diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-29 15:18:09 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-29 15:18:09 +0100 |
commit | 714470be3f15804e26484875e6e508b4bea491dd (patch) | |
tree | b895b0a2d7fc1efb83762415da5c94be74543dca /i386 | |
parent | 48e5b524be945e3eecaf88583a5aa50a5f5ca50a (diff) | |
download | gnumach-714470be3f15804e26484875e6e508b4bea491dd.tar.gz gnumach-714470be3f15804e26484875e6e508b4bea491dd.tar.bz2 gnumach-714470be3f15804e26484875e6e508b4bea491dd.zip |
ddb: Fix updating sp while progressing through frames
Notably trap/interrupt/syscall provide an exact SP value.
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386/db_trace.c | 7 |
1 files changed, 6 insertions, 1 deletions
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))) |