Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/stand/efiboot Make EFI runtime services available to the...



details:   https://anonhg.NetBSD.org/src/rev/ca6dd596893f
branches:  trunk
changeset: 836627:ca6dd596893f
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sun Oct 28 10:17:47 2018 +0000

description:
Make EFI runtime services available to the kernel. Bump version to 1.5.

diffstat:

 sys/stand/efiboot/bootaa64/Makefile |   4 +-
 sys/stand/efiboot/efiacpi.c         |   5 +-
 sys/stand/efiboot/efiboot.c         |  84 +++++++++++++++++++++++++++++++++++-
 sys/stand/efiboot/exec.c            |   8 ++-
 sys/stand/efiboot/version           |   3 +-
 5 files changed, 95 insertions(+), 9 deletions(-)

diffs (198 lines):

diff -r f5f0bce37003 -r ca6dd596893f sys/stand/efiboot/bootaa64/Makefile
--- a/sys/stand/efiboot/bootaa64/Makefile       Sun Oct 28 00:44:37 2018 +0000
+++ b/sys/stand/efiboot/bootaa64/Makefile       Sun Oct 28 10:17:47 2018 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.4 2018/10/21 00:57:38 jmcneill Exp $
+# $NetBSD: Makefile,v 1.5 2018/10/28 10:17:47 jmcneill Exp $
 
 PROG=          bootaa64.efi
 OBJFMT=                binary
@@ -9,6 +9,8 @@
 
 COPTS+=                -mgeneral-regs-only -fno-jump-tables
 CFLAGS+=       -DEFIBOOT_ALIGN=0x200000
+CFLAGS+=       -DEFIBOOT_RUNTIME_ADDRESS=0xffff800000000000L
+CFLAGS+=       -DEFIBOOT_RUNTIME_SIZE=0x40000000UL
 CFLAGS+=       -DEFIBOOT_ACPI
 
 .include "${.CURDIR}/../Makefile.efiboot"
