Module Name:    src
Committed By:   maxv
Date:           Tue Nov 21 07:56:05 UTC 2017

Modified Files:
        src/sys/arch/amd64/stand/prekern: elf.c mm.c prekern.h

Log Message:
Clean up and add some ASSERTs.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/amd64/stand/prekern/elf.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/amd64/stand/prekern/mm.c
cvs rdiff -u -r1.15 -r1.16 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.16 src/sys/arch/amd64/stand/prekern/elf.c:1.17
--- src/sys/arch/amd64/stand/prekern/elf.c:1.16	Fri Nov 17 07:07:52 2017
+++ src/sys/arch/amd64/stand/prekern/elf.c	Tue Nov 21 07:56:05 2017
@@ -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 @@ elf_build_boot(vaddr_t bootva, paddr_t b
 	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 @@ elf_build_boot(vaddr_t bootva, paddr_t b
 	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 @@ elf_kernel_reloc(void)
 		    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 @@ elf_kernel_reloc(void)
 		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 @@ elf_kernel_reloc(void)
 		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);
 

Index: src/sys/arch/amd64/stand/prekern/mm.c
diff -u src/sys/arch/amd64/stand/prekern/mm.c:1.17 src/sys/arch/amd64/stand/prekern/mm.c:1.18
--- src/sys/arch/amd64/stand/prekern/mm.c:1.17	Wed Nov 15 20:45:16 2017
+++ src/sys/arch/amd64/stand/prekern/mm.c	Tue Nov 21 07:56:05 2017
@@ -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 @@ mm_pte_is_valid(pt_entry_t pte)
 	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 @@ mm_map_tree(vaddr_t startva, vaddr_t end
 	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 @@ mm_map_tree(vaddr_t startva, vaddr_t end
 		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 @@ mm_map_tree(vaddr_t startva, vaddr_t end
 		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 @@ mm_rand_num64(void)
 	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 @@ mm_shift_segment(vaddr_t va, size_t page
 	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 @@ mm_map_boot(void)
 }
 
 /*
- * 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

Index: src/sys/arch/amd64/stand/prekern/prekern.h
diff -u src/sys/arch/amd64/stand/prekern/prekern.h:1.15 src/sys/arch/amd64/stand/prekern/prekern.h:1.16
--- src/sys/arch/amd64/stand/prekern/prekern.h:1.15	Wed Nov 15 20:45:16 2017
+++ src/sys/arch/amd64/stand/prekern/prekern.h	Tue Nov 21 07:56:05 2017
@@ -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 @@ void jump_kernel(vaddr_t);
 
 /* 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);

Reply via email to