From 006d404cf77cb76437589bef7e0e1bb57c7bd79d Mon Sep 17 00:00:00 2001 From: marcel Date: Sat, 10 Jul 2004 19:56:00 +0000 Subject: Implement makectx(). The makectx() function is used by KDB to create a PCB from a trapframe for purposes of unwinding the stack. The PCB is used as the thread context and all but the thread that entered the debugger has a valid PCB. This function can also be used to create a context for the threads running on the CPUs that have been stopped when the debugger got entered. This however is not done at the time of this commit. --- sys/sparc64/include/pcb.h | 1 + sys/sparc64/sparc64/machdep.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) (limited to 'sys/sparc64') diff --git a/sys/sparc64/include/pcb.h b/sys/sparc64/include/pcb.h index 38578d2..1f1e8dc 100644 --- a/sys/sparc64/include/pcb.h +++ b/sys/sparc64/include/pcb.h @@ -49,6 +49,7 @@ struct pcb { } __aligned(64); #ifdef _KERNEL +void makectx(struct trapframe *, struct pcb *); int savectx(struct pcb *pcb); #endif diff --git a/sys/sparc64/sparc64/machdep.c b/sys/sparc64/sparc64/machdep.c index 3db2dd8..2bc8329 100644 --- a/sys/sparc64/sparc64/machdep.c +++ b/sys/sparc64/sparc64/machdep.c @@ -564,6 +564,21 @@ freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap) } #endif +/* + * Construct a PCB from a trapframe. This is called from kdb_trap() where + * we want to start a backtrace from the function that caused us to enter + * the debugger. We have the context in the trapframe, but base the trace + * on the PCB. The PCB doesn't have to be perfect, as long as it contains + * enough for a backtrace. + */ +void +makectx(struct trapframe *tf, struct pcb *pcb) +{ + + pcb->pcb_pc = tf->tf_tpc; + pcb->pcb_sp = tf->tf_sp; +} + int get_mcontext(struct thread *td, mcontext_t *mc, int flags) { -- cgit v1.1