diff --git a/base-fiasco/src/core/platform.cc b/base-fiasco/src/core/platform.cc index 9a83f09a26..a5a3cbdb9f 100644 --- a/base-fiasco/src/core/platform.cc +++ b/base-fiasco/src/core/platform.cc @@ -187,6 +187,14 @@ struct Region Region() : start(0), end(0) { } Region(addr_t s, addr_t e) : start(s), end(e) { } + + /** + * Returns true if the specified range intersects with the region + */ + bool intersects(addr_t base, size_t size) const + { + return (((base + size) > start) && (base < end)); + } }; @@ -296,8 +304,11 @@ void Platform::_setup_mem_alloc() } region.start = addr; region.end = addr + size; - add_region(region, _ram_alloc); - add_region(region, _core_address_ranges()); + if (!region.intersects(Native_config::context_area_virtual_base(), + Native_config::context_area_virtual_size())) { + add_region(region, _ram_alloc); + add_region(region, _core_address_ranges()); + } remove_region(region, _io_mem_alloc); remove_region(region, _region_alloc); } diff --git a/base-foc/src/core/platform.cc b/base-foc/src/core/platform.cc index 93f1a648b6..8c73276b64 100644 --- a/base-foc/src/core/platform.cc +++ b/base-foc/src/core/platform.cc @@ -171,6 +171,14 @@ struct Region Region() : start(0), end(0) { } Region(addr_t s, addr_t e) : start(s), end(e) { } + + /** + * Returns true if the specified range intersects with the region + */ + bool intersects(addr_t base, size_t size) const + { + return (((base + size) > start) && (base < end)); + } }; @@ -308,8 +316,11 @@ void Platform::_setup_mem_alloc() } region.start = addr; region.end = addr + size; - add_region(region, _ram_alloc); - add_region(region, _core_address_ranges()); + if (!region.intersects(Native_config::context_area_virtual_base(), + Native_config::context_area_virtual_size())) { + add_region(region, _ram_alloc); + add_region(region, _core_address_ranges()); + } remove_region(region, _io_mem_alloc); remove_region(region, _region_alloc); } diff --git a/base-pistachio/src/core/include/map_local.h b/base-pistachio/src/core/include/map_local.h index 9539329798..e0a1be03cb 100644 --- a/base-pistachio/src/core/include/map_local.h +++ b/base-pistachio/src/core/include/map_local.h @@ -20,6 +20,7 @@ /* Pistachio includes */ namespace Pistachio { +#include #include #include #include @@ -40,7 +41,7 @@ namespace Genode { */ inline static bool map_local(addr_t from_addr, addr_t to_addr, size_t num_pages) { - + Native_thread_id core_pager = platform_specific()->core_pager()->native_thread_id(); addr_t offset = 0; @@ -85,7 +86,14 @@ namespace Genode { */ inline void unmap_local(addr_t virt, size_t num_pages) { - PERR("unmap_local() called - not implemented yet"); + size_t page_size = get_page_size(); + addr_t offset = 0; + for (unsigned i = 0; i < num_pages; i++, offset += page_size) { + using namespace Pistachio; + L4_Fpage_t fpage = L4_Fpage(virt + offset, page_size); + fpage += L4_FullyAccessible; + L4_Flush(fpage); + } } } diff --git a/base-pistachio/src/core/platform.cc b/base-pistachio/src/core/platform.cc index 4a7fa3ba13..96a05a76f7 100644 --- a/base-pistachio/src/core/platform.cc +++ b/base-pistachio/src/core/platform.cc @@ -21,6 +21,7 @@ /* core includes */ #include +#include #include #include #include @@ -247,6 +248,14 @@ struct Region Region() : start(0), end(0) { } Region(addr_t s, addr_t e) : start(s), end(e) { } + + /** + * Returns true if the specified range intersects with the region + */ + bool intersects(addr_t base, size_t size) const + { + return (((base + size) > start) && (base < end)); + } }; @@ -396,8 +405,13 @@ void Platform::_setup_mem_alloc() } else { region.start = addr; region.end = addr + size; - add_region(region, _ram_alloc); - add_region(region, _core_address_ranges()); + if (!region.intersects(Native_config::context_area_virtual_base(), + Native_config::context_area_virtual_size())) { + add_region(region, _ram_alloc); + add_region(region, _core_address_ranges()); + } else { + unmap_local(region.start, size >> get_page_size_log2()); + } remove_region(region, _io_mem_alloc); remove_region(region, _region_alloc); }