Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/trap.c
Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
#include <sys/mutex.h> | #include <sys/mutex.h> | ||||
#include <sys/resourcevar.h> | #include <sys/resourcevar.h> | ||||
#include <sys/signalvar.h> | #include <sys/signalvar.h> | ||||
#include <sys/syscall.h> | #include <sys/syscall.h> | ||||
#include <sys/sysctl.h> | #include <sys/sysctl.h> | ||||
#include <sys/sysent.h> | #include <sys/sysent.h> | ||||
#include <sys/uio.h> | #include <sys/uio.h> | ||||
#include <sys/vmmeter.h> | #include <sys/vmmeter.h> | ||||
#ifdef HWPMC_HOOKS | |||||
#include <sys/pmckern.h> | |||||
PMC_SOFT_DEFINE( , , page_fault, all); | |||||
PMC_SOFT_DEFINE( , , page_fault, read); | |||||
PMC_SOFT_DEFINE( , , page_fault, write); | |||||
#endif | |||||
#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> | ||||
#include <vm/vm_kern.h> | #include <vm/vm_kern.h> | ||||
#include <vm/vm_map.h> | #include <vm/vm_map.h> | ||||
#include <vm/vm_page.h> | #include <vm/vm_page.h> | ||||
#include <vm/vm_extern.h> | #include <vm/vm_extern.h> | ||||
Show All 9 Lines | |||||
#include <machine/stack.h> | #include <machine/stack.h> | ||||
#include <machine/trap.h> | #include <machine/trap.h> | ||||
#include <machine/tss.h> | #include <machine/tss.h> | ||||
#ifdef KDTRACE_HOOKS | #ifdef KDTRACE_HOOKS | ||||
#include <sys/dtrace_bsd.h> | #include <sys/dtrace_bsd.h> | ||||
#endif | #endif | ||||
#ifdef HWPMC_HOOKS | |||||
#include <sys/pmckern.h> | |||||
PMC_SOFT_DEFINE( , , page_fault, all); | |||||
PMC_SOFT_DEFINE( , , page_fault, read); | |||||
PMC_SOFT_DEFINE( , , page_fault, write); | |||||
#endif | |||||
extern inthand_t IDTVEC(bpt), IDTVEC(bpt_pti), IDTVEC(dbg), | extern inthand_t IDTVEC(bpt), IDTVEC(bpt_pti), IDTVEC(dbg), | ||||
IDTVEC(fast_syscall), IDTVEC(fast_syscall_pti), IDTVEC(fast_syscall32), | IDTVEC(fast_syscall), IDTVEC(fast_syscall_pti), IDTVEC(fast_syscall32), | ||||
IDTVEC(int0x80_syscall_pti), IDTVEC(int0x80_syscall); | IDTVEC(int0x80_syscall_pti), IDTVEC(int0x80_syscall); | ||||
void __noinline trap(struct trapframe *frame); | void __noinline trap(struct trapframe *frame); | ||||
void trap_check(struct trapframe *frame); | void trap_check(struct trapframe *frame); | ||||
void dblfault_handler(struct trapframe *frame); | void dblfault_handler(struct trapframe *frame); | ||||
▲ Show 20 Lines • Show All 700 Lines • ▼ Show 20 Lines | else if ((frame->tf_err & PGEX_I) && pg_nx != 0) | ||||
ftype = VM_PROT_EXECUTE; | ftype = VM_PROT_EXECUTE; | ||||
else | else | ||||
ftype = VM_PROT_READ; | ftype = VM_PROT_READ; | ||||
/* Fault in the page. */ | /* Fault in the page. */ | ||||
rv = vm_fault_trap(map, eva, ftype, VM_FAULT_NORMAL, signo, ucode); | rv = vm_fault_trap(map, eva, ftype, VM_FAULT_NORMAL, signo, ucode); | ||||
if (rv == KERN_SUCCESS) { | if (rv == KERN_SUCCESS) { | ||||
#ifdef HWPMC_HOOKS | #ifdef HWPMC_HOOKS | ||||
if (ftype == VM_PROT_READ || ftype == VM_PROT_WRITE) { | pmc_soft_page_fault(ftype, frame); | ||||
PMC_SOFT_CALL_TF( , , page_fault, all, frame); | |||||
if (ftype == VM_PROT_READ) | |||||
PMC_SOFT_CALL_TF( , , page_fault, read, | |||||
frame); | |||||
else | |||||
PMC_SOFT_CALL_TF( , , page_fault, write, | |||||
frame); | |||||
} | |||||
#endif | #endif | ||||
return (0); | return (0); | ||||
} | } | ||||
if (usermode) | if (usermode) | ||||
return (1); | return (1); | ||||
after_vmfault: | after_vmfault: | ||||
if (td->td_intr_nesting_level == 0 && | if (td->td_intr_nesting_level == 0 && | ||||
▲ Show 20 Lines • Show All 360 Lines • Show Last 20 Lines |