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 Clean up and add some ASSERTs.
details: https://anonhg.NetBSD.org/src/rev/380fa5db4c00
branches: trunk
changeset: 357684:380fa5db4c00
user: maxv <maxv%NetBSD.org@localhost>
date: Tue Nov 21 07:56:05 2017 +0000
description:
Clean up and add some ASSERTs.
diffstat:
sys/arch/amd64/stand/prekern/elf.c | 19 +++++-
sys/arch/amd64/stand/prekern/mm.c | 92 ++++++++++++++-------------------
sys/arch/amd64/stand/prekern/prekern.h | 3 +-
3 files changed, 55 insertions(+), 59 deletions(-)
diffs (235 lines):
diff -r 79bdff7bce7c -r 380fa5db4c00 sys/arch/amd64/stand/prekern/elf.c
--- a/sys/arch/amd64/stand/prekern/elf.c Tue Nov 21 07:48:07 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/elf.c Tue Nov 21 07:56:05 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: elf.c,v 1.16 2017/11/17 07:07:52 maxv Exp $ */
+/* $NetBSD: elf.c,v 1.17 2017/11/21 07:56:05 maxv Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -347,6 +347,9 @@
if (i == eif.ehdr->e_shnum) {
fatal("elf_build_boot: symtab not found");
}
+ if (eif.shdr[i].sh_offset == 0) {
+ fatal("elf_build_boot: symtab not loaded");
+ }
eif.symtab = (Elf_Sym *)((uint8_t *)eif.ehdr + eif.shdr[i].sh_offset);
eif.symcnt = eif.shdr[i].sh_size / sizeof(Elf_Sym);
@@ -358,6 +361,9 @@
if (eif.shdr[j].sh_type != SHT_STRTAB) {
fatal("elf_build_boot: wrong strtab type");
}
+ if (eif.shdr[j].sh_offset == 0) {
+ fatal("elf_build_boot: strtab not loaded");
+ }
eif.strtab = (char *)((uint8_t *)eif.ehdr + eif.shdr[j].sh_offset);
eif.strsz = eif.shdr[j].sh_size;
}
@@ -380,6 +386,7 @@
eif.shdr[i].sh_type != SHT_PROGBITS) {
continue;
}
+ ASSERT(eif.shdr[i].sh_offset != 0);
secva = baseva + eif.shdr[i].sh_offset;
for (j = 0; j < eif.symcnt; j++) {
sym = &eif.symtab[j];
@@ -400,9 +407,10 @@
size_t secidx, nrel;
uintptr_t base;
- if (eif.shdr[i].sh_type != SHT_REL)
+ if (eif.shdr[i].sh_type != SHT_REL) {
continue;
-
+ }
+ ASSERT(eif.shdr[i].sh_offset != 0);
reltab = (Elf_Rel *)((uint8_t *)eif.ehdr + eif.shdr[i].sh_offset);
nrel = eif.shdr[i].sh_size / sizeof(Elf_Rel);
@@ -428,9 +436,10 @@
size_t secidx, nrela;
uintptr_t base;
- if (eif.shdr[i].sh_type != SHT_RELA)
+ if (eif.shdr[i].sh_type != SHT_RELA) {
continue;
-
+ }
+ ASSERT(eif.shdr[i].sh_offset != 0);
relatab = (Elf_Rela *)((uint8_t *)eif.ehdr + eif.shdr[i].sh_offset);
nrela = eif.shdr[i].sh_size / sizeof(Elf_Rela);
diff -r 79bdff7bce7c -r 380fa5db4c00 sys/arch/amd64/stand/prekern/mm.c
--- a/sys/arch/amd64/stand/prekern/mm.c Tue Nov 21 07:48:07 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/mm.c Tue Nov 21 07:56:05 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mm.c,v 1.17 2017/11/15 20:45:16 maxv Exp $ */
+/* $NetBSD: mm.c,v 1.18 2017/11/21 07:56:05 maxv Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -36,7 +36,7 @@
#define ELFROUND 64
-static const int pads[4] = {
+static const uint8_t pads[4] = {
[BTSEG_NONE] = 0x00,
[BTSEG_TEXT] = 0xCC,
[BTSEG_RODATA] = 0x00,
@@ -107,12 +107,6 @@
return ((pte & PG_V) != 0);
}
-paddr_t
-mm_vatopa(vaddr_t va)
-{
- return (PTE_BASE[pl1_i(va)] & PG_FRAME);
-}
-
static void
mm_mprotect(vaddr_t startva, size_t size, pte_prot_t prot)
{
@@ -169,9 +163,7 @@
size_t L4e_idx, L3e_idx, L2e_idx;
paddr_t pa;
- /*
- * Build L4.
- */
+ /* Build L4. */
L4e_idx = pl4_i(startva);
nL4e = mm_nentries_range(startva, endva, NBPD_L4);
ASSERT(L4e_idx == 511);
@@ -181,9 +173,7 @@
L4_BASE[L4e_idx] = pa | PG_V | PG_RW;
}
- /*
- * Build L3.
- */
+ /* Build L3. */
L3e_idx = pl3_i(startva);
nL3e = mm_nentries_range(startva, endva, NBPD_L3);
for (i = 0; i < nL3e; i++) {
@@ -194,9 +184,7 @@
L3_BASE[L3e_idx+i] = pa | PG_V | PG_RW;
}
- /*
- * Build L2.
- */
+ /* Build L2. */
L2e_idx = pl2_i(startva);
nL2e = mm_nentries_range(startva, endva, NBPD_L2);
for (i = 0; i < nL2e; i++) {
@@ -215,39 +203,6 @@
return rdtsc();
}
-static void
-mm_map_head(void)
-{
- size_t i, npages, size;
- uint64_t rnd;
- vaddr_t randva;
-
- /*
- * To get the size of the head, we give a look at the read-only
- * mapping of the kernel we created in locore. We're identity mapped,
- * so kernpa = kernva.
- */
- size = elf_get_head_size((vaddr_t)kernpa_start);
- npages = size / PAGE_SIZE;
-
- rnd = mm_rand_num64();
- randva = rounddown(HEAD_WINDOW_BASE + rnd % (HEAD_WINDOW_SIZE - size),
- PAGE_SIZE);
- mm_map_tree(randva, randva + size);
-
- /* Enter the area and build the ELF info */
- for (i = 0; i < npages; i++) {
- mm_enter_pa(kernpa_start + i * PAGE_SIZE,
- randva + i * PAGE_SIZE, MM_PROT_READ|MM_PROT_WRITE);
- }
- elf_build_head(randva);
-
- /* Register the values in bootspace */
- bootspace.head.va = randva;
- bootspace.head.pa = kernpa_start;
- bootspace.head.sz = size;
-}
-
static vaddr_t
mm_randva_kregion(size_t size, size_t pagesz)
{
@@ -352,6 +307,39 @@
return offset;
}
+static void
+mm_map_head(void)
+{
+ size_t i, npages, size;
+ uint64_t rnd;
+ vaddr_t randva;
+
+ /*
+ * To get the size of the head, we give a look at the read-only
+ * mapping of the kernel we created in locore. We're identity mapped,
+ * so kernpa = kernva.
+ */
+ size = elf_get_head_size((vaddr_t)kernpa_start);
+ npages = size / PAGE_SIZE;
+
+ rnd = mm_rand_num64();
+ randva = rounddown(HEAD_WINDOW_BASE + rnd % (HEAD_WINDOW_SIZE - size),
+ PAGE_SIZE);
+ mm_map_tree(randva, randva + size);
+
+ /* Enter the area and build the ELF info */
+ for (i = 0; i < npages; i++) {
+ mm_enter_pa(kernpa_start + i * PAGE_SIZE,
+ randva + i * PAGE_SIZE, MM_PROT_READ|MM_PROT_WRITE);
+ }
+ elf_build_head(randva);
+
+ /* Register the values in bootspace */
+ bootspace.head.va = randva;
+ bootspace.head.pa = kernpa_start;
+ bootspace.head.sz = size;
+}
+
vaddr_t
mm_map_segment(int segtype, paddr_t pa, size_t elfsz, size_t elfalign)
{
@@ -434,8 +422,8 @@
}
/*
- * There are five independent regions: head, text, rodata, data, boot. They are
- * all mapped at random VAs.
+ * There is a variable number of independent regions: one head, several kernel
+ * segments, one boot. They are all mapped at random VAs.
*
* Head contains the ELF Header and ELF Section Headers, and we use them to
* map the rest of the regions. Head must be placed in memory *before* the
diff -r 79bdff7bce7c -r 380fa5db4c00 sys/arch/amd64/stand/prekern/prekern.h
--- a/sys/arch/amd64/stand/prekern/prekern.h Tue Nov 21 07:48:07 2017 +0000
+++ b/sys/arch/amd64/stand/prekern/prekern.h Tue Nov 21 07:56:05 2017 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: prekern.h,v 1.15 2017/11/15 20:45:16 maxv Exp $ */
+/* $NetBSD: prekern.h,v 1.16 2017/11/21 07:56:05 maxv Exp $ */
/*
* Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
@@ -104,7 +104,6 @@
/* mm.c */
void mm_init(paddr_t);
-paddr_t mm_vatopa(vaddr_t);
void mm_bootspace_mprotect(void);
vaddr_t mm_map_segment(int, paddr_t, size_t, size_t);
void mm_map_kernel(void);
Home |
Main Index |
Thread Index |
Old Index