• Tong Tiangen's avatar
    riscv: add VMAP_STACK overflow detection · 31da94c2
    Tong Tiangen authored
    This patch adds stack overflow detection to riscv, usable when
    CONFIG_VMAP_STACK=y.
    
    Overflow is detected in kernel exception entry(kernel/entry.S), if the
    kernel stack is overflow and been detected, the overflow handler is
    invoked on a per-cpu overflow stack. This approach preserves GPRs and
    the original exception information.
    
    The overflow detect is performed before any attempt is made to access
    the stack and the principle of stack overflow detection: kernel stacks
    are aligned to double their size, enabling overflow to be detected with
    a single bit test. For example, a 16K stack is aligned to 32K, ensuring
    that bit 14 of the SP must be zero. On an overflow (or underflow), this
    bit is flipped. Thus, overflow (of less than the size of the stack) can
    be detected by testing whether this bit is set.
    
    This gives us a useful error message on stack overflow, as can be
    trigger with the LKDTM overflow test:
    
    [  388.053267] lkdtm: Performing direct entry EXHAUST_STACK
    [  388.053663] lkdtm: Calling function with 1024 frame size to depth 32 ...
    [  388.054016] lkdtm: loop 32/32 ...
    [  388.054186] lkdtm: loop 31/32 ...
    [  388.054491] lkdtm: loop 30/32 ...
    [  388.054672] lkdtm: loop 29/32 ...
    [  388.054859] lkdtm: loop 28/32 ...
    [  388.055010] lkdtm: loop 27/32 ...
    [  388.055163] lkdtm: loop 26/32 ...
    [  388.055309] lkdtm: loop 25/32 ...
    [  388.055481] lkdtm: loop 24/32 ...
    [  388.055653] lkdtm: loop 23/32 ...
    [  388.055837] lkdtm: loop 22/32 ...
    [  388.056015] lkdtm: loop 21/32 ...
    [  388.056188] lkdtm: loop 20/32 ...
    [  388.058145] Insufficient stack space to handle exception!
    [  388.058153] Task stack:     [0xffffffd014260000..0xffffffd014264000]
    [  388.058160] Overflow stack: [0xffffffe1f8d2c220..0xffffffe1f8d2d220]
    [  388.058168] CPU: 0 PID: 89 Comm: bash Not tainted 5.12.0-rc8-dirty #90
    [  388.058175] Hardware name: riscv-virtio,qemu (DT)
    [  388.058187] epc : number+0x32/0x2c0
    [  388.058247]  ra : vsnprintf+0x2ae/0x3f0
    [  388.058255] epc : ffffffe0002d38f6 ra : ffffffe0002d814e sp : ffffffd01425ffc0
    [  388.058263]  gp : ffffffe0012e4010 tp : ffffffe08014da00 t0 : ffffffd0142606e8
    [  388.058271]  t1 : 0000000000000000 t2 : 0000000000000000 s0 : ffffffd014260070
    [  388.058303]  s1 : ffffffd014260158 a0 : ffffffd01426015e a1 : ffffffd014260158
    [  388.058311]  a2 : 0000000000000013 a3 : ffff0a01ffffff10 a4 : ffffffe000c398e0
    [  388.058319]  a5 : 511b02ec65f3e300 a6 : 0000000000a1749a a7 : 0000000000000000
    [  388.058327]  s2 : ffffffff000000ff s3 : 00000000ffff0a01 s4 : ffffffe0012e50a8
    [  388.058335]  s5 : 0000000000ffff0a s6 : ffffffe0012e50a8 s7 : ffffffe000da1cc0
    [  388.058343]  s8 : ffffffffffffffff s9 : ffffffd0142602b0 s10: ffffffd0142602a8
    [  388.058351]  s11: ffffffd01426015e t3 : 00000000000f0000 t4 : ffffffffffffffff
    [  388.058359]  t5 : 000000000000002f t6 : ffffffd014260158
    [  388.058366] status: 0000000000000100 badaddr: ffffffd01425fff8 cause: 000000000000000f
    [  388.058374] Kernel panic - not syncing: Kernel stack overflow
    [  388.058381] CPU: 0 PID: 89 Comm: bash Not tainted 5.12.0-rc8-dirty #90
    [  388.058387] Hardware name: riscv-virtio,qemu (DT)
    [  388.058393] Call Trace:
    [  388.058400] [<ffffffe000004944>] walk_stackframe+0x0/0xce
    [  388.058406] [<ffffffe0006f0b28>] dump_backtrace+0x38/0x46
    [  388.058412] [<ffffffe0006f0b46>] show_stack+0x10/0x18
    [  388.058418] [<ffffffe0006f3690>] dump_stack+0x74/0x8e
    [  388.058424] [<ffffffe0006f0d52>] panic+0xfc/0x2b2
    [  388.058430] [<ffffffe0006f0acc>] print_trace_address+0x0/0x24
    [  388.058436] [<ffffffe0002d814e>] vsnprintf+0x2ae/0x3f0
    [  388.058956] SMP: stopping secondary CPUs
    Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
    Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
    Signed-off-by: default avatarPalmer Dabbelt <palmerdabbelt@google.com>
    31da94c2
vmlinux.lds.S 2.61 KB