acpica: catch Io_mem exceptions

Issue #2998
This commit is contained in:
Alexander Boettcher
2018-10-02 11:02:59 +02:00
committed by Christian Helmuth
parent e448022f23
commit 6f0c6501f2

View File

@ -251,13 +251,12 @@ class Acpica::Io_mem
return 0UL; return 0UL;
} }
template <typename FUNC> static Acpica::Io_mem * unused_slot()
static Acpica::Io_mem * apply_p(FUNC const &func = [] () { } )
{ {
for (unsigned i = 0; i < sizeof(_ios) / sizeof(_ios[0]); i++) for (unsigned i = 0; i < sizeof(_ios) / sizeof(_ios[0]); i++)
{ {
Acpica::Io_mem * r = func(_ios[i]); if (_ios[i].unused())
if (r) return r; return &_ios[i];
} }
return nullptr; return nullptr;
} }
@ -265,21 +264,24 @@ class Acpica::Io_mem
static Acpica::Io_mem * allocate(ACPI_PHYSICAL_ADDRESS p, ACPI_SIZE s, static Acpica::Io_mem * allocate(ACPI_PHYSICAL_ADDRESS p, ACPI_SIZE s,
unsigned r) unsigned r)
{ {
return Acpica::Io_mem::apply_p([&] (Acpica::Io_mem &io_mem) { Acpica::Io_mem * io_mem = unused_slot();
if (!io_mem.unused()) if (!io_mem)
return reinterpret_cast<Acpica::Io_mem *>(0); return nullptr;
io_mem._phys = p & ~0xFFFUL; ACPI_PHYSICAL_ADDRESS const phys = p & ~0xFFFUL;
io_mem._size = Genode::align_addr(p + s - io_mem._phys, 12); ACPI_SIZE const size = Genode::align_addr(p + s - phys, 12);
io_mem._ref = r; try {
io_mem._virt = 0; 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()) io_mem->_phys = phys;
Genode::Io_mem_connection(Acpica::env(), io_mem._phys, io_mem->_size = size;
io_mem._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) 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) if (virt)
return reinterpret_cast<void *>(virt + (phys & 0xfffU)); return reinterpret_cast<void *>(virt + (phys & 0xfffU));
FAIL(nullptr) return 0UL;
} }
void AcpiOsUnmapMemory (void * ptr, ACPI_SIZE size) void AcpiOsUnmapMemory (void * ptr, ACPI_SIZE size)