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 <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
3d79cd3332
commit
c791590a8e
@@ -97,7 +97,7 @@ static void
|
|||||||
set_debug_argument_variable(int32 index, uint64 value)
|
set_debug_argument_variable(int32 index, uint64 value)
|
||||||
{
|
{
|
||||||
char name[8];
|
char name[8];
|
||||||
snprintf(name, sizeof(name), "_arg%ld", index);
|
snprintf(name, sizeof(name), "_arg%" B_PRId32, index);
|
||||||
set_debug_variable(name, value);
|
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:
|
case B_INT32_TYPE:
|
||||||
value = read_function_argument_value<int32>(arg, valueKnown);
|
value = read_function_argument_value<int32>(arg, valueKnown);
|
||||||
if (valueKnown)
|
if (valueKnown)
|
||||||
kprintf("int32: \33[34m%ld\33[0m", (int32)value);
|
kprintf("int32: \33[34m%" B_PRId32 "\33[0m", (int32)value);
|
||||||
break;
|
break;
|
||||||
case B_INT16_TYPE:
|
case B_INT16_TYPE:
|
||||||
value = read_function_argument_value<int16>(arg, valueKnown);
|
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:
|
case B_UINT32_TYPE:
|
||||||
value = read_function_argument_value<uint32>(arg, valueKnown);
|
value = read_function_argument_value<uint32>(arg, valueKnown);
|
||||||
if (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)
|
if (value < 0x100000)
|
||||||
kprintf(" (\33[34m%lu\33[0m)", (uint32)value);
|
kprintf(" (\33[34m%" B_PRIu32 "\33[0m)", (uint32)value);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case B_UINT16_TYPE:
|
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))
|
&& (type == B_POINTER_TYPE || type == B_REF_TYPE))
|
||||||
kprintf("NULL");
|
kprintf("NULL");
|
||||||
else
|
else
|
||||||
kprintf("\33[34m%#lx\33[0m", (uint32)value);
|
kprintf("\33[34m%#" B_PRIx32 "\33[0m", (uint32)value);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -356,7 +356,7 @@ stack_trace(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
addr_t previousLocations[NUM_PREVIOUS_LOCATIONS];
|
addr_t previousLocations[NUM_PREVIOUS_LOCATIONS];
|
||||||
Thread* thread = NULL;
|
Thread* thread = thread_get_current_thread();
|
||||||
phys_addr_t oldPageDirectory = 0;
|
phys_addr_t oldPageDirectory = 0;
|
||||||
addr_t fp = arm_get_fp();
|
addr_t fp = arm_get_fp();
|
||||||
int32 num = 0, last = 0;
|
int32 num = 0, last = 0;
|
||||||
@@ -375,7 +375,7 @@ stack_trace(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (thread != NULL) {
|
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);
|
thread->name);
|
||||||
|
|
||||||
kprintf(" kernel stack: %p to %p\n",
|
kprintf(" kernel stack: %p to %p\n",
|
||||||
@@ -403,14 +403,16 @@ stack_trace(int argc, char **argv)
|
|||||||
|
|
||||||
if (frame) {
|
if (frame) {
|
||||||
kprintf("iframe at %p\n", 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);
|
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);
|
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);
|
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);
|
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;
|
fp = frame->svc_sp;
|
||||||
print_stack_frame(thread, frame->pc, frame->svc_sp, frame->svc_lr, callIndex, demangle);
|
print_stack_frame(thread, frame->pc, frame->svc_sp, frame->svc_lr, callIndex, demangle);
|
||||||
|
|||||||
@@ -157,8 +157,9 @@ und_stack:
|
|||||||
FUNCTION(arm_undefined):
|
FUNCTION(arm_undefined):
|
||||||
PUSHFRAMEINSVC
|
PUSHFRAMEINSVC
|
||||||
|
|
||||||
mov r0, sp
|
mov r0, sp /* iframe */
|
||||||
bl arch_arm_undefined
|
mov fp, r0
|
||||||
|
bl arch_arm_undefined
|
||||||
|
|
||||||
PULLFRAMEFROMSVCANDEXIT
|
PULLFRAMEFROMSVCANDEXIT
|
||||||
FUNCTION_END(arm_undefined)
|
FUNCTION_END(arm_undefined)
|
||||||
@@ -167,8 +168,9 @@ FUNCTION_END(arm_undefined)
|
|||||||
FUNCTION(arm_syscall):
|
FUNCTION(arm_syscall):
|
||||||
PUSHFRAMEINSWI
|
PUSHFRAMEINSWI
|
||||||
|
|
||||||
mov r0, sp
|
mov r0, sp /* iframe */
|
||||||
bl arch_arm_syscall
|
mov fp, r0
|
||||||
|
bl arch_arm_syscall
|
||||||
|
|
||||||
PULLFRAMEINSWIANDEXIT
|
PULLFRAMEINSWIANDEXIT
|
||||||
FUNCTION_END(arm_syscall)
|
FUNCTION_END(arm_syscall)
|
||||||
@@ -179,11 +181,12 @@ FUNCTION(arm_prefetch_abort):
|
|||||||
nop /* Make absolutely sure any pending */
|
nop /* Make absolutely sure any pending */
|
||||||
nop /* imprecise aborts have occurred. */
|
nop /* imprecise aborts have occurred. */
|
||||||
#endif
|
#endif
|
||||||
sub lr, lr, #4
|
sub lr, lr, #4 /* Adjust LR */
|
||||||
PUSHFRAMEINSVC
|
PUSHFRAMEINSVC
|
||||||
|
|
||||||
mov r0, sp
|
mov r0, sp /* iframe */
|
||||||
bl arch_arm_prefetch_abort
|
mov fp, r0
|
||||||
|
bl arch_arm_prefetch_abort
|
||||||
|
|
||||||
PULLFRAMEFROMSVCANDEXIT
|
PULLFRAMEFROMSVCANDEXIT
|
||||||
FUNCTION_END(arm_prefetch_abort)
|
FUNCTION_END(arm_prefetch_abort)
|
||||||
@@ -194,11 +197,12 @@ FUNCTION(arm_data_abort):
|
|||||||
nop /* Make absolutely sure any pending */
|
nop /* Make absolutely sure any pending */
|
||||||
nop /* imprecise aborts have occurred. */
|
nop /* imprecise aborts have occurred. */
|
||||||
#endif
|
#endif
|
||||||
sub lr, lr, #8 /* Adjust the lr */
|
sub lr, lr, #8 /* Adjust LR */
|
||||||
PUSHFRAMEINSVC
|
PUSHFRAMEINSVC
|
||||||
|
|
||||||
mov r0, sp
|
mov r0, sp /* iframe */
|
||||||
bl arch_arm_data_abort
|
mov fp, r0
|
||||||
|
bl arch_arm_data_abort
|
||||||
|
|
||||||
PULLFRAMEFROMSVCANDEXIT
|
PULLFRAMEFROMSVCANDEXIT
|
||||||
FUNCTION_END(arm_data_abort)
|
FUNCTION_END(arm_data_abort)
|
||||||
@@ -210,23 +214,25 @@ FUNCTION_END(arm_reserved)
|
|||||||
|
|
||||||
|
|
||||||
FUNCTION(arm_irq):
|
FUNCTION(arm_irq):
|
||||||
sub lr, lr, #4
|
sub lr, lr, #4 /* Adjust LR */
|
||||||
PUSHFRAMEINSVC
|
PUSHFRAMEINSVC
|
||||||
|
|
||||||
mov r0, sp /* iframe */
|
mov r0, sp /* iframe */
|
||||||
bl arch_arm_irq
|
mov fp, r0
|
||||||
|
bl arch_arm_irq
|
||||||
|
|
||||||
PULLFRAMEFROMSVCANDEXIT
|
PULLFRAMEFROMSVCANDEXIT
|
||||||
FUNCTION_END(arm_irq)
|
FUNCTION_END(arm_irq)
|
||||||
|
|
||||||
|
|
||||||
FUNCTION(arm_fiq):
|
FUNCTION(arm_fiq):
|
||||||
sub lr, lr, #4
|
sub lr, lr, #4 /* Adjust LR */
|
||||||
PUSHFRAMEINSVC
|
PUSHFRAMEINSVC
|
||||||
|
|
||||||
mov r0, sp /* iframe */
|
mov r0, sp /* iframe */
|
||||||
bl arch_arm_fiq
|
mov fp, r0
|
||||||
|
bl arch_arm_fiq
|
||||||
|
|
||||||
PULLFRAMEFROMSVCANDEXIT
|
PULLFRAMEFROMSVCANDEXIT
|
||||||
FUNCTION_END(arm_fiq)
|
FUNCTION_END(arm_fiq)
|
||||||
|
|
||||||
|
|||||||
@@ -252,6 +252,8 @@ arch_arm_syscall(struct iframe *iframe)
|
|||||||
print_iframe("Software interrupt", iframe);
|
print_iframe("Software interrupt", iframe);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
IFrameScope scope(iframe);
|
||||||
|
|
||||||
uint32_t syscall = *(uint32_t *)(iframe->pc-4) & 0x00ffffff;
|
uint32_t syscall = *(uint32_t *)(iframe->pc-4) & 0x00ffffff;
|
||||||
TRACE("syscall number: %d\n", syscall);
|
TRACE("syscall number: %d\n", syscall);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user