Add RSDP detection to stivale

This commit is contained in:
mintsuki 2020-03-26 01:37:56 +01:00
parent 0040b97fd1
commit 26bccc6308
4 changed files with 42 additions and 5 deletions

20
src/lib/acpi.c Normal file
View File

@ -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;
}

6
src/lib/acpi.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef __LIB__ACPI_H__
#define __LIB__ACPI_H__
void *get_rsdp(void);
#endif

View File

@ -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)
);
}

View File

@ -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)
}