Fix so that dump stack does not overwrite any debug data and does not read past the end of the stack.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com --- src/include/reef/debug.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/src/include/reef/debug.h b/src/include/reef/debug.h index 7551fc5..85f91d4 100644 --- a/src/include/reef/debug.h +++ b/src/include/reef/debug.h @@ -46,6 +46,7 @@ #define PANIC_TASK 5 #define PANIC_EXCEPTION 6 #define PANIC_DEADLOCK 7 +#define PANIC_STACK 8
#define DEBUG
@@ -144,26 +145,26 @@ } while (0);
/* dump stack as part of panic */ -/* TODO: rework to make this generic - the stack top can be moved to arch code */ #define panic_dump_stack(_p) \ do { \ extern uint32_t __stack; \ extern uint32_t _stack_sentry; \ uint32_t _stack_bottom = (uint32_t)&__stack; \ uint32_t _stack_limit = (uint32_t)&_stack_sentry; \ - uint32_t _stack_top; \ - \ - __asm__ __volatile__ ("mov %0, a1" : "=a" (_stack_top) : : "memory"); \ + uint32_t _stack_top = arch_get_stack_ptr(); \ + uint32_t _size = _stack_bottom - _stack_top; \ + uint32_t _panic = _p; \ dbg_val(0xdead0000 | _p) \ - platform_panic(_p); \ - dbg_val(_stack_top) \ - dbg_val(_stack_bottom) \ - \ + dbg_val_at(_stack_top, 1) \ + dbg_val_at(_stack_bottom, 2) \ + /* is stack smashed ? */\ if (_stack_bottom <= _stack_limit) { \ - dbg_val(0x51ac0000 | _p) \ + dbg_val_at(0x51ac0000 | _p, 3); \ _stack_bottom = _stack_limit; \ + _panic = PANIC_STACK; \ } \ - dump(_stack_top, _stack_bottom - _stack_top) \ + platform_panic(_panic); \ + dump_at(_stack_top, (_size - sizeof(uint32_t)) >> 2, 4) \ \ while(1) {}; \ } while (0);