summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-29 15:18:09 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-29 15:18:09 +0100
commit714470be3f15804e26484875e6e508b4bea491dd (patch)
treeb895b0a2d7fc1efb83762415da5c94be74543dca
parent48e5b524be945e3eecaf88583a5aa50a5f5ca50a (diff)
ddb: Fix updating sp while progressing through frames
Notably trap/interrupt/syscall provide an exact SP value.
-rw-r--r--i386/i386/db_trace.c7
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)))