• Enze Li's avatar
    LoongArch: Get partial stack information when providing regs parameter · 95bb5b61
    Enze Li authored
    Currently, arch_stack_walk() can only get the full stack information
    including NMI.  This is because the implementation of arch_stack_walk()
    is forced to ignore the information passed by the regs parameter and use
    the current stack information instead.
    
    For some detection systems like KFENCE, only partial stack information
    is needed.  In particular, the stack frame where the interrupt occurred.
    
    To support KFENCE, this patch modifies the implementation of the
    arch_stack_walk() function so that if this function is called with the
    regs argument passed, it retains all the stack information in regs and
    uses it to provide accurate information.
    
    Before this patch:
    [    1.531195 ] ==================================================================
    [    1.531442 ] BUG: KFENCE: out-of-bounds read in stack_trace_save_regs+0x48/0x6c
    [    1.531442 ]
    [    1.531900 ] Out-of-bounds read at 0xffff800012267fff (1B left of kfence-#12):
    [    1.532046 ]  stack_trace_save_regs+0x48/0x6c
    [    1.532169 ]  kfence_report_error+0xa4/0x528
    [    1.532276 ]  kfence_handle_page_fault+0x124/0x270
    [    1.532388 ]  no_context+0x50/0x94
    [    1.532453 ]  do_page_fault+0x1a8/0x36c
    [    1.532524 ]  tlb_do_page_fault_0+0x118/0x1b4
    [    1.532623 ]  test_out_of_bounds_read+0xa0/0x1d8
    [    1.532745 ]  kunit_generic_run_threadfn_adapter+0x1c/0x28
    [    1.532854 ]  kthread+0x124/0x130
    [    1.532922 ]  ret_from_kernel_thread+0xc/0xa4
    <snip>
    
    After this patch:
    [    1.320220 ] ==================================================================
    [    1.320401 ] BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read+0xa8/0x1d8
    [    1.320401 ]
    [    1.320898 ] Out-of-bounds read at 0xffff800012257fff (1B left of kfence-#10):
    [    1.321134 ]  test_out_of_bounds_read+0xa8/0x1d8
    [    1.321264 ]  kunit_generic_run_threadfn_adapter+0x1c/0x28
    [    1.321392 ]  kthread+0x124/0x130
    [    1.321459 ]  ret_from_kernel_thread+0xc/0xa4
    <snip>
    Suggested-by: default avatarJinyang He <hejinyang@loongson.cn>
    Signed-off-by: default avatarEnze Li <lienze@kylinos.cn>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    95bb5b61
stacktrace.c 1.87 KB