summaryrefslogtreecommitdiffstats
path: root/lib/libkvm/kvm_proc.c
diff options
context:
space:
mode:
authorariane <ariane@openbsd.org>2011-05-24 15:27:36 +0000
committerariane <ariane@openbsd.org>2011-05-24 15:27:36 +0000
commit4e3da9ea5c5c5f4e31e57e65a6f97720cfa2a93f (patch)
treed9bb5c2f86c9031ede4e5ba19468f965cd1ce33e /lib/libkvm/kvm_proc.c
parentMerge pf_scrub_ip() and pf_scrub_ip6() into a single function. Call (diff)
downloadwireguard-openbsd-4e3da9ea5c5c5f4e31e57e65a6f97720cfa2a93f.tar.xz
wireguard-openbsd-4e3da9ea5c5c5f4e31e57e65a6f97720cfa2a93f.zip
Reimplement uvm/uvm_map.
vmmap is designed to perform address space randomized allocations, without letting fragmentation of the address space go through the roof. Some highlights: - kernel address space randomization - proper implementation of guardpages - roughly 10% system time reduction during kernel build Tested by alot of people on tech@ and developers. Theo's machines are still happy.
Diffstat (limited to 'lib/libkvm/kvm_proc.c')
-rw-r--r--lib/libkvm/kvm_proc.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index 079592a4d44..3d612966174 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kvm_proc.c,v 1.42 2011/03/12 04:54:28 guenther Exp $ */
+/* $OpenBSD: kvm_proc.c,v 1.43 2011/05/24 15:27:36 ariane Exp $ */
/* $NetBSD: kvm_proc.c,v 1.30 1999/03/24 05:50:50 mrg Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -131,7 +131,7 @@ static void ps_str_e(struct ps_strings *, u_long *, int *);
static char *
_kvm_ureadm(kvm_t *kd, const struct miniproc *p, u_long va, u_long *cnt)
{
- u_long addr, head, offset, slot;
+ u_long addr, offset, slot;
struct vm_anon *anonp, anon;
struct vm_map_entry vme;
struct vm_amap amap;
@@ -140,27 +140,28 @@ _kvm_ureadm(kvm_t *kd, const struct miniproc *p, u_long va, u_long *cnt)
if (kd->swapspc == 0) {
kd->swapspc = _kvm_malloc(kd, kd->nbpg);
if (kd->swapspc == 0)
- return (0);
+ return (NULL);
}
/*
* Look through the address map for the memory object
* that corresponds to the given virtual address.
- * The header just has the entire valid range.
*/
- head = (u_long)&p->p_vmspace->vm_map.header;
- addr = head;
+ addr = (u_long)RB_ROOT(&p->p_vmspace->vm_map.addr);
while (1) {
+ if (addr == 0)
+ return (NULL);
if (KREAD(kd, addr, &vme))
- return (0);
+ return (NULL);
- if (va >= vme.start && va < vme.end &&
- vme.aref.ar_amap != NULL)
+ if (va < vme.start)
+ addr = (u_long)RB_LEFT(&vme, daddrs.addr_entry);
+ else if (va >= vme.end + vme.guard + vme.fspace)
+ addr = (u_long)RB_RIGHT(&vme, daddrs.addr_entry);
+ else if (va >= vme.end)
+ return (NULL);
+ else
break;
-
- addr = (u_long)vme.next;
- if (addr == head)
- return (0);
}
/*