diff --git a/Makefile b/Makefile index ef6deeb..341461c 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ DEPENDFLAGS := -MMD INCLUDES := -I $(ARCH_D) INCLUDES += -I src/modules +INCLUDES += -I src/include INCLUDES += -isystem $(EFI_INCLUDES) INCLUDES += -isystem $(EFI_INCLUDES)/$(ARCH) INCLUDES += -isystem $(EFI_INCLUDES)/protocol @@ -33,6 +34,7 @@ INCLUDES += -isystem $(EFI_INCLUDES)/protocol BASEFLAGS := -ggdb -nostdlib BASEFLAGS += -ffreestanding -nodefaultlibs BASEFLAGS += -fno-builtin -fomit-frame-pointer +BASEFLAGS += -mno-red-zone -fno-stack-protector ifdef CPU BASEFLAGS += -mcpu=$(CPU) @@ -54,14 +56,16 @@ ASFLAGS ?= ASFLAGS += -p $(BUILD_D)/versions.s CFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS) -CFLAGS += -std=c11 -fshort-wchar -CFLAGS += -mno-red-zone -fno-stack-protector -CFLAGS += -DGIT_VERSION="L\"$(VERSION)\"" -CFLAGS += -DKERNEL_FILENAME="L\"$(KERNEL_FILENAME)\"" -CFLAGS += -DEFI_DEBUG=0 -DEFI_DEBUG_CLEAR_MEMORY=0 -CFLAGS += -DGNU_EFI_USE_MS_ABI -DHAVE_USE_MS_ABI +CFLAGS += -std=c11 -BOOT_CFLAGS := -I src/boot $(CFLAGS) -fPIC +CXXFLAGS := $(INCLUDES) $(DEPENDFLAGS) $(BASEFLAGS) $(WARNFLAGS) +CXXFLAGS += -std=c++14 + +BOOT_CFLAGS := -I src/boot $(CFLAGS) -fPIC -fshort-wchar +BOOT_CFLAGS += -DGIT_VERSION="L\"$(VERSION)\"" +BOOT_CFLAGS += -DKERNEL_FILENAME="L\"$(KERNEL_FILENAME)\"" +BOOT_CFLAGS += -DGNU_EFI_USE_MS_ABI -DHAVE_USE_MS_ABI +BOOT_CFLAGS += -DEFI_DEBUG=0 -DEFI_DEBUG_CLEAR_MEMORY=0 #BOOT_CFLAGS += -DEFI_FUNCTION_WRAPPER ifdef MAX_HRES diff --git a/modules.mk b/modules.mk index 99e93fa..c24662a 100644 --- a/modules.mk +++ b/modules.mk @@ -4,6 +4,7 @@ endif ifndef SOURCES SOURCES := $(wildcard src/modules/$(MOD_NAME)/*.c) + SOURCES += $(wildcard src/modules/$(MOD_NAME)/*.cpp) SOURCES += $(wildcard src/modules/$(MOD_NAME)/*.s) endif @@ -24,6 +25,9 @@ $(MOD_LIBNAME): $(OBJS_$(MOD_NAME)) $(MOD_BUILD_D)/%.c.o: $(MOD_SRC_D)/%.c $(INIT_DEP) $(CC) $(CFLAGS) -c -o $@ $< +$(MOD_BUILD_D)/%.cpp.o: $(MOD_SRC_D)/%.cpp $(INIT_DEP) + $(CXX) $(CXXFLAGS) -c -o $@ $< + $(MOD_BUILD_D)/%.s.o: $(MOD_SRC_D)/%.s $(BUILD_D)/versions.s $(INIT_DEP) $(AS) $(ASFLAGS) -o $@ $< diff --git a/src/boot/loader.c b/src/boot/loader.c index 579df69..0952ac3 100644 --- a/src/boot/loader.c +++ b/src/boot/loader.c @@ -27,7 +27,9 @@ loader_alloc_pages( status = bootsvc->AllocatePages(AllocateAnyPages, mem_type, page_count, &addr); } - CHECK_EFI_STATUS_OR_RETURN(status, L"Allocating kernel pages type %x", mem_type); + CHECK_EFI_STATUS_OR_RETURN(status, + L"Allocating %d kernel pages type %x", + page_count, mem_type); *length = page_count * PAGE_SIZE; *pages = (void *)addr; @@ -105,42 +107,52 @@ loader_load_kernel( void *next = NULL; - data->kernel_image = (void *)KERNEL_PHYS_ADDRESS; + data->kernel = (void *)KERNEL_PHYS_ADDRESS; status = loader_load_file( bootsvc, root, kernel_name, KERNEL_MEMTYPE, - &data->kernel_image, - &data->kernel_image_length, + &data->kernel, + &data->kernel_length, &next); if (status == EFI_NOT_FOUND) continue; CHECK_EFI_STATUS_OR_RETURN(status, L"loader_load_file: %s", kernel_name); - data->screen_font = next; + data->font = next; status = loader_load_file( bootsvc, root, font_name, KERNEL_FONT_MEMTYPE, - &data->screen_font, - &data->screen_font_length, + &data->font, + &data->font_length, &next); CHECK_EFI_STATUS_OR_RETURN(status, L"loader_load_file: %s", font_name); - data->kernel_data = next; - data->kernel_data_length += PAGE_SIZE; // extra page for map growth + data->data = next; + data->data_length += PAGE_SIZE; // extra page for map growth status = loader_alloc_pages( bootsvc, KERNEL_DATA_MEMTYPE, - &data->kernel_data_length, - &data->kernel_data, + &data->data_length, + &data->data, &next); CHECK_EFI_STATUS_OR_RETURN(status, L"loader_alloc_pages: kernel data"); + data->log = next; + data->log_length = KERNEL_LOG_PAGES; + status = loader_alloc_pages( + bootsvc, + KERNEL_LOG_MEMTYPE, + &data->log_length, + &data->log, + &next); + CHECK_EFI_STATUS_OR_RETURN(status, L"loader_alloc_pages: kernel log"); + return EFI_SUCCESS; } diff --git a/src/boot/loader.h b/src/boot/loader.h index 572c964..000ca4e 100644 --- a/src/boot/loader.h +++ b/src/boot/loader.h @@ -22,8 +22,12 @@ #define KERNEL_DATA_MEMTYPE 0x80000002 #endif -#ifndef KERNEL_DATA_PAGES -#define KERNEL_DATA_PAGES 1 +#ifndef KERNEL_LOG_MEMTYPE +#define KERNEL_LOG_MEMTYPE 0x80000003 +#endif + +#ifndef KERNEL_LOG_PAGES +#define KERNEL_LOG_PAGES 4 #endif #ifndef KERNEL_FILENAME @@ -35,14 +39,17 @@ #endif struct loader_data { - void *kernel_image; - size_t kernel_image_length; + void *kernel; + size_t kernel_length; - void *kernel_data; - size_t kernel_data_length; + void *font; + size_t font_length; - void *screen_font; - size_t screen_font_length; + void *data; + size_t data_length; + + void *log; + size_t log_length; }; EFI_STATUS loader_load_kernel(EFI_BOOT_SERVICES *bootsvc, struct loader_data *data); diff --git a/src/boot/main.c b/src/boot/main.c index 0760566..53cddd4 100644 --- a/src/boot/main.c +++ b/src/boot/main.c @@ -5,6 +5,7 @@ #include "console.h" #include "guids.h" +#include "kernel_data.h" #include "loader.h" #include "memory.h" #include "utility.h" @@ -16,10 +17,6 @@ #define KERNEL_HEADER_MAGIC 0x600db007 #define KERNEL_HEADER_VERSION 1 -#define DATA_HEADER_MAGIC 0x600dda7a -#define DATA_HEADER_VERSION 1 - - #pragma pack(push, 1) struct kernel_header { uint32_t magic; @@ -33,36 +30,6 @@ struct kernel_header { void *entrypoint; }; - -struct popcorn_data { - uint32_t magic; - uint16_t version; - uint16_t length; - - uint32_t _reserved0; - uint32_t flags; - - void *font; - size_t font_length; - - void *data; - size_t data_length; - - EFI_MEMORY_DESCRIPTOR *memory_map; - EFI_RUNTIME_SERVICES *runtime; - - void *acpi_table; - - void *frame_buffer; - size_t frame_buffer_size; - uint32_t hres; - uint32_t vres; - uint32_t rmask; - uint32_t gmask; - uint32_t bmask; - uint32_t _reserved1; -} -__attribute__((aligned(_Alignof(EFI_MEMORY_DESCRIPTOR)))); #pragma pack(pop) EFI_STATUS @@ -104,6 +71,7 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table) data_length += header_size; + // Load the kernel image from disk and check it // void *kernel_image = NULL, *kernel_data = NULL; @@ -111,29 +79,31 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table) con_printf(L"Loading kernel into memory...\r\n"); struct loader_data load; - load.kernel_data_length = data_length; + load.data_length = data_length; status = loader_load_kernel(bootsvc, &load); CHECK_EFI_STATUS_OR_FAIL(status); - con_printf(L" %u image bytes at 0x%x\r\n", load.kernel_image_length, load.kernel_image); - con_printf(L" %u font bytes at 0x%x\r\n", load.screen_font_length, load.screen_font); - con_printf(L" %u data bytes at 0x%x\r\n", load.kernel_data_length, load.kernel_data); + con_printf(L" %u image bytes at 0x%x\r\n", load.kernel_length, load.kernel); + con_printf(L" %u font bytes at 0x%x\r\n", load.font_length, load.font); + con_printf(L" %u data bytes at 0x%x\r\n", load.data_length, load.data); + con_printf(L" %u log bytes at 0x%x\r\n", load.log_length, load.log); - struct kernel_header *version = (struct kernel_header *)load.kernel_image; + struct kernel_header *version = (struct kernel_header *)load.kernel; if (version->magic != KERNEL_HEADER_MAGIC) { con_printf(L" bad magic %x\r\n", version->magic); CHECK_EFI_STATUS_OR_FAIL(EFI_CRC_ERROR); } - con_printf(L" Kernel version %d.%d.%d %x%s\r\n", version->major, version->minor, version->patch, - version->gitsha & 0x0fffffff, version->gitsha & 0xf0000000 ? "*" : ""); + con_printf(L" Kernel version %d.%d.%d %x%s\r\n", + version->major, version->minor, version->patch, version->gitsha & 0x0fffffff, + version->gitsha & 0xf0000000 ? "*" : ""); con_printf(L" Entrypoint 0x%x\r\n", version->entrypoint); void (*kernel_main)() = version->entrypoint; // Set up the kernel data pages to pass to the kernel // - struct popcorn_data *data_header = (struct popcorn_data *)load.kernel_data; + struct popcorn_data *data_header = (struct popcorn_data *)load.data; data_header->magic = DATA_HEADER_MAGIC; data_header->version = DATA_HEADER_VERSION; @@ -141,11 +111,14 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table) data_header->flags = 0; - data_header->font = load.screen_font; - data_header->font_length = load.screen_font_length; + data_header->font = load.font; + data_header->font_length = load.font_length; - data_header->data = load.screen_font; - data_header->data_length = load.screen_font_length; + data_header->data = load.data; + data_header->data_length = load.data_length; + + data_header->log = load.log; + data_header->log_length = load.log_length; data_header->memory_map = (EFI_MEMORY_DESCRIPTOR *)(data_header + 1); data_header->runtime = system_table->RuntimeServices; @@ -171,7 +144,7 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table) // struct memory_map map; map.entries = data_header->memory_map; - map.length = (load.kernel_data_length - header_size); + map.length = (load.data_length - header_size); status = memory_get_map(bootsvc, &map); CHECK_EFI_STATUS_OR_FAIL(status); diff --git a/src/include/kernel_data.h b/src/include/kernel_data.h new file mode 100644 index 0000000..6406745 --- /dev/null +++ b/src/include/kernel_data.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +#define DATA_HEADER_MAGIC 0x600dda7a +#define DATA_HEADER_VERSION 1 + +#pragma pack(push, 1) +struct popcorn_data { + uint32_t magic; + uint16_t version; + uint16_t length; + + uint32_t _reserved0; + uint32_t flags; + + void *font; + size_t font_length; + + void *data; + size_t data_length; + + void *log; + size_t log_length; + + void *memory_map; + void *runtime; + + void *acpi_table; + + void *frame_buffer; + size_t frame_buffer_size; + uint32_t hres; + uint32_t vres; + uint32_t rmask; + uint32_t gmask; + uint32_t bmask; + uint32_t _reserved1; +} +__attribute__((aligned(alignof(max_align_t)))); +#pragma pack(pop) + diff --git a/src/modules/main/font.c b/src/modules/main/font.cpp similarity index 100% rename from src/modules/main/font.c rename to src/modules/main/font.cpp diff --git a/src/modules/main/main.c b/src/modules/main/main.cpp similarity index 56% rename from src/modules/main/main.c rename to src/modules/main/main.cpp index 874a329..532c191 100644 --- a/src/modules/main/main.c +++ b/src/modules/main/main.cpp @@ -2,44 +2,16 @@ #include #include "font.h" +#include "kernel_data.h" #include "screen.h" -void do_the_set_registers(); - -#pragma pack(push, 1) -struct popcorn_data { - uint32_t magic; - uint16_t version; - uint16_t length; - - uint32_t _reserverd0; - uint32_t flags; - - void *font; - size_t font_length; - - void *data; - size_t data_length; - - void *memory_map; - void *runtime; - - void *acpi_table; - - void *frame_buffer; - size_t frame_buffer_size; - uint32_t hres; - uint32_t vres; - uint32_t rmask; - uint32_t gmask; - uint32_t bmask; - uint32_t _reserved1; +extern "C" { + void do_the_set_registers(popcorn_data *header); + void kernel_main(popcorn_data *header); } -__attribute__((aligned(8))); -#pragma pack(pop) void -kernel_main(struct popcorn_data *header) +kernel_main(popcorn_data *header) { struct screen screen; struct font font; diff --git a/src/modules/main/screen.c b/src/modules/main/screen.cpp similarity index 92% rename from src/modules/main/screen.c rename to src/modules/main/screen.cpp index c766271..6a37ed1 100644 --- a/src/modules/main/screen.c +++ b/src/modules/main/screen.cpp @@ -20,7 +20,7 @@ screen_init( uint32_t bmask, struct screen *s) { - s->data = frame_buffer; + s->data = static_cast(frame_buffer); s->hres = hres; s->vres = vres; s->rmask = rmask;