diff -r f5f0bce37003 -r ca6dd596893f sys/stand/efiboot/efiacpi.c
--- a/sys/stand/efiboot/efiacpi.c       Sun Oct 28 00:44:37 2018 +0000
+++ b/sys/stand/efiboot/efiacpi.c       Sun Oct 28 10:17:47 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efiacpi.c,v 1.2 2018/10/23 10:12:59 jmcneill Exp $ */
+/* $NetBSD: efiacpi.c,v 1.3 2018/10/28 10:17:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -103,6 +103,9 @@
        fdt_setprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,acpi-root-table", (uint64_t)(uintptr_t)acpi_root);
        if (smbios3_table)
                fdt_setprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,smbios-table", (uint64_t)(uintptr_t)smbios3_table);
+#ifdef EFIBOOT_RUNTIME_ADDRESS
+       fdt_setprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-system-table", (uint64_t)(uintptr_t)ST);
+#endif
 
        fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), "acpi");
        fdt_setprop_string(fdt, fdt_path_offset(fdt, "/acpi"), "compatible", "netbsd,acpi");
diff -r f5f0bce37003 -r ca6dd596893f sys/stand/efiboot/efiboot.c
--- a/sys/stand/efiboot/efiboot.c       Sun Oct 28 00:44:37 2018 +0000
+++ b/sys/stand/efiboot/efiboot.c       Sun Oct 28 10:17:47 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efiboot.c,v 1.9 2018/10/12 22:08:04 jmcneill Exp $ */
+/* $NetBSD: efiboot.c,v 1.10 2018/10/28 10:17:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -34,6 +34,8 @@
 
 #include <sys/reboot.h>
 
+#include <libfdt.h>
+
 EFI_HANDLE IH;
 EFI_DEVICE_PATH *efi_bootdp;
 EFI_LOADED_IMAGE *efi_li;
@@ -41,7 +43,7 @@
 int howto = 0;
 
 static EFI_PHYSICAL_ADDRESS heap_start;
-static UINTN heap_size = 1 * 1024 * 1024;
+static UINTN heap_size = 8 * 1024 * 1024;
 static EFI_EVENT delay_ev = 0;
 
 EFI_STATUS EFIAPI efi_main(EFI_HANDLE, EFI_SYSTEM_TABLE *);
@@ -92,18 +94,92 @@
        return EFI_SUCCESS;
 }
 
+#ifdef EFIBOOT_RUNTIME_ADDRESS
+static uint64_t
+efi_runtime_alloc_va(uint64_t npages)
+{
+       static uint64_t va = EFIBOOT_RUNTIME_ADDRESS;
+       static uint64_t sz = EFIBOOT_RUNTIME_SIZE;
+       uint64_t nva;
+
+       if (sz < (npages * EFI_PAGE_SIZE))
+               panic("efi_acpi_alloc_va: couldn't allocate %" PRIu64 " pages", npages);
+
+       nva = va;
+       va += (npages * EFI_PAGE_SIZE);
+       sz -= (npages * EFI_PAGE_SIZE);
+
+       return nva;
+}
+#endif
+
+#ifdef EFIBOOT_RUNTIME_ADDRESS
+static void
+efi_set_virtual_address_map(EFI_MEMORY_DESCRIPTOR *memmap, UINTN nentries, UINTN mapkey, UINTN descsize, UINT32 descver)
+{
+       EFI_MEMORY_DESCRIPTOR *md, *vmd, *vmemmap;
+       EFI_STATUS status;
+       int n, nrt;
+       void *fdt;
+
+       fdt = efi_fdt_data();
+
+       vmemmap = alloc(nentries * descsize);
+       if (vmemmap == NULL)
+               panic("FATAL: couldn't allocate virtual memory map");
+
+       for (n = 0, nrt = 0, vmd = vmemmap, md = memmap; n < nentries; n++, md = NextMemoryDescriptor(md, descsize)) {
+               if ((md->Attribute & EFI_MEMORY_RUNTIME) == 0)
+                       continue;
+               md->VirtualStart = efi_runtime_alloc_va(md->NumberOfPages);
+
+               switch (md->Type) {
+               case EfiRuntimeServicesCode:
+                       fdt_appendprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-runtime-code", md->PhysicalStart);
+                       fdt_appendprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-runtime-code", md->VirtualStart);
+                       fdt_appendprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-runtime-code", md->NumberOfPages * EFI_PAGE_SIZE);
+                       break;
+               case EfiRuntimeServicesData:
+                       fdt_appendprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-runtime-data", md->PhysicalStart);
+                       fdt_appendprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-runtime-data", md->VirtualStart);
+                       fdt_appendprop_u64(fdt, fdt_path_offset(fdt, "/chosen"), "netbsd,uefi-runtime-data", md->NumberOfPages * EFI_PAGE_SIZE);
+                       break;
+               default:
+                       break;
+               }
+
+               *vmd = *md;
+               vmd = NextMemoryDescriptor(vmd, descsize);
+               ++nrt;
+       }
+
+       status = uefi_call_wrapper(RT->SetVirtualAddressMap, 4, nrt * descsize, descsize, descver, vmemmap);
+       if (EFI_ERROR(status)) {
+               printf("WARNING: SetVirtualAddressMap failed\n");
+               return;
+       }
+}
+#endif
+
 void
 efi_cleanup(void)
 {
        EFI_STATUS status;
+       EFI_MEMORY_DESCRIPTOR *memmap;
        UINTN nentries, mapkey, descsize;
        UINT32 descver;
 
-       LibMemoryMap(&nentries, &mapkey, &descsize, &descver);
+       memmap = LibMemoryMap(&nentries, &mapkey, &descsize, &descver);
 
        status = uefi_call_wrapper(BS->ExitBootServices, 2, IH, mapkey);
-       if (EFI_ERROR(status))
+       if (EFI_ERROR(status)) {
                printf("WARNING: ExitBootServices failed\n");
+               return;
+       }
+
+#ifdef EFIBOOT_RUNTIME_ADDRESS
+       efi_set_virtual_address_map(memmap, nentries, mapkey, descsize, descver);
+#endif
 }
 
 void
diff -r f5f0bce37003 -r ca6dd596893f sys/stand/efiboot/exec.c
--- a/sys/stand/efiboot/exec.c  Sun Oct 28 00:44:37 2018 +0000
+++ b/sys/stand/efiboot/exec.c  Sun Oct 28 10:17:47 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: exec.c,v 1.7 2018/10/12 22:08:04 jmcneill Exp $ */
+/* $NetBSD: exec.c,v 1.8 2018/10/28 10:17:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -168,10 +168,14 @@
                efi_fdt_initrd(initrd_addr, initrd_size);
                efi_fdt_bootargs(args);
                efi_fdt_memory_map();
+       }
+
+       efi_cleanup();
+
+       if (efi_fdt_size() > 0) {
                efi_fdt_fini();
        }
 
-       efi_cleanup();
        efi_boot_kernel(marks);
 
        /* This should not happen.. */
diff -r f5f0bce37003 -r ca6dd596893f sys/stand/efiboot/version
--- a/sys/stand/efiboot/version Sun Oct 28 00:44:37 2018 +0000
+++ b/sys/stand/efiboot/version Sun Oct 28 10:17:47 2018 +0000
@@ -1,4 +1,4 @@
-$NetBSD: version,v 1.5 2018/10/26 20:56:35 mrg Exp $
+$NetBSD: version,v 1.6 2018/10/28 10:17:47 jmcneill Exp $
 
 NOTE ANY CHANGES YOU MAKE TO THE EFI BOOTLOADER HERE.  The format of this
 file is important - make sure the entries are appended on end, last item
@@ -9,3 +9,4 @@
 1.2:   Add environment variable support.
 1.3:   Add ACPI support.
 1.4:   Add bootfile support.
+1.5:   EFI runtime support.



Home | Main Index | Thread Index | Old Index