Module Name: src Committed By: maxv Date: Thu Jun 20 17:33:31 UTC 2019
Modified Files: src/doc: TODO.kaslr src/sys/arch/i386/stand/efiboot: boot.c src/sys/arch/i386/stand/lib: exec.c src/sys/lib/libsa: loadfile_elf32.c Log Message: Add KASLR support in UEFI. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/doc/TODO.kaslr cvs rdiff -u -r1.10 -r1.11 src/sys/arch/i386/stand/efiboot/boot.c cvs rdiff -u -r1.69 -r1.70 src/sys/arch/i386/stand/lib/exec.c cvs rdiff -u -r1.53 -r1.54 src/sys/lib/libsa/loadfile_elf32.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/doc/TODO.kaslr diff -u src/doc/TODO.kaslr:1.9 src/doc/TODO.kaslr:1.10 --- src/doc/TODO.kaslr:1.9 Sat Nov 24 17:54:18 2018 +++ src/doc/TODO.kaslr Thu Jun 20 17:33:30 2019 @@ -46,4 +46,4 @@ -- Sort the kernel sections by size, from largest to smallest, to save memory. --- Add the "pkboot" command in the EFI bootloader. +[DONE] -- Add the "pkboot" command in the EFI bootloader. Index: src/sys/arch/i386/stand/efiboot/boot.c diff -u src/sys/arch/i386/stand/efiboot/boot.c:1.10 src/sys/arch/i386/stand/efiboot/boot.c:1.11 --- src/sys/arch/i386/stand/efiboot/boot.c:1.10 Wed Apr 11 10:32:09 2018 +++ src/sys/arch/i386/stand/efiboot/boot.c Thu Jun 20 17:33:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.10 2018/04/11 10:32:09 nonaka Exp $ */ +/* $NetBSD: boot.c,v 1.11 2019/06/20 17:33:31 maxv Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -62,6 +62,7 @@ static const char * const names[][2] = { void command_help(char *); void command_quit(char *); void command_boot(char *); +void command_pkboot(char *); void command_consdev(char *); void command_dev(char *); void command_devpath(char *); @@ -84,6 +85,7 @@ const struct bootblk_command commands[] { "?", command_help }, { "quit", command_quit }, { "boot", command_boot }, + { "pkboot", command_pkboot }, { "consdev", command_consdev }, { "dev", command_dev }, { "devpath", command_devpath }, @@ -362,7 +364,8 @@ command_help(char *arg) printf("commands are:\n" "boot [xdNx:][filename] [-12acdqsvxz]\n" - " (ex. \"hd0a:netbsd.old -s\"\n" + " (ex. \"hd0a:netbsd.old -s\")\n" + "pkboot [xdNx:][filename] [-12acdqsvxz]\n" "dev [xd[N[x]]:]\n" "consdev {pc|com[0123][,{speed}]|com,{ioport}[,{speed}]}\n" "devpath\n" @@ -435,6 +438,15 @@ command_boot(char *arg) } void +command_pkboot(char *arg) +{ + extern int has_prekern; + has_prekern = 1; + command_boot(arg); + has_prekern = 0; +} + +void command_dev(char *arg) { static char savedevname[MAXDEVNAME + 1]; Index: src/sys/arch/i386/stand/lib/exec.c diff -u src/sys/arch/i386/stand/lib/exec.c:1.69 src/sys/arch/i386/stand/lib/exec.c:1.70 --- src/sys/arch/i386/stand/lib/exec.c:1.69 Sat Oct 7 10:26:38 2017 +++ src/sys/arch/i386/stand/lib/exec.c Thu Jun 20 17:33:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: exec.c,v 1.69 2017/10/07 10:26:38 maxv Exp $ */ +/* $NetBSD: exec.c,v 1.70 2019/06/20 17:33:31 maxv Exp $ */ /* * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -275,6 +275,7 @@ common_load_prekern(const char *file, u_ { paddr_t kernpa_start, kernpa_end; char prekernpath[] = "/prekern"; + u_long prekern_start; int fd, flags; *extmem = getextmem(); @@ -283,13 +284,17 @@ common_load_prekern(const char *file, u_ marks[MARK_START] = loadaddr; /* Load the prekern (static) */ - flags = LOAD_KERNEL & ~(LOAD_HDR|COUNT_HDR|LOAD_SYM|COUNT_SYM); + flags = LOAD_KERNEL & ~(LOAD_HDR|LOAD_SYM); if ((fd = loadfile(prekernpath, marks, flags)) == -1) return EIO; close(fd); - marks[MARK_END] = (1UL << 21); /* the kernel starts at 2MB XXX */ - kernpa_start = marks[MARK_END]; + prekern_start = marks[MARK_START]; + + /* The kernel starts at 2MB. */ + marks[MARK_START] = loadaddr; + marks[MARK_END] = loadaddr + (1UL << 21); + kernpa_start = (1UL << 21); /* Load the kernel (dynamic) */ flags = (LOAD_KERNEL | LOAD_DYN) & ~(floppy ? LOAD_BACKWARDS : 0); @@ -297,7 +302,7 @@ common_load_prekern(const char *file, u_ return EIO; close(fd); - kernpa_end = marks[MARK_END]; + kernpa_end = marks[MARK_END] - loadaddr; /* If the root fs type is unusual, load its module. */ if (fsmod != NULL) @@ -319,6 +324,7 @@ common_load_prekern(const char *file, u_ bi_getmemmap(); #endif + marks[MARK_START] = prekern_start; marks[MARK_END] = (((u_long)marks[MARK_END] + sizeof(int) - 1)) & (-sizeof(int)); image_end = marks[MARK_END]; @@ -518,7 +524,7 @@ exec_netbsd(const char *file, physaddr_t } efi_kernel_start = marks[MARK_START]; - efi_kernel_size = image_end - efi_loadaddr - efi_kernel_start; + efi_kernel_size = image_end - (efi_loadaddr + efi_kernel_start); #endif startprog(marks[MARK_ENTRY], BOOT_NARGS, boot_argv, x86_trunc_page(basemem * 1024)); @@ -541,6 +547,15 @@ count_netbsd(const char *file, u_long *r u_long sz; int err, fd; + if (has_prekern) { + /* + * Hardcoded for now. Need to count both the prekern and the + * kernel. 128MB is enough in all cases, so use that. + */ + *rsz = (128UL << 20); + return 0; + } + howto = AB_SILENT; memset(marks, 0, sizeof(marks)); Index: src/sys/lib/libsa/loadfile_elf32.c diff -u src/sys/lib/libsa/loadfile_elf32.c:1.53 src/sys/lib/libsa/loadfile_elf32.c:1.54 --- src/sys/lib/libsa/loadfile_elf32.c:1.53 Thu Aug 23 17:35:42 2018 +++ src/sys/lib/libsa/loadfile_elf32.c Thu Jun 20 17:33:30 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: loadfile_elf32.c,v 1.53 2018/08/23 17:35:42 jmcneill Exp $ */ +/* $NetBSD: loadfile_elf32.c,v 1.54 2019/06/20 17:33:30 maxv Exp $ */ /* * Copyright (c) 1997, 2008, 2017 The NetBSD Foundation, Inc. @@ -340,7 +340,7 @@ ELFNAMEEND(readfile_global)(int fd, u_lo static int ELFNAMEEND(loadfile_dynamic)(int fd, Elf_Ehdr *elf, u_long *marks, int flags) { - const u_long offset = 0; + const u_long offset = marks[MARK_START]; Elf_Shdr *shdr; Elf_Addr shpp, addr; int i, j, loaded; @@ -348,7 +348,7 @@ ELFNAMEEND(loadfile_dynamic)(int fd, Elf Elf_Addr maxp, elfp = 0; int ret; - maxp = marks[MARK_END]; + maxp = marks[MARK_END] - offset; internalize_ehdr(elf->e_ident[EI_DATA], elf);