pci_decode: do not handle signals after decoding

Remove signal handler and ACPI report ROM from Main class
to prevent to react on report changes.

Fix genodelabs/genode#4779
This commit is contained in:
Stefan Kalkowski 2023-03-08 10:01:08 +01:00 committed by Christian Helmuth
parent 8698e693d5
commit ec700e88f7

View File

@ -31,9 +31,6 @@ struct Main
Env & env;
Heap heap { env.ram(), env.rm() };
Attached_rom_dataspace platform_info { env, "platform_info" };
Attached_rom_dataspace sys_rom { env, "system" };
Signal_handler<Main> sys_rom_handler { env.ep(), *this,
&Main::sys_rom_update };
Expanding_reporter pci_reporter { env, "devices", "devices", { 32*1024 } };
Registry<Bridge> bridge_registry {}; /* contains host bridges */
@ -55,7 +52,6 @@ struct Main
void parse_irq_override_rules(Xml_node & xml);
void parse_pci_config_spaces(Xml_node & xml, Xml_generator & generator);
void parse_acpi_device_info(Xml_node const &xml, Xml_generator & generator);
void sys_rom_update();
template <typename FN>
void for_bridge(Pci::bus_t bus, FN const & fn)
@ -371,12 +367,29 @@ void Main::parse_pci_config_spaces(Xml_node & xml, Xml_generator & generator)
}
void Main::sys_rom_update()
Main::Main(Env & env) : env(env)
{
platform_info.xml().with_optional_sub_node("kernel", [&] (Xml_node xml)
{
apic_capable = xml.attribute_value("acpi", false);
msi_capable = xml.attribute_value("msi", false);
});
Attached_rom_dataspace sys_rom(env, "system");
sys_rom.update();
if (!sys_rom.valid())
return;
/*
* Wait until the system ROM is available
*/
if (!sys_rom.valid()) {
struct Io_dummy { void fn() {}; } io_dummy;
Io_signal_handler<Io_dummy> handler(env.ep(), io_dummy, &Io_dummy::fn);
sys_rom.sigh(handler);
while (!sys_rom.valid()) {
env.ep().wait_and_dispatch_one_io_signal();
sys_rom.update();
}
}
Xml_node xml = sys_rom.xml();
@ -403,17 +416,4 @@ void Main::sys_rom_update()
}
Main::Main(Env & env) : env(env)
{
sys_rom.sigh(sys_rom_handler);
platform_info.xml().with_optional_sub_node("kernel", [&] (Xml_node xml)
{
apic_capable = xml.attribute_value("acpi", false);
msi_capable = xml.attribute_value("msi", false);
});
sys_rom_update();
}
void Component::construct(Genode::Env &env) { static Main main(env); }