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 *);
-

Reply via email to