NOVA: support to restrict memory rwx bits in core

This commit is contained in:
Alexander Boettcher 2012-11-20 10:05:14 +01:00 committed by Norman Feske
parent 4d12464cee
commit b8ab3673cd
5 changed files with 16 additions and 10 deletions

View File

@ -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);
}
/**

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);