Module Name: src Committed By: maxv Date: Sun Nov 5 16:26:15 UTC 2017
Modified Files: src/sys/arch/amd64/stand/prekern: elf.c mm.c prekern.c prekern.h Log Message: Mprotect the segments in mm.c using bootspace, and remove the now unused fields of elfinfo. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/amd64/stand/prekern/elf.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/amd64/stand/prekern/mm.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/amd64/stand/prekern/prekern.c \ 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.6 src/sys/arch/amd64/stand/prekern/elf.c:1.7 --- src/sys/arch/amd64/stand/prekern/elf.c:1.6 Wed Nov 1 17:00:17 2017 +++ src/sys/arch/amd64/stand/prekern/elf.c Sun Nov 5 16:26:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: elf.c,v 1.6 2017/11/01 17:00:17 maxv Exp $ */ +/* $NetBSD: elf.c,v 1.7 2017/11/05 16:26:15 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -42,18 +42,6 @@ struct elfinfo { size_t symcnt; char *strtab; size_t strsz; - struct { - vaddr_t va; - size_t sz; - } text; - struct { - vaddr_t va; - size_t sz; - } rodata; - struct { - vaddr_t va; - size_t sz; - } data; }; extern paddr_t kernpa_start, kernpa_end; @@ -361,15 +349,12 @@ elf_get_text(paddr_t *pa, size_t *sz) } void -elf_build_text(vaddr_t textva, paddr_t textpa, size_t textsz) +elf_build_text(vaddr_t textva, paddr_t textpa) { const paddr_t basepa = kernpa_start; const vaddr_t headva = (vaddr_t)eif.ehdr; size_t i, offtext; - eif.text.va = textva; - eif.text.sz = textsz; - for (i = 0; i < eif.ehdr->e_shnum; i++) { if (!elf_section_is_text(&eif.shdr[i])) { continue; @@ -379,7 +364,7 @@ elf_build_text(vaddr_t textva, paddr_t t offtext = basepa + eif.shdr[i].sh_offset - textpa; /* We want (headva + sh_offset) to be the VA of the section. */ - eif.shdr[i].sh_offset = (eif.text.va + offtext - headva); + eif.shdr[i].sh_offset = (textva + offtext - headva); } } @@ -411,15 +396,12 @@ elf_get_rodata(paddr_t *pa, size_t *sz) } void -elf_build_rodata(vaddr_t rodatava, paddr_t rodatapa, size_t rodatasz) +elf_build_rodata(vaddr_t rodatava, paddr_t rodatapa) { const paddr_t basepa = kernpa_start; const vaddr_t headva = (vaddr_t)eif.ehdr; size_t i, offrodata; - eif.rodata.va = rodatava; - eif.rodata.sz = rodatasz; - for (i = 0; i < eif.ehdr->e_shnum; i++) { if (!elf_section_is_rodata(&eif.shdr[i])) { continue; @@ -429,7 +411,7 @@ elf_build_rodata(vaddr_t rodatava, paddr offrodata = basepa + eif.shdr[i].sh_offset - rodatapa; /* We want (headva + sh_offset) to be the VA of the section. */ - eif.shdr[i].sh_offset = (eif.rodata.va + offrodata - headva); + eif.shdr[i].sh_offset = (rodatava + offrodata - headva); } } @@ -461,15 +443,12 @@ elf_get_data(paddr_t *pa, size_t *sz) } void -elf_build_data(vaddr_t datava, paddr_t datapa, size_t datasz) +elf_build_data(vaddr_t datava, paddr_t datapa) { const paddr_t basepa = kernpa_start; const vaddr_t headva = (vaddr_t)eif.ehdr; size_t i, offdata; - eif.data.va = datava; - eif.data.sz = datasz; - for (i = 0; i < eif.ehdr->e_shnum; i++) { if (!elf_section_is_data(&eif.shdr[i])) { continue; @@ -479,7 +458,7 @@ elf_build_data(vaddr_t datava, paddr_t d offdata = basepa + eif.shdr[i].sh_offset - datapa; /* We want (headva + sh_offset) to be the VA of the section. */ - eif.shdr[i].sh_offset = (eif.data.va + offdata - headva); + eif.shdr[i].sh_offset = (datava + offdata - headva); } } @@ -644,15 +623,6 @@ elf_kernel_reloc() print_state(true, "Entry point found"); - /* - * Remap the code segments with proper permissions. - */ - mm_mprotect(eif.text.va, eif.text.sz, MM_PROT_READ|MM_PROT_EXECUTE); - mm_mprotect(eif.rodata.va, eif.rodata.sz, MM_PROT_READ); - mm_mprotect(eif.data.va, eif.data.sz, MM_PROT_READ|MM_PROT_WRITE); - - print_state(true, "Segments protection updated"); - return ent; } Index: src/sys/arch/amd64/stand/prekern/mm.c diff -u src/sys/arch/amd64/stand/prekern/mm.c:1.7 src/sys/arch/amd64/stand/prekern/mm.c:1.8 --- src/sys/arch/amd64/stand/prekern/mm.c:1.7 Sun Oct 29 11:38:43 2017 +++ src/sys/arch/amd64/stand/prekern/mm.c Sun Nov 5 16:26:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: mm.c,v 1.7 2017/10/29 11:38:43 maxv Exp $ */ +/* $NetBSD: mm.c,v 1.8 2017/11/05 16:26:15 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -96,7 +96,7 @@ mm_vatopa(vaddr_t va) return (PTE_BASE[pl1_i(va)] & PG_FRAME); } -void +static void mm_mprotect(vaddr_t startva, size_t size, int prot) { size_t i, npages; @@ -114,6 +114,20 @@ mm_mprotect(vaddr_t startva, size_t size } } +void +mm_bootspace_mprotect() +{ + /* + * Remap the kernel segments with proper permissions. + */ + mm_mprotect(bootspace.text.va, bootspace.text.sz, + MM_PROT_READ|MM_PROT_EXECUTE); + mm_mprotect(bootspace.rodata.va, bootspace.rodata.sz, + MM_PROT_READ); + + print_state(true, "Segments protection updated"); +} + static size_t mm_nentries_range(vaddr_t startva, vaddr_t endva, size_t pgsz) { @@ -277,7 +291,7 @@ mm_map_segments() mm_enter_pa(pa + i * PAGE_SIZE, randva + i * PAGE_SIZE, MM_PROT_READ|MM_PROT_WRITE); } - elf_build_text(randva, pa, size); + elf_build_text(randva, pa); /* Register the values in bootspace */ bootspace.text.va = randva; @@ -296,7 +310,7 @@ mm_map_segments() mm_enter_pa(pa + i * PAGE_SIZE, randva + i * PAGE_SIZE, MM_PROT_READ|MM_PROT_WRITE); } - elf_build_rodata(randva, pa, size); + elf_build_rodata(randva, pa); /* Register the values in bootspace */ bootspace.rodata.va = randva; @@ -315,7 +329,7 @@ mm_map_segments() mm_enter_pa(pa + i * PAGE_SIZE, randva + i * PAGE_SIZE, MM_PROT_READ|MM_PROT_WRITE); } - elf_build_data(randva, pa, size); + elf_build_data(randva, pa); /* Register the values in bootspace */ bootspace.data.va = randva; Index: src/sys/arch/amd64/stand/prekern/prekern.c diff -u src/sys/arch/amd64/stand/prekern/prekern.c:1.3 src/sys/arch/amd64/stand/prekern/prekern.c:1.4 --- src/sys/arch/amd64/stand/prekern/prekern.c:1.3 Sun Oct 29 11:28:30 2017 +++ src/sys/arch/amd64/stand/prekern/prekern.c Sun Nov 5 16:26:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: prekern.c,v 1.3 2017/10/29 11:28:30 maxv Exp $ */ +/* $NetBSD: prekern.c,v 1.4 2017/11/05 16:26:15 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -338,6 +338,7 @@ init_prekern(paddr_t pa_start) */ mm_map_kernel(); ent = elf_kernel_reloc(); + mm_bootspace_mprotect(); /* * Build the arguments. Index: src/sys/arch/amd64/stand/prekern/prekern.h diff -u src/sys/arch/amd64/stand/prekern/prekern.h:1.3 src/sys/arch/amd64/stand/prekern/prekern.h:1.4 --- src/sys/arch/amd64/stand/prekern/prekern.h:1.3 Sun Oct 29 11:28:30 2017 +++ src/sys/arch/amd64/stand/prekern/prekern.h Sun Nov 5 16:26:15 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: prekern.h,v 1.3 2017/10/29 11:28:30 maxv Exp $ */ +/* $NetBSD: prekern.h,v 1.4 2017/11/05 16:26:15 maxv Exp $ */ /* * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved. @@ -102,11 +102,11 @@ void print_banner(); size_t elf_get_head_size(vaddr_t); void elf_build_head(vaddr_t); void elf_get_text(paddr_t *, size_t *); -void elf_build_text(vaddr_t, paddr_t, size_t); +void elf_build_text(vaddr_t, paddr_t); void elf_get_rodata(paddr_t *, size_t *); -void elf_build_rodata(vaddr_t, paddr_t, size_t); +void elf_build_rodata(vaddr_t, paddr_t); void elf_get_data(paddr_t *, size_t *); -void elf_build_data(vaddr_t, paddr_t, size_t); +void elf_build_data(vaddr_t, paddr_t); void elf_build_boot(vaddr_t, paddr_t); vaddr_t elf_kernel_reloc(); @@ -118,7 +118,7 @@ void jump_kernel(); /* mm.c */ void mm_init(paddr_t); paddr_t mm_vatopa(vaddr_t); -void mm_mprotect(vaddr_t, size_t, int); +void mm_bootspace_mprotect(); void mm_map_kernel(); /* prekern.c */