summaryrefslogtreecommitdiff
path: root/shim/kc_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'shim/kc_main.c')
-rw-r--r--shim/kc_main.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/shim/kc_main.c b/shim/kc_main.c
new file mode 100644
index 0000000..1829616
--- /dev/null
+++ b/shim/kc_main.c
@@ -0,0 +1,73 @@
+#include <loader/efi/shim.h>
+#include <kernel/memory/range.h>
+
+#include <stdbool.h>
+
+#include "../lib/elf.h"
+
+struct efi_memory_map
+{
+ struct memory_range buffer;
+ UINTN size;
+ UINTN key;
+ UINTN descsize;
+ UINT32 descver;
+};
+
+struct efi_video_data
+{
+ struct memory_range buffer;
+ UINT32 width;
+ UINT32 height;
+ UINT32 pitch;
+ EFI_GRAPHICS_PIXEL_FORMAT format;
+ EFI_PIXEL_BITMASK mask;
+};
+
+struct efi_boot_data
+{
+ struct efi_memory_map memory_map;
+ struct efi_video_data video_data;
+ void *acpi_rsdp;
+ unsigned long acpi_version;
+};
+
+struct efi_loader_image kernel_image =
+{
+ .path = L"\\adasoft\\sophia\\kernel.os"
+};
+
+static struct efi_boot_data boot_data;
+
+// TODO: split relocation code out into library
+
+EFI_STATUS kc_main(struct efi_loader_interface *interface)
+{
+ // 1. load kernel and boot modules into memory
+ // 2. generate page tables for kernel and boot modules
+ // 2. gather boot data, store as type SystemMemoryType
+ // 3. exit boot services
+ // 5. ???????????
+
+ EFI_STATUS status;
+
+ if (!interface)
+ {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (!EFI_ERROR((status = interface->image_open(&kernel_image))) &&
+ !EFI_ERROR((status = interface->image_alloc(&kernel_image))) &&
+ !EFI_ERROR((status = interface->image_load(&kernel_image))))
+ {
+ (void)boot_data;
+ }
+
+ __asm__ volatile (
+ "cli\n\t"
+ "hlt\n\t"
+ );
+
+ return status;
+}
+