Module Name: src Committed By: nonaka Date: Fri Jul 26 12:09:48 UTC 2019
Modified Files: src/sys/arch/i386/stand/efiboot: boot.c efimemory.c src/sys/arch/i386/stand/lib: exec.c libi386.h Log Message: Pre-allocate memory for the kernel space at startup. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/i386/stand/efiboot/boot.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/i386/stand/efiboot/efimemory.c cvs rdiff -u -r1.72 -r1.73 src/sys/arch/i386/stand/lib/exec.c cvs rdiff -u -r1.43 -r1.44 src/sys/arch/i386/stand/lib/libi386.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/i386/stand/efiboot/boot.c diff -u src/sys/arch/i386/stand/efiboot/boot.c:1.11 src/sys/arch/i386/stand/efiboot/boot.c:1.12 --- src/sys/arch/i386/stand/efiboot/boot.c:1.11 Thu Jun 20 17:33:31 2019 +++ src/sys/arch/i386/stand/efiboot/boot.c Fri Jul 26 12:09:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.11 2019/06/20 17:33:31 maxv Exp $ */ +/* $NetBSD: boot.c,v 1.12 2019/07/26 12:09:48 nonaka Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -226,40 +226,16 @@ clearit(void) static void bootit(const char *filename, int howto) { - EFI_STATUS status; - EFI_PHYSICAL_ADDRESS bouncebuf; - UINTN npages; - u_long allocsz; if (howto & AB_VERBOSE) printf("booting %s (howto 0x%x)\n", sprint_bootsel(filename), howto); - if (count_netbsd(filename, &allocsz) < 0) { - printf("boot: %s: %s\n", sprint_bootsel(filename), - strerror(errno)); - return; - } - - bouncebuf = EFI_ALLOCATE_MAX_ADDRESS; - npages = EFI_SIZE_TO_PAGES(allocsz); - status = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress, - EfiLoaderData, npages, &bouncebuf); - if (EFI_ERROR(status)) { - printf("boot: %s: %s\n", sprint_bootsel(filename), - strerror(ENOMEM)); - return; - } - - efi_loadaddr = bouncebuf; - if (exec_netbsd(filename, bouncebuf, howto, 0, efi_cleanup) < 0) + if (exec_netbsd(filename, efi_loadaddr, howto, 0, efi_cleanup) < 0) printf("boot: %s: %s\n", sprint_bootsel(filename), strerror(errno)); else printf("boot returned\n"); - - (void) uefi_call_wrapper(BS->FreePages, 2, bouncebuf, npages); - efi_loadaddr = 0; } void Index: src/sys/arch/i386/stand/efiboot/efimemory.c diff -u src/sys/arch/i386/stand/efiboot/efimemory.c:1.5 src/sys/arch/i386/stand/efiboot/efimemory.c:1.6 --- src/sys/arch/i386/stand/efiboot/efimemory.c:1.5 Tue Mar 27 14:15:05 2018 +++ src/sys/arch/i386/stand/efiboot/efimemory.c Fri Jul 26 12:09:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: efimemory.c,v 1.5 2018/03/27 14:15:05 nonaka Exp $ */ +/* $NetBSD: efimemory.c,v 1.6 2019/07/26 12:09:48 nonaka Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -64,6 +64,10 @@ static const char *efimemtypes[] = { "PersistentMemory", }; +#ifndef KERN_LOADSPACE_SIZE +#define KERN_LOADSPACE_SIZE (128 * 1024 * 1024) /* 128MiB */ +#endif + static int getmemtype(EFI_MEMORY_DESCRIPTOR *md) { @@ -231,13 +235,21 @@ void efi_memory_probe(void) { EFI_MEMORY_DESCRIPTOR *mdtop, *md, *next; + EFI_STATUS status; + EFI_PHYSICAL_ADDRESS bouncebuf; UINTN i, n, NoEntries, MapKey, DescriptorSize, MappingSize; UINT32 DescriptorVersion; int memtype; + bouncebuf = EFI_ALLOCATE_MAX_ADDRESS; + status = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress, + EfiLoaderData, EFI_SIZE_TO_PAGES(KERN_LOADSPACE_SIZE), &bouncebuf); + if (EFI_ERROR(status)) + panic("couldn't allocate kernel space."); + efi_loadaddr = bouncebuf; + mdtop = efi_memory_get_map(&NoEntries, &MapKey, &DescriptorSize, &DescriptorVersion, false); - printf(" mem["); for (i = 0, n = 0, md = mdtop; i < NoEntries; i++, md = next) { next = NextMemoryDescriptor(md, DescriptorSize); Index: src/sys/arch/i386/stand/lib/exec.c diff -u src/sys/arch/i386/stand/lib/exec.c:1.72 src/sys/arch/i386/stand/lib/exec.c:1.73 --- src/sys/arch/i386/stand/lib/exec.c:1.72 Mon Jun 24 13:58:24 2019 +++ src/sys/arch/i386/stand/lib/exec.c Fri Jul 26 12:09:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: exec.c,v 1.72 2019/06/24 13:58:24 pgoyette Exp $ */ +/* $NetBSD: exec.c,v 1.73 2019/07/26 12:09:48 nonaka Exp $ */ /* * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -573,64 +573,6 @@ out: return -1; } -int -count_netbsd(const char *file, u_long *rsz) -{ - u_long marks[MARK_MAX]; - char kdev[64]; - char base_path[64] = "/"; - struct stat st; - boot_module_t *bm; - 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)); - if ((fd = loadfile(file, marks, COUNT_KERNEL | LOAD_NOTE)) == -1) - return -1; - close(fd); - marks[MARK_END] = (((u_long) marks[MARK_END] + sizeof(int) - 1)) & - (-sizeof(int)); - sz = marks[MARK_END]; - - /* The modules must be allocated after the kernel */ - if (boot_modules_enabled) { - extract_device(file, kdev, sizeof(kdev)); - module_base_path(base_path, sizeof(base_path)); - - /* If the root fs type is unusual, load its module. */ - if (fsmod != NULL) - module_add_split(fsmod, BM_TYPE_KMOD); - - for (bm = boot_modules; bm; bm = bm->bm_next) { - fd = module_open(bm, 0, kdev, base_path, false); - if (fd == -1) - continue; - sz = (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); - err = fstat(fd, &st); - if (err == -1 || st.st_size == -1) { - close(fd); - continue; - } - sz += st.st_size; - close(fd); - } - } - - *rsz = sz; - return 0; -} - static void extract_device(const char *path, char *buf, size_t buflen) { Index: src/sys/arch/i386/stand/lib/libi386.h diff -u src/sys/arch/i386/stand/lib/libi386.h:1.43 src/sys/arch/i386/stand/lib/libi386.h:1.44 --- src/sys/arch/i386/stand/lib/libi386.h:1.43 Mon Jun 24 13:58:24 2019 +++ src/sys/arch/i386/stand/lib/libi386.h Fri Jul 26 12:09:48 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: libi386.h,v 1.43 2019/06/24 13:58:24 pgoyette Exp $ */ +/* $NetBSD: libi386.h,v 1.44 2019/07/26 12:09:48 nonaka Exp $ */ /* * Copyright (c) 1996 @@ -43,7 +43,6 @@ void multiboot(physaddr_t, physaddr_t, p int exec_netbsd(const char *, physaddr_t, int, int, void (*)(void)); int exec_multiboot(const char *, char *); -int count_netbsd(const char *, u_long *); void delay(int); int getbasemem(void);