diff --git a/base-foc/include/base/native_types.h b/base-foc/include/base/native_types.h index f8d49da5a..bfc56f8ac 100644 --- a/base-foc/include/base/native_types.h +++ b/base-foc/include/base/native_types.h @@ -11,15 +11,46 @@ namespace Fiasco { #include enum Cap_selectors { - TASK_CAP = L4_BASE_TASK_CAP, - PARENT_CAP = 0x8UL << L4_CAP_SHIFT, - THREADS_BASE_CAP = 0x9UL << L4_CAP_SHIFT, + + /********************************************** + ** Capability seclectors controlled by core ** + **********************************************/ + + TASK_CAP = L4_BASE_TASK_CAP, /* use the same task cap selector + like L4Re for compatibility in + L4Linux */ + + /* + * To not clash with other L4Re cap selector constants (e.g.: L4Linux) + * leave the following selectors (2-7) empty + */ + + PARENT_CAP = 0x8UL << L4_CAP_SHIFT, /* cap to parent session */ + + /* + * Each thread has a designated slot in the core controlled cap + * selector area, where its ipc gate capability (for server threads), + * its irq capability (for locks), and the capability to its pager + * gate are stored + */ + THREAD_AREA_BASE = 0x9UL << L4_CAP_SHIFT, /* offset to thread area */ + THREAD_AREA_SLOT = 0x3UL << L4_CAP_SHIFT, /* size of one thread slot */ + THREAD_GATE_CAP = 0, /* offset to the ipc gate + cap selector in the slot */ + THREAD_PAGER_CAP = 0x1UL << L4_CAP_SHIFT, /* offset to the pager + cap selector in the slot */ + THREAD_IRQ_CAP = 0x2UL << L4_CAP_SHIFT, /* offset to the irq cap + selector in the slot */ + MAIN_THREAD_CAP = THREAD_AREA_BASE + THREAD_GATE_CAP, /* shortcut to the + main thread's + gate cap */ + + + /********************************************************* + ** Capability seclectors controlled by the task itself ** + *********************************************************/ + USER_BASE_CAP = 0x200UL << L4_CAP_SHIFT, - THREAD_GATE_CAP = 0, - THREAD_PAGER_CAP = 0x1UL << L4_CAP_SHIFT, - THREAD_IRQ_CAP = 0x2UL << L4_CAP_SHIFT, - THREAD_CAP_SLOT = THREAD_IRQ_CAP + L4_CAP_SIZE, - MAIN_THREAD_CAP = THREADS_BASE_CAP + THREAD_GATE_CAP }; enum Utcb_regs { diff --git a/base-foc/src/core/platform_pd.cc b/base-foc/src/core/platform_pd.cc index b13023ac2..32564b88e 100644 --- a/base-foc/src/core/platform_pd.cc +++ b/base-foc/src/core/platform_pd.cc @@ -53,7 +53,7 @@ int Platform_pd::bind_thread(Platform_thread *thread) else thread->_utcb = reinterpret_cast(utcb_area_start() + i * L4_UTCB_OFFSET); - Native_thread cap_offset = THREADS_BASE_CAP + i * THREAD_CAP_SLOT; + Native_thread cap_offset = THREAD_AREA_BASE + i * THREAD_AREA_SLOT; thread->_gate.remote = cap_offset + THREAD_GATE_CAP; thread->_pager.remote = cap_offset + THREAD_PAGER_CAP; thread->_irq.remote = cap_offset + THREAD_IRQ_CAP; diff --git a/ports-foc/src/lib/l4lx/startup.cc b/ports-foc/src/lib/l4lx/startup.cc index 4f48032ce..6555322f6 100644 --- a/ports-foc/src/lib/l4lx/startup.cc +++ b/ports-foc/src/lib/l4lx/startup.cc @@ -118,7 +118,7 @@ static void prepare_l4re_env() env->mem_alloc = L4_INVALID_CAP; env->log = L4_INVALID_CAP; env->main_thread = main_thread_cap.dst(); - env->rm = Fiasco::THREADS_BASE_CAP + Fiasco::THREAD_PAGER_CAP; + env->rm = Fiasco::THREAD_AREA_BASE + Fiasco::THREAD_PAGER_CAP; }