diff --git a/base-nova/include/base/cap_sel_alloc.h b/base-nova/include/base/cap_sel_alloc.h
index b7b4a4e9c9..2aed41f885 100644
--- a/base-nova/include/base/cap_sel_alloc.h
+++ b/base-nova/include/base/cap_sel_alloc.h
@@ -56,13 +56,6 @@ namespace Genode {
*/
void free(addr_t cap, size_t num_caps_log2);
- /**
- * Capability selector of local protection domain
- *
- * \return PD selector
- */
- static unsigned pd_sel();
-
};
/**
diff --git a/base-nova/include/base/native_types.h b/base-nova/include/base/native_types.h
index f923f745ec..bc07136e1c 100644
--- a/base-nova/include/base/native_types.h
+++ b/base-nova/include/base/native_types.h
@@ -26,20 +26,21 @@ namespace Genode {
struct Native_thread
{
- addr_t ec_sel; /* NOVA cap selector for execution context */
- addr_t pd_sel; /* NOVA cap selector of protection domain */
- addr_t exc_pt_sel; /* base of event portal window */
+ addr_t ec_sel; /* NOVA cap selector for execution context */
+ addr_t exc_pt_sel; /* base of event portal window */
};
typedef Native_thread Native_thread_id;
inline bool operator == (Native_thread_id t1, Native_thread_id t2)
{
- return (t1.ec_sel == t2.ec_sel) && (t1.pd_sel == t2.pd_sel);
+ return (t1.ec_sel == t2.ec_sel) &&
+ (t1.exc_pt_sel == t2.exc_pt_sel);
}
inline bool operator != (Native_thread_id t1, Native_thread_id t2)
{
- return (t1.ec_sel != t2.ec_sel) && (t1.pd_sel != t2.pd_sel);
+ return (t1.ec_sel != t2.ec_sel) &&
+ (t1.exc_pt_sel != t2.exc_pt_sel);
}
class Native_utcb
@@ -47,16 +48,17 @@ namespace Genode {
private:
/**
- * Size of the NOVA-specific user-level thread-control block
+ * Size of the NOVA-specific user-level thread-control
+ * block
*/
enum { UTCB_SIZE = 4096 };
/**
* User-level thread control block
*
- * The UTCB is one 4K page, shared between the kernel and the
- * user process. It is not backed by a dataspace but provided
- * by the kernel.
+ * The UTCB is one 4K page, shared between the kernel
+ * and the user process. It is not backed by a
+ * dataspace but provided by the kernel.
*/
addr_t _utcb[UTCB_SIZE/sizeof(addr_t)];
};
diff --git a/base-nova/src/base/env/cap_sel_alloc.cc b/base-nova/src/base/env/cap_sel_alloc.cc
index 03a328304a..3a9443b628 100644
--- a/base-nova/src/base/env/cap_sel_alloc.cc
+++ b/base-nova/src/base/env/cap_sel_alloc.cc
@@ -30,7 +30,6 @@ using namespace Genode;
* Must be initialized by the startup code
*/
int __first_free_cap_selector;
-int __local_pd_sel;
/**
* Low-level lock to protect the allocator
@@ -86,9 +85,7 @@ void Cap_selector_allocator::free(addr_t cap, size_t num_caps_log2)
}
-unsigned Cap_selector_allocator::pd_sel() { return __local_pd_sel; }
-
-Cap_selector_allocator::Cap_selector_allocator() : Bit_allocator<4096>()
+Cap_selector_allocator::Cap_selector_allocator()
{
/* initialize lock */
alloc_lock();
diff --git a/base-nova/src/base/lock/lock_helper.h b/base-nova/src/base/lock/lock_helper.h
index d7241fdff9..44d97c0287 100644
--- a/base-nova/src/base/lock/lock_helper.h
+++ b/base-nova/src/base/lock/lock_helper.h
@@ -45,7 +45,7 @@ static inline void thread_yield() { }
static bool thread_check_stopped_and_restart(Genode::Native_thread_id tid)
{
- Genode::addr_t sem = tid.pd_sel == 0 ?
+ Genode::addr_t sem = (tid.ec_sel == 0 && tid.exc_pt_sel == 0) ?
main_thread_running_semaphore() :
tid.exc_pt_sel + Nova::SM_SEL_EC;
@@ -72,14 +72,14 @@ static inline Genode::Native_thread_id thread_get_my_native_id()
static inline Genode::Native_thread_id thread_invalid_id()
{
- Genode::Native_thread_id tid = { 0, ~0UL };
+ Genode::Native_thread_id tid = { ~0UL, ~0UL };
return tid;
}
static inline bool thread_id_valid(Genode::Native_thread_id tid)
{
- return tid.pd_sel != ~0UL;
+ return !(tid.ec_sel == ~0UL && tid.exc_pt_sel == ~0UL);
}
diff --git a/base-nova/src/base/pager/pager.cc b/base-nova/src/base/pager/pager.cc
index 5528940f07..511d707bce 100644
--- a/base-nova/src/base/pager/pager.cc
+++ b/base-nova/src/base/pager/pager.cc
@@ -25,6 +25,7 @@ using namespace Genode;
using namespace Nova;
enum { PF_HANDLER_STACK_SIZE = sizeof(addr_t) * 1024 };
+extern Genode::addr_t __core_pd_sel;
void Pager_object::_page_fault_handler()
{
diff --git a/base-nova/src/base/thread/thread_nova.cc b/base-nova/src/base/thread/thread_nova.cc
index 00e59d787e..1f8fd11326 100644
--- a/base-nova/src/base/thread/thread_nova.cc
+++ b/base-nova/src/base/thread/thread_nova.cc
@@ -54,7 +54,6 @@ void Thread_base::_init_platform_thread()
* running semaphore and exception handler portals.
*/
_tid.ec_sel = ~0UL;
- _tid.pd_sel = cap_selector_allocator()->pd_sel();
_tid.exc_pt_sel = cap_selector_allocator()->alloc(NUM_INITIAL_PT_LOG2);
/* create thread at core */
diff --git a/base-nova/src/core/echo.cc b/base-nova/src/core/echo.cc
index b76c62957c..5b2bc2e849 100644
--- a/base-nova/src/core/echo.cc
+++ b/base-nova/src/core/echo.cc
@@ -1,6 +1,7 @@
/*
* \brief Echo implementation
* \author Norman Feske
+ * \author Alexander Boettcher
* \date 2010-01-19
*/
@@ -14,6 +15,9 @@
/* Genode includes */
#include
+/* Core includes */
+#include
+
/* local includes */
#include
@@ -65,7 +69,7 @@ Echo::Echo(Genode::addr_t utcb_addr)
using namespace Nova;
/* create echo EC */
- int pd_sel = Genode::Cap_selector_allocator::pd_sel();
+ Genode::addr_t pd_sel = Genode::Platform_pd::pd_core_sel();
uint8_t res = create_ec(_ec_sel, pd_sel, ECHO_CPU_NO, utcb_addr,
(mword_t)echo_stack_top(), ECHO_EXC_BASE, ECHO_GLOBAL);
diff --git a/base-nova/src/core/include/cap_session_component.h b/base-nova/src/core/include/cap_session_component.h
index 0dabf05ea6..bc8f03f1de 100644
--- a/base-nova/src/core/include/cap_session_component.h
+++ b/base-nova/src/core/include/cap_session_component.h
@@ -18,6 +18,9 @@
#include
#include
+/* core includes */
+#include
+
namespace Genode {
class Cap_session_component : public Rpc_object
diff --git a/base-nova/src/core/include/platform_pd.h b/base-nova/src/core/include/platform_pd.h
index a652cf0989..ec41c01c45 100644
--- a/base-nova/src/core/include/platform_pd.h
+++ b/base-nova/src/core/include/platform_pd.h
@@ -16,6 +16,12 @@
#include
+/*
+ * Must be initialized by the startup code,
+ * only valid in core
+ */
+extern Genode::addr_t __core_pd_sel;
+
namespace Genode {
class Platform_thread;
@@ -73,6 +79,14 @@ namespace Genode {
addr_t pd_sel() { return _pd_sel; }
int id() { return _id; }
+
+ /**
+ * Capability selector of core protection domain
+ *
+ * \return PD selector
+ */
+ static addr_t pd_core_sel() { return __core_pd_sel; }
+
};
}
diff --git a/base-nova/src/core/platform.cc b/base-nova/src/core/platform.cc
index 53f1809e9c..4a0401e6e7 100644
--- a/base-nova/src/core/platform.cc
+++ b/base-nova/src/core/platform.cc
@@ -64,7 +64,7 @@ extern unsigned _prog_img_beg, _prog_img_end;
/**
* Capability selector of root PD
*/
-extern int __local_pd_sel;
+addr_t __core_pd_sel;
/**
* Preserve physical page for the exclusive (read-only) use by core
@@ -161,7 +161,7 @@ static void init_core_page_fault_handler()
PDBG("create_ec returned %u", ret);
/* set up page-fault portal */
- create_pt(PT_SEL_PAGE_FAULT, __local_pd_sel, ec_sel,
+ create_pt(PT_SEL_PAGE_FAULT, __core_pd_sel, ec_sel,
Mtd(Mtd::QUAL | Mtd::ESP | Mtd::EIP),
(addr_t)page_fault_handler);
}
@@ -185,11 +185,11 @@ Platform::Platform() :
__first_free_cap_selector = hip->sel_exc + hip->sel_gsi + 3;
/* set core pd selector */
- __local_pd_sel = hip->sel_exc;
+ __core_pd_sel = hip->sel_exc;
/* create lock used by capability allocator */
- Nova::create_sm(Nova::PD_SEL_CAP_LOCK, __local_pd_sel, 1);
- Nova::create_sm(Nova::SM_SEL_EC, __local_pd_sel, 0);
+ Nova::create_sm(Nova::PD_SEL_CAP_LOCK, __core_pd_sel, 1);
+ Nova::create_sm(Nova::SM_SEL_EC, __core_pd_sel, 0);
/* locally map the whole I/O port range */
enum { ORDER_64K = 16 };
diff --git a/base-nova/src/core/platform_pd.cc b/base-nova/src/core/platform_pd.cc
index 99b1294f2e..1c7cd069e3 100644
--- a/base-nova/src/core/platform_pd.cc
+++ b/base-nova/src/core/platform_pd.cc
@@ -19,7 +19,6 @@
using namespace Genode;
-
/***************************
** Public object members **
***************************/
diff --git a/base-nova/src/core/platform_thread.cc b/base-nova/src/core/platform_thread.cc
index 0bbe46d391..9467e91531 100644
--- a/base-nova/src/core/platform_thread.cc
+++ b/base-nova/src/core/platform_thread.cc
@@ -98,7 +98,7 @@ int Platform_thread::start(void *ip, void *sp, addr_t exc_base)
*/
_pager->initial_esp(PD_UTCB + get_page_size());
- addr_t pd_sel = cap_selector_allocator()->pd_sel();
+ addr_t pd_sel = Platform_pd::pd_core_sel();
addr_t exc_base_sel = cap_selector_allocator()->alloc(Nova::NUM_INITIAL_PT_LOG2);
addr_t sm_alloc_sel = exc_base_sel + PD_SEL_CAP_LOCK;
addr_t sm_ec_sel = exc_base_sel + SM_SEL_EC;
diff --git a/base-nova/src/core/signal_source_component.cc b/base-nova/src/core/signal_source_component.cc
index e0f19be4d6..097720f493 100644
--- a/base-nova/src/core/signal_source_component.cc
+++ b/base-nova/src/core/signal_source_component.cc
@@ -18,6 +18,7 @@
/* core includes */
#include
+#include
/* NOVA includes */
#include
@@ -67,9 +68,9 @@ Signal_source_component::Signal_source_component(Rpc_entrypoint *ep)
/* initialized blocking semaphore */
addr_t sem_sel = cap_selector_allocator()->alloc();
uint8_t ret = Nova::create_sm(sem_sel,
- cap_selector_allocator()->pd_sel(), 0);
+ Platform_pd::pd_core_sel(), 0);
if (ret)
- PERR("create_sm returned %d", ret);
+ PERR("create_sm returned %u", ret);
_blocking_semaphore = Native_capability(sem_sel);
}
diff --git a/base-nova/src/core/thread_start.cc b/base-nova/src/core/thread_start.cc
index 67b99c008d..16e9e6d605 100644
--- a/base-nova/src/core/thread_start.cc
+++ b/base-nova/src/core/thread_start.cc
@@ -25,6 +25,7 @@
/* core includes */
#include
+#include
using namespace Genode;
@@ -44,7 +45,7 @@ void Thread_base::_init_platform_thread()
/* create running semaphore required for locking */
addr_t rs_sel =_tid.exc_pt_sel + SM_SEL_EC;
- uint8_t res = create_sm(rs_sel, _tid.pd_sel, 0);
+ uint8_t res = create_sm(rs_sel, pd_sel, 0);
if (res != NOVA_OK) {
PERR("create_sm returned %u", res);
throw Cpu_session::Thread_creation_failed();
@@ -55,7 +56,7 @@ void Thread_base::_init_platform_thread()
/* create local EC */
enum { CPU_NO = 0, GLOBAL = false };
- res = create_ec(_tid.ec_sel, Cap_selector_allocator::pd_sel(), CPU_NO,
+ res = create_ec(_tid.ec_sel, pd_sel, CPU_NO,
utcb, sp, _tid.exc_pt_sel, GLOBAL);
if (res != NOVA_OK) {
PERR("%p - create_ec returned %d", this, res);
diff --git a/base-nova/src/platform/_main_helper.h b/base-nova/src/platform/_main_helper.h
index 0b3871b3f0..f65a9845e5 100644
--- a/base-nova/src/platform/_main_helper.h
+++ b/base-nova/src/platform/_main_helper.h
@@ -16,6 +16,7 @@
#define _PLATFORM___MAIN_HELPER_H_
#include
+#include
/**
* Location of the main thread's UTCB, initialized by the startup code
@@ -34,11 +35,6 @@ extern long __initial_sp;
*/
extern int __first_free_cap_selector;
-/**
- * Selector of local protection domain
- */
-extern int __local_pd_sel;
-
static void main_thread_bootstrap()
{
/* register UTCB of main thread */
@@ -50,9 +46,6 @@ static void main_thread_bootstrap()
/* this variable may be set by the dynamic linker (ldso) */
if (!__first_free_cap_selector)
__first_free_cap_selector = FIRST_FREE_PORTAL;
-
- /* register pd selector at cap allocator */
- __local_pd_sel = Nova::PD_SEL;
}
#endif /* _PLATFORM___MAIN_HELPER_H_ */