Module Name: src
Committed By: maxv
Date: Sat Nov 11 13:50:57 UTC 2017
Modified Files:
src/sys/arch/amd64/stand/prekern: mm.c
Log Message:
Detect collisions from bootspace directly.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/amd64/stand/prekern/mm.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/stand/prekern/mm.c
diff -u src/sys/arch/amd64/stand/prekern/mm.c:1.10 src/sys/arch/amd64/stand/prekern/mm.c:1.11
--- src/sys/arch/amd64/stand/prekern/mm.c:1.10 Sat Nov 11 12:51:06 2017
+++ src/sys/arch/amd64/stand/prekern/mm.c Sat Nov 11 13:50:57 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: mm.c,v 1.10 2017/11/11 12:51:06 maxv Exp $ */
+/* $NetBSD: mm.c,v 1.11 2017/11/11 13:50:57 maxv Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -238,18 +238,12 @@ mm_map_head()
static vaddr_t
mm_randva_kregion(size_t size)
{
- static struct {
- vaddr_t sva;
- vaddr_t eva;
- } regions[4];
- static size_t idx = 0;
+ vaddr_t sva, eva;
vaddr_t randva;
uint64_t rnd;
size_t i;
bool ok;
- ASSERT(idx < 4);
-
while (1) {
rnd = mm_rand_num64();
randva = rounddown(KASLR_WINDOW_BASE +
@@ -257,14 +251,18 @@ mm_randva_kregion(size_t size)
/* Detect collisions */
ok = true;
- for (i = 0; i < idx; i++) {
- if ((regions[i].sva <= randva) &&
- (randva < regions[i].eva)) {
+ for (i = 0; i < BTSPACE_NSEGS; i++) {
+ if (bootspace.segs[i].type == BTSEG_NONE) {
+ continue;
+ }
+ sva = bootspace.segs[i].va;
+ eva = sva + bootspace.segs[i].sz;
+
+ if ((sva <= randva) && (randva < eva)) {
ok = false;
break;
}
- if ((regions[i].sva < randva + size) &&
- (randva + size <= regions[i].eva)) {
+ if ((sva < randva + size) && (randva + size <= eva)) {
ok = false;
break;
}
@@ -274,10 +272,6 @@ mm_randva_kregion(size_t size)
}
}
- regions[idx].eva = randva;
- regions[idx].sva = randva + size;
- idx++;
-
mm_map_tree(randva, randva + size);
return randva;