svn commit: r247457 - projects/uefi/sys/boot/amd64/efi

Benno Rice benno at FreeBSD.org
Thu Feb 28 10:54:21 UTC 2013


Author: benno
Date: Thu Feb 28 10:54:19 2013
New Revision: 247457
URL: http://svnweb.freebsd.org/changeset/base/247457

Log:
  Split efimd.c up and place parts into bootinfo.c and parts into elf64_freebsd.c

Deleted:
  projects/uefi/sys/boot/amd64/efi/efimd.c
Modified:
  projects/uefi/sys/boot/amd64/efi/Makefile
  projects/uefi/sys/boot/amd64/efi/bootinfo.c
  projects/uefi/sys/boot/amd64/efi/elf64_freebsd.c
  projects/uefi/sys/boot/amd64/efi/x86_efi.h

Modified: projects/uefi/sys/boot/amd64/efi/Makefile
==============================================================================
--- projects/uefi/sys/boot/amd64/efi/Makefile	Thu Feb 28 10:50:09 2013	(r247456)
+++ projects/uefi/sys/boot/amd64/efi/Makefile	Thu Feb 28 10:54:19 2013	(r247457)
@@ -11,7 +11,7 @@ INTERNALPROG=
 
 # architecture-specific loader code
 SRCS=	main.c conf.c vers.c reloc.c elf64_freebsd.c
-SRCS+=	copy.c bootinfo.c autoload.c devicename.c efimd.c
+SRCS+=	copy.c bootinfo.c autoload.c devicename.c
 SRCS+=	framebuffer.c amd64_tramp.S start.S
 
 CFLAGS+=	-fPIC

Modified: projects/uefi/sys/boot/amd64/efi/bootinfo.c
==============================================================================
--- projects/uefi/sys/boot/amd64/efi/bootinfo.c	Thu Feb 28 10:50:09 2013	(r247456)
+++ projects/uefi/sys/boot/amd64/efi/bootinfo.c	Thu Feb 28 10:54:19 2013	(r247457)
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 1998 Michael Smith <msmith at freebsd.org>
+ * Copyright (c) 2004, 2006 Marcel Moolenaar
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -33,6 +34,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/reboot.h>
 #include <sys/linker.h>
 #include <machine/cpufunc.h>
+#include <machine/efi.h>
+#include <machine/metadata.h>
 #include <machine/psl.h>
 #include <machine/specialreg.h>
 
@@ -40,8 +43,11 @@ __FBSDID("$FreeBSD$");
 #include <efilib.h>
 
 #include "bootstrap.h"
+#include "framebuffer.h"
 #include "x86_efi.h"
 
+UINTN x86_efi_mapkey;
+
 /*
  * Return a 'boothowto' value corresponding to the kernel arguments in
  * (kargs) and any relevant environment variables.
@@ -229,7 +235,66 @@ bi_copymodules64(vm_offset_t addr)
 	return(addr);
 }
 
-extern int ldr_bootinfo(struct preloaded_file *kfp);
+static int
+ldr_bootinfo(struct preloaded_file *kfp)
+{
+	EFI_MEMORY_DESCRIPTOR *mm;
+	EFI_PHYSICAL_ADDRESS addr;
+	EFI_STATUS status;
+	size_t efisz;
+	UINTN mmsz, pages, sz;
+	UINT32 mmver;
+	struct efi_header *efihdr;
+
+        efisz = (sizeof(struct efi_header) + 0xf) & ~0xf;
+
+	/*
+	 * Allocate enough pages to hold the bootinfo block and the memory
+	 * map EFI will return to us. The memory map has an unknown size,
+	 * so we have to determine that first. Note that the AllocatePages
+	 * call can itself modify the memory map, so we have to take that
+	 * into account as well. The changes to the memory map are caused
+	 * by splitting a range of free memory into two (AFAICT), so that
+	 * one is marked as being loader data.
+	 */
+	sz = 0;
+	BS->GetMemoryMap(&sz, NULL, &x86_efi_mapkey, &mmsz, &mmver);
+	sz += mmsz;
+	sz = (sz + 0xf) & ~0xf;
+	pages = EFI_SIZE_TO_PAGES(sz + efisz);
+	status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData, pages,
+	    &addr);
+	if (EFI_ERROR(status)) {
+		printf("%s: AllocatePages() returned 0x%lx\n", __func__,
+		    (long)status);
+		return (ENOMEM);
+	}
+
+	/*
+	 * Read the memory map and stash it after bootinfo. Align the
+	 * memory map on a 16-byte boundary (the bootinfo block is page
+	 * aligned).
+	 */
+	efihdr = (struct efi_header *)addr;
+	mm = (void *)((uint8_t *)efihdr + efisz);
+	sz = (EFI_PAGE_SIZE * pages) - efisz;
+	status = BS->GetMemoryMap(&sz, mm, &x86_efi_mapkey, &mmsz, &mmver);
+	if (EFI_ERROR(status)) {
+		printf("%s: GetMemoryMap() returned 0x%lx\n", __func__,
+		    (long)status);
+		return (EINVAL);
+	}
+
+	efihdr->memory_size = sz;
+	efihdr->descriptor_size = mmsz;
+	efihdr->descriptor_version = mmver;
+
+	efi_find_framebuffer(efihdr);
+
+	file_addmetadata(kfp, MODINFOMD_EFI, efisz + sz, efihdr);
+
+	return (0);
+}
 
 /*
  * Load the information expected by an amd64 kernel.

Modified: projects/uefi/sys/boot/amd64/efi/elf64_freebsd.c
==============================================================================
--- projects/uefi/sys/boot/amd64/efi/elf64_freebsd.c	Thu Feb 28 10:50:09 2013	(r247456)
+++ projects/uefi/sys/boot/amd64/efi/elf64_freebsd.c	Thu Feb 28 10:54:19 2013	(r247457)
@@ -93,6 +93,7 @@ elf64_exec(struct preloaded_file *fp)
     ACPI_TABLE_RSDP		*rsdp;
     char			buf[24];
     int				revision;
+    EFI_STATUS			status;
 
     rsdp = efi_get_table(&acpi20_guid);
     if (rsdp == NULL) {
@@ -164,7 +165,12 @@ elf64_exec(struct preloaded_file *fp)
 
     printf("Start @ 0x%lx ...\n", ehdr->e_entry);
 
-    ldr_enter(fp->f_name);
+    status = BS->ExitBootServices(IH, x86_efi_mapkey);
+    if (EFI_ERROR(status)) {
+        printf("%s: ExitBootServices() returned 0x%lx\n", __func__,
+            (long)status);
+        return (EINVAL);
+    }
 
     dev_cleanup();
 

Modified: projects/uefi/sys/boot/amd64/efi/x86_efi.h
==============================================================================
--- projects/uefi/sys/boot/amd64/efi/x86_efi.h	Thu Feb 28 10:50:09 2013	(r247456)
+++ projects/uefi/sys/boot/amd64/efi/x86_efi.h	Thu Feb 28 10:54:19 2013	(r247457)
@@ -44,4 +44,6 @@ ssize_t	x86_efi_copyin(const void *src, 
 ssize_t	x86_efi_copyout(const vm_offset_t src, void *dest, const size_t len);
 ssize_t	x86_efi_readin(const int fd, vm_offset_t dest, const size_t len);
 
+extern UINTN x86_efi_mapkey;
+
 #endif	/* _X86_EFI_COPY_H_ */


More information about the svn-src-projects mailing list