From 39f32b5bd6dfd383cce4ceb643639c3af963dfb9 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 20 Aug 2013 14:39:05 +0200 Subject: [PATCH] device_pd: survive failing attachment request Be more robust. If the attachment fails continue to operate and just print a error message. Before the commit the device_pd stopped to operate if an attachment did not succeed. Issue #683 --- os/src/drivers/pci/device_pd/main.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/os/src/drivers/pci/device_pd/main.cc b/os/src/drivers/pci/device_pd/main.cc index c6f1a7b4b..2fac3bcf9 100644 --- a/os/src/drivers/pci/device_pd/main.cc +++ b/os/src/drivers/pci/device_pd/main.cc @@ -30,10 +30,21 @@ void Pci::Device_pd_component::attach_dma_mem(Genode::Ram_dataspace_capability d Dataspace_client ds_client(ds_cap); - addr_t page = env()->rm_session()->attach_at(ds_cap, ds_client.phys_addr()); + addr_t page = ~0UL; + + try { + page = env()->rm_session()->attach_at(ds_cap, ds_client.phys_addr()); + } catch (...) { } + /* sanity check */ - if (page != ds_client.phys_addr()) - throw Rm_session::Region_conflict(); + if ((page == ~0UL) || (page != ds_client.phys_addr())) { + if (page != ~0UL) + env()->rm_session()->detach(page); + + PERR("attachment of DMA memory @ %lx+%zx failed", + ds_client.phys_addr(), ds_client.size()); + return; + } /* trigger mapping of whole memory area */ for (size_t rounds = (ds_client.size() + 1) / 4096; rounds;