kernel/arm: fix iframe unwinding

* add missing call to thread_get_current_thread()
* apply some better formatting to iframe printout
* pass iframe in lr to exception handlers
* add missing iframe scope in syscall handler
  (was removed previously by mistake)

Change-Id: I01c34f2114cd874f72f91be428921ad2002e256a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5611
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
This commit is contained in:
David Karoly 2022-09-02 16:27:28 +02:00 committed by waddlesplash
parent 3d79cd3332
commit c791590a8e
3 changed files with 38 additions and 28 deletions

View File

@ -97,7 +97,7 @@ static void
set_debug_argument_variable(int32 index, uint64 value)
{
char name[8];
snprintf(name, sizeof(name), "_arg%ld", index);
snprintf(name, sizeof(name), "_arg%" B_PRId32, index);
set_debug_variable(name, value);
}
@ -179,7 +179,7 @@ print_demangled_call(const char* image, const char* symbol, addr_t args,
case B_INT32_TYPE:
value = read_function_argument_value<int32>(arg, valueKnown);
if (valueKnown)
kprintf("int32: \33[34m%ld\33[0m", (int32)value);
kprintf("int32: \33[34m%" B_PRId32 "\33[0m", (int32)value);
break;
case B_INT16_TYPE:
value = read_function_argument_value<int16>(arg, valueKnown);
@ -202,9 +202,9 @@ print_demangled_call(const char* image, const char* symbol, addr_t args,
case B_UINT32_TYPE:
value = read_function_argument_value<uint32>(arg, valueKnown);
if (valueKnown) {
kprintf("uint32: \33[34m%#lx\33[0m", (uint32)value);
kprintf("uint32: \33[34m%#" B_PRIx32 "\33[0m", (uint32)value);
if (value < 0x100000)
kprintf(" (\33[34m%lu\33[0m)", (uint32)value);
kprintf(" (\33[34m%" B_PRIu32 "\33[0m)", (uint32)value);
}
break;
case B_UINT16_TYPE:
@ -238,7 +238,7 @@ print_demangled_call(const char* image, const char* symbol, addr_t args,
&& (type == B_POINTER_TYPE || type == B_REF_TYPE))
kprintf("NULL");
else
kprintf("\33[34m%#lx\33[0m", (uint32)value);
kprintf("\33[34m%#" B_PRIx32 "\33[0m", (uint32)value);
}
break;
}
@ -356,7 +356,7 @@ stack_trace(int argc, char **argv)
}
addr_t previousLocations[NUM_PREVIOUS_LOCATIONS];
Thread* thread = NULL;
Thread* thread = thread_get_current_thread();
phys_addr_t oldPageDirectory = 0;
addr_t fp = arm_get_fp();
int32 num = 0, last = 0;
@ -375,7 +375,7 @@ stack_trace(int argc, char **argv)
}
if (thread != NULL) {
kprintf("stack trace for thread 0x%lx \"%s\"\n", thread->id,
kprintf("stack trace for thread 0x%" B_PRIx32 " \"%s\"\n", thread->id,
thread->name);
kprintf(" kernel stack: %p to %p\n",
@ -403,14 +403,16 @@ stack_trace(int argc, char **argv)
if (frame) {
kprintf("iframe at %p\n", frame);
kprintf(" r0 0x%08lx r1 0x%08lx r2 0x%08lx r3 0x%08lx\n",
kprintf(" R00 0x%08x R01 0x%08x R02 0x%08x R03 0x%08x\n",
frame->r0, frame->r1, frame->r2, frame->r3);
kprintf(" r4 0x%08lx r5 0x%08lx r6 0x%08lx r7 0x%08lx\n",
kprintf(" R04 0x%08x R05 0x%08x R06 0x%08x R07 0x%08x\n",
frame->r4, frame->r5, frame->r6, frame->r7);
kprintf(" r8 0x%08lx r9 0x%08lx r10 0x%08lx r11 0x%08lx\n",
kprintf(" R08 0x%08x R09 0x%08x R10 0x%08x R11 0x%08x\n",
frame->r8, frame->r9, frame->r10, frame->r11);
kprintf(" r12 0x%08lx sp 0x%08lx lr 0x%08lx pc 0x%08lx\n",
kprintf(" R12 0x%08x SPs 0x%08x LRs 0x%08x PC 0x%08x\n",
frame->r12, frame->svc_sp, frame->svc_lr, frame->pc);
kprintf(" SPu 0x%08x LRu 0x%08x SPSR 0x%08x\n",
frame->usr_sp, frame->usr_lr, frame->spsr);
fp = frame->svc_sp;
print_stack_frame(thread, frame->pc, frame->svc_sp, frame->svc_lr, callIndex, demangle);

View File

@ -157,7 +157,8 @@ und_stack:
FUNCTION(arm_undefined):
PUSHFRAMEINSVC
mov r0, sp
mov r0, sp /* iframe */
mov fp, r0
bl arch_arm_undefined
PULLFRAMEFROMSVCANDEXIT
@ -167,7 +168,8 @@ FUNCTION_END(arm_undefined)
FUNCTION(arm_syscall):
PUSHFRAMEINSWI
mov r0, sp
mov r0, sp /* iframe */
mov fp, r0
bl arch_arm_syscall
PULLFRAMEINSWIANDEXIT
@ -179,10 +181,11 @@ FUNCTION(arm_prefetch_abort):
nop /* Make absolutely sure any pending */
nop /* imprecise aborts have occurred. */
#endif
sub lr, lr, #4
sub lr, lr, #4 /* Adjust LR */
PUSHFRAMEINSVC
mov r0, sp
mov r0, sp /* iframe */
mov fp, r0
bl arch_arm_prefetch_abort
PULLFRAMEFROMSVCANDEXIT
@ -194,10 +197,11 @@ FUNCTION(arm_data_abort):
nop /* Make absolutely sure any pending */
nop /* imprecise aborts have occurred. */
#endif
sub lr, lr, #8 /* Adjust the lr */
sub lr, lr, #8 /* Adjust LR */
PUSHFRAMEINSVC
mov r0, sp
mov r0, sp /* iframe */
mov fp, r0
bl arch_arm_data_abort
PULLFRAMEFROMSVCANDEXIT
@ -210,10 +214,11 @@ FUNCTION_END(arm_reserved)
FUNCTION(arm_irq):
sub lr, lr, #4
sub lr, lr, #4 /* Adjust LR */
PUSHFRAMEINSVC
mov r0, sp /* iframe */
mov fp, r0
bl arch_arm_irq
PULLFRAMEFROMSVCANDEXIT
@ -221,10 +226,11 @@ FUNCTION_END(arm_irq)
FUNCTION(arm_fiq):
sub lr, lr, #4
sub lr, lr, #4 /* Adjust LR */
PUSHFRAMEINSVC
mov r0, sp /* iframe */
mov fp, r0
bl arch_arm_fiq
PULLFRAMEFROMSVCANDEXIT

View File

@ -252,6 +252,8 @@ arch_arm_syscall(struct iframe *iframe)
print_iframe("Software interrupt", iframe);
#endif
IFrameScope scope(iframe);
uint32_t syscall = *(uint32_t *)(iframe->pc-4) & 0x00ffffff;
TRACE("syscall number: %d\n", syscall);