mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 07:30:19 +00:00
Kernel: Make the ACPI DSDT table accessible
Expose the DSDT table in ACPI::Parser and in /sys/firmware/acpi as a first little step toward interpreting the AML bytecode from ACPI.
This commit is contained in:
parent
8c5fa95ba3
commit
cf48200e7b
Notes:
sideshowbarker
2024-07-17 06:01:50 +09:00
Author: https://github.com/me-minus 🔰 Commit: https://github.com/SerenityOS/serenity/commit/cf48200e7b Pull-request: https://github.com/SerenityOS/serenity/pull/15380 Reviewed-by: https://github.com/supercomputer7
3 changed files with 22 additions and 1 deletions
|
@ -320,6 +320,11 @@ struct [[gnu::packed]] MCFG {
|
||||||
u64 reserved;
|
u64 reserved;
|
||||||
PCI_MMIO_Descriptor descriptors[];
|
PCI_MMIO_Descriptor descriptors[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct [[gnu::packed]] DSDT {
|
||||||
|
SDTHeader h;
|
||||||
|
unsigned char definition_block[];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
class Parser;
|
class Parser;
|
||||||
|
|
|
@ -130,6 +130,7 @@ UNMAP_AFTER_INIT void Parser::locate_static_data()
|
||||||
locate_main_system_description_table();
|
locate_main_system_description_table();
|
||||||
initialize_main_system_description_table();
|
initialize_main_system_description_table();
|
||||||
process_fadt_data();
|
process_fadt_data();
|
||||||
|
process_dsdt();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(StringView signature)
|
UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(StringView signature)
|
||||||
|
@ -170,7 +171,6 @@ UNMAP_AFTER_INIT void Parser::process_fadt_data()
|
||||||
|
|
||||||
auto sdt = Memory::map_typed<Structures::FADT>(m_fadt).release_value_but_fixme_should_propagate_errors();
|
auto sdt = Memory::map_typed<Structures::FADT>(m_fadt).release_value_but_fixme_should_propagate_errors();
|
||||||
dmesgln("ACPI: Fixed ACPI data, Revision {}, length: {} bytes", (size_t)sdt->h.revision, (size_t)sdt->h.length);
|
dmesgln("ACPI: Fixed ACPI data, Revision {}, length: {} bytes", (size_t)sdt->h.revision, (size_t)sdt->h.length);
|
||||||
dmesgln("ACPI: DSDT {}", PhysicalAddress(sdt->dsdt_ptr));
|
|
||||||
m_x86_specific_flags.cmos_rtc_not_present = (sdt->ia_pc_boot_arch_flags & (u8)FADTFlags::IA_PC_Flags::CMOS_RTC_Not_Present);
|
m_x86_specific_flags.cmos_rtc_not_present = (sdt->ia_pc_boot_arch_flags & (u8)FADTFlags::IA_PC_Flags::CMOS_RTC_Not_Present);
|
||||||
|
|
||||||
// FIXME: QEMU doesn't report that we have an i8042 controller in these flags, even if it should (when FADT revision is 3),
|
// FIXME: QEMU doesn't report that we have an i8042 controller in these flags, even if it should (when FADT revision is 3),
|
||||||
|
@ -205,6 +205,21 @@ UNMAP_AFTER_INIT void Parser::process_fadt_data()
|
||||||
m_hardware_flags.wbinvd_flush = (sdt->flags & (u32)FADTFlags::FeatureFlags::WBINVD_FLUSH);
|
m_hardware_flags.wbinvd_flush = (sdt->flags & (u32)FADTFlags::FeatureFlags::WBINVD_FLUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UNMAP_AFTER_INIT void Parser::process_dsdt()
|
||||||
|
{
|
||||||
|
auto sdt = Memory::map_typed<Structures::FADT>(m_fadt).release_value_but_fixme_should_propagate_errors();
|
||||||
|
|
||||||
|
// Add DSDT-pointer to expose the full table in /sys/firmware/acpi/
|
||||||
|
m_sdt_pointers.append(PhysicalAddress(sdt->dsdt_ptr));
|
||||||
|
|
||||||
|
auto dsdt_or_error = Memory::map_typed<Structures::DSDT>(PhysicalAddress(sdt->dsdt_ptr));
|
||||||
|
if (dsdt_or_error.is_error()) {
|
||||||
|
dmesgln("ACPI: DSDT is unmappable");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dmesgln("ACPI: Using DSDT @ {} with {} bytes", PhysicalAddress(sdt->dsdt_ptr), dsdt_or_error.value()->h.length);
|
||||||
|
}
|
||||||
|
|
||||||
bool Parser::can_reboot()
|
bool Parser::can_reboot()
|
||||||
{
|
{
|
||||||
auto fadt_or_error = Memory::map_typed<Structures::FADT>(m_fadt);
|
auto fadt_or_error = Memory::map_typed<Structures::FADT>(m_fadt);
|
||||||
|
|
|
@ -89,6 +89,7 @@ private:
|
||||||
size_t get_table_size(PhysicalAddress);
|
size_t get_table_size(PhysicalAddress);
|
||||||
u8 get_table_revision(PhysicalAddress);
|
u8 get_table_revision(PhysicalAddress);
|
||||||
void process_fadt_data();
|
void process_fadt_data();
|
||||||
|
void process_dsdt();
|
||||||
|
|
||||||
bool validate_reset_register(Memory::TypedMapping<Structures::FADT> const&);
|
bool validate_reset_register(Memory::TypedMapping<Structures::FADT> const&);
|
||||||
void access_generic_address(Structures::GenericAddressStructure const&, u32 value);
|
void access_generic_address(Structures::GenericAddressStructure const&, u32 value);
|
||||||
|
|
Loading…
Reference in a new issue