summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-07-09 15:21:10 +0000
committerkib <kib@FreeBSD.org>2011-07-09 15:21:10 +0000
commit61e3fec296fa6c27ba164bba06c2773c8f52d5ae (patch)
tree2e4765a311744587c5b4fff81d2ac15360a89ca0 /sys/vm
parent08e1095b2da00c4acdc7a1b5d5eaec9704712578 (diff)
downloadFreeBSD-src-61e3fec296fa6c27ba164bba06c2773c8f52d5ae.zip
FreeBSD-src-61e3fec296fa6c27ba164bba06c2773c8f52d5ae.tar.gz
Add a facility to disable processing page faults. When activated,
uiomove generates EFAULT if any accessed address is not mapped, as opposed to handling the fault. Sponsored by: The FreeBSD Foundation Reviewed by: alc (previous version)
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_extern.h2
-rw-r--r--sys/vm/vm_fault.c16
2 files changed, 18 insertions, 0 deletions
diff --git a/sys/vm/vm_extern.h b/sys/vm/vm_extern.h
index ae8e578..548cdb4 100644
--- a/sys/vm/vm_extern.h
+++ b/sys/vm/vm_extern.h
@@ -61,6 +61,8 @@ int useracc(void *, int, int);
int vm_fault(vm_map_t, vm_offset_t, vm_prot_t, int);
void vm_fault_copy_entry(vm_map_t, vm_map_t, vm_map_entry_t, vm_map_entry_t,
vm_ooffset_t *);
+int vm_fault_disable_pagefaults(void);
+void vm_fault_enable_pagefaults(int save);
int vm_fault_hold(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags, vm_page_t *m_hold);
int vm_fault_quick_hold_pages(vm_map_t map, vm_offset_t addr, vm_size_t len,
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 55abe86..eeb10a4 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -209,6 +209,8 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags)
{
+ if ((curthread->td_pflags & TDP_NOFAULTING) != 0)
+ return (KERN_PROTECTION_FAILURE);
return (vm_fault_hold(map, vaddr, fault_type, fault_flags, NULL));
}
@@ -1475,3 +1477,17 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage)
/* return number of pages */
return i;
}
+
+int
+vm_fault_disable_pagefaults(void)
+{
+
+ return (curthread_pflags_set(TDP_NOFAULTING));
+}
+
+void
+vm_fault_enable_pagefaults(int save)
+{
+
+ curthread_pflags_restore(save);
+}
OpenPOWER on IntegriCloud