From d02e1d97d9624a34fdda02b224dcd1c03840eda6 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 26 Jul 2017 01:41:46 -0700 Subject: [PATCH] Splitting out UEFI bootloader code from kernel Now the bootloader should be responsible for all initial setup, loading the kernel, and then handing off to the kernel with proper data in place. --- Makefile | 97 ++++++++++++++++++++--------- external/gnu-efi | 2 +- src/arch/x86_64/boot.s | 12 ++++ src/arch/x86_64/config.mk | 2 +- src/arch/x86_64/kernel.ld | 26 ++++++++ src/{arch/x86_64 => boot}/console.c | 0 src/{arch/x86_64 => boot}/console.h | 0 src/boot/loader.c | 75 ++++++++++++++++++++++ src/boot/loader.h | 8 +++ src/{arch/x86_64 => boot}/main.c | 31 ++++++--- src/{arch/x86_64 => boot}/memory.c | 34 +++++++--- src/{arch/x86_64 => boot}/memory.h | 6 +- src/{arch/x86_64 => boot}/utility.c | 0 src/{arch/x86_64 => boot}/utility.h | 2 + 14 files changed, 242 insertions(+), 53 deletions(-) create mode 100755 src/arch/x86_64/boot.s create mode 100755 src/arch/x86_64/kernel.ld rename src/{arch/x86_64 => boot}/console.c (100%) rename src/{arch/x86_64 => boot}/console.h (100%) create mode 100644 src/boot/loader.c create mode 100644 src/boot/loader.h rename src/{arch/x86_64 => boot}/main.c (63%) rename src/{arch/x86_64 => boot}/memory.c (68%) rename src/{arch/x86_64 => boot}/memory.h (60%) rename src/{arch/x86_64 => boot}/utility.c (100%) rename src/{arch/x86_64 => boot}/utility.h (91%) diff --git a/Makefile b/Makefile index d115d03..e68c641 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,9 @@ DEPENDFLAGS := -MMD INCLUDES := -I $(ARCH_D) INCLUDES += -I src/modules -INCLUDES += -isystem $(EFI_INCLUDES) -isystem $(EFI_INCLUDES)/$(ARCH) -isystem $(EFI_INCLUDES)/protocol +INCLUDES += -isystem $(EFI_INCLUDES) +INCLUDES += -isystem $(EFI_INCLUDES)/$(ARCH) +INCLUDES += -isystem $(EFI_INCLUDES)/protocol BASEFLAGS := -O2 -fpic -nostdlib BASEFLAGS += -ffreestanding -nodefaultlibs @@ -30,35 +32,39 @@ ifdef CPU BASEFLAGS += -mcpu=$(CPU) endif -WARNFLAGS := -Wall -Wextra -Wshadow -Wcast-align -Wwrite-strings -WARNFLAGS += -Winline -Wshadow -WARNFLAGS += -Wno-attributes -Wno-deprecated-declarations -WARNFLAGS += -Wno-div-by-zero -Wno-endif-labels -Wfloat-equal -WARNFLAGS += -Wformat=2 -Wno-format-extra-args -Winit-self +# Removed Flags:: -Wcast-align +WARNFLAGS := -Wall -Werror -Wextra -Wshadow -Wwrite-strings +WARNFLAGS += -Wformat=2 -Winit-self -Wfloat-equal -Winline WARNFLAGS += -Winvalid-pch -Wmissing-format-attribute -WARNFLAGS += -Wmissing-include-dirs -Wno-multichar -WARNFLAGS += -Wno-sign-compare -Wswitch -Wundef -WARNFLAGS += -Wno-pragmas #-Wno-unused-but-set-parameter -WARNFLAGS += -Wno-unused-result #-Wno-unused-but-set-variable -WARNFLAGS += -Wwrite-strings -Wdisabled-optimization -Wpointer-arith -WARNFLAGS += -Werror +WARNFLAGS += -Wmissing-include-dirs -Wswitch -Wundef +WARNFLAGS += -Wdisabled-optimization -Wpointer-arith + +WARNFLAGS += -Wno-attributes -Wno-sign-compare -Wno-multichar +WARNFLAGS += -Wno-div-by-zero -Wno-endif-labels -Wno-pragmas +WARNFLAGS += -Wno-format-extra-args -Wno-unused-result +WARNFLAGS += -Wno-deprecated-declarations -Wno-unused-function +WARNFLAGS += -Wno-unused-but-set-parameter ASFLAGS ?= -CFLAGS ?= -CFLAGS += $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS) +CFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS) +CFLAGS += -std=c11 -fpic -fshort-wchar +CFLAGS += -mno-red-zone -fno-stack-protector CFLAGS += -DGIT_VERSION="L\"$(VERSION)\"" -CFLAGS += -std=c11 -fno-stack-protector -fpic -fshort-wchar -mno-red-zone -CFLAGS += -DEFI_DEBUG=0 -DEFI_DEBUG_CLEAR_MEMORY=0 -DGNU_EFI_USE_MS_ABI -DHAVE_USE_MS_ABI #-DEFI_FUNCTION_WRAPPER +CFLAGS += -DEFI_DEBUG=0 -DEFI_DEBUG_CLEAR_MEMORY=0 +CFLAGS += -DGNU_EFI_USE_MS_ABI -DHAVE_USE_MS_ABI +#CFLAGS += -DEFI_FUNCTION_WRAPPER +BOOT_CFLAGS := -I src/boot $(CFLAGS) ifdef MAX_HRES -CFLAGS += -DMAX_HRES=$(MAX_HRES) +BOOT_CFLAGS += -DMAX_HRES=$(MAX_HRES) endif -LDFLAGS ?= -LDFLAGS += -L $(BUILD_D) -ggdb -LDFLAGS += -nostdlib -znocombreloc -shared -Bsymbolic -fPIC -nostartfiles -LDFLAGS += -L $(EFI_ARCH_DIR)/lib -L $(EFI_ARCH_DIR)/gnuefi +LDFLAGS := -L $(BUILD_D) -ggdb -fPIC -shared +LDFLAGS += -nostdlib -znocombreloc -Bsymbolic -nostartfiles + +BOOT_LDFLAGS := $(LDFLAGS) +BOOT_LDFLAGS += -L $(EFI_ARCH_DIR)/lib -L $(EFI_ARCH_DIR)/gnuefi AS ?= $(CROSS)as AR ?= $(CROSS)ar @@ -69,6 +75,11 @@ OBJC := $(CROSS)objcopy OBJD := $(CROSS)objdump INIT_DEP := $(BUILD_D)/.builddir + +BOOT_SRCS := $(wildcard src/boot/*.c) +BOBJS += $(patsubst src/boot/%,$(BUILD_D)/boot/%,$(patsubst %,%.o,$(BOOT_SRCS))) +BDEPS := $(patsubst src/boot/%,$(BUILD_D)/boot/%,$(patsubst %,%.d,$(BOOT_SRCS))) + ARCH_SRCS := $(wildcard $(ARCH_D)/*.s) ARCH_SRCS += $(wildcard $(ARCH_D)/*.c) KOBJS += $(patsubst $(ARCH_D)/%,$(BUILD_D)/arch/%,$(patsubst %,%.o,$(ARCH_SRCS))) @@ -80,7 +91,13 @@ QEMU ?= qemu-system-x86_64 GDBPORT ?= 27006 CPUS ?= 2 OVMF ?= assets/ovmf/x64/OVMF.fd -QEMUOPTS := -bios $(OVMF) -hda $(BUILD_D)/fs.img -smp $(CPUS) -m 512 $(QEMUEXTRA) -d guest_errors + +QEMUOPTS := -pflash $(OVMF) +QEMUOPTS += -drive file=$(BUILD_D)/fs.img,format=raw +QEMUOPTS += -smp $(CPUS) +QEMUOPTS += -m 512 +QEMUOPTS += -d guest_errors +QEMUOPTS += $(QEMUEXTRA) all: $(BUILD_D)/fs.img @@ -88,6 +105,7 @@ init: $(INIT_DEP) $(INIT_DEP): mkdir -p $(BUILD_D) $(patsubst %,$(BUILD_D)/d.%,$(MODULES)) + mkdir -p $(BUILD_D)/boot mkdir -p $(BUILD_D)/arch touch $(INIT_DEP) @@ -108,32 +126,47 @@ $(BUILD_D)/.version: $(EFI_LIB): make -C external/gnu-efi all -$(BUILD_D)/kernel.elf: $(KOBJS) $(MOD_TARGETS) $(EFI_LIB) - $(LD) $(LDFLAGS) -T $(EFI_LDS) -o $@ \ - $(EFI_CRT_OBJ) $(KOBJS) $(patsubst %,-l%,$(MODULES)) -lefi -lgnuefi +$(BUILD_D)/kernel.elf: $(KOBJS) $(MOD_TARGETS) $(ARCH_D)/kernel.ld + $(LD) $(LDFLAGS) -T $(ARCH_D)/kernel.ld -o $@ $(KOBJS) $(patsubst %,-l%,$(MODULES)) -$(BUILD_D)/kernel.efi: $(BUILD_D)/kernel.elf +$(BUILD_D)/boot.elf: $(BOBJS) $(EFI_LIB) + $(LD) $(BOOT_LDFLAGS) -T $(EFI_LDS) -o $@ \ + $(EFI_CRT_OBJ) $(BOBJS) $(patsubst %,-l%,$(MODULES)) -lefi -lgnuefi + +$(BUILD_D)/boot.efi: $(BUILD_D)/boot.elf objcopy -j .text -j .sdata -j .data -j .dynamic \ -j .dynsym -j .rel -j .rela -j .reloc \ --target=efi-app-$(ARCH) $^ $@ -$(BUILD_D)/kernel.debug.efi: $(BUILD_D)/kernel.elf +$(BUILD_D)/boot.debug.efi: $(BUILD_D)/boot.elf objcopy -j .text -j .sdata -j .data -j .dynamic \ -j .dynsym -j .rel -j .rela -j .reloc \ -j .debug_info -j .debug_abbrev -j .debug_loc -j .debug_str \ -j .debug_aranges -j .debug_line -j .debug_macinfo \ --target=efi-app-$(ARCH) $^ $@ -$(BUILD_D)/%.dump: $(BUILD_D)/%.efi +$(BUILD_D)/%.elf.dump: $(BUILD_D)/%.elf $(OBJD) -D -S $< > $@ +$(BUILD_D)/%.bin.dump: $(BUILD_D)/%.bin + $(OBJD) -D $< > $@ + +$(BUILD_D)/%.bin: $(BUILD_D)/%.elf + $(OBJC) $< -O binary $@ + +$(BUILD_D)/boot/%.s.o: src/boot/%.s $(INIT_DEP) + $(AS) $(ASFLAGS) -o $@ $< + +$(BUILD_D)/boot/%.c.o: src/boot/%.c $(INIT_DEP) + $(CC) $(BOOT_CFLAGS) -c -o $@ $< + $(BUILD_D)/arch/%.s.o: $(ARCH_D)/%.s $(INIT_DEP) $(AS) $(ASFLAGS) -o $@ $< $(BUILD_D)/arch/%.c.o: $(ARCH_D)/%.c $(INIT_DEP) $(CC) $(CFLAGS) -c -o $@ $< -$(BUILD_D)/fs.img: $(BUILD_D)/kernel.efi +$(BUILD_D)/fs.img: $(BUILD_D)/boot.efi $(BUILD_D)/kernel.bin $(eval TEMPFILE := $(shell mktemp --suffix=.img)) dd if=/dev/zero of=$@.tmp bs=512 count=93750 $(PARTED) $@.tmp -s -a minimal mklabel gpt @@ -143,7 +176,9 @@ $(BUILD_D)/fs.img: $(BUILD_D)/kernel.efi mformat -i $(TEMPFILE) -h 32 -t 32 -n 64 -c 1 mmd -i $(TEMPFILE) ::/EFI mmd -i $(TEMPFILE) ::/EFI/BOOT - mcopy -i $(TEMPFILE) $^ ::/EFI/BOOT/BOOTX64.efi + mcopy -i $(TEMPFILE) $(BUILD_D)/boot.efi ::/EFI/BOOT/BOOTX64.efi + mcopy -i $(TEMPFILE) $(BUILD_D)/kernel.bin ::/kernel.bin + mlabel -i $(TEMPFILE) ::Popcorn_OS dd if=$(TEMPFILE) of=$@.tmp bs=512 count=91669 seek=2048 conv=notrunc rm $(TEMPFILE) mv $@.tmp $@ @@ -159,7 +194,7 @@ qemu: $(BUILD_D)/fs.img qemu-window: $(BUILD_D)/fs.img "$(QEMU)" $(QEMUOPTS) -qemu-gdb: $(BUILD_D)/fs.img $(BUILD_D)/kernel.debug.efi +qemu-gdb: $(BUILD_D)/fs.img $(BUILD_D)/boot.debug.efi "$(QEMU)" $(QEMUOPTS) -S -D popcorn-qemu.log -s # vim: ft=make ts=4 diff --git a/external/gnu-efi b/external/gnu-efi index d031099..99d9468 160000 --- a/external/gnu-efi +++ b/external/gnu-efi @@ -1 +1 @@ -Subproject commit d03109958fa45865b77cf1fdf92c3b145a7dc7a0 +Subproject commit 99d94682de590719f9333fcf091910a9581b44c0 diff --git a/src/arch/x86_64/boot.s b/src/arch/x86_64/boot.s new file mode 100755 index 0000000..a5895f1 --- /dev/null +++ b/src/arch/x86_64/boot.s @@ -0,0 +1,12 @@ +; boot.s -- Kernel start location. + +[BITS 64] +ALIGN 4 + +SECTION .text +[GLOBAL start] + +start: + ; Load multiboot header location + mov ebx, 0xdeadbeef + jmp $ diff --git a/src/arch/x86_64/config.mk b/src/arch/x86_64/config.mk index 9456356..1c53532 100644 --- a/src/arch/x86_64/config.mk +++ b/src/arch/x86_64/config.mk @@ -1,5 +1,5 @@ AS := nasm -ASFLAGS := -felf +ASFLAGS := -felf64 LDFLAGS := -m elf_x86_64 CFLAGS := -march=nocona -m64 diff --git a/src/arch/x86_64/kernel.ld b/src/arch/x86_64/kernel.ld new file mode 100755 index 0000000..4913206 --- /dev/null +++ b/src/arch/x86_64/kernel.ld @@ -0,0 +1,26 @@ +ENTRY(start) +SECTIONS +{ + . = 0x100000; + + .text : { + code = .; + *(.text) + . = ALIGN(4096); + } + + .data : { + data = .; + *(.data) + *(.rodata) + . = ALIGN(4096); + } + + .bss : { + bss = .; + *(.bss) + . = ALIGN(4096); + } + + end = .; +} diff --git a/src/arch/x86_64/console.c b/src/boot/console.c similarity index 100% rename from src/arch/x86_64/console.c rename to src/boot/console.c diff --git a/src/arch/x86_64/console.h b/src/boot/console.h similarity index 100% rename from src/arch/x86_64/console.h rename to src/boot/console.h diff --git a/src/boot/loader.c b/src/boot/loader.c new file mode 100644 index 0000000..25bc13d --- /dev/null +++ b/src/boot/loader.c @@ -0,0 +1,75 @@ +#include "loader.h" +#include "utility.h" + +static CHAR16 kernel_name[] = KERNEL_FILENAME; + +static EFI_STATUS loader_load_file(EFI_FILE_PROTOCOL *root, void **kernel_image, UINT64 *len) { + EFI_STATUS status; + + EFI_FILE_PROTOCOL *handle = 0; + status = root->Open(root, &handle, kernel_name, EFI_FILE_MODE_READ, 0); + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to open kernel file handle"); + + EFI_FILE_INFO *info = LibFileInfo(handle); + if (info->FileSize == 0) + return EFI_NOT_FOUND; + + UINTN count = ((info->FileSize - 1) / 0x1000) + 1; + EFI_PHYSICAL_ADDRESS addr = 0x100000; // Try to load the kernel in at 1MiB + EFI_MEMORY_TYPE memType = 0xFFFFFFFF; // Special value to tell the kernel it's here + status = ST->BootServices->AllocatePages(AllocateAddress, memType, count, &addr); + if (status == EFI_NOT_FOUND) { + // couldn't get the address we wanted, try loading the kernel anywhere + status = ST->BootServices->AllocatePages(AllocateAnyPages, memType, count, &addr); + } + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to allocate kernel pages"); + + UINTN buffer_size = count * 0x1000; + void *buffer = (void*)addr; + status = handle->Read(handle, &buffer_size, &buffer); + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to read kernel to memory"); + + *len = buffer_size; + *kernel_image = buffer; + return EFI_SUCCESS; +} + +EFI_STATUS loader_load_kernel(void **kernel_image, UINT64 *len) { + if (kernel_image == 0 || len == 0) + CHECK_EFI_STATUS_OR_RETURN(EFI_INVALID_PARAMETER, "NULL kernel_image pointer or size"); + + EFI_STATUS status; + + // First, find all the handles that support the filesystem protocol. Call + UINTN size = 0; + EFI_GUID fs_guid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; + status = ST->BootServices->LocateHandle(ByProtocol, &fs_guid, NULL, &size, NULL); + if (status != EFI_BUFFER_TOO_SMALL) { + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to find number of filesystem handles"); + } else if (size == 0) { + CHECK_EFI_STATUS_OR_RETURN(EFI_NO_MEDIA, "Found zero filesystem handles"); + } + + EFI_HANDLE *buffer = 0; + status = ST->BootServices->AllocatePool(EfiLoaderData, size, (void**)&buffer); + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to allocate buffer of filesystem handles"); + + status = ST->BootServices->LocateHandle(ByProtocol, &fs_guid, NULL, &size, buffer); + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to find filesystem handles"); + + unsigned num_fs = size / sizeof(EFI_HANDLE); + EFI_HANDLE *fss = (EFI_HANDLE*)buffer; + + for (unsigned i = 0; i < num_fs; ++i) { + EFI_FILE_HANDLE root = LibOpenRoot(fss[i]); + + status = loader_load_file(root, kernel_image, len); + if (status == EFI_NOT_FOUND) + continue; + + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to load kernel"); + return EFI_SUCCESS; + } + + return EFI_NOT_FOUND; +} diff --git a/src/boot/loader.h b/src/boot/loader.h new file mode 100644 index 0000000..6829d38 --- /dev/null +++ b/src/boot/loader.h @@ -0,0 +1,8 @@ +#pragma once +#include + +#ifndef KERNEL_FILENAME +#define KERNEL_FILENAME L"kernel.bin" +#endif + +EFI_STATUS loader_load_kernel(void **kernel_image, UINT64 *len); diff --git a/src/arch/x86_64/main.c b/src/boot/main.c similarity index 63% rename from src/arch/x86_64/main.c rename to src/boot/main.c index 841e8c5..b89b078 100644 --- a/src/arch/x86_64/main.c +++ b/src/boot/main.c @@ -2,6 +2,7 @@ #include #include "console.h" +#include "loader.h" #include "memory.h" #include "utility.h" @@ -21,18 +22,31 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) // be sure if the console was fully set up status = con_initialize(GIT_VERSION); CHECK_EFI_STATUS_OR_RETURN(status, "con_initialize"); - // From here on out, use CHECK_EFI_STATUS_OR_FAIL instead // because the console is now set up - /* - Print(L" SystemTable: %x\n", SystemTable); - if (SystemTable) - Print(L" ConOut: %x\n", SystemTable->ConOut); - if (SystemTable->ConOut) - Print(L"OutputString: %x\n", SystemTable->ConOut->OutputString); - */ + // Get info about the image + con_status_begin(L"Gathering image information..."); + EFI_LOADED_IMAGE *info = 0; + EFI_GUID image_proto = EFI_LOADED_IMAGE_PROTOCOL_GUID; + status = ST->BootServices->HandleProtocol(ImageHandle, &image_proto, (void **)&info); + CHECK_EFI_STATUS_OR_FAIL(status); + con_status_ok(); + con_status_begin(L"Virtualizing memory..."); + status = memory_virtualize(); + CHECK_EFI_STATUS_OR_FAIL(status); + con_status_ok(); + + con_status_begin(L"Loading kernel into memory..."); + void *kernel_image = NULL; + UINT64 len = 0; + status = loader_load_kernel(&kernel_image, &len); + CHECK_EFI_STATUS_OR_FAIL(status); + Print(L" %u bytes at 0x%x", len, kernel_image); + con_status_ok(); + + /* dump_memory_map(); UINTN memmap_size = 0; @@ -54,6 +68,7 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) memmap_size, desc_size, desc_version, memmap); CHECK_EFI_STATUS_OR_FAIL(status); con_status_ok(); + */ while (1) __asm__("hlt"); return status; diff --git a/src/arch/x86_64/memory.c b/src/boot/memory.c similarity index 68% rename from src/arch/x86_64/memory.c rename to src/boot/memory.c index 60d84b3..7fc1a57 100644 --- a/src/arch/x86_64/memory.c +++ b/src/boot/memory.c @@ -24,18 +24,34 @@ const CHAR16 *memory_type_names[] = { L"EfiPersistentMemory", }; -const CHAR16 *memory_type_name(UINT32 value) { +static const CHAR16 *memory_type_name(UINT32 value) { if (value >= (sizeof(memory_type_names)/sizeof(CHAR16*))) return L"Bad Type Value"; return memory_type_names[value]; } -EFI_STATUS get_memory_map(EFI_MEMORY_DESCRIPTOR **buffer, UINTN *buffer_size, +void EFIAPI memory_update_addresses(EFI_EVENT UNUSED *event, void UNUSED *context) { + ST->RuntimeServices->ConvertPointer(0, (void **)&BS); + ST->RuntimeServices->ConvertPointer(0, (void **)&ST); +} + +EFI_STATUS memory_virtualize() { + EFI_STATUS status; + EFI_EVENT event; + + status = ST->BootServices->CreateEvent(EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, + TPL_CALLBACK, (EFI_EVENT_NOTIFY)&memory_update_addresses, NULL, &event); + CHECK_EFI_STATUS_OR_RETURN(status, "Failed to create memory update event"); + + return status; +} + +EFI_STATUS memory_get_map(EFI_MEMORY_DESCRIPTOR **buffer, UINTN *buffer_size, UINTN *key, UINTN *desc_size, UINT32 *desc_version) { EFI_STATUS status; UINTN needs_size = 0; - status = BS->GetMemoryMap(&needs_size, 0, key, desc_size, desc_version); + status = ST->BootServices->GetMemoryMap(&needs_size, 0, key, desc_size, desc_version); if (status != EFI_BUFFER_TOO_SMALL) { CHECK_EFI_STATUS_OR_RETURN(status, "Failed to load memory map"); } @@ -43,20 +59,20 @@ EFI_STATUS get_memory_map(EFI_MEMORY_DESCRIPTOR **buffer, UINTN *buffer_size, // Give some extra buffer to account for changes. *buffer_size = needs_size + 256; Print(L"Trying to load memory map with size %d.\n", *buffer_size); - status = BS->AllocatePool(EfiLoaderData, *buffer_size, (void**)buffer); + status = ST->BootServices->AllocatePool(EfiLoaderData, *buffer_size, (void**)buffer); CHECK_EFI_STATUS_OR_RETURN(status, "Failed to allocate space for memory map"); - status = BS->GetMemoryMap(buffer_size, *buffer, key, desc_size, desc_version); + status = ST->BootServices->GetMemoryMap(buffer_size, *buffer, key, desc_size, desc_version); CHECK_EFI_STATUS_OR_RETURN(status, "Failed to load memory map"); return EFI_SUCCESS; } -EFI_STATUS dump_memory_map() { +EFI_STATUS memory_dump_map() { EFI_MEMORY_DESCRIPTOR *buffer; UINTN buffer_size, desc_size, key; UINT32 desc_version; - EFI_STATUS status = get_memory_map(&buffer, &buffer_size, &key, + EFI_STATUS status = memory_get_map(&buffer, &buffer_size, &key, &desc_size, &desc_version); CHECK_EFI_STATUS_OR_RETURN(status, "Failed to get memory map"); @@ -79,6 +95,6 @@ EFI_STATUS dump_memory_map() { d = (EFI_MEMORY_DESCRIPTOR *)((uint8_t *)d + desc_size); } - BS->FreePool(buffer); + ST->BootServices->FreePool(buffer); return EFI_SUCCESS; -} \ No newline at end of file +} diff --git a/src/arch/x86_64/memory.h b/src/boot/memory.h similarity index 60% rename from src/arch/x86_64/memory.h rename to src/boot/memory.h index 970345b..8adf4ce 100644 --- a/src/arch/x86_64/memory.h +++ b/src/boot/memory.h @@ -1,13 +1,13 @@ #pragma once #include -const CHAR16 *memory_type_name(UINT32 value); +EFI_STATUS memory_virtualize(); -EFI_STATUS get_memory_map( +EFI_STATUS memory_get_map( EFI_MEMORY_DESCRIPTOR **buffer, UINTN *buffer_size, UINTN *key, UINTN *desc_size, UINT32 *desc_version); -EFI_STATUS dump_memory_map(); \ No newline at end of file +EFI_STATUS memory_dump_map(); diff --git a/src/arch/x86_64/utility.c b/src/boot/utility.c similarity index 100% rename from src/arch/x86_64/utility.c rename to src/boot/utility.c diff --git a/src/arch/x86_64/utility.h b/src/boot/utility.h similarity index 91% rename from src/arch/x86_64/utility.h rename to src/boot/utility.h index 58f8c86..06e2d9e 100644 --- a/src/arch/x86_64/utility.h +++ b/src/boot/utility.h @@ -2,6 +2,8 @@ #include #include "console.h" +#define UNUSED __attribute__((unused)) + const CHAR16 *util_error_message(EFI_STATUS status); #define CHECK_EFI_STATUS_OR_RETURN(s, msg, ...) \