diff --git a/base-nova/src/core/include/map_local.h b/base-nova/src/core/include/map_local.h index 3af9cb85e2..6898ffd0ce 100644 --- a/base-nova/src/core/include/map_local.h +++ b/base-nova/src/core/include/map_local.h @@ -35,10 +35,12 @@ namespace Genode { * * \return true on success */ - inline bool map_local(addr_t from_phys, addr_t to_virt, size_t num_pages) + inline bool map_local(addr_t from_phys, addr_t to_virt, size_t num_pages, + bool read = true, bool write = true, bool exec = true) { return (::map_local((Nova::Utcb *)Thread_base::myself()->utcb(), - from_phys, to_virt, num_pages, true) == 0); + from_phys, to_virt, num_pages, + Nova::Rights(read, write, exec), true) == 0); } /** diff --git a/base-nova/src/core/include/nova_util.h b/base-nova/src/core/include/nova_util.h index 815f3105cf..9ae01effa9 100644 --- a/base-nova/src/core/include/nova_util.h +++ b/base-nova/src/core/include/nova_util.h @@ -94,6 +94,7 @@ map_local_one_to_one(Nova::Utcb *utcb, Nova::Crd crd) { inline int map_local(Nova::Utcb *utcb, Genode::addr_t from_start, Genode::addr_t to_start, Genode::size_t num_pages, + Nova::Rights const &permission, bool kern_pd = false) { if (verbose_local_map) @@ -102,7 +103,6 @@ inline int map_local(Nova::Utcb *utcb, using namespace Nova; using namespace Genode; - Rights const rwx(true, true, true); size_t const size = num_pages << get_page_size_log2(); @@ -144,8 +144,8 @@ inline int map_local(Nova::Utcb *utcb, order, from_curr, from_end, to_curr, to_end); int const res = map_local(utcb, - Mem_crd((from_curr >> 12), order - get_page_size_log2(), rwx), - Mem_crd((to_curr >> 12), order - get_page_size_log2(), rwx), + Mem_crd((from_curr >> 12), order - get_page_size_log2(), permission), + Mem_crd((to_curr >> 12), order - get_page_size_log2(), permission), kern_pd); if (res) return res; diff --git a/base-nova/src/core/io_mem_session_support.cc b/base-nova/src/core/io_mem_session_support.cc index e531999941..f3bec9de4e 100644 --- a/base-nova/src/core/io_mem_session_support.cc +++ b/base-nova/src/core/io_mem_session_support.cc @@ -51,9 +51,10 @@ addr_t Io_mem_session_component::_map_local(addr_t base, size_t size) } /* map the dataspace's physical pages to local addresses */ + const Nova::Rights rights(true, true, true); map_local((Nova::Utcb *)Thread_base::myself()->utcb(), base, (addr_t)virt_addr, - page_rounded_size >> get_page_size_log2(), true); + page_rounded_size >> get_page_size_log2(), rights, true); return (addr_t)virt_addr; } diff --git a/base-nova/src/core/platform.cc b/base-nova/src/core/platform.cc index b2478a3c2b..5b04d82f8b 100644 --- a/base-nova/src/core/platform.cc +++ b/base-nova/src/core/platform.cc @@ -385,7 +385,8 @@ Platform::Platform() : PERR("could not locally map multi-boot module"); int res = map_local(__main_thread_utcb, mem_desc->addr, (addr_t)core_local_addr, - round_page(mem_desc->size) >> get_page_size_log2(), true); + round_page(mem_desc->size) >> get_page_size_log2(), + Nova::Rights(true, true, true), true); if (res) PERR("map_local failed res=%d", res); @@ -413,7 +414,7 @@ Platform::Platform() : /* remap main utcb to default utbc address */ if (map_local(__main_thread_utcb, (addr_t)__main_thread_utcb, - (addr_t)main_thread_utcb(), 1)) { + (addr_t)main_thread_utcb(), 1, Nova::Rights(true, true, true))) { PERR("could not remap main threads utcb"); nova_die(); } @@ -435,7 +436,8 @@ bool Core_mem_allocator::Mapped_mem_allocator::_map_local(addr_t virt_addr, unsigned size_log2) { map_local((Utcb *)Thread_base::myself()->utcb(), phys_addr, - virt_addr, 1 << (size_log2 - get_page_size_log2()), true); + virt_addr, 1 << (size_log2 - get_page_size_log2()), + Rights(true, true, true), true); return true; } diff --git a/base-nova/src/core/ram_session_support.cc b/base-nova/src/core/ram_session_support.cc index ce57ee3f3a..031be90236 100644 --- a/base-nova/src/core/ram_session_support.cc +++ b/base-nova/src/core/ram_session_support.cc @@ -67,9 +67,10 @@ void Ram_session_component::_clear_ds(Dataspace_component *ds) page_rounded_size, ds->phys_addr(), virt_addr); /* map the dataspace's physical pages to local addresses */ + const Nova::Rights rights(true, true, true); map_local((Nova::Utcb *)Thread_base::myself()->utcb(), ds->phys_addr(), (addr_t)virt_addr, - page_rounded_size >> get_page_size_log2(), true); + page_rounded_size >> get_page_size_log2(), rights, true); memset(virt_addr, 0, page_rounded_size);