From 714470be3f15804e26484875e6e508b4bea491dd Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 29 Dec 2021 15:18:09 +0100 Subject: ddb: Fix updating sp while progressing through frames Notably trap/interrupt/syscall provide an exact SP value. --- i386/i386/db_trace.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/i386/i386/db_trace.c b/i386/i386/db_trace.c index 2f47c325..5e2bef8b 100644 --- a/i386/i386/db_trace.c +++ b/i386/i386/db_trace.c @@ -265,6 +265,7 @@ void db_nextframe( struct i386_frame **lfp, /* in/out */ struct i386_frame **fp, /* in/out */ + db_addr_t *sp, /* out */ db_addr_t *ip, /* out */ long frame_type, /* in */ const thread_t thread) /* in */ @@ -286,6 +287,7 @@ db_nextframe( db_task_printsym(saved_regs->eip, DB_STGY_PROC, task); db_printf(" <<<<<\n"); *fp = (struct i386_frame *)saved_regs->ebp; + *sp = (db_addr_t)saved_regs->uesp; *ip = (db_addr_t)saved_regs->eip; break; case INTERRUPT: @@ -296,6 +298,7 @@ db_nextframe( db_printf(">>>>> interrupt at "); ifp = (struct interrupt_frame *)(*lfp); *fp = ifp->if_frame; + *sp = (db_addr_t) ifp->if_frame; if (ifp->if_iretaddr == db_return_to_iret_symbol_value) *ip = ((struct i386_interrupt_state *) ifp->if_edx)->eip; else @@ -306,6 +309,7 @@ db_nextframe( case SYSCALL: if (thread != THREAD_NULL && thread->pcb) { *ip = (db_addr_t) thread->pcb->iss.eip; + *sp = (db_addr_t) thread->pcb->iss.uesp; *fp = (struct i386_frame *) thread->pcb->iss.ebp; break; } @@ -317,6 +321,7 @@ db_nextframe( *lfp = *fp; *fp = (struct i386_frame *) db_get_task_value((long)&(*fp)->f_frame, sizeof(long), FALSE, task); + *sp = (db_addr_t) *fp; break; } } @@ -534,7 +539,7 @@ db_i386_stack_trace( db_printf("\n"); next_frame: - db_nextframe(&lastframe, &frame, &callpc, frame_type, th); + db_nextframe(&lastframe, &frame, &sp, &callpc, frame_type, th); if (!INKERNEL(lastframe) || (!INKERNEL(callpc) && !INKERNEL(frame))) -- cgit v1.2.3