Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/uvm unify rounding and range checking.
details: https://anonhg.NetBSD.org/src/rev/cccaaf2c3808
branches: trunk
changeset: 449651:cccaaf2c3808
user: christos <christos%NetBSD.org@localhost>
date: Thu Mar 14 21:09:03 2019 +0000
description:
unify rounding and range checking.
diffstat:
sys/uvm/uvm_mmap.c | 143 ++++++++++++++--------------------------------------
1 files changed, 40 insertions(+), 103 deletions(-)
diffs (281 lines):
diff -r fe6f9956aadd -r cccaaf2c3808 sys/uvm/uvm_mmap.c
--- a/sys/uvm/uvm_mmap.c Thu Mar 14 20:29:53 2019 +0000
+++ b/sys/uvm/uvm_mmap.c Thu Mar 14 21:09:03 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_mmap.c,v 1.170 2019/03/14 19:10:04 kre Exp $ */
+/* $NetBSD: uvm_mmap.c,v 1.171 2019/03/14 21:09:03 christos Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.170 2019/03/14 19:10:04 kre Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.171 2019/03/14 21:09:03 christos Exp $");
#include "opt_compat_netbsd.h"
#include "opt_pax.h"
@@ -67,7 +67,7 @@
int, int, struct uvm_object *, voff_t, vsize_t);
static int
-range_test(struct vm_map *map, vaddr_t addr, vsize_t size, bool ismmap)
+range_test(const struct vm_map *map, vaddr_t addr, vsize_t size, bool ismmap)
{
vaddr_t vm_min_address = vm_map_min(map);
vaddr_t vm_max_address = vm_map_max(map);
@@ -89,6 +89,26 @@
}
/*
+ * align the address to a page boundary, and adjust the size accordingly
+ */
+static int
+round_and_check(const struct vm_map *map, vaddr_t *addr, vsize_t *size)
+{
+ const vsize_t pageoff = (vsize_t)(*addr & PAGE_MASK);
+
+ *addr -= pageoff;
+
+ if (*size != 0) {
+ *size += pageoff;
+ *size = (vsize_t)round_page(*size);
+ } else if (*addr + *size < *addr) {
+ return ENOMEM;
+ }
+
+ return range_test(map, *addr, *size, false);
+}
+
+/*
* sys_mincore: determine if pages are in core or not.
*/
@@ -405,7 +425,7 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
+ vsize_t size;
struct vm_map *map;
int error, flags, uvmflags;
bool rv;
@@ -427,22 +447,11 @@
flags |= MS_SYNC;
/*
- * align the address to a page boundary and adjust the size accordingly.
- */
-
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- size += pageoff;
- size = (vsize_t)round_page(size);
-
-
- /*
* get map
*/
map = &p->p_vmspace->vm_map;
- error = range_test(map, addr, size, false);
- if (error)
+ if (round_and_check(map, &addr, &size))
return ENOMEM;
/*
@@ -497,10 +506,9 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
+ vsize_t size;
struct vm_map *map;
struct vm_map_entry *dead_entries;
- int error;
/*
* get syscall args.
@@ -509,24 +517,14 @@
addr = (vaddr_t)SCARG(uap, addr);
size = (vsize_t)SCARG(uap, len);
- /*
- * align the address to a page boundary and adjust the size accordingly.
- */
+ map = &p->p_vmspace->vm_map;
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- size += pageoff;
- size = (vsize_t)round_page(size);
+ if (round_and_check(map, &addr, &size))
+ return EINVAL;
if (size == 0)
return 0;
- map = &p->p_vmspace->vm_map;
-
- error = range_test(map, addr, size, false);
- if (error)
- return EINVAL;
-
vm_map_lock(map);
#if 0
/*
@@ -560,7 +558,7 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
+ vsize_t size;
vm_prot_t prot;
int error;
@@ -572,17 +570,7 @@
size = (vsize_t)SCARG(uap, len);
prot = SCARG(uap, prot) & VM_PROT_ALL;
- /*
- * align the address to a page boundary and adjust the size accordingly.
- */
-
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- size += pageoff;
- size = round_page(size);
-
- error = range_test(&p->p_vmspace->vm_map, addr, size, false);
- if (error)
+ if (round_and_check(&p->p_vmspace->vm_map, &addr, &size))
return EINVAL;
error = uvm_map_protect_user(l, addr, addr + size, prot);
@@ -604,7 +592,7 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
+ vsize_t size;
vm_inherit_t inherit;
int error;
@@ -612,17 +600,7 @@
size = (vsize_t)SCARG(uap, len);
inherit = SCARG(uap, inherit);
- /*
- * align the address to a page boundary and adjust the size accordingly.
- */
-
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- size += pageoff;
- size = (vsize_t)round_page(size);
-
- error = range_test(&p->p_vmspace->vm_map, addr, size, false);
- if (error)
+ if (round_and_check(&p->p_vmspace->vm_map, &addr, &size))
return EINVAL;
error = uvm_map_inherit(&p->p_vmspace->vm_map, addr, addr + size,
@@ -646,24 +624,14 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
+ vsize_t size;
int advice, error;
addr = (vaddr_t)SCARG(uap, addr);
size = (vsize_t)SCARG(uap, len);
advice = SCARG(uap, behav);
- /*
- * align the address to a page boundary, and adjust the size accordingly
- */
-
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- size += pageoff;
- size = (vsize_t)round_page(size);
-
- error = range_test(&p->p_vmspace->vm_map, addr, size, false);
- if (error)
+ if (round_and_check(&p->p_vmspace->vm_map, &addr, &size))
return EINVAL;
switch (advice) {
@@ -743,7 +711,7 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
+ vsize_t size;
int error;
/*
@@ -753,21 +721,7 @@
addr = (vaddr_t)SCARG(uap, addr);
size = (vsize_t)SCARG(uap, len);
- /*
- * align the address to a page boundary and adjust the size accordingly
- */
-
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- if (size != 0) {
- size += pageoff;
- size = (vsize_t)round_page(size);
- }
- if (addr + size < addr)
- return ENOMEM;
-
- error = range_test(&p->p_vmspace->vm_map, addr, size, false);
- if (error)
+ if (round_and_check(&p->p_vmspace->vm_map, &addr, &size))
return ENOMEM;
if (atop(size) + uvmexp.wired > uvmexp.wiredmax)
@@ -798,8 +752,7 @@
} */
struct proc *p = l->l_proc;
vaddr_t addr;
- vsize_t size, pageoff;
- int error;
+ vsize_t size;
/*
* extract syscall args from uap
@@ -808,26 +761,10 @@
addr = (vaddr_t)SCARG(uap, addr);
size = (vsize_t)SCARG(uap, len);
- /*
- * align the address to a page boundary, and adjust the size accordingly
- */
-
- pageoff = (addr & PAGE_MASK);
- addr -= pageoff;
- if (size != 0) {
- size += pageoff;
- size = (vsize_t)round_page(size);
- }
- if (addr + size < addr)
+ if (round_and_check(&p->p_vmspace->vm_map, &addr, &size))
return ENOMEM;
- error = range_test(&p->p_vmspace->vm_map, addr, size, false);
- if (error)
- return ENOMEM;
-
- error = uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, true,
- 0);
- if (error)
+ if (uvm_map_pageable(&p->p_vmspace->vm_map, addr, addr+size, true, 0))
return ENOMEM;
return 0;
Home |
Main Index |
Thread Index |
Old Index