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;

Reply via email to