Module Name: src Committed By: maxv Date: Thu Nov 9 15:24:39 UTC 2017
Modified Files: src/sys/arch/amd64/stand/prekern: elf.c mm.c prekern.h Log Message: Fill in the page padding. Only .text is pre-filled by the ld script, but this will change in the future. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/amd64/stand/prekern/elf.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/amd64/stand/prekern/mm.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/amd64/stand/prekern/prekern.h 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/elf.c diff -u src/sys/arch/amd64/stand/prekern/elf.c:1.7 src/sys/arch/amd64/stand/prekern/elf.c:1.8 --- src/sys/arch/amd64/stand/prekern/elf.c:1.7 Sun Nov 5 16:26:15 2017 +++ src/sys/arch/amd64/stand/prekern/elf.c Thu Nov 9 15:24:39 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: elf.c,v 1.7 2017/11/05 16:26:15 maxv Exp $ */ +/* $NetBSD: elf.c,v 1.8 2017/11/09 15:24:39 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -345,7 +345,7 @@ elf_get_text(paddr_t *pa, size_t *sz) ASSERT(minpa % PAGE_SIZE == 0); *pa = minpa; - *sz = roundup(maxpa - minpa, PAGE_SIZE); + *sz = maxpa - minpa; } void @@ -392,7 +392,7 @@ elf_get_rodata(paddr_t *pa, size_t *sz) ASSERT(minpa % PAGE_SIZE == 0); *pa = minpa; - *sz = roundup(maxpa - minpa, PAGE_SIZE); + *sz = maxpa - minpa; } void @@ -439,7 +439,7 @@ elf_get_data(paddr_t *pa, size_t *sz) ASSERT(minpa % PAGE_SIZE == 0); *pa = minpa; - *sz = roundup(maxpa - minpa, PAGE_SIZE); + *sz = maxpa - minpa; } void Index: src/sys/arch/amd64/stand/prekern/mm.c diff -u src/sys/arch/amd64/stand/prekern/mm.c:1.8 src/sys/arch/amd64/stand/prekern/mm.c:1.9 --- src/sys/arch/amd64/stand/prekern/mm.c:1.8 Sun Nov 5 16:26:15 2017 +++ src/sys/arch/amd64/stand/prekern/mm.c Thu Nov 9 15:24:39 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mm.c,v 1.8 2017/11/05 16:26:15 maxv Exp $ */ +/* $NetBSD: mm.c,v 1.9 2017/11/09 15:24:39 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -30,6 +30,10 @@ #include "prekern.h" +#define PAD_TEXT 0xCC +#define PAD_RODATA 0x00 +#define PAD_DATA 0x00 + static const pt_entry_t protection_codes[3] = { [MM_PROT_READ] = PG_RO | PG_NX, [MM_PROT_WRITE] = PG_RW | PG_NX, @@ -275,14 +279,15 @@ mm_randva_kregion(size_t size) static void mm_map_segments() { - size_t i, npages, size; + size_t i, npages, size, elfsz; vaddr_t randva; paddr_t pa; /* * Kernel text segment. */ - elf_get_text(&pa, &size); + elf_get_text(&pa, &elfsz); + size = roundup(elfsz, PAGE_SIZE); randva = mm_randva_kregion(size); npages = size / PAGE_SIZE; @@ -293,6 +298,9 @@ mm_map_segments() } elf_build_text(randva, pa); + /* Fill in the padding */ + memset((void *)(randva + elfsz), PAD_TEXT, size - elfsz); + /* Register the values in bootspace */ bootspace.text.va = randva; bootspace.text.pa = pa; @@ -301,7 +309,8 @@ mm_map_segments() /* * Kernel rodata segment. */ - elf_get_rodata(&pa, &size); + elf_get_rodata(&pa, &elfsz); + size = roundup(elfsz, PAGE_SIZE); randva = mm_randva_kregion(size); npages = size / PAGE_SIZE; @@ -312,6 +321,9 @@ mm_map_segments() } elf_build_rodata(randva, pa); + /* Fill in the padding */ + memset((void *)(randva + elfsz), PAD_RODATA, size - elfsz); + /* Register the values in bootspace */ bootspace.rodata.va = randva; bootspace.rodata.pa = pa; @@ -320,7 +332,8 @@ mm_map_segments() /* * Kernel data segment. */ - elf_get_data(&pa, &size); + elf_get_data(&pa, &elfsz); + size = roundup(elfsz, PAGE_SIZE); randva = mm_randva_kregion(size); npages = size / PAGE_SIZE; @@ -331,6 +344,9 @@ mm_map_segments() } elf_build_data(randva, pa); + /* Fill in the padding */ + memset((void *)(randva + elfsz), PAD_DATA, size - elfsz); + /* Register the values in bootspace */ bootspace.data.va = randva; bootspace.data.pa = pa; Index: src/sys/arch/amd64/stand/prekern/prekern.h diff -u src/sys/arch/amd64/stand/prekern/prekern.h:1.4 src/sys/arch/amd64/stand/prekern/prekern.h:1.5 --- src/sys/arch/amd64/stand/prekern/prekern.h:1.4 Sun Nov 5 16:26:15 2017 +++ src/sys/arch/amd64/stand/prekern/prekern.h Thu Nov 9 15:24:39 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: prekern.h,v 1.4 2017/11/05 16:26:15 maxv Exp $ */ +/* $NetBSD: prekern.h,v 1.5 2017/11/09 15:24:39 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -41,7 +41,6 @@ #define MM_PROT_EXECUTE 0x02 #define ASSERT(a) if (!(a)) fatal("ASSERT"); -#define memset(d, v, l) __builtin_memset(d, v, l) #define memcpy(d, v, l) __builtin_memcpy(d, v, l) typedef uint64_t paddr_t; typedef uint64_t vaddr_t; @@ -60,6 +59,18 @@ typedef uint64_t pte_prot_t; /* -------------------------------------------------------------------------- */ +static inline void +memset(void *dst, char c, size_t sz) +{ + char *bdst = dst; + while (sz > 0) { + *bdst = c; + bdst++, sz--; + } +} + +/* -------------------------------------------------------------------------- */ + struct bootspace { struct { vaddr_t va; @@ -123,4 +134,3 @@ void mm_map_kernel(); /* prekern.c */ void fatal(char *); -