Advertisement
Guest User

Untitled

a guest
May 9th, 2023
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. namespace acpi {
  2.  
  3. static void* find_sdt(rsdt* rsdt, const char* signature)
  4. {
  5. u32 entries = (rsdt->header.length - sizeof rsdt->header) / sizeof rsdt->list;
  6. for (u32 i = 0; i < entries; i++) {
  7. table_header* entry = &rsdt->list[i];
  8. if (!memcmp(entry->signature, signature, 4)) {
  9. check_sdt(entry);
  10. return (void*)entry;
  11. }
  12. }
  13. return nullptr;
  14. }
  15.  
  16. void init()
  17. {
  18. constexpr auto rsdp_start = "RSD PTR ";
  19. acpi::rsdp* rsdp{};
  20.  
  21. for (u32 addr = 0xf0000; addr < 0xfffff; addr++) {
  22. if (!memcmp((u32*)addr, rsdp_start, 8)) {
  23. rsdp = (acpi::rsdp*)addr;
  24. break;
  25. }
  26. }
  27.  
  28. if (!rsdp) {
  29. u8* ebda = (u8*)(*((u16*)0x40e) << 4);
  30. for (u32 i = 0; i <= KiB(1); i += 16) {
  31. if (!memcmp(ebda + i, rsdp_start, 8)) {
  32. rsdp = (acpi::rsdp*)(ebda + i);
  33. break;
  34. }
  35. }
  36. }
  37.  
  38. // this works
  39. constexpr auto test = "APIC";
  40. for (u32 i = 0x7fe0000; i < 0x7ffffff; i++) {
  41. if (!memcmp((u32*)i, test, 4)) {
  42. vga::print("%s: 0x%x\n", test, i);
  43. break;
  44. }
  45. }
  46.  
  47. auto rsdt = rsdp->rsdt;
  48.  
  49. // this also works
  50. auto fadt = (acpi::fadt*)find_sdt(rsdt, "FACP");
  51. vga::print("FADT: 0x%x\n", fadt);
  52.  
  53. // this doesn't work
  54. // auto madt = ( acpi::madt* )find_sdt(rsdt, "APIC");
  55. // vga::print("MADT: 0x%x\n", madt);
  56. }
  57.  
  58. }
  59.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement