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