diff --git a/base-nova/include/base/ipc.h b/base-nova/include/base/ipc.h
index f1d2818774..cd4cbefe93 100644
--- a/base-nova/include/base/ipc.h
+++ b/base-nova/include/base/ipc.h
@@ -20,14 +20,15 @@
inline void Genode::Ipc_ostream::_marshal_capability(Genode::Native_capability const &cap)
{
if (cap.valid())
- _snd_msg->snd_append_pt_sel(cap.dst());
+ _snd_msg->snd_append_pt_sel(cap.local_name(),
+ cap.dst().rights());
}
inline void Genode::Ipc_istream::_unmarshal_capability(Genode::Native_capability &cap)
{
addr_t pt_sel = _rcv_msg->rcv_pt_sel();
- cap = Native_capability(pt_sel, pt_sel);
+ cap = Native_capability(pt_sel);
}
#endif /* _INCLUDE__BASE__IPC_H_ */
diff --git a/base-nova/include/base/ipc_msgbuf.h b/base-nova/include/base/ipc_msgbuf.h
index 5bcec79ac7..dc52de26a7 100644
--- a/base-nova/include/base/ipc_msgbuf.h
+++ b/base-nova/include/base/ipc_msgbuf.h
@@ -45,7 +45,10 @@ namespace Genode {
/**
* Portal capability selectors to delegate
*/
- addr_t _snd_pt_sel[MAX_CAP_ARGS];
+ struct {
+ addr_t sel;
+ unsigned rights;
+ } _snd_pt_sel [MAX_CAP_ARGS];
/**
* Base of portal receive window
@@ -109,19 +112,25 @@ namespace Genode {
/**
* Append portal capability selector to message buffer
*/
- inline bool snd_append_pt_sel(addr_t pt_sel)
+ inline bool snd_append_pt_sel(addr_t pt_sel,
+ unsigned rights)
{
if (_snd_pt_sel_cnt >= MAX_CAP_ARGS - 1)
return false;
- _snd_pt_sel[_snd_pt_sel_cnt++] = pt_sel;
+ _snd_pt_sel[_snd_pt_sel_cnt ].sel = pt_sel;
+ _snd_pt_sel[_snd_pt_sel_cnt++].rights = rights;
return true;
}
/**
- * Return number of marshalled portal-capability selectors
+ * Return number of marshalled portal-capability
+ * selectors
*/
- inline size_t snd_pt_sel_cnt() { return _snd_pt_sel_cnt; }
+ inline size_t snd_pt_sel_cnt()
+ {
+ return _snd_pt_sel_cnt;
+ }
/**
* Return portal capability selector
@@ -130,7 +139,14 @@ namespace Genode {
* \return portal-capability selector, or
* -1 if index is invalid
*/
- addr_t snd_pt_sel(unsigned i) { return i < _snd_pt_sel_cnt ? _snd_pt_sel[i] : -1; }
+ Nova::Obj_crd snd_pt_sel(addr_t i)
+ {
+ if (i >= _snd_pt_sel_cnt)
+ return Nova::Obj_crd();
+
+ return Nova::Obj_crd(_snd_pt_sel[i].sel, 0,
+ _snd_pt_sel[i].rights);
+ }
/**
* Request current portal-receive window
diff --git a/base-nova/include/base/native_types.h b/base-nova/include/base/native_types.h
index f814918f61..d7a3081a99 100644
--- a/base-nova/include/base/native_types.h
+++ b/base-nova/include/base/native_types.h
@@ -17,6 +17,8 @@
#include
#include
+#include
+
namespace Genode {
typedef volatile int Native_lock;
@@ -57,18 +59,88 @@ namespace Genode {
* user process. It is not backed by a dataspace but provided
* by the kernel.
*/
- long _utcb[UTCB_SIZE/sizeof(long)];
+ addr_t _utcb[UTCB_SIZE/sizeof(addr_t)];
};
- struct Cap_dst_policy
+ class Native_capability
{
- typedef addr_t Dst;
- static bool valid(Dst pt) { return pt != 0; }
- static Dst invalid() { return 0; }
- static void copy(void* dst, Native_capability_tpl* src);
+ public:
+ typedef Nova::Obj_crd Dst;
+
+ struct Raw
+ {
+ Dst dst;
+ /*
+ * It is obsolete and unused in NOVA,
+ * however still used by generic base part
+ */
+ addr_t local_name;
+ };
+
+ private:
+ struct _Raw
+ {
+ Dst dst;
+
+ _Raw() : dst() { }
+
+ _Raw(addr_t sel, unsigned rights)
+ : dst(sel, 0, rights) { }
+ } _cap;
+
+ bool _trans_map;
+ void * _ptr;
+
+ protected:
+
+ explicit
+ Native_capability(void* ptr) : _cap(),
+ _trans_map(true),
+ _ptr(ptr) { }
+
+ public:
+ Native_capability() : _cap(), _trans_map(true),
+ _ptr(0) { }
+
+ explicit
+ Native_capability(addr_t sel, unsigned rights = 0x1f)
+ : _cap(sel, rights), _trans_map(true), _ptr(0) { }
+
+ Native_capability(const Native_capability &o)
+ : _cap(o._cap), _trans_map(o._trans_map), _ptr(o._ptr) { }
+
+ Native_capability& operator=(const Native_capability &o){
+ if (this == &o)
+ return *this;
+
+ _cap = o._cap;
+ _trans_map = o._trans_map;
+ _ptr = o._ptr;
+ return *this;
+ }
+
+ bool valid() const
+ {
+ return !_cap.dst.is_null() &&
+ _cap.dst.base() != ~0UL;
+ }
+
+ Dst dst() const { return _cap.dst; }
+ void * local() const { return _ptr; }
+ addr_t local_name() const { return _cap.dst.base(); }
+
+ static Dst invalid() { return Dst(); }
+
+ static Native_capability invalid_cap()
+ {
+ return Native_capability(~0UL);
+ }
+
+ /** Invoke map syscall instead of translate_map call */
+ void solely_map() { _trans_map = false; }
+ bool trans_map() const { return _trans_map; }
};
- typedef Native_capability_tpl Native_capability;
typedef int Native_connection_state;
}
diff --git a/base-nova/include/base/pager.h b/base-nova/include/base/pager.h
index 126aa6a8de..7021d378d5 100644
--- a/base-nova/include/base/pager.h
+++ b/base-nova/include/base/pager.h
@@ -44,8 +44,7 @@ namespace Genode {
*/
Signal_context_capability _exception_sigh;
- unsigned _pt_sel; /* portal selector for object identity */
- unsigned _pt_cleanup; /* portal selector for object cleanup/destruction */
+ addr_t _pt_cleanup; /* portal selector for object cleanup/destruction */
addr_t _initial_esp;
addr_t _initial_eip;
@@ -92,11 +91,6 @@ namespace Genode {
*/
void initial_eip(addr_t eip) { _initial_eip = eip; }
- /**
- * Return portal capability selector used for object identity
- */
- unsigned pt_sel() { return _pt_sel; }
-
/**
* Continue execution of pager object
*/
@@ -113,15 +107,13 @@ namespace Genode {
transmitter.submit();
}
-
/**
* Return entry point address
*/
addr_t handler_address()
{
- return reinterpret_cast(_invoke_handler);
+ return reinterpret_cast(_invoke_handler);
}
-
};
diff --git a/base-nova/include/nova/syscall-generic.h b/base-nova/include/nova/syscall-generic.h
index 0b76cf5b4f..b5e4b6f9ab 100644
--- a/base-nova/include/nova/syscall-generic.h
+++ b/base-nova/include/nova/syscall-generic.h
@@ -242,6 +242,7 @@ namespace Nova {
mword_t order() const { return _query(); }
bool is_null() const { return (_value & TYPE_MASK) == NULL_CRD_TYPE; }
uint8_t type() const { return _query(); }
+ uint8_t rights() const { return _query(); }
} __attribute__((packed));
@@ -323,6 +324,15 @@ namespace Nova {
{
public:
+ enum {
+ RIGHT_EC_RECALL = 0x1U,
+ };
+
+ Obj_crd() : Crd(0, 0)
+ {
+ _assign(NULL_CRD_TYPE);
+ }
+
Obj_crd(mword_t base, mword_t order,
mword_t rights = RIGHTS_ALL)
: Crd(base, order)
diff --git a/base-nova/include/nova/util.h b/base-nova/include/nova/util.h
index f19662be53..956f582cd7 100644
--- a/base-nova/include/nova/util.h
+++ b/base-nova/include/nova/util.h
@@ -31,7 +31,7 @@ inline void request_event_portal(Genode::Native_capability cap,
utcb->msg[0] = event;
utcb->set_msg_word(1);
- uint8_t res = call(pager_cap.dst());
+ uint8_t res = call(pager_cap.local_name());
if (res)
PERR("request of event (%lu) capability selector failed",
event);
diff --git a/base-nova/include/signal_session/source_client.h b/base-nova/include/signal_session/source_client.h
index 1c6e7bea24..3788e777a6 100644
--- a/base-nova/include/signal_session/source_client.h
+++ b/base-nova/include/signal_session/source_client.h
@@ -25,6 +25,8 @@
#include
#include
+#include
+
namespace Genode {
class Signal_source_client : public Rpc_client
@@ -54,7 +56,8 @@ namespace Genode {
* Constructor
*/
Signal_source_client(Signal_source_capability cap)
- : Rpc_client(static_cap_cast(cap)) { }
+ : Rpc_client(
+ static_cap_cast(cap)) { }
/*****************************
@@ -63,11 +66,19 @@ namespace Genode {
Signal wait_for_signal()
{
- /* make sure that we have aquired the semaphore from the server */
+ /*
+ * Make sure that we have acquired the
+ * semaphore from the server
+ */
_init_sem();
- /* block on semaphore, will be unblocked if signal is available */
- Nova::sm_ctrl(_sem.dst(), Nova::SEMAPHORE_DOWN);
+ /*
+ * Block on semaphore, will be unblocked if
+ * signal is available
+ */
+ if (Nova::sm_ctrl(_sem.local_name(),
+ Nova::SEMAPHORE_DOWN))
+ nova_die(__FILE__, __LINE__);
/*
* Now that the server has unblocked the semaphore, we are sure
diff --git a/base-nova/src/base/ipc/ipc.cc b/base-nova/src/base/ipc/ipc.cc
index fa29666d44..e74c267982 100644
--- a/base-nova/src/base/ipc/ipc.cc
+++ b/base-nova/src/base/ipc/ipc.cc
@@ -82,10 +82,10 @@ static bool copy_msgbuf_to_utcb(Nova::Utcb *utcb, Msgbuf_base *snd_msg,
/* append portal capability selectors */
for (unsigned i = 0; i < snd_msg->snd_pt_sel_cnt(); i++) {
- int pt_sel = snd_msg->snd_pt_sel(i);
- if (pt_sel < 0) continue;
+ Nova::Obj_crd crd = snd_msg->snd_pt_sel(i);
+ if (crd.base() == ~0UL) continue;
- if (!utcb->append_item(Nova::Obj_crd(pt_sel, 0), i, false, false, true))
+ if (!utcb->append_item(crd, i, false, false, true))
return false;
}
@@ -142,7 +142,7 @@ void Ipc_client::_call()
_rcv_msg->rcv_prepare_pt_sel_window(utcb);
/* establish the mapping via a portal traversal */
- uint8_t res = Nova::call(Ipc_ostream::_dst.dst());
+ uint8_t res = Nova::call(Ipc_ostream::_dst.local_name());
if (res) {
/* If an error occurred, reset word&item count (not done by kernel). */
utcb->set_msg_word(0);
diff --git a/base-nova/src/base/pager/pager.cc b/base-nova/src/base/pager/pager.cc
index 47634f7f76..3d9bd641a6 100644
--- a/base-nova/src/base/pager/pager.cc
+++ b/base-nova/src/base/pager/pager.cc
@@ -99,11 +99,10 @@ void Pager_object::wake_up() { PDBG("not yet implemented"); }
Pager_object::Pager_object(unsigned long badge)
: Thread_base("pager", PF_HANDLER_STACK_SIZE), _badge(badge)
{
- addr_t pd_sel = cap_selector_allocator()->pd_sel();
-
- enum { CPU_NO = 0, GLOBAL = false, EXC_BASE = 0 };
+ _pt_cleanup = cap_selector_allocator()->alloc();
/* create portal for page-fault handler */
+ addr_t pd_sel = __core_pd_sel;
uint8_t res = create_pt(exc_pt_sel() + PT_SEL_PAGE_FAULT, pd_sel,
_tid.ec_sel, Mtd(Mtd::QUAL | Mtd::EIP),
(mword_t)_page_fault_handler);
@@ -124,20 +123,6 @@ Pager_object::Pager_object(unsigned long badge)
throw Create_startup_pt_failed();
}
- /*
- * Create object identity representing the pager object. It is used as
- * argument to 'Cpu_session::set_pager'. Furthermore it can be invoked
- * to request the mapping of the event capability selector window
- * corresponding to the pager object.
- */
- _pt_sel = cap_selector_allocator()->alloc();
- res = create_pt(_pt_sel, pd_sel, _tid.ec_sel, Mtd(0),
- reinterpret_cast(_invoke_handler));
- if (res)
- PERR("could not create pager object identity, error = %u\n",
- res);
-
- _pt_cleanup = cap_selector_allocator()->alloc();
res = create_pt(_pt_cleanup, pd_sel, _tid.ec_sel, Mtd(0),
reinterpret_cast(_invoke_handler));
if (res)
@@ -147,10 +132,9 @@ Pager_object::Pager_object(unsigned long badge)
Pager_object::~Pager_object()
{
- /* Revoke thread portals serving exceptions */
- revoke(Obj_crd(exc_pt_sel(), NUM_INITIAL_PT_LOG2), true);
- /* Revoke portal used as identity object */
- revoke(Obj_crd(_pt_sel, 0), true);
+ /* Revoke portals of Pager_object */
+ revoke(Obj_crd(exc_pt_sel() + PT_SEL_STARTUP, 0), true);
+ revoke(Obj_crd(exc_pt_sel() + PT_SEL_PAGE_FAULT, 0), true);
/* Make sure nobody is in the handler anymore by doing an IPC to a
* local cap pointing to same serving thread (if not running in the
@@ -167,8 +151,6 @@ Pager_object::~Pager_object()
/* Revoke portal used for the cleanup call */
revoke(Obj_crd(_pt_cleanup, 0), true);
-
- cap_selector_allocator()->free(_pt_sel, 0);
cap_selector_allocator()->free(_pt_cleanup, 0);
}
@@ -177,11 +159,9 @@ Pager_object::~Pager_object()
Pager_capability Pager_entrypoint::manage(Pager_object *obj)
{
/* request creation of portal bind to pager thread */
- Native_capability pager_thread_cap(obj->ec_sel(), 0);
- Native_capability cap_session = _cap_session->alloc(pager_thread_cap,
- obj->handler_address());
-
- cap_session = Native_capability(cap_session.dst(), cap_session.dst());
+ Native_capability pager_thread_cap(obj->ec_sel());
+ Native_capability cap_session =
+ _cap_session->alloc(pager_thread_cap, obj->handler_address());
/* add server object to object pool */
obj->Object_pool::Entry::cap(cap_session);
@@ -199,9 +179,12 @@ void Pager_entrypoint::dissolve(Pager_object *obj)
_cap_session->free(obj->Object_pool::Entry::cap());
/* cleanup locally */
- addr_t pager_pt = obj->Object_pool::Entry::cap().dst();
- revoke(Obj_crd(pager_pt, 0), true);
- cap_selector_allocator()->free(pager_pt, 0);
+ Native_capability pager_pt =
+ obj->Object_pool::Entry::cap();
+
+ revoke(pager_pt.dst(), true);
+
+ cap_selector_allocator()->free(pager_pt.local_name(), 0);
remove(obj);
}
diff --git a/base-nova/src/base/server/server.cc b/base-nova/src/base/server/server.cc
index 012106563a..b49aa74342 100644
--- a/base-nova/src/base/server/server.cc
+++ b/base-nova/src/base/server/server.cc
@@ -38,12 +38,11 @@ Untyped_capability Rpc_entrypoint::_manage(Rpc_object_base *obj)
/* _ec_sel is invalid until thread gets started */
if (tid().ec_sel != ~0UL)
- ep_cap = Native_capability(tid().ec_sel, 0);
+ ec_cap = Native_capability(tid().ec_sel);
else
- ep_cap = Native_capability(_thread_cap.dst(), 0);
+ ec_cap = _thread_cap;
- new_obj_cap = _cap_session->alloc(ep_cap, (addr_t)_activation_entry);
- new_obj_cap = Native_capability(new_obj_cap.dst(), new_obj_cap.dst());
+ ep_cap = _cap_session->alloc(ec_cap, (addr_t)_activation_entry);
/* add server object to object pool */
obj->cap(new_obj_cap);
@@ -100,7 +99,7 @@ void Rpc_entrypoint::_activation_entry()
ep->_rcv_buf.post_ipc(reinterpret_cast(ep->utcb()));
/* destination of next reply */
- srv.dst(Native_capability(id_pt, srv.badge()));
+ srv.dst(Native_capability(id_pt));
int opcode = 0;
@@ -223,7 +222,7 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size,
* (to create portals bound to the ec)
*/
Native_capability ec_cap = cpu.native_cap(_thread_cap);
- _tid.ec_sel = ec_cap.dst();
+ _tid.ec_sel = ec_cap.local_name();
}
_rcv_buf.rcv_prepare_pt_sel_window((Nova::Utcb *)&_context->utcb);
diff --git a/base-nova/src/base/thread/thread_nova.cc b/base-nova/src/base/thread/thread_nova.cc
index f88692f3e6..2a60aab8e4 100644
--- a/base-nova/src/base/thread/thread_nova.cc
+++ b/base-nova/src/base/thread/thread_nova.cc
@@ -96,6 +96,10 @@ void Thread_base::_deinit_platform_thread()
/* de-announce thread */
env()->cpu_session()->kill_thread(_thread_cap);
+
+ revoke(_thread_cap.local_name(), 0);
+ cap_selector_allocator()->free(_thread_cap.local_name(), 0);
+
}
@@ -120,7 +124,7 @@ void Thread_base::start()
/* request native EC thread cap */
Native_capability ec_cap = cpu.native_cap(_thread_cap);
- _tid.ec_sel = ec_cap.dst();
+ _tid.ec_sel = ec_cap.local_name();
using namespace Nova;
diff --git a/base-nova/src/core/include/cap_session_component.h b/base-nova/src/core/include/cap_session_component.h
index e7e0de7fcb..0dabf05ea6 100644
--- a/base-nova/src/core/include/cap_session_component.h
+++ b/base-nova/src/core/include/cap_session_component.h
@@ -38,9 +38,29 @@ namespace Genode {
addr_t entry,
addr_t mtd)
{
- Lock::Guard lock_guard(_lock());
+ addr_t pt_sel = cap_selector_allocator()->alloc(0);
+ addr_t pd_sel = Platform_pd::pd_core_sel();
+ addr_t ec_sel = ep.local_name();
+
+ using namespace Nova;
+
+ /* create portal */
+ uint8_t res = create_pt(pt_sel, pd_sel, ec_sel,
+ Mtd(mtd), entry);
+ if (res == NOVA_OK)
+ return Native_capability(pt_sel);
- return Native_capability(ep.dst(), ++_unique_id_cnt);
+ PERR("cap_session - cap=%lx:%lx"
+ " addr=%lx flags=%lx xpt=%lx res=%u",
+ ec_sel, ep.local_name(),
+ entry, mtd, pt_sel, res);
+
+ /* cleanup unused selectors */
+ cap_selector_allocator()->free(pt_sel, 0);
+
+ /* XXX revoke ec_sel if it was mapped !!!! */
+
+ return Native_capability::invalid_cap();
}
void free(Native_capability cap) { }
diff --git a/base-nova/src/core/include/platform_pd.h b/base-nova/src/core/include/platform_pd.h
index f2700a0296..827b15d904 100644
--- a/base-nova/src/core/include/platform_pd.h
+++ b/base-nova/src/core/include/platform_pd.h
@@ -63,14 +63,14 @@ namespace Genode {
/**
* Return portal capability selector for parent interface
*/
- int parent_pt_sel() { return _parent.dst(); }
+ addr_t parent_pt_sel() { return _parent.local_name(); }
/**
* Assign PD selector to PD
*/
void assign_pd(int pd_sel) { _pd_sel = pd_sel; }
- int pd_sel() { return _pd_sel; }
+ addr_t pd_sel() { return _pd_sel; }
int id() { return _id; }
};
diff --git a/base-nova/src/core/platform.cc b/base-nova/src/core/platform.cc
index 815bbcc20f..8901d564fc 100644
--- a/base-nova/src/core/platform.cc
+++ b/base-nova/src/core/platform.cc
@@ -149,18 +149,19 @@ static void init_core_page_fault_handler()
static char stack[STACK_SIZE];
- mword_t sp = (long)&stack[STACK_SIZE - sizeof(long)];
- int ec_sel = cap_selector_allocator()->alloc();
+ addr_t sp = (addr_t)&stack[STACK_SIZE - sizeof(addr_t)];
+ addr_t ec_sel = cap_selector_allocator()->alloc();
- int ret = create_ec(ec_sel, __local_pd_sel, CPU_NO, CORE_PAGER_UTCB_ADDR,
- (mword_t)sp, EXC_BASE, GLOBAL);
+ uint8_t ret = create_ec(ec_sel, __core_pd_sel, CPU_NO,
+ CORE_PAGER_UTCB_ADDR, (addr_t)sp, EXC_BASE,
+ GLOBAL);
if (ret)
- PDBG("create_ec returned %d", ret);
+ PDBG("create_ec returned %u", ret);
/* set up page-fault portal */
create_pt(PT_SEL_PAGE_FAULT, __local_pd_sel, ec_sel,
Mtd(Mtd::QUAL | Mtd::ESP | Mtd::EIP),
- (mword_t)page_fault_handler);
+ (addr_t)page_fault_handler);
}
diff --git a/base-nova/src/core/signal_source_component.cc b/base-nova/src/core/signal_source_component.cc
index f8314419d5..e0f19be4d6 100644
--- a/base-nova/src/core/signal_source_component.cc
+++ b/base-nova/src/core/signal_source_component.cc
@@ -40,7 +40,8 @@ void Signal_source_component::submit(Signal_context_component *context,
_signal_queue.enqueue(context);
/* wake up client */
- Nova::sm_ctrl(_blocking_semaphore.dst(), Nova::SEMAPHORE_UP);
+ Nova::sm_ctrl(_blocking_semaphore.local_name(),
+ Nova::SEMAPHORE_UP);
}
}
@@ -64,10 +65,11 @@ Signal_source_component::Signal_source_component(Rpc_entrypoint *ep)
: _entrypoint(ep)
{
/* initialized blocking semaphore */
- int sem_sel = cap_selector_allocator()->alloc();
- int ret = Nova::create_sm(sem_sel, cap_selector_allocator()->pd_sel(), 0);
+ addr_t sem_sel = cap_selector_allocator()->alloc();
+ uint8_t ret = Nova::create_sm(sem_sel,
+ cap_selector_allocator()->pd_sel(), 0);
if (ret)
PERR("create_sm returned %d", ret);
- _blocking_semaphore = Native_capability(sem_sel, 0);
+ _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 7c54a54111..191215998d 100644
--- a/base-nova/src/core/thread_start.cc
+++ b/base-nova/src/core/thread_start.cc
@@ -35,10 +35,11 @@ using namespace Genode;
*/
void Thread_base::_init_platform_thread()
{
- _tid.ec_sel = cap_selector_allocator()->alloc();
- _tid.rs_sel = cap_selector_allocator()->alloc();
- _tid.pd_sel = cap_selector_allocator()->pd_sel();
- _tid.exc_pt_sel = cap_selector_allocator()->alloc(Nova::NUM_INITIAL_PT_LOG2);
+ using namespace Nova;
+
+ _tid.ec_sel = cap_selector_allocator()->alloc();
+ _tid.exc_pt_sel = cap_selector_allocator()->alloc(NUM_INITIAL_PT_LOG2);
+ addr_t pd_sel = Platform_pd::pd_core_sel();
/* create running semaphore required for locking */
uint8_t res = Nova::create_sm(_tid.rs_sel, _tid.pd_sel, 0);
@@ -56,7 +57,7 @@ void Thread_base::_init_platform_thread()
if (res) {
PERR("%p - create_ec returned %d", this, res);
PERR("valid thread %x %lx:%lx", _thread_cap.valid(),
- _thread_cap.dst(), _thread_cap.local_name());
+ _thread_cap.dst()._sel, _thread_cap.local_name());
}
}
diff --git a/base-nova/src/platform/_main_parent_cap.h b/base-nova/src/platform/_main_parent_cap.h
index 2bea15f325..4edc7cf75b 100644
--- a/base-nova/src/platform/_main_parent_cap.h
+++ b/base-nova/src/platform/_main_parent_cap.h
@@ -1,13 +1,11 @@
/*
* \brief Obtain parent capability
* \author Norman Feske
+ * \author Alexander Boettcher
* \date 2010-01-26
*
- * On NOVA, the parent capability consists of two parts, a local portal
- * capability selector (as invokation address) and a global unique object ID.
* The parent portal is, by convention, capability selector 'PT_CAP_PARENT'
- * supplied with the initial portals when the PD is created. The object ID is
- * provided at the begin of the data segment of the loaded ELF image.
+ * supplied with the initial portals when the PD is created.
*/
/*
@@ -33,13 +31,9 @@ namespace Genode {
*/
Parent_capability parent_cap()
{
- /* read capability from start of data section, containing object ID */
- Native_capability cap;
- memcpy(&cap, (void *)&_parent_cap, sizeof(cap));
-
- /* assemble parent capability from object ID and portal */
- return reinterpret_cap_cast(Native_capability(Nova::PT_SEL_PARENT,
- cap.local_name()));
+ /* assemble parent capability */
+ return reinterpret_cap_cast(
+ Native_capability(Nova::PT_SEL_PARENT));
}
}