X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/24ef8cad2598c8dc0026e4124569498520eff67b..3338cc67bf8b657fca8ae9544aa3f89bb32cffb8:/sys/platform/pc64/x86_64/vm_machdep.c diff --git a/sys/platform/pc64/x86_64/vm_machdep.c b/sys/platform/pc64/x86_64/vm_machdep.c index 772f567691..0a3797dcfb 100644 --- a/sys/platform/pc64/x86_64/vm_machdep.c +++ b/sys/platform/pc64/x86_64/vm_machdep.c @@ -201,7 +201,8 @@ cpu_prepare_lwp(struct lwp *lp, struct lwp_params *params) regs->tf_rip = (long)params->func; regs->tf_rsp = (long)params->stack; /* Set up argument for function call */ - regs->tf_rdi = (long)params->arg; /* JG Can this be in userspace addresses? */ + regs->tf_rdi = (long)params->arg; + /* * Set up fake return address. As the lwp function may never return, * we simply copy out a NULL pointer and force the lwp to receive @@ -294,17 +295,6 @@ cpu_thread_exit(void) panic("cpu_thread_exit: lwkt_switch() unexpectedly returned"); } -/* - * Process Reaper. Called after the caller has acquired the thread's - * rwlock and removed it from the reap list. - */ -void -cpu_proc_wait(struct proc *p) -{ - /* drop per-process resources */ - pmap_dispose_proc(p); -} - void cpu_reset(void) { @@ -361,7 +351,7 @@ swi_vm(void *arg, void *frame) static void swi_vm_setup(void *arg) { - register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL); + register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL, 0); } SYSINIT(vm_setup, SI_BOOT2_MACHDEP, SI_ORDER_ANY, swi_vm_setup, NULL); @@ -421,3 +411,68 @@ kvm_access_check(vm_offset_t saddr, vm_offset_t eaddr, int prot) return 0; } +#if 0 + +void _test_frame_enter(struct trapframe *frame); +void _test_frame_exit(struct trapframe *frame); + +void +_test_frame_enter(struct trapframe *frame) +{ + thread_t td = curthread; + + if (ISPL(frame->tf_cs) == SEL_UPL) { + KKASSERT(td->td_lwp); + KASSERT(td->td_lwp->lwp_md.md_regs == frame, + ("_test_frame_exit: Frame mismatch %p %p", + td->td_lwp->lwp_md.md_regs, frame)); + td->td_lwp->lwp_saveusp = (void *)frame->tf_rsp; + td->td_lwp->lwp_saveupc = (void *)frame->tf_rip; + } + if ((char *)frame < td->td_kstack || + (char *)frame > td->td_kstack + td->td_kstack_size) { + panic("_test_frame_exit: frame not on kstack %p kstack=%p\n", + frame, td->td_kstack); + } +} + +void +_test_frame_exit(struct trapframe *frame) +{ + thread_t td = curthread; + + if (ISPL(frame->tf_cs) == SEL_UPL) { + KKASSERT(td->td_lwp); + KASSERT(td->td_lwp->lwp_md.md_regs == frame, + ("_test_frame_exit: Frame mismatch %p %p", + td->td_lwp->lwp_md.md_regs, frame)); + if (td->td_lwp->lwp_saveusp != (void *)frame->tf_rsp) { + kprintf("_test_frame_exit: %s:%d usp mismatch %p/%p\n", + td->td_comm, td->td_proc->p_pid, + td->td_lwp->lwp_saveusp, + (void *)frame->tf_rsp); + } + if (td->td_lwp->lwp_saveupc != (void *)frame->tf_rip) { + kprintf("_test_frame_exit: %s:%d upc mismatch %p/%p\n", + td->td_comm, td->td_proc->p_pid, + td->td_lwp->lwp_saveupc, + (void *)frame->tf_rip); + } + + /* + * adulterate the fields to catch entries that + * don't run through test_frame_enter + */ + td->td_lwp->lwp_saveusp = + (void *)~(intptr_t)td->td_lwp->lwp_saveusp; + td->td_lwp->lwp_saveupc = + (void *)~(intptr_t)td->td_lwp->lwp_saveupc; + } + if ((char *)frame < td->td_kstack || + (char *)frame > td->td_kstack + td->td_kstack_size) { + panic("_test_frame_exit: frame not on kstack %p kstack=%p\n", + frame, td->td_kstack); + } +} + +#endif