diff --git a/base-nova/src/base/pager/pager.cc b/base-nova/src/base/pager/pager.cc index 59c486e52..2446789b4 100644 --- a/base-nova/src/base/pager/pager.cc +++ b/base-nova/src/base/pager/pager.cc @@ -275,6 +275,8 @@ Pager_object::Pager_object(unsigned long badge, unsigned affinity) _state.singlestep = false; _state.sel_client_ec = Native_thread::INVALID_INDEX; + /* tell thread starting code on which CPU to let run the pager */ + *reinterpret_cast(stack_top()) = affinity; /* creates local EC */ Thread_base::start(); diff --git a/base-nova/src/base/server/server.cc b/base-nova/src/base/server/server.cc index a6d3c0b18..8662a2823 100644 --- a/base-nova/src/base/server/server.cc +++ b/base-nova/src/base/server/server.cc @@ -252,11 +252,16 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size, throw Cpu_session::Thread_creation_failed(); _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(stack_top()) = CPU_NO; + /* * Required for core threads (creates local EC) */ Thread_base::start(); + } /* create cleanup portal */ _cap = _cap_session->alloc(Native_capability(_tid.ec_sel), diff --git a/base-nova/src/base/thread/thread_nova.cc b/base-nova/src/base/thread/thread_nova.cc index ae4ecb204..2a928c22e 100644 --- a/base-nova/src/base/thread/thread_nova.cc +++ b/base-nova/src/base/thread/thread_nova.cc @@ -121,6 +121,7 @@ void Thread_base::start() /* create EC at core */ addr_t thread_sp = reinterpret_cast(&_context->stack[-4]); + thread_sp &= ~0xf; /* align initial stack to 16 byte boundary */ Thread_state state; state.sel_exc_base = _tid.exc_pt_sel; diff --git a/base-nova/src/core/thread_start.cc b/base-nova/src/core/thread_start.cc index 68621a0df..ae49c18a4 100644 --- a/base-nova/src/core/thread_start.cc +++ b/base-nova/src/core/thread_start.cc @@ -77,15 +77,17 @@ void Thread_base::start() */ using namespace Nova; - addr_t sp = reinterpret_cast(&_context->stack[-4]); - addr_t utcb = reinterpret_cast(&_context->utcb); + addr_t sp = reinterpret_cast(&_context->stack[-4]); + sp &= ~0xf; /* align initial stack to 16 byte boundary */ + addr_t utcb = reinterpret_cast(&_context->utcb); Utcb * utcb_obj = reinterpret_cast(&_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(stack_top()); /* create local EC */ - enum { CPU_NO = 0, GLOBAL = false }; - uint8_t res = create_ec(_tid.ec_sel, pd_sel, CPU_NO, - utcb, sp, _tid.exc_pt_sel, GLOBAL); + enum { LOCAL_THREAD = false }; + uint8_t res = create_ec(_tid.ec_sel, pd_sel, cpu_no, + utcb, sp, _tid.exc_pt_sel, LOCAL_THREAD); if (res != NOVA_OK) { PERR("create_ec returned %d", res); throw Cpu_session::Thread_creation_failed();