summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_fault.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-03-28 15:38:38 +0000
committerkib <kib@FreeBSD.org>2014-03-28 15:38:38 +0000
commitef58943ab3d439a34a1586ccd4abc8c5266f7d01 (patch)
tree00116dbbc03ded27ce1b50cf87bab72dcf6ed6ac /sys/vm/vm_fault.c
parent31717f7c2c10a59b1c3baf95958b322e632d756c (diff)
downloadFreeBSD-src-ef58943ab3d439a34a1586ccd4abc8c5266f7d01.zip
FreeBSD-src-ef58943ab3d439a34a1586ccd4abc8c5266f7d01.tar.gz
MFC r263475:
Fix two issues with /dev/mem access on amd64, both causing kernel page faults. First, for accesses to direct map region should check for the limit by which direct map is instantiated. Second, for accesses to the kernel map, use a new thread private flag TDP_DEVMEMIO, which instructs vm_fault() to return error when fault happens on the MAP_ENTRY_NOFAULT entry, instead of panicing. MFC r263498: Add change forgotten in r263475. Make dmaplimit accessible outside amd64/pmap.c.
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r--sys/vm/vm_fault.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 4f4015d..7581cc8 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -276,6 +276,10 @@ RetryFault:;
map_generation = fs.map->timestamp;
if (fs.entry->eflags & MAP_ENTRY_NOFAULT) {
+ if ((curthread->td_pflags & TDP_DEVMEMIO) != 0) {
+ vm_map_unlock_read(fs.map);
+ return (KERN_FAILURE);
+ }
panic("vm_fault: fault on nofault entry, addr: %lx",
(u_long)vaddr);
}
OpenPOWER on IntegriCloud