diff options
author | Freya Murphy <freya@freyacat.org> | 2024-02-03 00:50:07 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-02-03 00:53:58 -0500 |
commit | 90a6065691beee52bf5309916fba98f7580d27be (patch) | |
tree | 0b5375d20c189f62d394c473d371f7bf7f1d3fc5 /src/arch/amd64/acpi.c | |
parent | improved debugger, refactored (diff) | |
download | corn-90a6065691beee52bf5309916fba98f7580d27be.tar.gz corn-90a6065691beee52bf5309916fba98f7580d27be.tar.bz2 corn-90a6065691beee52bf5309916fba98f7580d27be.zip |
refactor, new arch dirs, (wip) page alloc on write, hsv screen (convert to userspace later), other fixes
Diffstat (limited to 'src/arch/amd64/acpi.c')
-rw-r--r-- | src/arch/amd64/acpi.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/arch/amd64/acpi.c b/src/arch/amd64/acpi.c index e262a99..eb38f73 100644 --- a/src/arch/amd64/acpi.c +++ b/src/arch/amd64/acpi.c @@ -1,14 +1,12 @@ #include <acpi.h> #include <lib.h> - +#include <memory.h> #include <stdint.h> #include <stddef.h> +#include <string.h> +#include <panic.h> #include "bindings.h" -#include "memory.h" - -/* global state, idk a better way rn */ -struct acpi_state state; struct acpi_header { char signature[4]; @@ -20,7 +18,7 @@ struct acpi_header { uint32_t oem_revision; uint32_t creator_id; uint32_t creator_revision; -}; +} __attribute__((packed)); // root system descriptor pointer // ACPI 1.0 @@ -30,7 +28,7 @@ struct rsdp { char oemid[6]; uint8_t revision; uint32_t rsdt_addr; -}; +} __attribute__((packed)); // eXtended system descriptor pointer // ACPI 2.0 @@ -45,7 +43,7 @@ struct xsdp { uint64_t xsdt_addr; uint8_t extendeid_checksum; uint8_t reserved[3]; -}; +} __attribute__((packed)); // root system descriptor table // ACPI 1.0 @@ -152,6 +150,9 @@ struct acpi_state { uint16_t SCI_EN; }; +/* global state, idk a better way rn */ +static struct acpi_state state; + static bool checksum(uint8_t *data, size_t len) { unsigned char sum = 0; for (size_t i = 0; i < len; i++) @@ -230,6 +231,9 @@ static void *acpi_find_table_xsdt(struct xsdt *xsdt, const char *identifier, int } int acpi_init_rsdt(struct rsdt *rsdt) { + + kprintf("RSDT: %#016lx\n", (size_t)rsdt); + rsdt = mmap(rsdt, sizeof(struct rsdt)); state.dst.rsdt = rsdt; @@ -278,23 +282,35 @@ int acpi_init(void *rootsdp) { if (!checksum((uint8_t *)rsdp, sizeof(struct rsdp))) return -1; + if (strncmp(rsdp->signature, "RSD PTR ", 8) != 0) { + panic("invalid acpi rsdp signature: %.*s\n", 8, rsdp->signature); + } + int res; if (rsdp->revision == 0) { + kprintf("ACPI 1.0\n"); + kprintf("RSDP: %#016lx\n", (size_t)rsdp); res = acpi_init_rsdt( (struct rsdt *) (uintptr_t) rsdp->rsdt_addr ); } else if (rsdp->revision == 2) { struct xsdp *xsdp = (struct xsdp *) rsdp; + kprintf("ACPI 2.0\n"); + kprintf("XSDP: %#016lx\n", (size_t)xsdp); res = acpi_init_xsdt( (struct xsdt *) (uintptr_t) xsdp->xsdt_addr ); } else { - return -1; + panic("invalid acpi rev: %d\n", rsdp->revision); } - if (res) + if (res) { + kprintf("...acpi failed to load\n\n"); return res; + } + + kprintf("\n\n"); int ret = read_s5_addr(&state); if (!ret) |