Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/stack_machdep.c
Show All 27 Lines | |||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/proc.h> | #include <sys/proc.h> | ||||
#include <sys/stack.h> | #include <sys/stack.h> | ||||
#include <machine/pcb.h> | #include <machine/pcb.h> | ||||
#include <machine/smp.h> | |||||
#include <machine/stack.h> | #include <machine/stack.h> | ||||
#include <vm/vm.h> | #include <vm/vm.h> | ||||
#include <vm/vm_param.h> | #include <vm/vm_param.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
static void | static void | ||||
stack_capture(struct stack *st, register_t rbp) | stack_capture(struct stack *st, register_t rbp) | ||||
Show All 26 Lines | stack_save_td(struct stack *st, struct thread *td) | ||||
if (TD_IS_SWAPPED(td)) | if (TD_IS_SWAPPED(td)) | ||||
panic("stack_save_td: swapped"); | panic("stack_save_td: swapped"); | ||||
if (TD_IS_RUNNING(td)) | if (TD_IS_RUNNING(td)) | ||||
panic("stack_save_td: running"); | panic("stack_save_td: running"); | ||||
rbp = td->td_pcb->pcb_rbp; | rbp = td->td_pcb->pcb_rbp; | ||||
stack_capture(st, rbp); | stack_capture(st, rbp); | ||||
} | |||||
void | |||||
stack_save_inpanic(struct stack *st, struct thread *td) | |||||
{ | |||||
#ifdef SMP | |||||
const struct pcb *pcb = &stoppcbs[td->td_oncpu]; | |||||
#else | |||||
const struct pcb *pcb = td->td_pcb; | |||||
#endif | |||||
stack_capture(st, pcb->pcb_rbp); | |||||
} | } | ||||
void | void | ||||
stack_save(struct stack *st) | stack_save(struct stack *st) | ||||
{ | { | ||||
register_t rbp; | register_t rbp; | ||||
__asm __volatile("movq %%rbp,%0" : "=r" (rbp)); | __asm __volatile("movq %%rbp,%0" : "=r" (rbp)); | ||||
stack_capture(st, rbp); | stack_capture(st, rbp); | ||||
} | } |