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;