Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace acpi {
- static void* find_sdt(rsdt* rsdt, const char* signature)
- {
- u32 entries = (rsdt->header.length - sizeof rsdt->header) / sizeof rsdt->list;
- for (u32 i = 0; i < entries; i++) {
- table_header* entry = &rsdt->list[i];
- if (!memcmp(entry->signature, signature, 4)) {
- check_sdt(entry);
- return (void*)entry;
- }
- }
- return nullptr;
- }
- void init()
- {
- constexpr auto rsdp_start = "RSD PTR ";
- acpi::rsdp* rsdp{};
- for (u32 addr = 0xf0000; addr < 0xfffff; addr++) {
- if (!memcmp((u32*)addr, rsdp_start, 8)) {
- rsdp = (acpi::rsdp*)addr;
- break;
- }
- }
- if (!rsdp) {
- u8* ebda = (u8*)(*((u16*)0x40e) << 4);
- for (u32 i = 0; i <= KiB(1); i += 16) {
- if (!memcmp(ebda + i, rsdp_start, 8)) {
- rsdp = (acpi::rsdp*)(ebda + i);
- break;
- }
- }
- }
- // this works
- constexpr auto test = "APIC";
- for (u32 i = 0x7fe0000; i < 0x7ffffff; i++) {
- if (!memcmp((u32*)i, test, 4)) {
- vga::print("%s: 0x%x\n", test, i);
- break;
- }
- }
- auto rsdt = rsdp->rsdt;
- // this also works
- auto fadt = (acpi::fadt*)find_sdt(rsdt, "FACP");
- vga::print("FADT: 0x%x\n", fadt);
- // this doesn't work
- // auto madt = ( acpi::madt* )find_sdt(rsdt, "APIC");
- // vga::print("MADT: 0x%x\n", madt);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement