From 6f0c6501f2ea0f48886dc421864ced8b5dfdaa53 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 2 Oct 2018 11:02:59 +0200 Subject: [PATCH] acpica: catch Io_mem exceptions Issue #2998 --- repos/libports/src/lib/acpica/iomem.cc | 36 ++++++++++++++------------ 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/repos/libports/src/lib/acpica/iomem.cc b/repos/libports/src/lib/acpica/iomem.cc index 34334a7ab..c6258c3da 100644 --- a/repos/libports/src/lib/acpica/iomem.cc +++ b/repos/libports/src/lib/acpica/iomem.cc @@ -251,13 +251,12 @@ class Acpica::Io_mem return 0UL; } - template - static Acpica::Io_mem * apply_p(FUNC const &func = [] () { } ) + static Acpica::Io_mem * unused_slot() { for (unsigned i = 0; i < sizeof(_ios) / sizeof(_ios[0]); i++) { - Acpica::Io_mem * r = func(_ios[i]); - if (r) return r; + if (_ios[i].unused()) + return &_ios[i]; } return nullptr; } @@ -265,21 +264,24 @@ class Acpica::Io_mem static Acpica::Io_mem * allocate(ACPI_PHYSICAL_ADDRESS p, ACPI_SIZE s, unsigned r) { - return Acpica::Io_mem::apply_p([&] (Acpica::Io_mem &io_mem) { - if (!io_mem.unused()) - return reinterpret_cast(0); + Acpica::Io_mem * io_mem = unused_slot(); + if (!io_mem) + return nullptr; - io_mem._phys = p & ~0xFFFUL; - io_mem._size = Genode::align_addr(p + s - io_mem._phys, 12); - io_mem._ref = r; - io_mem._virt = 0; + ACPI_PHYSICAL_ADDRESS const phys = p & ~0xFFFUL; + ACPI_SIZE const size = Genode::align_addr(p + s - phys, 12); + try { + io_mem->_io_mem = new (Acpica::heap()) Genode::Io_mem_connection(Acpica::env(), phys, size); + } catch (...) { + return nullptr; + } - io_mem._io_mem = new (Acpica::heap()) - Genode::Io_mem_connection(Acpica::env(), io_mem._phys, - io_mem._size); + io_mem->_phys = phys; + io_mem->_size = size; + io_mem->_ref = r; + io_mem->_virt = 0; - return &io_mem; - }); + return io_mem; } static Genode::addr_t insert(ACPI_PHYSICAL_ADDRESS p, ACPI_SIZE s) @@ -421,7 +423,7 @@ void * AcpiOsMapMemory (ACPI_PHYSICAL_ADDRESS phys, ACPI_SIZE size) if (virt) return reinterpret_cast(virt + (phys & 0xfffU)); - FAIL(nullptr) + return 0UL; } void AcpiOsUnmapMemory (void * ptr, ACPI_SIZE size)