parent
4ae1faf14d
commit
4e2e79bf4f
|
@ -275,6 +275,8 @@ Pager_object::Pager_object(unsigned long badge, unsigned affinity)
|
||||||
_state.singlestep = false;
|
_state.singlestep = false;
|
||||||
_state.sel_client_ec = Native_thread::INVALID_INDEX;
|
_state.sel_client_ec = Native_thread::INVALID_INDEX;
|
||||||
|
|
||||||
|
/* tell thread starting code on which CPU to let run the pager */
|
||||||
|
*reinterpret_cast<addr_t *>(stack_top()) = affinity;
|
||||||
/* creates local EC */
|
/* creates local EC */
|
||||||
Thread_base::start();
|
Thread_base::start();
|
||||||
|
|
||||||
|
|
|
@ -252,11 +252,16 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size,
|
||||||
throw Cpu_session::Thread_creation_failed();
|
throw Cpu_session::Thread_creation_failed();
|
||||||
_tid.ec_sel = ec_cap.local_name();
|
_tid.ec_sel = ec_cap.local_name();
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
enum { CPU_NO = 0 }; //XXX find out the boot cpu
|
||||||
|
/* tell thread starting code on which CPU to let run the server thread */
|
||||||
|
*reinterpret_cast<addr_t *>(stack_top()) = CPU_NO;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Required for core threads (creates local EC)
|
* Required for core threads (creates local EC)
|
||||||
*/
|
*/
|
||||||
Thread_base::start();
|
Thread_base::start();
|
||||||
|
}
|
||||||
|
|
||||||
/* create cleanup portal */
|
/* create cleanup portal */
|
||||||
_cap = _cap_session->alloc(Native_capability(_tid.ec_sel),
|
_cap = _cap_session->alloc(Native_capability(_tid.ec_sel),
|
||||||
|
|
|
@ -121,6 +121,7 @@ void Thread_base::start()
|
||||||
|
|
||||||
/* create EC at core */
|
/* create EC at core */
|
||||||
addr_t thread_sp = reinterpret_cast<addr_t>(&_context->stack[-4]);
|
addr_t thread_sp = reinterpret_cast<addr_t>(&_context->stack[-4]);
|
||||||
|
thread_sp &= ~0xf; /* align initial stack to 16 byte boundary */
|
||||||
|
|
||||||
Thread_state state;
|
Thread_state state;
|
||||||
state.sel_exc_base = _tid.exc_pt_sel;
|
state.sel_exc_base = _tid.exc_pt_sel;
|
||||||
|
|
|
@ -77,15 +77,17 @@ void Thread_base::start()
|
||||||
*/
|
*/
|
||||||
using namespace Nova;
|
using namespace Nova;
|
||||||
|
|
||||||
addr_t sp = reinterpret_cast<addr_t>(&_context->stack[-4]);
|
addr_t sp = reinterpret_cast<addr_t>(&_context->stack[-4]);
|
||||||
addr_t utcb = reinterpret_cast<addr_t>(&_context->utcb);
|
sp &= ~0xf; /* align initial stack to 16 byte boundary */
|
||||||
|
addr_t utcb = reinterpret_cast<addr_t>(&_context->utcb);
|
||||||
Utcb * utcb_obj = reinterpret_cast<Utcb *>(&_context->utcb);
|
Utcb * utcb_obj = reinterpret_cast<Utcb *>(&_context->utcb);
|
||||||
addr_t pd_sel = Platform_pd::pd_core_sel();
|
addr_t pd_sel = Platform_pd::pd_core_sel();
|
||||||
|
addr_t cpu_no = *reinterpret_cast<addr_t *>(stack_top());
|
||||||
|
|
||||||
/* create local EC */
|
/* create local EC */
|
||||||
enum { CPU_NO = 0, GLOBAL = false };
|
enum { LOCAL_THREAD = false };
|
||||||
uint8_t res = create_ec(_tid.ec_sel, pd_sel, CPU_NO,
|
uint8_t res = create_ec(_tid.ec_sel, pd_sel, cpu_no,
|
||||||
utcb, sp, _tid.exc_pt_sel, GLOBAL);
|
utcb, sp, _tid.exc_pt_sel, LOCAL_THREAD);
|
||||||
if (res != NOVA_OK) {
|
if (res != NOVA_OK) {
|
||||||
PERR("create_ec returned %d", res);
|
PERR("create_ec returned %d", res);
|
||||||
throw Cpu_session::Thread_creation_failed();
|
throw Cpu_session::Thread_creation_failed();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user