diff --git a/repos/libports/src/app/acpica/ac.h b/repos/libports/src/app/acpica/ac.h index 36b88c6509..60acd0f5eb 100644 --- a/repos/libports/src/app/acpica/ac.h +++ b/repos/libports/src/app/acpica/ac.h @@ -50,9 +50,10 @@ class Ac : Acpica::Callback { _report->ac_event(); } - static ACPI_STATUS detect(ACPI_HANDLE ac, UINT32, void * report, void **) + static ACPI_STATUS detect(ACPI_HANDLE ac, UINT32, void * m, void **) { - Ac * obj = new (Genode::env()->heap()) Ac(report); + Acpica::Main * main = reinterpret_cast(m); + Ac * obj = new (main->heap) Ac(main->report); ACPI_STATUS res = AcpiInstallNotifyHandler (ac, ACPI_DEVICE_NOTIFY, handler, obj); diff --git a/repos/libports/src/app/acpica/ec.h b/repos/libports/src/app/acpica/ec.h index 4998b472ea..3254a8cb0c 100644 --- a/repos/libports/src/app/acpica/ec.h +++ b/repos/libports/src/app/acpica/ec.h @@ -25,6 +25,7 @@ class Ec : Acpica::Callback { ACPI_HANDLE gpe_block; + Genode::Allocator &_heap; Acpica::Reportstate * _report; /* 12.2.1 Embedded Controller Status, EC_SC (R) */ @@ -49,9 +50,10 @@ class Ec : Acpica::Callback { public: - Ec(void * report) + Ec(Genode::Allocator &heap, Acpica::Reportstate *report) : - _report(reinterpret_cast(report)) + _heap(heap), + _report(report) { } static UINT32 handler_gpe(ACPI_HANDLE dev, UINT32 gpe, void *context) @@ -104,7 +106,7 @@ class Ec : Acpica::Callback { } if (!data_obj) { - data_obj = new (Genode::env()->heap()) Data(data); + data_obj = new (ec->_heap) Data(data); ec->_list_data.insert(data_obj); } data_obj->count ++; @@ -136,11 +138,11 @@ class Ec : Acpica::Callback { if (!ec->ec_data) { ec->ec_port_data = resource->Data.Io.Minimum; - ec->ec_data = new (Genode::env()->heap()) Genode::Io_port_connection(ec->ec_port_data, 1); + ec->ec_data = new (ec->_heap) Genode::Io_port_connection(ec->ec_port_data, 1); } else if (!ec->ec_cmdsta) { ec->ec_port_cmdsta = resource->Data.Io.Minimum; - ec->ec_cmdsta = new (Genode::env()->heap()) Genode::Io_port_connection(ec->ec_port_cmdsta, 1); + ec->ec_cmdsta = new (ec->_heap) Genode::Io_port_connection(ec->ec_port_cmdsta, 1); } else Genode::error("unknown io_port"); @@ -212,9 +214,10 @@ class Ec : Acpica::Callback { return AE_BAD_PARAMETER; } - static ACPI_STATUS detect(ACPI_HANDLE ec, UINT32, void *report, void **) + static ACPI_STATUS detect(ACPI_HANDLE ec, UINT32, void *m, void **) { - Ec *ec_obj = new (Genode::env()->heap()) Ec(report); + Acpica::Main * main = reinterpret_cast(m); + Ec *ec_obj = new (main->heap) Ec(main->heap, main->report); ACPI_STATUS res = AcpiWalkResources(ec, ACPI_STRING("_CRS"), Ec::detect_io_ports, ec_obj); diff --git a/repos/libports/src/app/acpica/lid.h b/repos/libports/src/app/acpica/lid.h index a09bde0e11..a85479f8fc 100644 --- a/repos/libports/src/app/acpica/lid.h +++ b/repos/libports/src/app/acpica/lid.h @@ -50,9 +50,10 @@ class Lid : Acpica::Callback { _report->lid_event(); } - static ACPI_STATUS detect(ACPI_HANDLE lid, UINT32, void * report, void **) + static ACPI_STATUS detect(ACPI_HANDLE lid, UINT32, void * m, void **) { - Lid * obj = new (Genode::env()->heap()) Lid(report); + Acpica::Main * main = reinterpret_cast(m); + Lid * obj = new (main->heap) Lid(main->report); ACPI_STATUS res = AcpiInstallNotifyHandler (lid, ACPI_DEVICE_NOTIFY, handler, obj); diff --git a/repos/libports/src/app/acpica/os.cc b/repos/libports/src/app/acpica/os.cc index 488ade5a8f..01ac06c998 100644 --- a/repos/libports/src/app/acpica/os.cc +++ b/repos/libports/src/app/acpica/os.cc @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -43,10 +44,6 @@ namespace Acpica { #include "util.h" #include "reporter.h" #include "fixed.h" -#include "ac.h" -#include "lid.h" -#include "sb.h" -#include "ec.h" struct Acpica::Statechange @@ -110,7 +107,7 @@ struct Acpica::Main Genode::Attached_rom_dataspace config { env, "config" }; - Genode::Signal_handler sci_irq; + Genode::Signal_handler sci_irq; Genode::Constructible sci_conn; Acpica::Reportstate * report = nullptr; @@ -143,7 +140,7 @@ struct Acpica::Main if (enable_reset || enable_poweroff) new (heap) Acpica::Statechange(env.ep(), enable_reset, - enable_poweroff); + enable_poweroff); /* setup IRQ */ if (!irq_handler.handler) { @@ -188,6 +185,10 @@ struct Acpica::Main } }; +#include "ac.h" +#include "lid.h" +#include "sb.h" +#include "ec.h" void Acpica::Main::init_acpica() { @@ -227,7 +228,7 @@ void Acpica::Main::init_acpica() } /* Embedded controller */ - status = AcpiGetDevices(ACPI_STRING("PNP0C09"), Ec::detect, report, nullptr); + status = AcpiGetDevices(ACPI_STRING("PNP0C09"), Ec::detect, this, nullptr); if (status != AE_OK) { Genode::error("AcpiGetDevices failed, status=", status); return; @@ -268,21 +269,21 @@ void Acpica::Main::init_acpica() /* AC Adapters and Power Source Objects */ - status = AcpiGetDevices(ACPI_STRING("ACPI0003"), Ac::detect, report, nullptr); + status = AcpiGetDevices(ACPI_STRING("ACPI0003"), Ac::detect, this, nullptr); if (status != AE_OK) { Genode::error("AcpiGetDevices (ACPI0003) failed, status=", status); return; } /* Smart battery control devices */ - status = AcpiGetDevices(ACPI_STRING("PNP0C0A"), Battery::detect, report, nullptr); + status = AcpiGetDevices(ACPI_STRING("PNP0C0A"), Battery::detect, this, nullptr); if (status != AE_OK) { Genode::error("AcpiGetDevices (PNP0C0A) failed, status=", status); return; } /* LID device */ - status = AcpiGetDevices(ACPI_STRING("PNP0C0D"), Lid::detect, report, nullptr); + status = AcpiGetDevices(ACPI_STRING("PNP0C0D"), Lid::detect, this, nullptr); if (status != AE_OK) { Genode::error("AcpiGetDevices (PNP0C0D) failed, status=", status); return; @@ -303,4 +304,7 @@ ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER handler, } +/* used by normal (no-printf-debug) target */ +void Component::construct(Genode::Env &env) { static Acpica::Main main(env); } +/* used by debug target (using printf of libc) */ void Libc::Component::construct(Genode::Env &env) { static Acpica::Main main(env); } diff --git a/repos/libports/src/app/acpica/sb.h b/repos/libports/src/app/acpica/sb.h index b8a75590b4..b763d58c6d 100644 --- a/repos/libports/src/app/acpica/sb.h +++ b/repos/libports/src/app/acpica/sb.h @@ -33,9 +33,10 @@ class Battery : Acpica::Callback { _report->battery_event(); } - static ACPI_STATUS detect(ACPI_HANDLE sb, UINT32, void *report, void **) + static ACPI_STATUS detect(ACPI_HANDLE sb, UINT32, void *m, void **) { - Battery * dev_obj = new (Genode::env()->heap()) Battery(report, sb); + Acpica::Main * main = reinterpret_cast(m); + Battery * dev_obj = new (main->heap) Battery(main->report, sb); ACPI_STATUS res = AcpiInstallNotifyHandler (sb, ACPI_DEVICE_NOTIFY, handler, dev_obj); diff --git a/repos/libports/src/lib/acpica/iomem.cc b/repos/libports/src/lib/acpica/iomem.cc index bdb5a23853..107997a4aa 100644 --- a/repos/libports/src/lib/acpica/iomem.cc +++ b/repos/libports/src/lib/acpica/iomem.cc @@ -44,7 +44,7 @@ class Acpica::Io_mem Genode::Io_mem_connection *_io_mem = nullptr; unsigned _ref; - static Acpica::Io_mem _ios[16]; + static Acpica::Io_mem _ios[32]; public: @@ -239,7 +239,7 @@ class Acpica::Io_mem } }; -Acpica::Io_mem Acpica::Io_mem::_ios[16]; +Acpica::Io_mem Acpica::Io_mem::_ios[32]; void * AcpiOsMapMemory (ACPI_PHYSICAL_ADDRESS phys, ACPI_SIZE size)