summaryrefslogtreecommitdiff
path: root/src/arch/amd64/acpi.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-02-03 00:50:07 -0500
committerFreya Murphy <freya@freyacat.org>2024-02-03 00:53:58 -0500
commit90a6065691beee52bf5309916fba98f7580d27be (patch)
tree0b5375d20c189f62d394c473d371f7bf7f1d3fc5 /src/arch/amd64/acpi.c
parentimproved debugger, refactored (diff)
downloadcorn-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 '')
-rw-r--r--src/arch/amd64/acpi.c36
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)