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 */