Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/trap.c
Show First 20 Lines • Show All 714 Lines • ▼ Show 20 Lines | trap_pfault(struct trapframe *frame, int usermode) | ||||
else if ((frame->tf_err & PGEX_I) && pg_nx != 0) | 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(map, va, ftype, VM_FAULT_NORMAL); | rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); | ||||
if (rv == KERN_SUCCESS) { | if (rv == KERN_SUCCESS) { | ||||
if (pti && pg_nx != 0 && (frame->tf_err & (PGEX_P | PGEX_W | | |||||
PGEX_U | PGEX_I)) == (PGEX_P | PGEX_U | PGEX_I) && | |||||
bootverbose) { | |||||
/* | |||||
* Most likely, userspace executed with the | |||||
* kernel-mode page table. | |||||
*/ | |||||
printf("PTI: pid %d comm %s tf_err %#lx\n", p->p_pid, | |||||
p->p_comm, frame->tf_err); | |||||
} | |||||
#ifdef HWPMC_HOOKS | #ifdef HWPMC_HOOKS | ||||
if (ftype == VM_PROT_READ || ftype == VM_PROT_WRITE) { | if (ftype == VM_PROT_READ || ftype == VM_PROT_WRITE) { | ||||
PMC_SOFT_CALL_TF( , , page_fault, all, frame); | PMC_SOFT_CALL_TF( , , page_fault, all, frame); | ||||
if (ftype == VM_PROT_READ) | if (ftype == VM_PROT_READ) | ||||
PMC_SOFT_CALL_TF( , , page_fault, read, | PMC_SOFT_CALL_TF( , , page_fault, read, | ||||
frame); | frame); | ||||
else | else | ||||
PMC_SOFT_CALL_TF( , , page_fault, write, | PMC_SOFT_CALL_TF( , , page_fault, write, | ||||
▲ Show 20 Lines • Show All 236 Lines • Show Last 20 Lines |