Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/amd64/stand/prekern Fill in the page padding. Only ...



details:   https://anonhg.NetBSD.org/src/rev/9a8619a99d78
branches:  trunk
changeset: 357399:9a8619a99d78
user:      maxv <maxv%NetBSD.org@localhost>
date:      Thu Nov 09 15:24:39 2017 +0000

description:
Fill in the page padding. Only .text is pre-filled by the ld script, but
this will change in the future.

diffstat:

 sys/arch/amd64/stand/prekern/elf.c     |   8 ++++----
 sys/arch/amd64/stand/prekern/mm.c      |  26 +++++++++++++++++++++-----
 sys/arch/amd64/stand/prekern/prekern.h |  16 +++++++++++++---
 3 files changed, 38 insertions(+), 12 deletions(-)

diffs (165 lines):

diff -r 2216155a7998 -r 9a8619a99d78 sys/arch/amd64/stand/prekern/elf.c
--- a/sys/arch/amd64/stand/prekern/elf.c        Thu Nov 09 15:03:01 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/elf.c        Thu Nov 09 15:24:39 2017 +0000
@@ -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 @@
        ASSERT(minpa % PAGE_SIZE == 0);
 
        *pa = minpa;
-       *sz = roundup(maxpa - minpa, PAGE_SIZE);
+       *sz = maxpa - minpa;
 }
 
 void
@@ -392,7 +392,7 @@
        ASSERT(minpa % PAGE_SIZE == 0);
 
        *pa = minpa;
-       *sz = roundup(maxpa - minpa, PAGE_SIZE);
+       *sz = maxpa - minpa;
 }
 
 void
@@ -439,7 +439,7 @@
        ASSERT(minpa % PAGE_SIZE == 0);
 
        *pa = minpa;
-       *sz = roundup(maxpa - minpa, PAGE_SIZE);
+       *sz = maxpa - minpa;
 }
 
 void
diff -r 2216155a7998 -r 9a8619a99d78 sys/arch/amd64/stand/prekern/mm.c
--- a/sys/arch/amd64/stand/prekern/mm.c Thu Nov 09 15:03:01 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/mm.c Thu Nov 09 15:24:39 2017 +0000
@@ -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 @@
 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 @@
        }
        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 @@
        /*
         * 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 @@
        }
        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 @@
        /*
         * 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 @@
        }
        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;
diff -r 2216155a7998 -r 9a8619a99d78 sys/arch/amd64/stand/prekern/prekern.h
--- a/sys/arch/amd64/stand/prekern/prekern.h    Thu Nov 09 15:03:01 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/prekern.h    Thu Nov 09 15:24:39 2017 +0000
@@ -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 @@
 
 /* -------------------------------------------------------------------------- */
 
+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 @@
 
 /* prekern.c */
 void fatal(char *);
-



Home | Main Index | Thread Index | Old Index