:: commit 26bccc63086aab1f2761f9e3e86e261b36e96dda

mintsuki <mintsuki@protonmail.com> — 2020-03-26 00:37

parents: 0040b97fd1

Add RSDP detection to stivale

diff --git a/src/lib/acpi.c b/src/lib/acpi.c
new file mode 100644
index 00000000..b6e771cd
--- /dev/null
+++ b/src/lib/acpi.c
@@ -0,0 +1,20 @@
+#include <stddef.h>
+#include <lib/acpi.h>
+#include <lib/blib.h>
+#include <lib/libc.h>
+
+void *get_rsdp(void) {
+    for (size_t i = 0x80000; i < 0x100000; i += 16) {
+        if (i == 0xa0000) {
+            /* skip video mem and mapped hardware */
+            i = 0xe0000 - 16;
+            continue;
+        }
+        if (!strncmp((char *)i, "RSD PTR ", 8)) {
+            print("acpi: Found RSDP at %x\n", i);
+            return (void *)i;
+        }
+    }
+
+    return NULL;
+}
diff --git a/src/lib/acpi.h b/src/lib/acpi.h
new file mode 100644
index 00000000..4f45423c
--- /dev/null
+++ b/src/lib/acpi.h
@@ -0,0 +1,6 @@
+#ifndef __LIB__ACPI_H__
+#define __LIB__ACPI_H__
+
+void *get_rsdp(void);
+
+#endif
diff --git a/src/protos/stivale.c b/src/protos/stivale.c
index a4e19410..e11baaeb 100644
--- a/src/protos/stivale.c
+++ b/src/protos/stivale.c
@@ -3,6 +3,7 @@
 #include <protos/stivale.h>
 #include <lib/elf.h>
 #include <lib/blib.h>
+#include <lib/acpi.h>
 
 struct stivale_header {
     uint64_t stack;
@@ -24,6 +25,7 @@ struct stivale_struct {
     uint16_t framebuffer_width;
     uint16_t framebuffer_height;
     uint16_t framebuffer_bpp;
+    uint64_t rsdp;
     uint64_t module_count;
     struct stivale_module modules[];
 } __attribute__((packed));
@@ -54,6 +56,9 @@ void stivale_load(struct echfs_file_handle *fd) {
 
     elf_load(fd, &entry_point);
 
+    stivale_struct.rsdp = (uint64_t)(size_t)get_rsdp();
+    print("stivale: RSDP at %X\n", stivale_struct.rsdp);
+
     volatile struct {
         uint64_t pml4[512];
         uint64_t pml3_lo[512];
@@ -103,9 +108,11 @@ void stivale_load(struct echfs_file_handle *fd) {
         "mov fs, ax\n\t"
         "mov gs, ax\n\t"
         "mov ss, ax\n\t"
+        "mov rsp, [rsi]\n\t"
         "jmp [rbx]\n\t"
         ".code32\n\t"
         :
-        : "a" (pagemap), "b" (&entry_point), "S" (&stivale_struct)
+        : "a" (pagemap), "b" (&entry_point),
+          "D" (&stivale_struct), "S" (&stivale_hdr.stack)
     );
 }
diff --git a/test/linker.ld b/test/linker.ld
index a1f8fbd3..14f6027d 100644
--- a/test/linker.ld
+++ b/test/linker.ld
@@ -3,19 +3,23 @@ ENTRY(_start)
 SECTIONS {
     . = 0xffffffff80100000;
 
-    .text : {
+    .stivalehdr : ALIGN(4K) {
+        *(.stivalehdr)
+    }
+
+    .text : ALIGN(4K) {
         *(.text*)
     }
 
-    .rodata : {
+    .rodata : ALIGN(4K) {
         *(.rodata*)
     }
 
-    .data : {
+    .data : ALIGN(4K) {
         *(.data*)
     }
 
-    .bss : {
+    .bss : ALIGN(4K) {
         *(.bss*)
         *(COMMON)
     }
tab: 248 wrap: offon