mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 19:15:08 +00:00
Kernel/ACPI: Return Optional container after table search
This is a better pattern than returning a PhysicalAddress with a zero value, so the code is more understandable now.
This commit is contained in:
parent
43b17f27a3
commit
bde3c7301e
7 changed files with 26 additions and 25 deletions
|
@ -330,7 +330,7 @@ class Parser;
|
||||||
|
|
||||||
namespace StaticParsing {
|
namespace StaticParsing {
|
||||||
Optional<PhysicalAddress> find_rsdp();
|
Optional<PhysicalAddress> find_rsdp();
|
||||||
PhysicalAddress find_table(PhysicalAddress rsdp, const StringView& signature);
|
Optional<PhysicalAddress> find_table(PhysicalAddress rsdp, const StringView& signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,8 +103,8 @@ void Parser::set_the(Parser& parser)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool match_table_signature(PhysicalAddress table_header, const StringView& signature);
|
static bool match_table_signature(PhysicalAddress table_header, const StringView& signature);
|
||||||
static PhysicalAddress search_table_in_xsdt(PhysicalAddress xsdt, const StringView& signature);
|
static Optional<PhysicalAddress> search_table_in_xsdt(PhysicalAddress xsdt, const StringView& signature);
|
||||||
static PhysicalAddress search_table_in_rsdt(PhysicalAddress rsdt, const StringView& signature);
|
static Optional<PhysicalAddress> search_table_in_rsdt(PhysicalAddress rsdt, const StringView& signature);
|
||||||
static bool validate_table(const Structures::SDTHeader&, size_t length);
|
static bool validate_table(const Structures::SDTHeader&, size_t length);
|
||||||
|
|
||||||
UNMAP_AFTER_INIT void Parser::locate_static_data()
|
UNMAP_AFTER_INIT void Parser::locate_static_data()
|
||||||
|
@ -115,7 +115,7 @@ UNMAP_AFTER_INIT void Parser::locate_static_data()
|
||||||
init_facs();
|
init_facs();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT PhysicalAddress Parser::find_table(const StringView& signature)
|
UNMAP_AFTER_INIT Optional<PhysicalAddress> Parser::find_table(const StringView& signature)
|
||||||
{
|
{
|
||||||
dbgln_if(ACPI_DEBUG, "ACPI: Calling Find Table method!");
|
dbgln_if(ACPI_DEBUG, "ACPI: Calling Find Table method!");
|
||||||
for (auto p_sdt : m_sdt_pointers) {
|
for (auto p_sdt : m_sdt_pointers) {
|
||||||
|
@ -131,7 +131,8 @@ UNMAP_AFTER_INIT PhysicalAddress Parser::find_table(const StringView& signature)
|
||||||
|
|
||||||
UNMAP_AFTER_INIT void Parser::init_facs()
|
UNMAP_AFTER_INIT void Parser::init_facs()
|
||||||
{
|
{
|
||||||
m_facs = find_table("FACS");
|
if (auto facs = find_table("FACS"); facs.has_value())
|
||||||
|
m_facs = facs.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT void Parser::init_fadt()
|
UNMAP_AFTER_INIT void Parser::init_fadt()
|
||||||
|
@ -139,9 +140,7 @@ UNMAP_AFTER_INIT void Parser::init_fadt()
|
||||||
dmesgln("ACPI: Initializing Fixed ACPI data");
|
dmesgln("ACPI: Initializing Fixed ACPI data");
|
||||||
dmesgln("ACPI: Searching for the Fixed ACPI Data Table");
|
dmesgln("ACPI: Searching for the Fixed ACPI Data Table");
|
||||||
|
|
||||||
m_fadt = find_table("FACP");
|
m_fadt = find_table("FACP").value();
|
||||||
VERIFY(!m_fadt.is_null());
|
|
||||||
|
|
||||||
auto sdt = Memory::map_typed<const volatile Structures::FADT>(m_fadt);
|
auto sdt = Memory::map_typed<const volatile Structures::FADT>(m_fadt);
|
||||||
|
|
||||||
dbgln_if(ACPI_DEBUG, "ACPI: FADT @ V{}, {}", &sdt, m_fadt);
|
dbgln_if(ACPI_DEBUG, "ACPI: FADT @ V{}, {}", &sdt, m_fadt);
|
||||||
|
@ -379,7 +378,7 @@ UNMAP_AFTER_INIT Optional<PhysicalAddress> StaticParsing::find_rsdp()
|
||||||
return map_bios().find_chunk_starting_with(signature, 16);
|
return map_bios().find_chunk_starting_with(signature, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT PhysicalAddress StaticParsing::find_table(PhysicalAddress rsdp_address, const StringView& signature)
|
UNMAP_AFTER_INIT Optional<PhysicalAddress> StaticParsing::find_table(PhysicalAddress rsdp_address, const StringView& signature)
|
||||||
{
|
{
|
||||||
// FIXME: There's no validation of ACPI tables here. Use the checksum to validate the tables.
|
// FIXME: There's no validation of ACPI tables here. Use the checksum to validate the tables.
|
||||||
VERIFY(signature.length() == 4);
|
VERIFY(signature.length() == 4);
|
||||||
|
@ -397,7 +396,7 @@ UNMAP_AFTER_INIT PhysicalAddress StaticParsing::find_table(PhysicalAddress rsdp_
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT static PhysicalAddress search_table_in_xsdt(PhysicalAddress xsdt_address, const StringView& signature)
|
UNMAP_AFTER_INIT static Optional<PhysicalAddress> search_table_in_xsdt(PhysicalAddress xsdt_address, const StringView& signature)
|
||||||
{
|
{
|
||||||
// FIXME: There's no validation of ACPI tables here. Use the checksum to validate the tables.
|
// FIXME: There's no validation of ACPI tables here. Use the checksum to validate the tables.
|
||||||
VERIFY(signature.length() == 4);
|
VERIFY(signature.length() == 4);
|
||||||
|
@ -420,7 +419,7 @@ static bool match_table_signature(PhysicalAddress table_header, const StringView
|
||||||
return !strncmp(table->h.sig, signature.characters_without_null_termination(), 4);
|
return !strncmp(table->h.sig, signature.characters_without_null_termination(), 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT static PhysicalAddress search_table_in_rsdt(PhysicalAddress rsdt_address, const StringView& signature)
|
UNMAP_AFTER_INIT static Optional<PhysicalAddress> search_table_in_rsdt(PhysicalAddress rsdt_address, const StringView& signature)
|
||||||
{
|
{
|
||||||
// FIXME: There's no validation of ACPI tables here. Use the checksum to validate the tables.
|
// FIXME: There's no validation of ACPI tables here. Use the checksum to validate the tables.
|
||||||
VERIFY(signature.length() == 4);
|
VERIFY(signature.length() == 4);
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
set_the(*new ParserType(rsdp));
|
set_the(*new ParserType(rsdp));
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual PhysicalAddress find_table(const StringView& signature);
|
virtual Optional<PhysicalAddress> find_table(const StringView& signature);
|
||||||
|
|
||||||
virtual void try_acpi_reboot();
|
virtual void try_acpi_reboot();
|
||||||
virtual bool can_reboot();
|
virtual bool can_reboot();
|
||||||
|
|
|
@ -21,7 +21,7 @@ static bool test_pci_io();
|
||||||
|
|
||||||
UNMAP_AFTER_INIT static PCIAccessLevel detect_optimal_access_type(PCIAccessLevel boot_determined)
|
UNMAP_AFTER_INIT static PCIAccessLevel detect_optimal_access_type(PCIAccessLevel boot_determined)
|
||||||
{
|
{
|
||||||
if (!ACPI::is_enabled() || ACPI::Parser::the()->find_table("MCFG").is_null())
|
if (!ACPI::is_enabled() || !ACPI::Parser::the()->find_table("MCFG").has_value())
|
||||||
return PCIAccessLevel::IOAddressing;
|
return PCIAccessLevel::IOAddressing;
|
||||||
|
|
||||||
if (boot_determined != PCIAccessLevel::IOAddressing)
|
if (boot_determined != PCIAccessLevel::IOAddressing)
|
||||||
|
@ -39,7 +39,9 @@ UNMAP_AFTER_INIT void initialize()
|
||||||
|
|
||||||
switch (detect_optimal_access_type(boot_determined)) {
|
switch (detect_optimal_access_type(boot_determined)) {
|
||||||
case PCIAccessLevel::MemoryAddressing: {
|
case PCIAccessLevel::MemoryAddressing: {
|
||||||
auto success = Access::initialize_for_memory_access(ACPI::Parser::the()->find_table("MCFG"));
|
auto mcfg = ACPI::Parser::the()->find_table("MCFG");
|
||||||
|
VERIFY(mcfg.has_value());
|
||||||
|
auto success = Access::initialize_for_memory_access(mcfg.value());
|
||||||
VERIFY(success);
|
VERIFY(success);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -265,12 +265,12 @@ UNMAP_AFTER_INIT bool APIC::init_bsp()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto madt_address = ACPI::StaticParsing::find_table(rsdp.value(), "APIC");
|
auto madt_address = ACPI::StaticParsing::find_table(rsdp.value(), "APIC");
|
||||||
if (madt_address.is_null()) {
|
if (!madt_address.has_value()) {
|
||||||
dbgln("APIC: MADT table not found");
|
dbgln("APIC: MADT table not found");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto madt = Memory::map_typed<ACPI::Structures::MADT>(madt_address);
|
auto madt = Memory::map_typed<ACPI::Structures::MADT>(madt_address.value());
|
||||||
size_t entry_index = 0;
|
size_t entry_index = 0;
|
||||||
size_t entries_length = madt->h.length - sizeof(ACPI::Structures::MADT);
|
size_t entries_length = madt->h.length - sizeof(ACPI::Structures::MADT);
|
||||||
auto* madt_entry = madt->entries;
|
auto* madt_entry = madt->entries;
|
||||||
|
|
|
@ -115,7 +115,7 @@ UNMAP_AFTER_INIT PhysicalAddress InterruptManagement::search_for_madt()
|
||||||
auto rsdp = ACPI::StaticParsing::find_rsdp();
|
auto rsdp = ACPI::StaticParsing::find_rsdp();
|
||||||
if (!rsdp.has_value())
|
if (!rsdp.has_value())
|
||||||
return {};
|
return {};
|
||||||
return ACPI::StaticParsing::find_table(rsdp.value(), "APIC");
|
return ACPI::StaticParsing::find_table(rsdp.value(), "APIC").value();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT InterruptManagement::InterruptManagement()
|
UNMAP_AFTER_INIT InterruptManagement::InterruptManagement()
|
||||||
|
|
|
@ -119,12 +119,12 @@ UNMAP_AFTER_INIT bool HPET::test_and_initialize()
|
||||||
{
|
{
|
||||||
VERIFY(!HPET::initialized());
|
VERIFY(!HPET::initialized());
|
||||||
hpet_initialized = true;
|
hpet_initialized = true;
|
||||||
auto hpet = ACPI::Parser::the()->find_table("HPET");
|
auto hpet_table = ACPI::Parser::the()->find_table("HPET");
|
||||||
if (hpet.is_null())
|
if (!hpet_table.has_value())
|
||||||
return false;
|
return false;
|
||||||
dmesgln("HPET @ {}", hpet);
|
dmesgln("HPET @ {}", hpet_table.value());
|
||||||
|
|
||||||
auto sdt = Memory::map_typed<ACPI::Structures::HPET>(hpet);
|
auto sdt = Memory::map_typed<ACPI::Structures::HPET>(hpet_table.value());
|
||||||
|
|
||||||
// Note: HPET is only usable from System Memory
|
// Note: HPET is only usable from System Memory
|
||||||
VERIFY(sdt->event_timer_block.address_space == (u8)ACPI::GenericAddressStructure::AddressSpace::SystemMemory);
|
VERIFY(sdt->event_timer_block.address_space == (u8)ACPI::GenericAddressStructure::AddressSpace::SystemMemory);
|
||||||
|
@ -135,17 +135,17 @@ UNMAP_AFTER_INIT bool HPET::test_and_initialize()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new HPET(PhysicalAddress(hpet));
|
new HPET(PhysicalAddress(hpet_table.value()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool HPET::check_for_exisiting_periodic_timers()
|
UNMAP_AFTER_INIT bool HPET::check_for_exisiting_periodic_timers()
|
||||||
{
|
{
|
||||||
auto hpet = ACPI::Parser::the()->find_table("HPET");
|
auto hpet_table = ACPI::Parser::the()->find_table("HPET");
|
||||||
if (hpet.is_null())
|
if (!hpet_table.has_value())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto sdt = Memory::map_typed<ACPI::Structures::HPET>(hpet);
|
auto sdt = Memory::map_typed<ACPI::Structures::HPET>(hpet_table.value());
|
||||||
VERIFY(sdt->event_timer_block.address_space == 0);
|
VERIFY(sdt->event_timer_block.address_space == 0);
|
||||||
auto registers = Memory::map_typed<HPETRegistersBlock>(PhysicalAddress(sdt->event_timer_block.address));
|
auto registers = Memory::map_typed<HPETRegistersBlock>(PhysicalAddress(sdt->event_timer_block.address));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue