From 3bd361dfa56117d9fa0aea99a052579b60b5dd9e Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 23 Sep 2016 17:47:36 +0200 Subject: [PATCH] nova: setup exception portals correctly Fixes #2111 --- repos/base-nova/src/core/include/pager.h | 11 ++++++----- repos/base-nova/src/core/pager.cc | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/repos/base-nova/src/core/include/pager.h b/repos/base-nova/src/core/include/pager.h index 708ce8e9d..b6fe41972 100644 --- a/repos/base-nova/src/core/include/pager.h +++ b/repos/base-nova/src/core/include/pager.h @@ -116,9 +116,10 @@ namespace Genode { } _state; - Cpu_session_capability _cpu_session_cap; - Thread_capability _thread_cap; - Exception_handlers _exceptions; + Cpu_session_capability _cpu_session_cap; + Thread_capability _thread_cap; + Affinity::Location const _location; + Exception_handlers _exceptions; addr_t _pd; @@ -149,8 +150,6 @@ namespace Genode { public: - const Affinity::Location location; - Pager_object(Cpu_session_capability cpu_session_cap, Thread_capability thread_cap, unsigned long badge, Affinity::Location location, @@ -175,6 +174,8 @@ namespace Genode { _exception_sigh = sigh; } + Affinity::Location location() const { return _location; } + /** * Assign PD selector to PD */ diff --git a/repos/base-nova/src/core/pager.cc b/repos/base-nova/src/core/pager.cc index 46a89c165..44fde2f78 100644 --- a/repos/base-nova/src/core/pager.cc +++ b/repos/base-nova/src/core/pager.cc @@ -510,7 +510,8 @@ template void Exception_handlers::register_handler(Pager_object *obj, Mtd mtd, void (* __attribute__((regparm(1))) func)(addr_t)) { - unsigned use_cpu = obj->location.xpos(); + unsigned use_cpu = obj->location().xpos(); + if (!kernel_hip()->is_cpu_enabled(use_cpu) || !pager_threads[use_cpu]) { warning("invalid CPU parameter used in pager object"); throw Region_map::Invalid_thread(); @@ -581,8 +582,8 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, _client_exc_pt_sel(cap_map()->insert(NUM_INITIAL_PT_LOG2)), _client_exc_vcpu(Native_thread::INVALID_INDEX), _cpu_session_cap(cpu_session_cap), _thread_cap(thread_cap), - _exceptions(this), - location(location) + _location(location), + _exceptions(this) { uint8_t res; @@ -870,7 +871,7 @@ void Pager_object::_oom_handler(addr_t pager_dst, addr_t pager_src, addr_t Pager_object::get_oom_portal() { addr_t const pt_oom = sel_oom_portal(); - unsigned const use_cpu = location.xpos(); + unsigned const use_cpu = _location.xpos(); if (kernel_hip()->is_cpu_enabled(use_cpu) && pager_threads[use_cpu]) { addr_t const ec_sel = pager_threads[use_cpu]->native_thread().ec_sel; @@ -953,7 +954,7 @@ Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &cap_factory) Pager_capability Pager_entrypoint::manage(Pager_object *obj) { /* let handle pager_object of pager thread on same CPU */ - unsigned use_cpu = obj->location.xpos(); + unsigned use_cpu = obj->location().xpos(); if (!kernel_hip()->is_cpu_enabled(use_cpu) || !pager_threads[use_cpu]) { warning("invalid CPU parameter used in pager object"); return Pager_capability();