diff options
Diffstat (limited to 'kernel/src/apic/rsdp.c')
| -rw-r--r-- | kernel/src/apic/rsdp.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/src/apic/rsdp.c b/kernel/src/apic/rsdp.c index ebecd66..983ab5f 100644 --- a/kernel/src/apic/rsdp.c +++ b/kernel/src/apic/rsdp.c @@ -24,6 +24,44 @@ uint64_t* find_rsdp() return NULL; } +void list_sys_tables(void) +{ + uint64_t* rsdp = find_rsdp(); + + if (rsdp == NULL) { + printf("RSDP NOT FOUND\n"); + return; + } + + struct RSDP_descriptor* rsdp_desc = (struct RSDP_descriptor*)rsdp; + map_addr(rsdp_desc->RsdtAddress, rsdp_desc->RsdtAddress, FLAG_PRESENT); + + struct ACPI_header* rsdt = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header)); + memcpy(rsdt, (uint64_t*)(uint64_t)rsdp_desc->RsdtAddress, sizeof(struct ACPI_header)); + + uint32_t entries = (rsdt->Length - (uint32_t)sizeof(struct ACPI_header)) / 4; + + for (size_t i = 0; i < entries; i++) { + uint32_t na_addr = (uint32_t)rsdp_desc->RsdtAddress + (uint32_t)sizeof(struct ACPI_header) + (uint32_t)i * 4; + uint32_t addr; + memcpy(&addr, (uint64_t*)(uint64_t)na_addr, 4); + + struct ACPI_header* t = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header)); + memcpy(t, (uint64_t*)(uint64_t)addr, sizeof(struct ACPI_header)); + + for (size_t j = 0; j < 4; j++) { + printf("%c", t->Signature[j]); + } + printf(", "); + + kfree(t); + } + printf("\n"); + + kfree(rsdt); + +} + uint64_t* find_sys_table_addr(const char* signature) { uint64_t* rsdp = find_rsdp(); |
