diff --git a/repos/base-fiasco/src/core/include/map_local.h b/repos/base-fiasco/src/core/include/map_local.h index c905eacfd..c28bca4f2 100644 --- a/repos/base-fiasco/src/core/include/map_local.h +++ b/repos/base-fiasco/src/core/include/map_local.h @@ -40,7 +40,7 @@ namespace Genode { */ inline bool map_local(addr_t from_addr, addr_t to_addr, size_t num_pages) { - Fiasco::l4_threadid_t core_pager = platform_specific()->core_pager()->native_thread_id(); + Fiasco::l4_threadid_t core_pager = platform_specific().core_pager().native_thread_id(); addr_t offset = 0; size_t page_size = get_page_size(); diff --git a/repos/base-fiasco/src/core/include/platform.h b/repos/base-fiasco/src/core/include/platform.h index 58d28e9f5..ffb163cf4 100644 --- a/repos/base-fiasco/src/core/include/platform.h +++ b/repos/base-fiasco/src/core/include/platform.h @@ -18,11 +18,12 @@ #include #include -#include "synced_range_allocator.h" -#include "platform_generic.h" -#include "platform_thread.h" -#include "platform_pd.h" -#include "boot_modules.h" +#include +#include +#include +#include +#include +#include namespace Genode { @@ -113,7 +114,7 @@ namespace Genode { /** * Return singleton instance of Sigma0 pager object */ - static Sigma0 *sigma0(); + static Sigma0 &sigma0(); /** * Core pager thread that handles core-internal page-faults @@ -123,7 +124,7 @@ namespace Genode { /** * Constructor */ - Core_pager(Platform_pd *core_pd); + Core_pager(Platform_pd &core_pd); int pager(Ipc_pager &) { /* never called */ return -1; } }; @@ -131,7 +132,7 @@ namespace Genode { /** * Return singleton instance of core pager object */ - Core_pager *core_pager(); + Core_pager &core_pager(); /** * Constructor @@ -141,22 +142,28 @@ namespace Genode { /** * Accessor for core pd object */ - Platform_pd *core_pd() { return _core_pd; } + Platform_pd &core_pd() + { + if (_core_pd) + return *_core_pd; + + ASSERT_NEVER_CALLED; + } /******************************** ** Generic platform interface ** ********************************/ - Range_allocator *core_mem_alloc() override { return &_ram_alloc; } - Range_allocator *ram_alloc() override { return &_ram_alloc; } - Range_allocator *io_mem_alloc() override { return &_io_mem_alloc; } - Range_allocator *io_port_alloc() override { return &_io_port_alloc; } - Range_allocator *irq_alloc() override { return &_irq_alloc; } - Range_allocator *region_alloc() override { return &_region_alloc; } + Range_allocator &core_mem_alloc() override { return _ram_alloc; } + Range_allocator &ram_alloc() override { return _ram_alloc; } + Range_allocator &io_mem_alloc() override { return _io_mem_alloc; } + Range_allocator &io_port_alloc() override { return _io_port_alloc; } + Range_allocator &irq_alloc() override { return _irq_alloc; } + Range_allocator ®ion_alloc() override { return _region_alloc; } addr_t vm_start() const override { return _vm_start; } size_t vm_size() const override { return _vm_size; } - Rom_fs *rom_fs() override { return &_rom_fs; } + Rom_fs &rom_fs() override { return _rom_fs; } size_t max_caps() const { return Capability_space::max_caps(); } diff --git a/repos/base-fiasco/src/core/include/platform_pd.h b/repos/base-fiasco/src/core/include/platform_pd.h index a899dfda7..8dbd4c415 100644 --- a/repos/base-fiasco/src/core/include/platform_pd.h +++ b/repos/base-fiasco/src/core/include/platform_pd.h @@ -74,7 +74,7 @@ namespace Genode { * * Again a special case for Core thread0. */ - int _alloc_thread(int thread_id, Platform_thread *thread); + int _alloc_thread(int thread_id, Platform_thread &thread); /** * Thread deallocation @@ -149,8 +149,12 @@ namespace Genode { /** * Constructor */ - Platform_pd(Allocator * md_alloc, char const *, - signed pd_id = PD_INVALID, bool create = true); + Platform_pd(Allocator &md_alloc, char const *name); + + /** + * Constructor used for core's PD + */ + Platform_pd(char const *name, signed pd_id); /** * Destructor @@ -172,14 +176,14 @@ namespace Genode { * * \return true on success */ - bool bind_thread(Platform_thread *thread); + bool bind_thread(Platform_thread &thread); /** * Unbind thread from protection domain * * Free the thread's slot and update thread object. */ - void unbind_thread(Platform_thread *thread); + void unbind_thread(Platform_thread &thread); /** * Assign parent interface to protection domain diff --git a/repos/base-fiasco/src/core/include/platform_thread.h b/repos/base-fiasco/src/core/include/platform_thread.h index c7dc8f033..10591cbf4 100644 --- a/repos/base-fiasco/src/core/include/platform_thread.h +++ b/repos/base-fiasco/src/core/include/platform_thread.h @@ -21,6 +21,7 @@ /* core includes */ #include #include +#include /* Fiasco includes */ namespace Fiasco { @@ -40,14 +41,17 @@ namespace Genode { Platform_thread(Platform_thread const &); Platform_thread &operator = (Platform_thread const &); - int _thread_id; /* plain thread number */ - Fiasco::l4_threadid_t _l4_thread_id; /* L4 thread ID */ - char _name[32]; /* thread name that will be + int _thread_id = THREAD_INVALID; /* plain thread number */ + + Fiasco::l4_threadid_t _l4_thread_id; + + typedef String<32> Name; + Name const _name; /* thread name that will be registered at the kernel debugger */ Platform_pd *_platform_pd = nullptr; /* protection domain thread is bound to */ - Pager_object *_pager; + Pager_object *_pager = nullptr; public: @@ -58,9 +62,13 @@ namespace Genode { /** * Constructor */ - Platform_thread(size_t, const char *name = 0, unsigned priority = 0, - Affinity::Location = Affinity::Location(), - addr_t utcb = 0, int thread_id = THREAD_INVALID); + Platform_thread(size_t, const char *name, unsigned priority, + Affinity::Location, addr_t utcb); + + /** + * Constructor used for core-internal threads + */ + Platform_thread(const char *name); /** * Destructor @@ -106,7 +114,7 @@ namespace Genode { * \param pd platform pd, thread is bound to */ void bind(int thread_id, Fiasco::l4_threadid_t l4_thread_id, - Platform_pd *pd); + Platform_pd &pd); /** * Unbind this thread @@ -146,8 +154,15 @@ namespace Genode { /** * Return/set pager */ - Pager_object *pager() const { return _pager; } - void pager(Pager_object *pager) { _pager = pager; } + Pager_object &pager() const + { + if (_pager) + return *_pager; + + ASSERT_NEVER_CALLED; + } + + void pager(Pager_object &pager) { _pager = &pager; } /** * Return identification of thread when faulting @@ -172,7 +187,7 @@ namespace Genode { int thread_id() const { return _thread_id; } Fiasco::l4_threadid_t native_thread_id() const { return _l4_thread_id; } - const char *name() const { return _name; } + Name name() const { return _name; } }; } diff --git a/repos/base-fiasco/src/core/include/rpc_cap_factory.h b/repos/base-fiasco/src/core/include/rpc_cap_factory.h index 9b6000c00..eb5d68a8f 100644 --- a/repos/base-fiasco/src/core/include/rpc_cap_factory.h +++ b/repos/base-fiasco/src/core/include/rpc_cap_factory.h @@ -24,7 +24,7 @@ class Genode::Rpc_cap_factory { private: - static Native_capability _alloc(Rpc_cap_factory *owner, + static Native_capability _alloc(Rpc_cap_factory &owner, Native_capability ep); public: diff --git a/repos/base-fiasco/src/core/io_mem_session_support.cc b/repos/base-fiasco/src/core/io_mem_session_support.cc index 609d8d995..993dce6c4 100644 --- a/repos/base-fiasco/src/core/io_mem_session_support.cc +++ b/repos/base-fiasco/src/core/io_mem_session_support.cc @@ -27,7 +27,7 @@ using namespace Genode; void Io_mem_session_component::_unmap_local(addr_t base, size_t) { - platform()->region_alloc()->free(reinterpret_cast(base)); + platform().region_alloc().free(reinterpret_cast(base)); } @@ -51,7 +51,7 @@ addr_t Io_mem_session_component::_map_local(addr_t base, size_t size) /* find appropriate region for mapping */ void *local_base = 0; - if (platform()->region_alloc()->alloc_aligned(size, &local_base, alignment).error()) + if (platform().region_alloc().alloc_aligned(size, &local_base, alignment).error()) return 0; /* call sigma0 for I/O region */ diff --git a/repos/base-fiasco/src/core/irq_session_component.cc b/repos/base-fiasco/src/core/irq_session_component.cc index fc7cb10bb..8e4cfba33 100644 --- a/repos/base-fiasco/src/core/irq_session_component.cc +++ b/repos/base-fiasco/src/core/irq_session_component.cc @@ -121,7 +121,7 @@ Irq_object::Irq_object(unsigned irq) { } -Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char *args) : _irq_number(Arg_string::find_arg(args, "irq_number").long_value(-1)), @@ -132,7 +132,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, if (msi) throw Service_denied(); - if (!irq_alloc || irq_alloc->alloc_addr(1, _irq_number).error()) { + if (irq_alloc.alloc_addr(1, _irq_number).error()) { error("unavailable IRQ ", _irq_number, " requested"); throw Service_denied(); } diff --git a/repos/base-fiasco/src/core/platform.cc b/repos/base-fiasco/src/core/platform.cc index 66159c60d..7b6af01ae 100644 --- a/repos/base-fiasco/src/core/platform.cc +++ b/repos/base-fiasco/src/core/platform.cc @@ -140,27 +140,27 @@ Platform::Sigma0::Sigma0() } -Platform::Sigma0 *Platform::sigma0() +Platform::Sigma0 &Platform::sigma0() { static Sigma0 _sigma0; - return &_sigma0; + return _sigma0; } -Platform::Core_pager::Core_pager(Platform_pd *core_pd) +Platform::Core_pager::Core_pager(Platform_pd &core_pd) : - Platform_thread(0, "core.pager"), + Platform_thread("core.pager"), Pager_object(Cpu_session_capability(), Thread_capability(), 0, Affinity::Location(), Session_label(), Cpu_session::Name(name())) { Platform_thread::pager(sigma0()); - core_pd->bind_thread(this); + core_pd.bind_thread(*this); cap(Capability_space::import(native_thread_id(), Rpc_obj_key())); /* pager needs to know core's pd ID */ - _core_pager_arg = core_pd->pd_id(); + _core_pager_arg = core_pd.pd_id(); /* stack begins at the top end of the '_core_pager_stack' array */ void *sp = (void *)&_core_pager_stack[PAGER_STACK_ELEMENTS - 1]; @@ -176,10 +176,10 @@ Platform::Core_pager::Core_pager(Platform_pd *core_pd) } -Platform::Core_pager *Platform::core_pager() +Platform::Core_pager &Platform::core_pager() { static Core_pager _core_pager(core_pd()); - return &_core_pager; + return _core_pager; } @@ -412,9 +412,9 @@ void Platform::_setup_basics() Platform::Platform() : - _ram_alloc(nullptr), _io_mem_alloc(core_mem_alloc()), - _io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()), - _region_alloc(core_mem_alloc()), + _ram_alloc(nullptr), _io_mem_alloc(&core_mem_alloc()), + _io_port_alloc(&core_mem_alloc()), _irq_alloc(&core_mem_alloc()), + _region_alloc(&core_mem_alloc()), _kip_rom((addr_t)get_kip(), L4_PAGESIZE, "l4v2_kip") { /* @@ -438,20 +438,21 @@ Platform::Platform() : /* setup pd object for core pd */ _core_label[0] = 0; - _core_pd = new(core_mem_alloc()) Platform_pd(nullptr, _core_label, - myself.id.task, false); + _core_pd = new (core_mem_alloc()) Platform_pd(_core_label, myself.id.task); /* * We setup the thread object for thread0 in core pd using a special * interface that allows us to specify the lthread number. */ - Platform_thread *core_thread = new(core_mem_alloc()) - Platform_thread(0, "core.main", myself.id.lthread); - core_thread->pager(sigma0()); + Platform_thread &core_thread = *new (core_mem_alloc()) + Platform_thread("core.main"); + + core_thread.pager(sigma0()); _core_pd->bind_thread(core_thread); /* we never call _core_thread.start(), so set name directly */ - Fiasco::fiasco_register_thread_name(core_thread->native_thread_id(), core_thread->name()); + Fiasco::fiasco_register_thread_name(core_thread.native_thread_id(), + core_thread.name().string()); /* core log as ROM module */ { @@ -459,14 +460,14 @@ Platform::Platform() : unsigned const pages = 1; size_t const log_size = pages << get_page_size_log2(); - ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); + ram_alloc().alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); addr_t const phys_addr = reinterpret_cast(phys_ptr); - void * const core_local_ptr = phys_ptr; + void * const core_local_ptr = phys_ptr; addr_t const core_local_addr = phys_addr; /* let one page free after the log buffer */ - region_alloc()->remove_range(core_local_addr, log_size + get_page_size()); + region_alloc().remove_range(core_local_addr, log_size + get_page_size()); memset(core_local_ptr, 0, log_size); diff --git a/repos/base-fiasco/src/core/platform_pd.cc b/repos/base-fiasco/src/core/platform_pd.cc index a972c68ec..305179928 100644 --- a/repos/base-fiasco/src/core/platform_pd.cc +++ b/repos/base-fiasco/src/core/platform_pd.cc @@ -162,7 +162,7 @@ Platform_thread* Platform_pd::_next_thread() } -int Platform_pd::_alloc_thread(int thread_id, Platform_thread *thread) +int Platform_pd::_alloc_thread(int thread_id, Platform_thread &thread) { int i = thread_id; @@ -177,7 +177,7 @@ int Platform_pd::_alloc_thread(int thread_id, Platform_thread *thread) if (_threads[i]) return -2; } - _threads[i] = thread; + _threads[i] = &thread; return i; } @@ -196,10 +196,10 @@ void Platform_pd::_free_thread(int thread_id) ** Public object members ** ***************************/ -bool Platform_pd::bind_thread(Platform_thread *thread) +bool Platform_pd::bind_thread(Platform_thread &thread) { /* thread_id is THREAD_INVALID by default - only core is the special case */ - int thread_id = thread->thread_id(); + int thread_id = thread.thread_id(); l4_threadid_t l4_thread_id; int t = _alloc_thread(thread_id, thread); @@ -213,18 +213,18 @@ bool Platform_pd::bind_thread(Platform_thread *thread) l4_thread_id.id.lthread = thread_id; /* finally inform thread about binding */ - thread->bind(thread_id, l4_thread_id, this); + thread.bind(thread_id, l4_thread_id, *this); return true; } -void Platform_pd::unbind_thread(Platform_thread *thread) +void Platform_pd::unbind_thread(Platform_thread &thread) { - int thread_id = thread->thread_id(); + int thread_id = thread.thread_id(); /* unbind thread before proceeding */ - thread->unbind(); + thread.unbind(); _free_thread(thread_id); } @@ -246,7 +246,25 @@ void Platform_pd::flush(addr_t, size_t size, Core_local_addr core_local_base) L4_FP_FLUSH_PAGE); } -Platform_pd::Platform_pd(Allocator *, char const *, signed pd_id, bool create) +Platform_pd::Platform_pd(Allocator &, char const *) +{ + /* check correct init */ + if (!_init) + panic("init pd facility via Platform_pd::init() before using it!"); + + /* init threads */ + _init_threads(); + + int ret = _alloc_pd(PD_INVALID); + if (ret < 0) { + panic("pd alloc failed"); + } + + _create_pd(true); +} + + +Platform_pd::Platform_pd(char const *, signed pd_id) { /* check correct init */ if (!_init) @@ -260,14 +278,14 @@ Platform_pd::Platform_pd(Allocator *, char const *, signed pd_id, bool create) panic("pd alloc failed"); } - _create_pd(create); + _create_pd(false); } Platform_pd::~Platform_pd() { /* unbind all threads */ - while (Platform_thread *t = _next_thread()) unbind_thread(t); + while (Platform_thread *t = _next_thread()) unbind_thread(*t); _destroy_pd(); _free_pd(); diff --git a/repos/base-fiasco/src/core/platform_thread.cc b/repos/base-fiasco/src/core/platform_thread.cc index c42241630..6e57981b7 100644 --- a/repos/base-fiasco/src/core/platform_thread.cc +++ b/repos/base-fiasco/src/core/platform_thread.cc @@ -55,7 +55,7 @@ int Platform_thread::start(void *ip, void *sp) warning("old eflags == ~0 on ex_regs ", Hex(thread.id.task), ".", Hex(thread.id.lthread)); - fiasco_register_thread_name(thread, _name); + fiasco_register_thread_name(thread, _name.string()); return 0; } @@ -72,11 +72,11 @@ void Platform_thread::resume() } -void Platform_thread::bind(int thread_id, l4_threadid_t l4_thread_id, Platform_pd *pd) +void Platform_thread::bind(int thread_id, l4_threadid_t l4_thread_id, Platform_pd &pd) { _thread_id = thread_id; _l4_thread_id = l4_thread_id; - _platform_pd = pd; + _platform_pd = &pd; } @@ -154,12 +154,12 @@ void Platform_thread::cancel_blocking() Platform_thread::Platform_thread(size_t, const char *name, unsigned, - Affinity::Location, addr_t, - int thread_id) -: _thread_id(thread_id), _l4_thread_id(L4_INVALID_ID), _pager(0) -{ - strncpy(_name, name, sizeof(_name)); -} + Affinity::Location, addr_t) +: _l4_thread_id(L4_INVALID_ID), _name(name) { } + + +Platform_thread::Platform_thread(const char *name) +: _l4_thread_id(L4_INVALID_ID), _name(name) { } Platform_thread::~Platform_thread() @@ -169,5 +169,5 @@ Platform_thread::~Platform_thread() * Thread::unbind() */ if (_platform_pd) - _platform_pd->unbind_thread(this); + _platform_pd->unbind_thread(*this); } diff --git a/repos/base-fiasco/src/core/ram_dataspace_support.cc b/repos/base-fiasco/src/core/ram_dataspace_support.cc index b1e0ebb19..18e63f332 100644 --- a/repos/base-fiasco/src/core/ram_dataspace_support.cc +++ b/repos/base-fiasco/src/core/ram_dataspace_support.cc @@ -18,10 +18,10 @@ using namespace Genode; -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *) { } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &) { } +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } -void Ram_dataspace_factory::_clear_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_clear_ds(Dataspace_component &ds) { - memset((void *)ds->phys_addr(), 0, ds->size()); + memset((void *)ds.phys_addr(), 0, ds.size()); } diff --git a/repos/base-fiasco/src/core/thread_start.cc b/repos/base-fiasco/src/core/thread_start.cc index 34903e189..53eebe162 100644 --- a/repos/base-fiasco/src/core/thread_start.cc +++ b/repos/base-fiasco/src/core/thread_start.cc @@ -37,12 +37,12 @@ void Thread::_thread_start() void Thread::start() { /* create and start platform thread */ - native_thread().pt = new(platform()->core_mem_alloc()) - Platform_thread(0, _stack->name().string()); + native_thread().pt = new (platform().core_mem_alloc()) + Platform_thread(_stack->name().string()); - platform_specific()->core_pd()->bind_thread(native_thread().pt); + platform_specific().core_pd().bind_thread(*native_thread().pt); - native_thread().pt->pager(platform_specific()->core_pager()); + native_thread().pt->pager(platform_specific().core_pager()); native_thread().l4id = native_thread().pt->native_thread_id(); native_thread().pt->start((void *)_thread_start, stack_top()); @@ -60,5 +60,5 @@ void Thread::cancel_blocking() void Thread::_deinit_platform_thread() { /* destruct platform thread */ - destroy(platform()->core_mem_alloc(), native_thread().pt); + destroy(platform().core_mem_alloc(), native_thread().pt); } diff --git a/repos/base-foc/src/core/include/cap_id_alloc.h b/repos/base-foc/src/core/include/cap_id_alloc.h index f4c42e6f4..518728629 100644 --- a/repos/base-foc/src/core/include/cap_id_alloc.h +++ b/repos/base-foc/src/core/include/cap_id_alloc.h @@ -42,7 +42,7 @@ namespace Genode { class Out_of_ids : Exception {}; - Cap_id_allocator(Allocator*); + Cap_id_allocator(Allocator &); unsigned long alloc(); void free(unsigned long id); diff --git a/repos/base-foc/src/core/include/cap_mapping.h b/repos/base-foc/src/core/include/cap_mapping.h index d79655931..e134a1079 100644 --- a/repos/base-foc/src/core/include/cap_mapping.h +++ b/repos/base-foc/src/core/include/cap_mapping.h @@ -36,7 +36,7 @@ namespace Genode { * * \return pointer to newly constructed Core_cap_index object */ - inline Core_cap_index* _get_cap(); + inline Core_cap_index *_get_cap(); public: diff --git a/repos/base-foc/src/core/include/cpu_session_irqs.h b/repos/base-foc/src/core/include/cpu_session_irqs.h deleted file mode 100644 index a6e39068f..000000000 --- a/repos/base-foc/src/core/include/cpu_session_irqs.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * \brief Fiasco.OC-specific implementation of core's CPU service - * \author Christian Helmuth - * \author Norman Feske - * \author Stefan Kalkowski - * \date 2006-07-17 - */ - -/* - * Copyright (C) 2006-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -#ifndef _CORE__INCLUDE__CPU_SESSION_IRQS_H_ -#define _CORE__INCLUDE__CPU_SESSION_IRQS_H_ - -/* Genode includes */ -#include - -/* core includes */ -#include - -namespace Genode { class Cpu_session_irqs; } - - -class Genode::Cpu_session_irqs : public Avl_node -{ - private: - - /* - * Noncopyable - */ - Cpu_session_irqs(Cpu_session_irqs const &); - Cpu_session_irqs &operator = (Cpu_session_irqs const &); - - enum { IRQ_MAX = 20 }; - - Cpu_session_component* _owner; - Native_capability _irqs[IRQ_MAX]; - unsigned _cnt; - - public: - - Cpu_session_irqs(Cpu_session_component *owner) - : _owner(owner), _cnt(0) {} - - bool add(Native_capability irq) - { - if (_cnt >= (IRQ_MAX - 1)) - return false; - _irqs[_cnt++] = irq; - return true; - } - - /************************ - ** Avl node interface ** - ************************/ - - bool higher(Cpu_session_irqs *c) { return (c->_owner > _owner); } - - Cpu_session_irqs *find_by_session(Cpu_session_component *o) - { - if (o == _owner) return this; - - Cpu_session_irqs *c = Avl_node::child(o > _owner); - return c ? c->find_by_session(o) : 0; - } -}; - -#endif /* _CORE__INCLUDE__CPU_SESSION_COMPONENT_H_ */ diff --git a/repos/base-foc/src/core/include/ipc_pager.h b/repos/base-foc/src/core/include/ipc_pager.h index 4da549889..9016d0a30 100644 --- a/repos/base-foc/src/core/include/ipc_pager.h +++ b/repos/base-foc/src/core/include/ipc_pager.h @@ -202,13 +202,13 @@ class Genode::Ipc_pager : public Native_capability * Copy the exception registers from the last exception * to the given Thread_state object. */ - void get_regs(Foc_thread_state *state); + void get_regs(Foc_thread_state &state) const; /* * Copy the exception reply registers from the given * Thread_state object */ - void set_regs(Foc_thread_state state); + void set_regs(Foc_thread_state const &state); }; #endif /* _CORE__INCLUDE__IPC_PAGER_H_ */ diff --git a/repos/base-foc/src/core/include/platform.h b/repos/base-foc/src/core/include/platform.h index 0cd4e96fc..709c89d22 100644 --- a/repos/base-foc/src/core/include/platform.h +++ b/repos/base-foc/src/core/include/platform.h @@ -26,6 +26,7 @@ #include #include #include +#include namespace Genode { @@ -123,7 +124,7 @@ namespace Genode { /** * Constructor */ - Core_pager(Platform_pd *core_pd, Sigma0*); + Core_pager(Platform_pd &core_pd, Sigma0 &); int pager(Ipc_pager &) { /* never called */ return -1; } }; @@ -131,7 +132,7 @@ namespace Genode { /** * Return singleton instance of core pager object */ - Core_pager *core_pager(); + Core_pager &core_pager(); /** * Set interrupt trigger/polarity (e.g., level or edge, high or low) @@ -147,26 +148,33 @@ namespace Genode { /** * Accessor for core pd object */ - Platform_pd *core_pd() { return _core_pd; } + Platform_pd &core_pd() + { + if (_core_pd) + return *_core_pd; + + ASSERT_NEVER_CALLED; + } /******************************** ** Generic platform interface ** ********************************/ - Range_allocator *core_mem_alloc() { return &_ram_alloc; } - Range_allocator *ram_alloc() { return &_ram_alloc; } - Range_allocator *io_mem_alloc() { return &_io_mem_alloc; } - Range_allocator *io_port_alloc() { return &_io_port_alloc; } - Range_allocator *irq_alloc() { return &_irq_alloc; } - Range_allocator *region_alloc() { return &_region_alloc; } - Cap_id_allocator *cap_id_alloc() { return &_cap_id_alloc; } - addr_t vm_start() const { return _vm_start; } - size_t vm_size() const { return _vm_size; } - Rom_fs *rom_fs() { return &_rom_fs; } - Affinity::Space affinity_space() const; + Range_allocator &core_mem_alloc() override { return _ram_alloc; } + Range_allocator &ram_alloc() override { return _ram_alloc; } + Range_allocator &io_mem_alloc() override { return _io_mem_alloc; } + Range_allocator &io_port_alloc() override { return _io_port_alloc; } + Range_allocator &irq_alloc() override { return _irq_alloc; } + Range_allocator ®ion_alloc() override { return _region_alloc; } + addr_t vm_start() const override { return _vm_start; } + size_t vm_size() const override { return _vm_size; } + Rom_fs &rom_fs() override { return _rom_fs; } + Affinity::Space affinity_space() const override; - size_t max_caps() const override { return cap_idx_alloc()->max_caps(); } + size_t max_caps() const override { return cap_idx_alloc().max_caps(); } + + Cap_id_allocator &cap_id_alloc() { return _cap_id_alloc; } void wait_for_exit(); }; diff --git a/repos/base-foc/src/core/include/platform_pd.h b/repos/base-foc/src/core/include/platform_pd.h index e15496c4f..8fd42514d 100644 --- a/repos/base-foc/src/core/include/platform_pd.h +++ b/repos/base-foc/src/core/include/platform_pd.h @@ -65,7 +65,7 @@ namespace Genode { Cap_mapping _task; Cap_mapping _parent { }; Cap_mapping _debug { }; - Platform_thread *_threads[THREAD_MAX]; + Platform_thread *_threads[THREAD_MAX] { }; public: @@ -73,14 +73,14 @@ namespace Genode { /** - * Constructor for core. + * Constructor for core */ - Platform_pd(Core_cap_index*); + Platform_pd(Core_cap_index &); /** * Constructor for all tasks except core. */ - Platform_pd(Allocator *, char const *label); + Platform_pd(Allocator &, char const *label); /** * Destructor @@ -90,14 +90,14 @@ namespace Genode { /** * Bind thread to protection domain */ - bool bind_thread(Platform_thread *thread); + bool bind_thread(Platform_thread &); /** * Unbind thread from protection domain * * Free the thread's slot and update thread object. */ - void unbind_thread(Platform_thread *thread); + void unbind_thread(Platform_thread &); /** * Assign parent interface to protection domain diff --git a/repos/base-foc/src/core/include/platform_thread.h b/repos/base-foc/src/core/include/platform_thread.h index 2ccc03c5b..b7f3d92d1 100644 --- a/repos/base-foc/src/core/include/platform_thread.h +++ b/repos/base-foc/src/core/include/platform_thread.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace Genode { @@ -39,8 +40,11 @@ namespace Genode { enum State { DEAD, RUNNING }; + typedef String<32> Name; + friend class Platform_pd; + Name const _name; /* name at kernel debugger */ State _state; bool _core_thread; Cap_mapping _thread; @@ -48,9 +52,6 @@ namespace Genode { Cap_mapping _pager { }; Cap_mapping _irq; addr_t _utcb; - char _name[32]; /* thread name that will be - registered at the kernel - debugger */ Platform_pd *_platform_pd; /* protection domain thread is bound to */ Pager_object *_pager_obj; @@ -59,7 +60,7 @@ namespace Genode { Affinity::Location _location { }; void _create_thread(void); - void _finalize_construction(const char *name); + void _finalize_construction(); bool _in_syscall(Fiasco::l4_umword_t flags); public: @@ -75,8 +76,8 @@ namespace Genode { /** * Constructor for core main-thread */ - Platform_thread(Core_cap_index* thread, - Core_cap_index* irq, const char *name); + Platform_thread(Core_cap_index& thread, + Core_cap_index& irq, const char *name); /** * Constructor for core threads @@ -124,7 +125,7 @@ namespace Genode { * * \param pd platform pd, thread is bound to */ - void bind(Platform_pd *pd); + void bind(Platform_pd &pd); /** * Unbind this thread @@ -162,8 +163,15 @@ namespace Genode { /** * Return/set pager */ - Pager_object *pager() const { return _pager_obj; } - void pager(Pager_object *pager); + Pager_object &pager() const + { + if (_pager_obj) + return *_pager_obj; + + ASSERT_NEVER_CALLED; + } + + void pager(Pager_object &pager); /** * Return identification of thread when faulting @@ -188,7 +196,7 @@ namespace Genode { Cap_mapping const & thread() const { return _thread; } Cap_mapping & gate() { return _gate; } - const char *name() const { return _name; } + Name name() const { return _name; } bool core_thread() const { return _core_thread; } addr_t utcb() const { return _utcb; } }; diff --git a/repos/base-foc/src/core/io_mem_session_support.cc b/repos/base-foc/src/core/io_mem_session_support.cc index 81658a841..8755182eb 100644 --- a/repos/base-foc/src/core/io_mem_session_support.cc +++ b/repos/base-foc/src/core/io_mem_session_support.cc @@ -23,7 +23,7 @@ using namespace Genode; void Io_mem_session_component::_unmap_local(addr_t base, size_t) { - platform()->region_alloc()->free(reinterpret_cast(base)); + platform().region_alloc().free(reinterpret_cast(base)); } @@ -35,7 +35,7 @@ addr_t Io_mem_session_component::_map_local(addr_t base, size_t size) /* find appropriate region for mapping */ void *local_base = 0; - if (platform()->region_alloc()->alloc_aligned(size, &local_base, alignment).error()) + if (platform().region_alloc().alloc_aligned(size, &local_base, alignment).error()) return 0; if (!map_local_io(base, (addr_t)local_base, size >> get_page_size_log2())) { diff --git a/repos/base-foc/src/core/irq_session_component.cc b/repos/base-foc/src/core/irq_session_component.cc index c0fb34731..7766c822d 100644 --- a/repos/base-foc/src/core/irq_session_component.cc +++ b/repos/base-foc/src/core/irq_session_component.cc @@ -147,7 +147,7 @@ void Genode::Irq_object::ack_irq() Genode::Irq_object::Irq_object() : - _cap(cap_map()->insert(platform_specific()->cap_id_alloc()->alloc())), + _cap(cap_map().insert(platform_specific().cap_id_alloc().alloc())), _trigger(Irq_session::TRIGGER_UNCHANGED), _polarity(Irq_session::POLARITY_UNCHANGED), _irq(~0U), _msi_addr(0), _msi_data(0) @@ -170,7 +170,7 @@ Genode::Irq_object::~Irq_object() if (l4_error(l4_icu_unbind(L4_BASE_ICU_CAP, irq, _capability()))) error("cannot unbind IRQ"); - cap_map()->remove(_cap); + cap_map().remove(_cap); } @@ -179,7 +179,7 @@ Genode::Irq_object::~Irq_object() ***************************/ -Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char *args) : _irq_number(Arg_string::find_arg(args, "irq_number").long_value(-1)), _irq_alloc(irq_alloc), _irq_object() @@ -192,7 +192,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, } msi_alloc.set(_irq_number, 1); } else { - if (!irq_alloc || irq_alloc->alloc_addr(1, _irq_number).error()) { + if (irq_alloc.alloc_addr(1, _irq_number).error()) { error("unavailable IRQ ", _irq_number, " requested"); throw Service_denied(); } @@ -208,7 +208,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, msi_alloc.clear(_irq_number, 1); else { addr_t const free_irq = _irq_number; - _irq_alloc->free((void *)free_irq); + _irq_alloc.free((void *)free_irq); } throw Service_denied(); } @@ -223,7 +223,7 @@ Irq_session_component::~Irq_session_component() msi_alloc.clear(_irq_number, 1); } else { Genode::addr_t free_irq = _irq_number; - _irq_alloc->free((void *)free_irq); + _irq_alloc.free((void *)free_irq); } } diff --git a/repos/base-foc/src/core/native_cpu_component.cc b/repos/base-foc/src/core/native_cpu_component.cc index 815f96b2d..595b960b1 100644 --- a/repos/base-foc/src/core/native_cpu_component.cc +++ b/repos/base-foc/src/core/native_cpu_component.cc @@ -16,7 +16,7 @@ /* core includes */ #include -#include +#include #include /* Fiasco.OC includes */ @@ -54,7 +54,7 @@ Genode::Native_cpu_component::thread_state(Genode::Thread_capability cap) Genode::Native_cpu_component::Native_cpu_component(Cpu_session_component &cpu_session, char const *) : - _cpu_session(cpu_session), _thread_ep(*_cpu_session._thread_ep) + _cpu_session(cpu_session), _thread_ep(_cpu_session._thread_ep) { _thread_ep.manage(this); } diff --git a/repos/base-foc/src/core/pager.cc b/repos/base-foc/src/core/pager.cc index 5a96723f6..06a70514d 100644 --- a/repos/base-foc/src/core/pager.cc +++ b/repos/base-foc/src/core/pager.cc @@ -59,7 +59,7 @@ void Pager_entrypoint::entry() { if (_pager.exception()) { Lock::Guard guard(obj->state.lock); - _pager.get_regs(&obj->state); + _pager.get_regs(obj->state); obj->state.exceptions++; obj->state.in_exception = true; obj->submit_exception_signal(); @@ -115,7 +115,7 @@ void Pager_entrypoint::entry() case Ipc_pager::PAUSE: { Lock::Guard guard(obj->state.lock); - _pager.get_regs(&obj->state); + _pager.get_regs(obj->state); obj->state.exceptions++; obj->state.in_exception = true; @@ -139,24 +139,24 @@ void Pager_entrypoint::entry() } -void Pager_entrypoint::dissolve(Pager_object *obj) +void Pager_entrypoint::dissolve(Pager_object &obj) { /* cleanup at cap session */ - _cap_factory.free(obj->Object_pool::Entry::cap()); + _cap_factory.free(obj.Object_pool::Entry::cap()); - remove(obj); + remove(&obj); } -Pager_capability Pager_entrypoint::manage(Pager_object *obj) +Pager_capability Pager_entrypoint::manage(Pager_object &obj) { using namespace Fiasco; Native_capability cap(_cap_factory.alloc(Thread::_thread_cap)); /* add server object to object pool */ - obj->cap(cap); - insert(obj); + obj.cap(cap); + insert(&obj); /* return capability that uses the object id as badge */ return reinterpret_cap_cast(cap); diff --git a/repos/base-foc/src/core/platform.cc b/repos/base-foc/src/core/platform.cc index 058531b14..8a009b454 100644 --- a/repos/base-foc/src/core/platform.cc +++ b/repos/base-foc/src/core/platform.cc @@ -137,7 +137,7 @@ Platform::Sigma0::Sigma0(Cap_index* i) } -Platform::Core_pager::Core_pager(Platform_pd *core_pd, Sigma0 *sigma0) +Platform::Core_pager::Core_pager(Platform_pd &core_pd, Sigma0 &sigma0) : Platform_thread("core.pager"), Pager_object(Cpu_session_capability(), Thread_capability(), @@ -146,7 +146,7 @@ Platform::Core_pager::Core_pager(Platform_pd *core_pd, Sigma0 *sigma0) { Platform_thread::pager(sigma0); - core_pd->bind_thread(this); + core_pd.bind_thread(*this); cap(thread().local); /* stack begins at the top end of the '_core_pager_stack' array */ @@ -164,10 +164,10 @@ Platform::Core_pager::Core_pager(Platform_pd *core_pd, Sigma0 *sigma0) } -Platform::Core_pager *Platform::core_pager() +Platform::Core_pager &Platform::core_pager() { - static Core_pager _core_pager(core_pd(), &_sigma0); - return &_core_pager; + static Core_pager _core_pager(core_pd(), _sigma0); + return _core_pager; } @@ -248,13 +248,13 @@ static inline int sigma0_req_region(addr_t *addr, unsigned log2size) } -static Fiasco::l4_kernel_info_t *sigma0_map_kip() +static Fiasco::l4_kernel_info_t &sigma0_map_kip() { using namespace Fiasco; - static l4_kernel_info_t *kip = nullptr; + static l4_kernel_info_t *kip_ptr = nullptr; - if (kip) return kip; + if (kip_ptr) return *kip_ptr; /* signal we want to map the KIP */ l4_utcb_mr()->mr[0] = SIGMA0_REQ_KIP; @@ -270,15 +270,15 @@ static Fiasco::l4_kernel_info_t *sigma0_map_kip() l4_msgtag(L4_PROTO_SIGMA0, 1, 0, 0), L4_IPC_NEVER); if (l4_ipc_error(tag, l4_utcb())) - return 0; + panic("kip request to sigma0 failed"); l4_addr_t ret = l4_trunc_page(l4_utcb_mr()->mr[0]); - if (!ret) panic("kip mapping failed"); - else - kip = (l4_kernel_info_t*) ret; - return kip; + + kip_ptr = (l4_kernel_info_t*)ret; + + return *kip_ptr; } @@ -347,21 +347,21 @@ void Platform::_setup_basics() { using namespace Fiasco; - l4_kernel_info_t * kip = sigma0_map_kip(); + l4_kernel_info_t const &kip = sigma0_map_kip(); - if (kip->magic != L4_KERNEL_INFO_MAGIC) + if (kip.magic != L4_KERNEL_INFO_MAGIC) panic("Sigma0 mapped something but not the KIP"); log(""); - log("KIP @ ", kip); - log(" magic: ", Hex(kip->magic)); - log(" version: ", Hex(kip->version)); + log("KIP @ ", &kip); + log(" magic: ", Hex(kip.magic)); + log(" version: ", Hex(kip.version)); /* add KIP as ROM module */ _rom_fs.insert(&_kip_rom); /* update multi-boot info pointer from KIP */ - addr_t mb_info_addr = kip->user_ptr; + addr_t mb_info_addr = kip.user_ptr; log("MBI @ ", Hex(mb_info_addr)); /* parse memory descriptors - look for virtual memory configuration */ @@ -369,9 +369,9 @@ void Platform::_setup_basics() using Fiasco::L4::Kip::Mem_desc; _vm_start = 0; _vm_size = 0; - Mem_desc *desc = Mem_desc::first(kip); + Mem_desc const * const desc = Mem_desc::first(&kip); - for (unsigned i = 0; i < Mem_desc::count(kip); ++i) + for (unsigned i = 0; i < Mem_desc::count(&kip); ++i) if (desc[i].is_virtual()) { _vm_start = round_page(desc[i].start()); _vm_size = trunc_page(desc[i].end() - _vm_start + 1); @@ -398,8 +398,8 @@ void Platform::_setup_basics() _io_mem_alloc.add_range(0, ~0); /* remove KIP and MBI area from region and IO_MEM allocator */ - remove_region(Region((addr_t)kip, (addr_t)kip + L4_PAGESIZE), _region_alloc); - remove_region(Region((addr_t)kip, (addr_t)kip + L4_PAGESIZE), _io_mem_alloc); + remove_region(Region((addr_t)&kip, (addr_t)&kip + L4_PAGESIZE), _region_alloc); + remove_region(Region((addr_t)&kip, (addr_t)&kip + L4_PAGESIZE), _io_mem_alloc); /* remove core program image memory from region and IO_MEM allocator */ addr_t img_start = (addr_t) &_prog_img_beg; @@ -413,11 +413,11 @@ void Platform::_setup_basics() Platform::Platform() : - _ram_alloc(nullptr), _io_mem_alloc(core_mem_alloc()), - _io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()), - _region_alloc(core_mem_alloc()), _cap_id_alloc(core_mem_alloc()), - _kip_rom((addr_t)sigma0_map_kip(), L4_PAGESIZE, "l4v2_kip"), - _sigma0(cap_map()->insert(_cap_id_alloc.alloc(), Fiasco::L4_BASE_PAGER_CAP)) + _ram_alloc(nullptr), _io_mem_alloc(&core_mem_alloc()), + _io_port_alloc(&core_mem_alloc()), _irq_alloc(&core_mem_alloc()), + _region_alloc(&core_mem_alloc()), _cap_id_alloc(core_mem_alloc()), + _kip_rom((addr_t)&sigma0_map_kip(), L4_PAGESIZE, "l4v2_kip"), + _sigma0(cap_map().insert(_cap_id_alloc.alloc(), Fiasco::L4_BASE_PAGER_CAP)) { /* * We must be single-threaded at this stage and so this is safe. @@ -434,31 +434,33 @@ Platform::Platform() : log(_rom_fs); - Core_cap_index* pdi = - reinterpret_cast(cap_map()->insert(_cap_id_alloc.alloc(), Fiasco::L4_BASE_TASK_CAP)); - Core_cap_index* thi = - reinterpret_cast(cap_map()->insert(_cap_id_alloc.alloc(), Fiasco::L4_BASE_THREAD_CAP)); - Core_cap_index* irqi = - reinterpret_cast(cap_map()->insert(_cap_id_alloc.alloc())); + Core_cap_index &pdi = + *reinterpret_cast(cap_map().insert(_cap_id_alloc.alloc(), + Fiasco::L4_BASE_TASK_CAP)); + Core_cap_index &thi = + *reinterpret_cast(cap_map().insert(_cap_id_alloc.alloc(), + Fiasco::L4_BASE_THREAD_CAP)); + Core_cap_index &irqi = + *reinterpret_cast(cap_map().insert(_cap_id_alloc.alloc())); /* setup pd object for core pd */ - _core_pd = new(core_mem_alloc()) Platform_pd(pdi); + _core_pd = new (core_mem_alloc()) Platform_pd(pdi); /* * We setup the thread object for thread0 in core pd using a special * interface that allows us to specify the capability slot. */ - Platform_thread *core_thread = new(core_mem_alloc()) + Platform_thread &core_thread = *new (core_mem_alloc()) Platform_thread(thi, irqi, "core.main"); - core_thread->pager(&_sigma0); + core_thread.pager(_sigma0); _core_pd->bind_thread(core_thread); { /* export x86 platform specific infos */ void * phys_ptr = nullptr; - if (ram_alloc()->alloc_aligned(get_page_size(), &phys_ptr, - get_page_size_log2()).ok()) { + if (ram_alloc().alloc_aligned(get_page_size(), &phys_ptr, + get_page_size_log2()).ok()) { addr_t const phys_addr = reinterpret_cast(phys_ptr); /* empty for now */ _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, @@ -474,11 +476,11 @@ Platform::Platform() : unsigned const pages = 1; size_t const log_size = pages << get_page_size_log2(); - ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); + ram_alloc().alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); addr_t const phys_addr = reinterpret_cast(phys_ptr); /* let one page free after the log buffer */ - region_alloc()->alloc_aligned(log_size, &core_local_ptr, get_page_size_log2()); + region_alloc().alloc_aligned(log_size, &core_local_ptr, get_page_size_log2()); addr_t const core_local_addr = reinterpret_cast(core_local_ptr); map_local(phys_addr, core_local_addr, pages); diff --git a/repos/base-foc/src/core/platform_pd.cc b/repos/base-foc/src/core/platform_pd.cc index 3528bbf97..28a851271 100644 --- a/repos/base-foc/src/core/platform_pd.cc +++ b/repos/base-foc/src/core/platform_pd.cc @@ -42,42 +42,42 @@ static addr_t core_utcb_base() { ** Public object members ** ***************************/ -bool Platform_pd::bind_thread(Platform_thread *thread) +bool Platform_pd::bind_thread(Platform_thread &thread) { /* * Fiasco.OC limits the UTCB area for roottask to 16K. Therefore, the * number of threads is limited to 16K / L4_UTCB_OFFSET. * (see kernel/fiasco/src/kern/kernel_thread-std.cpp:94) */ - unsigned const thread_max = thread->core_thread() ? 16*1024/L4_UTCB_OFFSET : THREAD_MAX; + unsigned const thread_max = thread.core_thread() ? 16*1024/L4_UTCB_OFFSET : THREAD_MAX; for (unsigned i = 0; i < thread_max; i++) { if (_threads[i]) continue; - _threads[i] = thread; + _threads[i] = &thread; - if (thread->core_thread()) - thread->_utcb = (addr_t) (core_utcb_base() + i * L4_UTCB_OFFSET); + if (thread.core_thread()) + thread._utcb = (addr_t) (core_utcb_base() + i * L4_UTCB_OFFSET); else - thread->_utcb = + thread._utcb = reinterpret_cast(utcb_area_start() + i * L4_UTCB_OFFSET); Fiasco::l4_cap_idx_t 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; + thread._gate.remote = cap_offset + THREAD_GATE_CAP; + thread._pager.remote = cap_offset + THREAD_PAGER_CAP; + thread._irq.remote = cap_offset + THREAD_IRQ_CAP; /* if it's no core-thread we have to map parent and pager gate cap */ - if (!thread->core_thread()) { + if (!thread.core_thread()) { _task.map(_task.local.data()->kcap()); // FIXME: there is no debug cap anymore // _debug.map(_task.local.data()->kcap()); } /* inform thread about binding */ - thread->bind(this); + thread.bind(*this); return true; } @@ -86,14 +86,14 @@ bool Platform_pd::bind_thread(Platform_thread *thread) } -void Platform_pd::unbind_thread(Platform_thread *thread) +void Platform_pd::unbind_thread(Platform_thread &thread) { /* inform thread about unbinding */ - thread->unbind(); + thread.unbind(); for (unsigned i = 0; i < THREAD_MAX; i++) - if (_threads[i] == thread) { - _threads[i] = (Platform_thread*) 0; + if (_threads[i] == &thread) { + _threads[i] = (Platform_thread*)nullptr; return; } } @@ -117,25 +117,19 @@ void Platform_pd::flush(addr_t, size_t size, Core_local_addr core_local) static Core_cap_index * debug_cap() { - unsigned long id = platform_specific()->cap_id_alloc()->alloc(); - static Cap_index * idx = cap_map()->insert(id, DEBUG_CAP); + unsigned long const id = platform_specific().cap_id_alloc().alloc(); + static Cap_index * idx = cap_map().insert(id, DEBUG_CAP); return reinterpret_cast(idx); } -Platform_pd::Platform_pd(Core_cap_index* i) -: _task(Native_capability(i), TASK_CAP) -{ - for (unsigned i = 0; i < THREAD_MAX; i++) - _threads[i] = (Platform_thread*) 0; -} +Platform_pd::Platform_pd(Core_cap_index &ci) +: _task(Native_capability(&ci), TASK_CAP) +{ } -Platform_pd::Platform_pd(Allocator *, char const *) +Platform_pd::Platform_pd(Allocator &, char const *) : _task(true, TASK_CAP), _debug(debug_cap(), DEBUG_CAP) { - for (unsigned i = 0; i < THREAD_MAX; i++) - _threads[i] = (Platform_thread*) 0; - l4_fpage_t utcb_area = l4_fpage(utcb_area_start(), log2(UTCB_AREA_SIZE), 0); l4_msgtag_t tag = l4_factory_create_task(L4_BASE_FACTORY_CAP, diff --git a/repos/base-foc/src/core/platform_thread.cc b/repos/base-foc/src/core/platform_thread.cc index bf3cddb72..28c9dc16e 100644 --- a/repos/base-foc/src/core/platform_thread.cc +++ b/repos/base-foc/src/core/platform_thread.cc @@ -153,11 +153,11 @@ void Platform_thread::resume() } -void Platform_thread::bind(Platform_pd *pd) +void Platform_thread::bind(Platform_pd &pd) { - _platform_pd = pd; - _gate.map(pd->native_task().data()->kcap()); - _irq.map(pd->native_task().data()->kcap()); + _platform_pd = &pd; + _gate.map(pd.native_task().data()->kcap()); + _irq.map(pd.native_task().data()->kcap()); } @@ -180,11 +180,11 @@ void Platform_thread::unbind() } -void Platform_thread::pager(Pager_object *pager_obj) +void Platform_thread::pager(Pager_object &pager_obj) { - _pager_obj = pager_obj; + _pager_obj = &pager_obj; if (_pager_obj) - _pager.local = pager_obj->cap(); + _pager.local = pager_obj.cap(); else _pager.local = Native_capability(); } @@ -240,7 +240,7 @@ Affinity::Location Platform_thread::affinity() const static Rpc_cap_factory &thread_cap_factory() { - static Rpc_cap_factory inst(*platform()->core_mem_alloc()); + static Rpc_cap_factory inst(platform().core_mem_alloc()); return inst; } @@ -257,7 +257,7 @@ void Platform_thread::_create_thread() } -void Platform_thread::_finalize_construction(const char *name) +void Platform_thread::_finalize_construction() { /* create irq for new thread */ l4_msgtag_t tag = l4_factory_create_irq(L4_BASE_FACTORY_CAP, @@ -271,8 +271,7 @@ void Platform_thread::_finalize_construction(const char *name) warning("attaching thread's irq failed"); /* set human readable name in kernel debugger */ - strncpy(_name, name, sizeof(_name)); - Fiasco::l4_debugger_set_object_name(_thread.local.data()->kcap(), name); + Fiasco::l4_debugger_set_object_name(_thread.local.data()->kcap(), _name.string()); /* set priority of thread */ l4_sched_param_t params = l4_sched_param(_prio); @@ -283,7 +282,8 @@ void Platform_thread::_finalize_construction(const char *name) Platform_thread::Platform_thread(size_t, const char *name, unsigned prio, Affinity::Location location, addr_t) -: _state(DEAD), +: _name(name), + _state(DEAD), _core_thread(false), _thread(true), _irq(true), @@ -295,17 +295,18 @@ Platform_thread::Platform_thread(size_t, const char *name, unsigned prio, /* XXX remove const cast */ ((Core_cap_index *)_thread.local.data())->pt(this); _create_thread(); - _finalize_construction(name); + _finalize_construction(); affinity(location); } -Platform_thread::Platform_thread(Core_cap_index* thread, - Core_cap_index* irq, const char *name) -: _state(RUNNING), +Platform_thread::Platform_thread(Core_cap_index &thread, + Core_cap_index &irq, const char *name) +: _name(name), + _state(RUNNING), _core_thread(true), - _thread(Native_capability(thread), L4_BASE_THREAD_CAP), - _irq(Native_capability(irq)), + _thread(Native_capability(&thread), L4_BASE_THREAD_CAP), + _irq(Native_capability(&irq)), _utcb(0), _platform_pd(0), _pager_obj(0), @@ -313,12 +314,13 @@ Platform_thread::Platform_thread(Core_cap_index* thread, { /* XXX remove const cast */ ((Core_cap_index *)_thread.local.data())->pt(this); - _finalize_construction(name); + _finalize_construction(); } Platform_thread::Platform_thread(const char *name) -: _state(DEAD), +: _name(name), + _state(DEAD), _core_thread(true), _thread(true), _irq(true), @@ -330,7 +332,7 @@ Platform_thread::Platform_thread(const char *name) /* XXX remove const cast */ ((Core_cap_index *)_thread.local.data())->pt(this); _create_thread(); - _finalize_construction(name); + _finalize_construction(); } @@ -343,5 +345,5 @@ Platform_thread::~Platform_thread() * Thread::unbind() */ if (_platform_pd) - _platform_pd->unbind_thread(this); + _platform_pd->unbind_thread(*this); } diff --git a/repos/base-foc/src/core/ram_dataspace_support.cc b/repos/base-foc/src/core/ram_dataspace_support.cc index 179366012..535bc1365 100644 --- a/repos/base-foc/src/core/ram_dataspace_support.cc +++ b/repos/base-foc/src/core/ram_dataspace_support.cc @@ -21,15 +21,15 @@ namespace Fiasco { using namespace Genode; -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *) { } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &) { } +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } -void Ram_dataspace_factory::_clear_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_clear_ds(Dataspace_component &ds) { - memset((void *)ds->phys_addr(), 0, ds->size()); + memset((void *)ds.phys_addr(), 0, ds.size()); - if (ds->cacheability() != CACHED) - Fiasco::l4_cache_dma_coherent(ds->phys_addr(), ds->phys_addr() + ds->size()); + if (ds.cacheability() != CACHED) + Fiasco::l4_cache_dma_coherent(ds.phys_addr(), ds.phys_addr() + ds.size()); } diff --git a/repos/base-foc/src/core/rpc_cap_factory.cc b/repos/base-foc/src/core/rpc_cap_factory.cc index 2bca4066d..60baf669d 100644 --- a/repos/base-foc/src/core/rpc_cap_factory.cc +++ b/repos/base-foc/src/core/rpc_cap_factory.cc @@ -43,10 +43,10 @@ using namespace Genode; ** Cap_index_allocator ** ***************************/ -Genode::Cap_index_allocator* Genode::cap_idx_alloc() +Genode::Cap_index_allocator &Genode::cap_idx_alloc() { static Genode::Cap_index_allocator_tpl alloc; - return &alloc; + return alloc; } @@ -54,10 +54,10 @@ Genode::Cap_index_allocator* Genode::cap_idx_alloc() ** Cap_mapping ** *******************/ -Core_cap_index* Cap_mapping::_get_cap() +Core_cap_index *Cap_mapping::_get_cap() { - int id = platform_specific()->cap_id_alloc()->alloc(); - return static_cast(cap_map()->insert(id)); + int const id = platform_specific().cap_id_alloc().alloc(); + return static_cast(cap_map().insert(id)); } @@ -107,12 +107,12 @@ Native_capability Rpc_cap_factory::alloc(Native_capability ep) /* * Allocate new id, and ipc-gate and set id as gate-label */ - unsigned long id = platform_specific()->cap_id_alloc()->alloc(); - Core_cap_index* idx = static_cast(cap_map()->insert(id)); + unsigned long const id = platform_specific().cap_id_alloc().alloc(); + Core_cap_index *idx = static_cast(cap_map().insert(id)); if (!idx) { warning("Out of capability indices!"); - platform_specific()->cap_id_alloc()->free(id); + platform_specific().cap_id_alloc().free(id); return cap; } @@ -121,12 +121,12 @@ Native_capability Rpc_cap_factory::alloc(Native_capability ep) ref->pt()->thread().local.data()->kcap(), id); if (l4_msgtag_has_error(tag)) { error("l4_factory_create_gate failed!"); - cap_map()->remove(idx); - platform_specific()->cap_id_alloc()->free(id); + cap_map().remove(idx); + platform_specific().cap_id_alloc().free(id); return cap; } else /* set debugger-name of ipc-gate to thread's name */ - Fiasco::l4_debugger_set_object_name(idx->kcap(), ref->pt()->name()); + Fiasco::l4_debugger_set_object_name(idx->kcap(), ref->pt()->name().string()); // XXX remove cast idx->session((Pd_session_component *)this); @@ -159,7 +159,7 @@ void Rpc_cap_factory::free(Native_capability cap) if (static_cast(cap.data())->session() != (Pd_session_component *)this) return; - Entry * entry; + Entry * entry = nullptr; _pool.apply(cap, [&] (Entry *e) { entry = e; if (e) { @@ -184,8 +184,8 @@ Rpc_cap_factory::~Rpc_cap_factory() ** Capability ID Allocator ** *******************************/ -Cap_id_allocator::Cap_id_allocator(Allocator* alloc) -: _id_alloc(alloc) +Cap_id_allocator::Cap_id_allocator(Allocator &alloc) +: _id_alloc(&alloc) { _id_alloc.add_range(CAP_ID_OFFSET, CAP_ID_RANGE); } @@ -195,7 +195,7 @@ unsigned long Cap_id_allocator::alloc() { Lock::Guard lock_guard(_lock); - void *id; + void *id = nullptr; if (_id_alloc.alloc(CAP_ID_OFFSET, &id)) return (unsigned long) id; throw Out_of_ids(); @@ -211,7 +211,7 @@ void Cap_id_allocator::free(unsigned long id) } -void Genode::Capability_map::remove(Genode::Cap_index* i) +void Genode::Capability_map::remove(Genode::Cap_index *i) { using namespace Genode; using namespace Fiasco; @@ -228,9 +228,9 @@ void Genode::Capability_map::remove(Genode::Cap_index* i) error("destruction of ipc-gate ", i->kcap(), " failed!"); - platform_specific()->cap_id_alloc()->free(i->id()); + platform_specific().cap_id_alloc().free(i->id()); _tree.remove(i); } - cap_idx_alloc()->free(i, 1); + cap_idx_alloc().free(i, 1); } } diff --git a/repos/base-foc/src/core/signal_source_component.cc b/repos/base-foc/src/core/signal_source_component.cc index d047ca208..383b806d4 100644 --- a/repos/base-foc/src/core/signal_source_component.cc +++ b/repos/base-foc/src/core/signal_source_component.cc @@ -32,20 +32,20 @@ using namespace Genode; ** Signal-source component ** *****************************/ -void Signal_source_component::release(Signal_context_component *context) +void Signal_source_component::release(Signal_context_component &context) { - if (context && context->enqueued()) - _signal_queue.remove(context); + if (context.enqueued()) + _signal_queue.remove(&context); } -void Signal_source_component::submit(Signal_context_component *context, +void Signal_source_component::submit(Signal_context_component &context, unsigned long cnt) { /* enqueue signal to context */ - context->increment_signal_cnt(cnt); + context.increment_signal_cnt(cnt); - if (!context->enqueued()) { - _signal_queue.enqueue(context); + if (!context.enqueued()) { + _signal_queue.enqueue(&context); /* wake up client */ Fiasco::l4_irq_trigger(_blocking_semaphore.data()->kcap()); @@ -61,16 +61,16 @@ Signal_source::Signal Signal_source_component::wait_for_signal() } /* dequeue and return pending signal */ - Signal_context_component *context = _signal_queue.dequeue(); - Signal result(context->imprint(), context->cnt()); - context->reset_signal_cnt(); + Signal_context_component &context = *_signal_queue.dequeue(); + Signal result(context.imprint(), context.cnt()); + context.reset_signal_cnt(); return result; } -Signal_source_component::Signal_source_component(Rpc_entrypoint *ep) +Signal_source_component::Signal_source_component(Rpc_entrypoint &ep) : - Signal_source_rpc_object(cap_map()->insert(platform_specific()->cap_id_alloc()->alloc())), + Signal_source_rpc_object(cap_map().insert(platform_specific().cap_id_alloc().alloc())), _entrypoint(ep) { using namespace Fiasco; diff --git a/repos/base-foc/src/core/spec/arm/ipc_pager.cc b/repos/base-foc/src/core/spec/arm/ipc_pager.cc index 86c46ff97..aff98a0e9 100644 --- a/repos/base-foc/src/core/spec/arm/ipc_pager.cc +++ b/repos/base-foc/src/core/spec/arm/ipc_pager.cc @@ -32,29 +32,29 @@ void Genode::Ipc_pager::_parse_exception() } -void Genode::Ipc_pager::get_regs(Foc_thread_state *state) +void Genode::Ipc_pager::get_regs(Foc_thread_state &state) const { - state->ip = _regs.pc; - state->sp = _regs.sp; - state->r0 = _regs.r[0]; - state->r1 = _regs.r[1]; - state->r2 = _regs.r[2]; - state->r3 = _regs.r[3]; - state->r4 = _regs.r[4]; - state->r5 = _regs.r[5]; - state->r6 = _regs.r[6]; - state->r7 = _regs.r[7]; - state->r8 = _regs.r[8]; - state->r9 = _regs.r[9]; - state->r10 = _regs.r[10]; - state->r11 = _regs.r[11]; - state->r12 = _regs.r[12]; - state->lr = _regs.ulr; - state->cpsr = _regs.cpsr; + state.ip = _regs.pc; + state.sp = _regs.sp; + state.r0 = _regs.r[0]; + state.r1 = _regs.r[1]; + state.r2 = _regs.r[2]; + state.r3 = _regs.r[3]; + state.r4 = _regs.r[4]; + state.r5 = _regs.r[5]; + state.r6 = _regs.r[6]; + state.r7 = _regs.r[7]; + state.r8 = _regs.r[8]; + state.r9 = _regs.r[9]; + state.r10 = _regs.r[10]; + state.r11 = _regs.r[11]; + state.r12 = _regs.r[12]; + state.lr = _regs.ulr; + state.cpsr = _regs.cpsr; } -void Genode::Ipc_pager::set_regs(Foc_thread_state state) +void Genode::Ipc_pager::set_regs(Foc_thread_state const &state) { _regs.pc = state.ip; _regs.sp = state.sp; diff --git a/repos/base-foc/src/core/spec/x86_32/ipc_pager.cc b/repos/base-foc/src/core/spec/x86_32/ipc_pager.cc index f592da2e7..97df1ffef 100644 --- a/repos/base-foc/src/core/spec/x86_32/ipc_pager.cc +++ b/repos/base-foc/src/core/spec/x86_32/ipc_pager.cc @@ -17,25 +17,25 @@ #include -void Genode::Ipc_pager::get_regs(Foc_thread_state *state) +void Genode::Ipc_pager::get_regs(Foc_thread_state &state) const { - state->ip = _regs.ip; - state->sp = _regs.sp; - state->edi = _regs.edi; - state->esi = _regs.esi; - state->ebp = _regs.ebp; - state->ebx = _regs.ebx; - state->edx = _regs.edx; - state->ecx = _regs.ecx; - state->eax = _regs.eax; - state->gs = _regs.gs; - state->fs = _regs.fs; - state->eflags = _regs.flags; - state->trapno = _regs.trapno; + state.ip = _regs.ip; + state.sp = _regs.sp; + state.edi = _regs.edi; + state.esi = _regs.esi; + state.ebp = _regs.ebp; + state.ebx = _regs.ebx; + state.edx = _regs.edx; + state.ecx = _regs.ecx; + state.eax = _regs.eax; + state.gs = _regs.gs; + state.fs = _regs.fs; + state.eflags = _regs.flags; + state.trapno = _regs.trapno; } -void Genode::Ipc_pager::set_regs(Foc_thread_state state) +void Genode::Ipc_pager::set_regs(Foc_thread_state const &state) { _regs.ip = state.ip; _regs.sp = state.sp; diff --git a/repos/base-foc/src/core/spec/x86_64/ipc_pager.cc b/repos/base-foc/src/core/spec/x86_64/ipc_pager.cc index 1fd94169d..b25408905 100644 --- a/repos/base-foc/src/core/spec/x86_64/ipc_pager.cc +++ b/repos/base-foc/src/core/spec/x86_64/ipc_pager.cc @@ -17,32 +17,32 @@ #include -void Genode::Ipc_pager::get_regs(Foc_thread_state *state) +void Genode::Ipc_pager::get_regs(Foc_thread_state &state) const { - state->ip = _regs.ip; - state->sp = _regs.sp; - state->r8 = _regs.r8; - state->r9 = _regs.r9; - state->r10 = _regs.r10; - state->r11 = _regs.r11; - state->r12 = _regs.r12; - state->r13 = _regs.r13; - state->r14 = _regs.r14; - state->r15 = _regs.r15; - state->rax = _regs.rax; - state->rbx = _regs.rbx; - state->rcx = _regs.rcx; - state->rdx = _regs.rdx; - state->rdi = _regs.rdi; - state->rsi = _regs.rsi; - state->rbp = _regs.rbp; - state->ss = _regs.ss; - state->eflags = _regs.flags; - state->trapno = _regs.trapno; + state.ip = _regs.ip; + state.sp = _regs.sp; + state.r8 = _regs.r8; + state.r9 = _regs.r9; + state.r10 = _regs.r10; + state.r11 = _regs.r11; + state.r12 = _regs.r12; + state.r13 = _regs.r13; + state.r14 = _regs.r14; + state.r15 = _regs.r15; + state.rax = _regs.rax; + state.rbx = _regs.rbx; + state.rcx = _regs.rcx; + state.rdx = _regs.rdx; + state.rdi = _regs.rdi; + state.rsi = _regs.rsi; + state.rbp = _regs.rbp; + state.ss = _regs.ss; + state.eflags = _regs.flags; + state.trapno = _regs.trapno; } -void Genode::Ipc_pager::set_regs(Foc_thread_state state) +void Genode::Ipc_pager::set_regs(Foc_thread_state const &state) { _regs.ip = state.ip; _regs.sp = state.sp; diff --git a/repos/base-foc/src/core/thread_start.cc b/repos/base-foc/src/core/thread_start.cc index dbbd49c07..3cd60c7a3 100644 --- a/repos/base-foc/src/core/thread_start.cc +++ b/repos/base-foc/src/core/thread_start.cc @@ -45,26 +45,26 @@ void Thread::start() using namespace Fiasco; /* create and start platform thread */ - Platform_thread *pt = - new(platform()->core_mem_alloc()) Platform_thread(_stack->name().string()); + Platform_thread &pt = *new (platform().core_mem_alloc()) + Platform_thread(_stack->name().string()); - platform_specific()->core_pd()->bind_thread(pt); + platform_specific().core_pd().bind_thread(pt); - l4_utcb_t *foc_utcb = (l4_utcb_t *)(pt->utcb()); + l4_utcb_t *foc_utcb = (l4_utcb_t *)(pt.utcb()); - native_thread() = Native_thread(pt->gate().remote); + native_thread() = Native_thread(pt.gate().remote); utcb()->foc_utcb = foc_utcb; _thread_cap = - reinterpret_cap_cast(Native_capability(pt->thread().local)); + reinterpret_cap_cast(Native_capability(pt.thread().local)); - pt->pager(platform_specific()->core_pager()); + pt.pager(platform_specific().core_pager()); - l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_BADGE] = (unsigned long) pt->gate().local.data(); + l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_BADGE] = (unsigned long) pt.gate().local.data(); l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_THREAD_OBJ] = (addr_t)this; - pt->start((void *)_thread_start, stack_top()); + pt.start((void *)_thread_start, stack_top()); } diff --git a/repos/base-foc/src/include/base/internal/cap_map.h b/repos/base-foc/src/include/base/internal/cap_map.h index f76ef283d..c02d3484a 100644 --- a/repos/base-foc/src/include/base/internal/cap_map.h +++ b/repos/base-foc/src/include/base/internal/cap_map.h @@ -124,7 +124,7 @@ namespace Genode { /** * Get the global Cap_index_allocator of the process. */ - Cap_index_allocator *cap_idx_alloc(); + Cap_index_allocator &cap_idx_alloc(); /** @@ -245,7 +245,7 @@ namespace Genode { /** * Get the global Capability_map of the process. */ - Capability_map *cap_map(); + Capability_map &cap_map(); } #endif /* _INCLUDE__BASE__CAP_MAP_H_ */ diff --git a/repos/base-foc/src/include/base/internal/parent_cap.h b/repos/base-foc/src/include/base/internal/parent_cap.h index 1d44767b6..1feb3e0f1 100644 --- a/repos/base-foc/src/include/base/internal/parent_cap.h +++ b/repos/base-foc/src/include/base/internal/parent_cap.h @@ -33,15 +33,14 @@ namespace Genode { { unsigned long const local_name = _parent_cap; - static Cap_index *i = cap_map()->insert(local_name, - Fiasco::PARENT_CAP); + static Cap_index *i = cap_map().insert(local_name, Fiasco::PARENT_CAP); /* * Update local name after a parent capability got reloaded via * 'Platform_env::reload_parent_cap()'. */ if (i->id() != local_name) { - cap_map()->remove(i); - i = cap_map()->insert(local_name, Fiasco::PARENT_CAP); + cap_map().remove(i); + i = cap_map().insert(local_name, Fiasco::PARENT_CAP); } return reinterpret_cap_cast(Native_capability(i)); diff --git a/repos/base-foc/src/lib/base/cap_alloc.cc b/repos/base-foc/src/lib/base/cap_alloc.cc index d282b8091..0cb34b669 100644 --- a/repos/base-foc/src/lib/base/cap_alloc.cc +++ b/repos/base-foc/src/lib/base/cap_alloc.cc @@ -13,8 +13,8 @@ #include -Genode::Cap_index_allocator* Genode::cap_idx_alloc() +Genode::Cap_index_allocator &Genode::cap_idx_alloc() { static Genode::Cap_index_allocator_tpl alloc; - return &alloc; + return alloc; } diff --git a/repos/base-foc/src/lib/base/cap_map.cc b/repos/base-foc/src/lib/base/cap_map.cc index 00fc54179..7f55d1b96 100644 --- a/repos/base-foc/src/lib/base/cap_map.cc +++ b/repos/base-foc/src/lib/base/cap_map.cc @@ -71,13 +71,13 @@ Genode::Cap_index* Genode::Cap_index::find_by_id(Genode::uint16_t id) Genode::addr_t Genode::Cap_index::kcap() const { - return cap_idx_alloc()->idx_to_kcap(this); } + return cap_idx_alloc().idx_to_kcap(this); } Genode::uint8_t Genode::Cap_index::inc() { /* con't ref-count index that are controlled by core */ - if (cap_idx_alloc()->static_idx(this)) + if (cap_idx_alloc().static_idx(this)) return 1; spinlock_lock(&_cap_index_spinlock); @@ -90,7 +90,7 @@ Genode::uint8_t Genode::Cap_index::inc() Genode::uint8_t Genode::Cap_index::dec() { /* con't ref-count index that are controlled by core */ - if (cap_idx_alloc()->static_idx(this)) + if (cap_idx_alloc().static_idx(this)) return 1; spinlock_lock(&_cap_index_spinlock); @@ -121,7 +121,7 @@ Genode::Cap_index* Genode::Capability_map::insert(int id) ASSERT(!_tree.first() || !_tree.first()->find_by_id(id), "Double insertion in cap_map()!"); - Cap_index *i = cap_idx_alloc()->alloc_range(1); + Cap_index * const i = cap_idx_alloc().alloc_range(1); if (i) { i->id(id); _tree.insert(i); @@ -141,7 +141,7 @@ Genode::Cap_index* Genode::Capability_map::insert(int id, addr_t kcap) if (i) _tree.remove(i); - i = cap_idx_alloc()->alloc(kcap); + i = cap_idx_alloc().alloc(kcap); if (i) { i->id(id); _tree.insert(i); @@ -180,7 +180,7 @@ Genode::Cap_index* Genode::Capability_map::insert_map(int id, addr_t kcap) } /* the capability doesn't exists in the map so allocate a new one */ - i = cap_idx_alloc()->alloc_range(1); + i = cap_idx_alloc().alloc_range(1); if (!i) return 0; @@ -196,10 +196,10 @@ Genode::Cap_index* Genode::Capability_map::insert_map(int id, addr_t kcap) } -Genode::Capability_map* Genode::cap_map() +Genode::Capability_map &Genode::cap_map() { static Genode::Capability_map map; - return ↦ + return map; } @@ -209,14 +209,14 @@ Genode::Capability_map* Genode::cap_map() Fiasco::l4_cap_idx_t Genode::Capability_space::alloc_kcap() { - return cap_idx_alloc()->alloc_range(1)->kcap(); + return cap_idx_alloc().alloc_range(1)->kcap(); } void Genode::Capability_space::free_kcap(Fiasco::l4_cap_idx_t kcap) { - Genode::Cap_index* idx = Genode::cap_idx_alloc()->kcap_to_idx(kcap); - Genode::cap_idx_alloc()->free(idx, 1); + Genode::Cap_index *idx = Genode::cap_idx_alloc().kcap_to_idx(kcap); + Genode::cap_idx_alloc().free(idx, 1); } diff --git a/repos/base-foc/src/lib/base/cap_map_remove.cc b/repos/base-foc/src/lib/base/cap_map_remove.cc index 0342ec013..8f196ffbb 100644 --- a/repos/base-foc/src/lib/base/cap_map_remove.cc +++ b/repos/base-foc/src/lib/base/cap_map_remove.cc @@ -22,9 +22,9 @@ void Genode::Capability_map::remove(Genode::Cap_index* i) Lock_guard guard(_lock); if (i) { - Cap_index* e = _tree.first() ? _tree.first()->find_by_id(i->id()) : 0; + Cap_index *e = _tree.first() ? _tree.first()->find_by_id(i->id()) : 0; if (e == i) _tree.remove(i); - cap_idx_alloc()->free(i, 1); + cap_idx_alloc().free(i, 1); } } diff --git a/repos/base-foc/src/lib/base/capability.cc b/repos/base-foc/src/lib/base/capability.cc index d840440cb..88305b90c 100644 --- a/repos/base-foc/src/lib/base/capability.cc +++ b/repos/base-foc/src/lib/base/capability.cc @@ -36,7 +36,7 @@ void Native_capability::_inc() void Native_capability::_dec() { if (_data && !_data->dec()) - cap_map()->remove(_data); + cap_map().remove(_data); } diff --git a/repos/base-foc/src/lib/base/ipc.cc b/repos/base-foc/src/lib/base/ipc.cc index f377c737e..061b817e3 100644 --- a/repos/base-foc/src/lib/base/ipc.cc +++ b/repos/base-foc/src/lib/base/ipc.cc @@ -159,8 +159,8 @@ static unsigned long extract_msg_from_utcb(l4_msgtag_t tag, */ for (unsigned i = 0; i < num_caps; i++) { if (caps[i].valid) { - rcv_msg.insert(Native_capability(cap_map()->insert_map(caps[i].badge, - caps[i].sel))); + rcv_msg.insert(Native_capability(cap_map().insert_map(caps[i].badge, + caps[i].sel))); } else { rcv_msg.insert(Native_capability()); } @@ -383,13 +383,13 @@ Ipc_server::~Ipc_server() { } Receive_window::~Receive_window() { if (_rcv_idx_base) - cap_idx_alloc()->free(_rcv_idx_base, MAX_CAPS_PER_MSG); + cap_idx_alloc().free(_rcv_idx_base, MAX_CAPS_PER_MSG); } void Receive_window::init() { - _rcv_idx_base = cap_idx_alloc()->alloc_range(MAX_CAPS_PER_MSG); + _rcv_idx_base = cap_idx_alloc().alloc_range(MAX_CAPS_PER_MSG); } diff --git a/repos/base-foc/src/lib/base/thread_bootstrap.cc b/repos/base-foc/src/lib/base/thread_bootstrap.cc index e300a4ef4..19b94367c 100644 --- a/repos/base-foc/src/lib/base/thread_bootstrap.cc +++ b/repos/base-foc/src/lib/base/thread_bootstrap.cc @@ -31,7 +31,7 @@ void prepare_init_main_thread() { using namespace Genode; enum { THREAD_CAP_ID = 1 }; - Cap_index * ci(cap_map()->insert(THREAD_CAP_ID, Fiasco::MAIN_THREAD_CAP)); + Cap_index * ci(cap_map().insert(THREAD_CAP_ID, Fiasco::MAIN_THREAD_CAP)); Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_BADGE] = (unsigned long)ci; Fiasco::l4_utcb_tcr()->user[Fiasco::UTCB_TCR_THREAD_OBJ] = 0; } @@ -40,8 +40,8 @@ void prepare_init_main_thread() void prepare_reinit_main_thread() { using namespace Genode; - construct_at(cap_map()); - cap_idx_alloc()->reinit(); + construct_at(&cap_map()); + cap_idx_alloc().reinit(); prepare_init_main_thread(); } diff --git a/repos/base-foc/src/lib/base/thread_start.cc b/repos/base-foc/src/lib/base/thread_start.cc index 26b7744a1..ba41c6f26 100644 --- a/repos/base-foc/src/lib/base/thread_start.cc +++ b/repos/base-foc/src/lib/base/thread_start.cc @@ -40,7 +40,7 @@ void Thread::_deinit_platform_thread() if (native_thread().kcap && _thread_cap.valid()) { Cap_index *i = (Cap_index*)l4_utcb_tcr_u(utcb()->foc_utcb)->user[UTCB_TCR_BADGE]; - cap_map()->remove(i); + cap_map().remove(i); _cpu_session->kill_thread(_thread_cap); } } @@ -93,7 +93,7 @@ void Thread::start() native_thread() = Native_thread(state.kcap); - Cap_index *i = cap_map()->insert(state.id, state.kcap); + Cap_index *i = cap_map().insert(state.id, state.kcap); l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_BADGE] = (unsigned long) i; l4_utcb_tcr_u(foc_utcb)->user[UTCB_TCR_THREAD_OBJ] = (addr_t)this; diff --git a/repos/base-foc/src/test/cap_integrity/main.cc b/repos/base-foc/src/test/cap_integrity/main.cc index 39b9fcff4..16ec50ea6 100644 --- a/repos/base-foc/src/test/cap_integrity/main.cc +++ b/repos/base-foc/src/test/cap_integrity/main.cc @@ -34,7 +34,7 @@ Main::Main(Env &env) enum { COUNT = 1000 }; - Cap_index* idx = cap_idx_alloc()->alloc_range(COUNT); + Cap_index* idx = cap_idx_alloc().alloc_range(COUNT); Fiasco::l4_cap_idx_t tid = Capability_space::kcap(env.ram_session_cap()); /* try the first 1000 local name IDs */ diff --git a/repos/base-hw/src/core/core_region_map.cc b/repos/base-hw/src/core/core_region_map.cc index dd0f9663d..1defc1368 100644 --- a/repos/base-hw/src/core/core_region_map.cc +++ b/repos/base-hw/src/core/core_region_map.cc @@ -49,9 +49,8 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t size, /* allocate range in core's virtual address space */ void *virt_addr; - if (!platform()->region_alloc()->alloc_aligned(page_rounded_size, - &virt_addr, - get_page_size_log2()).ok()) { + if (!platform().region_alloc().alloc_aligned(page_rounded_size, &virt_addr, + get_page_size_log2()).ok()) { error("could not allocate virtual address range in core of size ", page_rounded_size); return nullptr; diff --git a/repos/base-hw/src/core/cpu_thread_allocator.h b/repos/base-hw/src/core/cpu_thread_allocator.h index c57eab0b8..834cfe028 100644 --- a/repos/base-hw/src/core/cpu_thread_allocator.h +++ b/repos/base-hw/src/core/cpu_thread_allocator.h @@ -14,9 +14,13 @@ #ifndef _CORE__CPU_THREAD_ALLOCATOR_H_ #define _CORE__CPU_THREAD_ALLOCATOR_H_ +/* Genode includes */ #include #include +/* core includes */ +#include + namespace Genode { /** @@ -36,7 +40,7 @@ namespace Genode Cpu_thread_allocator(Cpu_thread_allocator const &); Cpu_thread_allocator &operator = (Cpu_thread_allocator const &); - Allocator * const _alloc; + Allocator &_alloc; public: @@ -45,34 +49,25 @@ namespace Genode * * \param alloc allocator backend */ - Cpu_thread_allocator(Allocator * alloc) : _alloc(alloc) { } + Cpu_thread_allocator(Allocator &alloc) : _alloc(alloc) { } + /************************* ** Allocator interface ** *************************/ bool alloc(size_t size, void **out_addr) override { - return _alloc->alloc(size, out_addr); } + return _alloc.alloc(size, out_addr); } void free(void *addr, size_t size) override { - _alloc->free(addr, size); } + _alloc.free(addr, size); } - size_t consumed() const override - { - warning(__func__, "unexpectedly called"); - while (1) ; - return 0; - } + size_t consumed() const override { ASSERT_NEVER_CALLED; } - size_t overhead(size_t) const override - { - warning(__func__, "unexpectedly called"); - while (1) ; - return 0; - } + size_t overhead(size_t) const override { ASSERT_NEVER_CALLED; } bool need_size_for_free() const override { - return _alloc->need_size_for_free(); } + return _alloc.need_size_for_free(); } }; } diff --git a/repos/base-hw/src/core/irq_session_component.cc b/repos/base-hw/src/core/irq_session_component.cc index e8d15a0b7..333241ef7 100644 --- a/repos/base-hw/src/core/irq_session_component.cc +++ b/repos/base-hw/src/core/irq_session_component.cc @@ -62,14 +62,14 @@ Irq_session_component::~Irq_session_component() using namespace Kernel; User_irq * kirq = reinterpret_cast(&_kernel_object); - _irq_alloc->free((void *)(addr_t)_irq_number); + _irq_alloc.free((void *)(addr_t)_irq_number); if (_sig_cap.valid()) Kernel::delete_irq(kirq); } -Irq_session_component::Irq_session_component(Range_allocator * const irq_alloc, - const char * const args) +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, + const char * const args) : _irq_number(Platform::irq(_find_irq_number(args))), _irq_alloc(irq_alloc), _is_msi(false), _address(0), _value(0) @@ -85,7 +85,7 @@ Irq_session_component::Irq_session_component(Range_allocator * const irq_alloc, } /* allocate interrupt */ - if (_irq_alloc->alloc_addr(1, _irq_number).error()) { + if (_irq_alloc.alloc_addr(1, _irq_number).error()) { error("unavailable interrupt ", _irq_number, " requested"); throw Service_denied(); } diff --git a/repos/base-hw/src/core/irq_session_component.h b/repos/base-hw/src/core/irq_session_component.h index e21aa5ddb..911322e7d 100644 --- a/repos/base-hw/src/core/irq_session_component.h +++ b/repos/base-hw/src/core/irq_session_component.h @@ -31,14 +31,8 @@ class Genode::Irq_session_component : public Rpc_object, friend class List; - /* - * Noncopyable - */ - Irq_session_component(Irq_session_component const &); - Irq_session_component &operator = (Irq_session_component const &); - unsigned _irq_number; - Range_allocator *_irq_alloc; + Range_allocator &_irq_alloc; Genode::uint8_t _kernel_object[sizeof(Kernel::User_irq)]; bool _is_msi; addr_t _address, _value; @@ -55,7 +49,7 @@ class Genode::Irq_session_component : public Rpc_object, * \param irq_alloc platform-dependent IRQ allocator * \param args session construction arguments */ - Irq_session_component(Range_allocator *irq_alloc, + Irq_session_component(Range_allocator &irq_alloc, const char *args); /** diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc index 701cbdd11..e8c5babea 100644 --- a/repos/base-hw/src/core/kernel/cpu.cc +++ b/repos/base-hw/src/core/kernel/cpu.cc @@ -27,10 +27,7 @@ using namespace Kernel; -namespace Kernel -{ - Cpu_pool * cpu_pool() { return unmanaged_singleton(); } -} +Kernel::Cpu_pool &Kernel::cpu_pool() { return *unmanaged_singleton(); } /************* @@ -64,14 +61,14 @@ void Cpu_job::_activate_own_share() { _cpu->schedule(this); } void Cpu_job::_deactivate_own_share() { assert(_cpu->id() == Cpu::executing_id()); - _cpu->scheduler()->unready(this); + _cpu->scheduler().unready(this); } void Cpu_job::_yield() { assert(_cpu->id() == Cpu::executing_id()); - _cpu->scheduler()->yield(); + _cpu->scheduler().yield(); } @@ -79,7 +76,7 @@ void Cpu_job::_interrupt(unsigned const /* cpu_id */) { /* determine handling for specific interrupt */ unsigned irq_id; - if (pic()->take_request(irq_id)) + if (pic().take_request(irq_id)) /* is the interrupt a cpu-local one */ if (!_cpu->interrupt(irq_id)) { @@ -91,20 +88,20 @@ void Cpu_job::_interrupt(unsigned const /* cpu_id */) } /* end interrupt request at controller */ - pic()->finish_request(); + pic().finish_request(); } -void Cpu_job::affinity(Cpu * const cpu) +void Cpu_job::affinity(Cpu &cpu) { - _cpu = cpu; - _cpu->scheduler()->insert(this); + _cpu = &cpu; + _cpu->scheduler().insert(this); } void Cpu_job::quota(unsigned const q) { - if (_cpu) { _cpu->scheduler()->quota(this, q); } + if (_cpu) { _cpu->scheduler().quota(this, q); } else { Cpu_share::quota(q); } } @@ -117,7 +114,7 @@ Cpu_job::Cpu_job(Cpu_priority const p, unsigned const q) Cpu_job::~Cpu_job() { if (!_cpu) { return; } - _cpu->scheduler()->remove(this); + _cpu->scheduler().remove(this); } @@ -127,13 +124,13 @@ Cpu_job::~Cpu_job() extern "C" void idle_thread_main(void); -Cpu::Idle_thread::Idle_thread(Cpu * const cpu) +Cpu::Idle_thread::Idle_thread(Cpu &cpu) : Thread("idle") { regs->ip = (addr_t)&idle_thread_main; affinity(cpu); - Thread::_pd = core_pd(); + Thread::_pd = &core_pd(); } @@ -199,7 +196,7 @@ Cpu::Cpu(unsigned const id, Pic & pic, Inter_processor_work_list & global_work_list) : _id(id), _pic(pic), _timer(_id), - _scheduler(&_idle, _quota(), _fill()), _idle(this), + _scheduler(&_idle, _quota(), _fill()), _idle(*this), _ipi_irq(*this), _timer_irq(_timer.interrupt_id(), *this), _global_work_list(global_work_list) { _arch_init(); } diff --git a/repos/base-hw/src/core/kernel/cpu.h b/repos/base-hw/src/core/kernel/cpu.h index 274c40fbb..ca9f8267a 100644 --- a/repos/base-hw/src/core/kernel/cpu.h +++ b/repos/base-hw/src/core/kernel/cpu.h @@ -38,7 +38,7 @@ namespace Kernel /** * Return singleton of CPU pool */ - Cpu_pool * cpu_pool(); + Cpu_pool &cpu_pool(); } @@ -106,7 +106,7 @@ class Kernel::Cpu : public Genode::Cpu, private Irq::Pool, private Timeout /** * Construct idle context for CPU 'cpu' */ - Idle_thread(Cpu * const cpu); + Idle_thread(Cpu &cpu); }; @@ -175,7 +175,7 @@ class Kernel::Cpu : public Genode::Cpu, private Irq::Pool, private Timeout return *static_cast(_scheduler.head())->helping_sink(); } unsigned id() const { return _id; } - Cpu_scheduler * scheduler() { return &_scheduler; } + Cpu_scheduler &scheduler() { return _scheduler; } time_t us_to_ticks(time_t const us) const { return _timer.us_to_ticks(us); }; diff --git a/repos/base-hw/src/core/kernel/cpu_context.h b/repos/base-hw/src/core/kernel/cpu_context.h index 792a37569..20f9939c3 100644 --- a/repos/base-hw/src/core/kernel/cpu_context.h +++ b/repos/base-hw/src/core/kernel/cpu_context.h @@ -68,7 +68,7 @@ class Kernel::Cpu_job : private Cpu_share /** * Return wether we are allowed to help job 'j' with our CPU-share */ - bool _helping_possible(Cpu_job * const j) { return j->_cpu == _cpu; } + bool _helping_possible(Cpu_job const &j) const { return j._cpu == _cpu; } public: @@ -100,7 +100,7 @@ class Kernel::Cpu_job : private Cpu_share /** * Link job to CPU 'cpu' */ - void affinity(Cpu * const cpu); + void affinity(Cpu &cpu); /** * Set CPU quota of the job to 'q' @@ -124,7 +124,7 @@ class Kernel::Cpu_job : private Cpu_share ** Accessors ** ***************/ - void cpu(Cpu * const cpu) { _cpu = cpu; } + void cpu(Cpu &cpu) { _cpu = &cpu; } Cpu_share &share() { return *this; } }; diff --git a/repos/base-hw/src/core/kernel/cpu_mp.cc b/repos/base-hw/src/core/kernel/cpu_mp.cc index ced77609d..3fd3ed68e 100644 --- a/repos/base-hw/src/core/kernel/cpu_mp.cc +++ b/repos/base-hw/src/core/kernel/cpu_mp.cc @@ -41,7 +41,7 @@ void Cpu::trigger_ip_interrupt() /* check whether there is still an IPI send */ if (_ipi_irq.pending) return; - pic()->send_ipi(_id); + pic().send_ipi(_id); _ipi_irq.pending = true; } diff --git a/repos/base-hw/src/core/kernel/init.cc b/repos/base-hw/src/core/kernel/init.cc index 85a9f3a86..3f027e466 100644 --- a/repos/base-hw/src/core/kernel/init.cc +++ b/repos/base-hw/src/core/kernel/init.cc @@ -30,11 +30,11 @@ using namespace Kernel; static_assert(sizeof(Genode::sizet_arithm_t) >= 2 * sizeof(size_t), "Bad result type for size_t arithmetics."); -Pd * Kernel::core_pd() { - return &unmanaged_singleton()->kernel_pd(); } +Pd &Kernel::core_pd() { + return unmanaged_singleton()->kernel_pd(); } -Pic * Kernel::pic() { return unmanaged_singleton(); } +Pic &Kernel::pic() { return *unmanaged_singleton(); } extern "C" void kernel_init(); @@ -50,7 +50,7 @@ extern "C" void kernel_init() Lock::Guard guard(data_lock()); /* initialize current cpu */ - pool_ready = cpu_pool()->initialize(*pic()); + pool_ready = cpu_pool().initialize(pic()); }; /* wait until all cpus have initialized their corresponding cpu object */ diff --git a/repos/base-hw/src/core/kernel/ipc_node.cc b/repos/base-hw/src/core/kernel/ipc_node.cc index 925a22e3f..4b9c78511 100644 --- a/repos/base-hw/src/core/kernel/ipc_node.cc +++ b/repos/base-hw/src/core/kernel/ipc_node.cc @@ -28,35 +28,35 @@ using namespace Kernel; -static inline void free_obj_id_ref(Pd *pd, void *ptr) +static inline void free_obj_id_ref(Pd &pd, void *ptr) { - pd->platform_pd()->capability_slab().free(ptr, sizeof(Object_identity_reference)); + pd.platform_pd().capability_slab().free(ptr, sizeof(Object_identity_reference)); } -void Ipc_node::copy_msg(Ipc_node * const sender) +void Ipc_node::copy_msg(Ipc_node &sender) { using namespace Genode; using Reference = Object_identity_reference; /* copy payload and set destination capability id */ - *_utcb = *sender->_utcb; - _utcb->destination(sender->_capid); + *_utcb = *sender._utcb; + _utcb->destination(sender._capid); /* translate capabilities */ for (unsigned i = 0; i < _rcv_caps; i++) { - capid_t id = sender->_utcb->cap_get(i); + capid_t id = sender._utcb->cap_get(i); /* if there is no capability to send, just free the pre-allocation */ - if (i >= sender->_utcb->cap_cnt()) { + if (i >= sender._utcb->cap_cnt()) { free_obj_id_ref(pd(), _obj_id_ref_ptr[i]); continue; } /* lookup the capability id within the caller's cap space */ Reference *oir = (id == cap_id_invalid()) - ? nullptr : sender->pd()->cap_tree().find(id); + ? nullptr : sender.pd().cap_tree().find(id); /* if the caller's capability is invalid, free the pre-allocation */ if (!oir) { @@ -69,8 +69,8 @@ void Ipc_node::copy_msg(Ipc_node * const sender) Reference *dst_oir = oir->find(pd()); /* if it is not found, and the target is not core, create a reference */ - if (!dst_oir && (pd() != core_pd())) { - dst_oir = oir->factory(_obj_id_ref_ptr[i], *pd()); + if (!dst_oir && (&pd() != &core_pd())) { + dst_oir = oir->factory(_obj_id_ref_ptr[i], pd()); if (!dst_oir) free_obj_id_ref(pd(), _obj_id_ref_ptr[i]); } else /* otherwise free the pre-allocation */ @@ -84,15 +84,15 @@ void Ipc_node::copy_msg(Ipc_node * const sender) } -void Ipc_node::_receive_request(Ipc_node * const caller) +void Ipc_node::_receive_request(Ipc_node &caller) { copy_msg(caller); - _caller = caller; - _state = INACTIVE; + _caller = &caller; + _state = INACTIVE; } -void Ipc_node::_receive_reply(Ipc_node * callee) +void Ipc_node::_receive_reply(Ipc_node &callee) { copy_msg(callee); _state = INACTIVE; @@ -100,7 +100,7 @@ void Ipc_node::_receive_reply(Ipc_node * callee) } -void Ipc_node::_announce_request(Ipc_node * const node) +void Ipc_node::_announce_request(Ipc_node &node) { /* directly receive request if we've awaited it */ if (_state == AWAIT_REQUEST) { @@ -110,7 +110,7 @@ void Ipc_node::_announce_request(Ipc_node * const node) } /* cannot receive yet, so queue request */ - _request_queue.enqueue(node); + _request_queue.enqueue(&node); } @@ -125,7 +125,7 @@ void Ipc_node::_cancel_request_queue() void Ipc_node::_cancel_outbuf_request() { if (_callee) { - _callee->_announced_request_cancelled(this); + _callee->_announced_request_cancelled(*this); _callee = nullptr; } } @@ -140,10 +140,10 @@ void Ipc_node::_cancel_inbuf_request() } -void Ipc_node::_announced_request_cancelled(Ipc_node * const node) +void Ipc_node::_announced_request_cancelled(Ipc_node &node) { - if (_caller == node) _caller = nullptr; - else _request_queue.remove(node); + if (_caller == &node) _caller = nullptr; + else _request_queue.remove(&node); } @@ -160,36 +160,36 @@ void Ipc_node::_outbuf_request_cancelled() bool Ipc_node::_helps_outbuf_dst() { return (_state == AWAIT_REPLY) && _help; } -void Ipc_node::_init(Genode::Native_utcb * utcb, Ipc_node * starter) +void Ipc_node::_init(Genode::Native_utcb &utcb, Ipc_node &starter) { - _utcb = utcb; - _rcv_caps = starter->_utcb->cap_cnt(); - Genode::Allocator &slab = pd()->platform_pd()->capability_slab(); + _utcb = &utcb; + _rcv_caps = starter._utcb->cap_cnt(); + Genode::Allocator &slab = pd().platform_pd().capability_slab(); for (unsigned i = 0; i < _rcv_caps; i++) _obj_id_ref_ptr[i] = slab.alloc(sizeof(Object_identity_reference)); copy_msg(starter); } -void Ipc_node::send_request(Ipc_node * const callee, capid_t capid, bool help, +void Ipc_node::send_request(Ipc_node &callee, capid_t capid, bool help, unsigned rcv_caps) { if (_state != INACTIVE) { Genode::error("IPC send request: bad state"); return; } - Genode::Allocator &slab = pd()->platform_pd()->capability_slab(); + Genode::Allocator &slab = pd().platform_pd().capability_slab(); for (unsigned i = 0; i < rcv_caps; i++) _obj_id_ref_ptr[i] = slab.alloc(sizeof(Object_identity_reference)); _state = AWAIT_REPLY; - _callee = callee; + _callee = &callee; _capid = capid; _help = false; _rcv_caps = rcv_caps; /* announce request */ - _callee->_announce_request(this); + _callee->_announce_request(*this); _help = help; } @@ -205,7 +205,7 @@ bool Ipc_node::await_request(unsigned rcv_caps) Genode::error("IPC await request: bad state"); return true; } - Genode::Allocator &slab = pd()->platform_pd()->capability_slab(); + Genode::Allocator &slab = pd().platform_pd().capability_slab(); for (unsigned i = 0; i < rcv_caps; i++) _obj_id_ref_ptr[i] = slab.alloc(sizeof(Object_identity_reference)); @@ -213,7 +213,7 @@ bool Ipc_node::await_request(unsigned rcv_caps) /* if anybody already announced a request receive it */ if (!_request_queue.empty()) { - _receive_request(_request_queue.dequeue()); + _receive_request(*_request_queue.dequeue()); return true; } @@ -227,7 +227,7 @@ void Ipc_node::send_reply() { /* reply to the last request if we have to */ if (_state == INACTIVE && _caller) { - _caller->_receive_reply(this); + _caller->_receive_reply(*this); _caller = nullptr; } } diff --git a/repos/base-hw/src/core/kernel/ipc_node.h b/repos/base-hw/src/core/kernel/ipc_node.h index c52d5d446..38661663e 100644 --- a/repos/base-hw/src/core/kernel/ipc_node.h +++ b/repos/base-hw/src/core/kernel/ipc_node.h @@ -24,6 +24,7 @@ /* core includes */ #include #include +#include namespace Genode { class Msgbuf_base; }; @@ -50,7 +51,7 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element AWAIT_REQUEST = 3, }; - void _init(Genode::Native_utcb * utcb, Ipc_node * callee); + void _init(Genode::Native_utcb &utcb, Ipc_node &callee); private: @@ -70,22 +71,22 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element /* pre-allocation array for obkject identity references */ void * _obj_id_ref_ptr[Genode::Msgbuf_base::MAX_CAPS_PER_MSG]; - inline void copy_msg(Ipc_node * const sender); + inline void copy_msg(Ipc_node &sender); /** * Buffer next request from request queue in 'r' to handle it */ - void _receive_request(Ipc_node * const caller); + void _receive_request(Ipc_node &caller); /** * Receive a given reply if one is expected */ - void _receive_reply(Ipc_node * callee); + void _receive_reply(Ipc_node &callee); /** * Insert 'r' into request queue, buffer it if we were waiting for it */ - void _announce_request(Ipc_node * const node); + void _announce_request(Ipc_node &node); /** * Cancel all requests in request queue @@ -105,7 +106,7 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element /** * A request 'r' in inbuf or request queue was cancelled by sender */ - void _announced_request_cancelled(Ipc_node * const node); + void _announced_request_cancelled(Ipc_node &node); /** * The request in the outbuf was cancelled by receiver @@ -159,7 +160,7 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element * \param callee targeted IPC node * \param help wether the request implies a helping relationship */ - void send_request(Ipc_node * const callee, capid_t capid, bool help, + void send_request(Ipc_node &callee, capid_t capid, bool help, unsigned rcv_caps); /** @@ -202,8 +203,15 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element ** Accessors ** ***************/ - Pd *pd() const { return _pd; } - Genode::Native_utcb *utcb() { return _utcb; } + Pd &pd() const + { + if (_pd) + return *_pd; + + ASSERT_NEVER_CALLED; + } + + Genode::Native_utcb *utcb() { return _utcb; } }; #endif /* _CORE__KERNEL__IPC_NODE_H_ */ diff --git a/repos/base-hw/src/core/kernel/irq.cc b/repos/base-hw/src/core/kernel/irq.cc index 5e1a40538..19003018c 100644 --- a/repos/base-hw/src/core/kernel/irq.cc +++ b/repos/base-hw/src/core/kernel/irq.cc @@ -18,14 +18,14 @@ #include -void Kernel::Irq::disable() const { pic()->mask(_irq_nr); } +void Kernel::Irq::disable() const { pic().mask(_irq_nr); } -void Kernel::Irq::enable() const { pic()->unmask(_irq_nr, Cpu::executing_id()); } +void Kernel::Irq::enable() const { pic().unmask(_irq_nr, Cpu::executing_id()); } -Kernel::Irq::Pool * Kernel::User_irq::_pool() +Kernel::Irq::Pool &Kernel::User_irq::_pool() { static Irq::Pool p; - return &p; + return p; } diff --git a/repos/base-hw/src/core/kernel/irq.h b/repos/base-hw/src/core/kernel/irq.h index 5f1785172..d77e65a78 100644 --- a/repos/base-hw/src/core/kernel/irq.h +++ b/repos/base-hw/src/core/kernel/irq.h @@ -128,7 +128,7 @@ class Kernel::User_irq : public Kernel::Irq, public Kernel::Object /** * Get map that provides all user interrupts by their kernel names */ - static Irq::Pool * _pool(); + static Irq::Pool &_pool(); public: @@ -136,7 +136,7 @@ class Kernel::User_irq : public Kernel::Irq, public Kernel::Object * Construct object that signals interrupt 'irq' via signal 'context' */ User_irq(unsigned const irq, Signal_context &context) - : Irq(irq, *_pool()), _context(context) { disable(); } + : Irq(irq, _pool()), _context(context) { disable(); } /** * Destructor @@ -156,7 +156,7 @@ class Kernel::User_irq : public Kernel::Irq, public Kernel::Object * Handle occurence of interrupt 'irq' */ static User_irq * object(unsigned const irq) { - return dynamic_cast(_pool()->object(irq)); } + return dynamic_cast(_pool().object(irq)); } }; #endif /* _CORE__KERNEL__IRQ_H_ */ diff --git a/repos/base-hw/src/core/kernel/kernel.cc b/repos/base-hw/src/core/kernel/kernel.cc index 4f2d8b1cb..43b22012f 100644 --- a/repos/base-hw/src/core/kernel/kernel.cc +++ b/repos/base-hw/src/core/kernel/kernel.cc @@ -22,7 +22,7 @@ extern "C" void kernel() { using namespace Kernel; - Cpu & cpu = cpu_pool()->cpu(Cpu::executing_id()); + Cpu &cpu = cpu_pool().cpu(Cpu::executing_id()); Cpu_job * new_job; { diff --git a/repos/base-hw/src/core/kernel/kernel.h b/repos/base-hw/src/core/kernel/kernel.h index 56e30fe44..c32403e14 100644 --- a/repos/base-hw/src/core/kernel/kernel.h +++ b/repos/base-hw/src/core/kernel/kernel.h @@ -27,8 +27,8 @@ namespace Kernel { class Pd; - Pd * core_pd(); - Pic * pic(); + Pd &core_pd(); + Pic &pic(); } #endif /* _CORE__KERNEL__KERNEL_H_ */ diff --git a/repos/base-hw/src/core/kernel/object.cc b/repos/base-hw/src/core/kernel/object.cc index 9312961be..8e445cf32 100644 --- a/repos/base-hw/src/core/kernel/object.cc +++ b/repos/base-hw/src/core/kernel/object.cc @@ -46,13 +46,13 @@ Object_identity::~Object_identity() { invalidate(); } *******************************/ Object_identity_reference * -Object_identity_reference::find(Pd * pd) +Object_identity_reference::find(Pd &pd) { if (!_identity) return nullptr; for (Object_identity_reference * oir = _identity->first(); oir; oir = oir->next()) - if (pd == &(oir->_pd)) return oir; + if (&pd == &(oir->_pd)) return oir; return nullptr; } diff --git a/repos/base-hw/src/core/kernel/object.h b/repos/base-hw/src/core/kernel/object.h index fe5cc9645..3d4fbb71b 100644 --- a/repos/base-hw/src/core/kernel/object.h +++ b/repos/base-hw/src/core/kernel/object.h @@ -160,7 +160,7 @@ class Kernel::Object_identity_reference ** Lookup functions ** **********************/ - Object_identity_reference * find(Pd * pd); + Object_identity_reference * find(Pd &pd); Object_identity_reference * find(capid_t capid); }; @@ -189,7 +189,7 @@ class Kernel::Core_object_identity : public Object_identity, Core_object_identity(T & object) : Object_identity(object), - Object_identity_reference(this, *core_pd()) { } + Object_identity_reference(this, core_pd()) { } capid_t core_capid() { return capid(); } }; diff --git a/repos/base-hw/src/core/kernel/pd.h b/repos/base-hw/src/core/kernel/pd.h index af464b106..3ffd5f137 100644 --- a/repos/base-hw/src/core/kernel/pd.h +++ b/repos/base-hw/src/core/kernel/pd.h @@ -47,14 +47,8 @@ class Kernel::Pd : public Kernel::Object private: - /* - * Noncopyable - */ - Pd(Pd const &); - Pd &operator = (Pd const &); - - Hw::Page_table * const _table; - Genode::Platform_pd * const _platform_pd; + Hw::Page_table &_table; + Genode::Platform_pd &_platform_pd; Capid_allocator _capid_alloc { }; Object_identity_reference_tree _cap_tree { }; @@ -68,10 +62,10 @@ class Kernel::Pd : public Kernel::Object * \param table translation table of the PD * \param platform_pd core object of the PD */ - Pd(Hw::Page_table * const table, - Genode::Platform_pd * const platform_pd) + Pd(Hw::Page_table &table, + Genode::Platform_pd &platform_pd) : _table(table), _platform_pd(platform_pd), - mmu_regs((addr_t)table) + mmu_regs((addr_t)&table) { capid_t invalid = _capid_alloc.alloc(); assert(invalid == cap_id_invalid()); @@ -84,11 +78,11 @@ class Kernel::Pd : public Kernel::Object } static capid_t syscall_create(void * const dst, - Hw::Page_table * tt, - Genode::Platform_pd * const pd) + Hw::Page_table &tt, + Genode::Platform_pd &pd) { return call(call_id_new_pd(), (Call_arg)dst, - (Call_arg)tt, (Call_arg)pd); + (Call_arg)&tt, (Call_arg)&pd); } static void syscall_destroy(Pd * const pd) { @@ -105,10 +99,10 @@ class Kernel::Pd : public Kernel::Object ** Accessors ** ***************/ - Genode::Platform_pd * platform_pd() const { return _platform_pd; } - Hw::Page_table * translation_table() const { return _table; } - Capid_allocator & capid_alloc() { return _capid_alloc; } - Object_identity_reference_tree & cap_tree() { return _cap_tree; } + Genode::Platform_pd &platform_pd() { return _platform_pd; } + Hw::Page_table &translation_table() { return _table; } + Capid_allocator &capid_alloc() { return _capid_alloc; } + Object_identity_reference_tree &cap_tree() { return _cap_tree; } }; #endif /* _CORE__KERNEL__PD_H_ */ diff --git a/repos/base-hw/src/core/kernel/thread.cc b/repos/base-hw/src/core/kernel/thread.cc index 6a8ba8fb5..13c0b3e5d 100644 --- a/repos/base-hw/src/core/kernel/thread.cc +++ b/repos/base-hw/src/core/kernel/thread.cc @@ -41,7 +41,7 @@ using namespace Kernel; Thread::Pd_update::Pd_update(Thread & caller, Pd & pd, unsigned cnt) : caller(caller), pd(pd), cnt(cnt) { - cpu_pool()->work_list().insert(&_le); + cpu_pool().work_list().insert(&_le); caller._become_inactive(AWAITS_RESTART); } @@ -57,7 +57,7 @@ Thread::Destroy::Destroy(Thread & caller, Thread & to_delete) void Thread::Destroy::execute() { thread_to_destroy.~Thread(); - cpu_pool()->executing_cpu().work_list().remove(&_le); + cpu_pool().executing_cpu().work_list().remove(&_le); caller._restart(); } @@ -224,18 +224,18 @@ void Thread::_call_thread_quota() void Thread::_call_start_thread() { /* lookup CPU */ - Cpu & cpu = cpu_pool()->cpu(user_arg_2()); + Cpu & cpu = cpu_pool().cpu(user_arg_2()); user_arg_0(0); - Thread * const thread = (Thread*) user_arg_1(); + Thread &thread = *(Thread *)user_arg_1(); - assert(thread->_state == AWAITS_START); + assert(thread._state == AWAITS_START); - thread->affinity(&cpu); + thread.affinity(cpu); /* join protection domain */ - thread->_pd = (Pd *) user_arg_3(); - thread->Ipc_node::_init((Native_utcb *)user_arg_4(), this); - thread->_become_active(); + thread._pd = (Pd *) user_arg_3(); + thread.Ipc_node::_init(*(Native_utcb *)user_arg_4(), *this); + thread._become_active(); } @@ -268,17 +268,20 @@ void Thread::_call_stop_thread() void Thread::_call_restart_thread() { - if (!pd()) { - return; } + Thread *thread_ptr = pd().cap_tree().find(user_arg_1()); - Thread * const thread = pd()->cap_tree().find(user_arg_1()); - if (!thread || (!_core && (pd() != thread->pd()))) { + if (!thread_ptr) + return; + + Thread &thread = *thread_ptr; + + if (!_core && (&pd() != &thread.pd())) { warning(*this, ": failed to lookup thread ", (unsigned)user_arg_1(), " to restart it"); _die(); return; } - user_arg_0(thread->_restart()); + user_arg_0(thread._restart()); } @@ -386,7 +389,7 @@ void Thread::_call_timeout_max_us() void Thread::timeout_triggered() { Signal_context * const c = - pd()->cap_tree().find(_timeout_sigid); + pd().cap_tree().find(_timeout_sigid); if (!c || c->submit(1)) Genode::warning(*this, ": failed to submit timeout signal"); } @@ -394,7 +397,7 @@ void Thread::timeout_triggered() void Thread::_call_send_request_msg() { - Object_identity_reference * oir = pd()->cap_tree().find(user_arg_1()); + Object_identity_reference * oir = pd().cap_tree().find(user_arg_1()); Thread * const dst = (oir) ? oir->object() : nullptr; if (!dst) { Genode::warning(*this, ": cannot send to unknown recipient ", @@ -402,10 +405,10 @@ void Thread::_call_send_request_msg() _become_inactive(AWAITS_IPC); return; } - bool const help = Cpu_job::_helping_possible(dst); + bool const help = Cpu_job::_helping_possible(*dst); oir = oir->find(dst->pd()); - Ipc_node::send_request(dst, oir ? oir->capid() : cap_id_invalid(), + Ipc_node::send_request(*dst, oir ? oir->capid() : cap_id_invalid(), help, user_arg_2()); _state = AWAITS_IPC; if (!help || !dst->own_share_active()) { _deactivate_used_shares(); } @@ -424,8 +427,8 @@ void Thread::_call_send_reply_msg() void Thread::_call_pager() { /* override event route */ - Thread * const t = (Thread*) user_arg_1(); - t->_pager = pd()->cap_tree().find(user_arg_2()); + Thread &thread = *(Thread *)user_arg_1(); + thread._pager = pd().cap_tree().find(user_arg_2()); } @@ -441,7 +444,7 @@ void Thread::_call_await_signal() return; } /* lookup receiver */ - Signal_receiver * const r = pd()->cap_tree().find(user_arg_1()); + Signal_receiver * const r = pd().cap_tree().find(user_arg_1()); if (!r) { Genode::warning(*this, ": cannot await, unknown signal receiver ", (unsigned)user_arg_1()); @@ -460,15 +463,9 @@ void Thread::_call_await_signal() void Thread::_call_cancel_next_await_signal() { - /* kill the caller if he has no protection domain */ - if (!pd()) { - error(*this, ": PD not set"); - _die(); - return; - } /* kill the caller if the capability of the target thread is invalid */ - Thread * const thread = pd()->cap_tree().find(user_arg_1()); - if (!thread || pd() != thread->pd()) { + Thread * const thread = pd().cap_tree().find(user_arg_1()); + if (!thread || (&pd() != &thread->pd())) { error(*this, ": failed to lookup thread ", (unsigned)user_arg_1()); _die(); return; @@ -486,7 +483,7 @@ void Thread::_call_cancel_next_await_signal() void Thread::_call_submit_signal() { /* lookup signal context */ - Signal_context * const c = pd()->cap_tree().find(user_arg_1()); + Signal_context * const c = pd().cap_tree().find(user_arg_1()); if(!c) { Genode::warning(*this, ": cannot submit unknown signal context"); user_arg_0(-1); @@ -506,7 +503,7 @@ void Thread::_call_submit_signal() void Thread::_call_ack_signal() { /* lookup signal context */ - Signal_context * const c = pd()->cap_tree().find(user_arg_1()); + Signal_context * const c = pd().cap_tree().find(user_arg_1()); if (!c) { Genode::warning(*this, ": cannot ack unknown signal context"); return; @@ -520,7 +517,7 @@ void Thread::_call_ack_signal() void Thread::_call_kill_signal_context() { /* lookup signal context */ - Signal_context * const c = pd()->cap_tree().find(user_arg_1()); + Signal_context * const c = pd().cap_tree().find(user_arg_1()); if (!c) { Genode::warning(*this, ": cannot kill unknown signal context"); user_arg_0(-1); @@ -538,7 +535,7 @@ void Thread::_call_kill_signal_context() void Thread::_call_new_irq() { - Signal_context * const c = pd()->cap_tree().find(user_arg_3()); + Signal_context * const c = pd().cap_tree().find(user_arg_3()); if (!c) { Genode::warning(*this, ": invalid signal context for interrupt"); user_arg_0(-1); @@ -557,7 +554,7 @@ void Thread::_call_ack_irq() { void Thread::_call_new_obj() { /* lookup thread */ - Object_identity_reference * ref = pd()->cap_tree().find(user_arg_2()); + Object_identity_reference * ref = pd().cap_tree().find(user_arg_2()); Thread * thread = ref ? ref->object() : nullptr; if (!thread || (static_cast*>(thread)->capid() != ref->capid())) { @@ -583,19 +580,19 @@ void Thread::_call_delete_obj() void Thread::_call_ack_cap() { - Object_identity_reference * oir = pd()->cap_tree().find(user_arg_1()); + Object_identity_reference * oir = pd().cap_tree().find(user_arg_1()); if (oir) oir->remove_from_utcb(); } void Thread::_call_delete_cap() { - Object_identity_reference * oir = pd()->cap_tree().find(user_arg_1()); + Object_identity_reference * oir = pd().cap_tree().find(user_arg_1()); if (!oir) return; if (oir->in_utcb()) return; - destroy(pd()->platform_pd()->capability_slab(), oir); + destroy(pd().platform_pd().capability_slab(), oir); } @@ -604,7 +601,7 @@ void Kernel::Thread::_call_update_pd() Pd * const pd = (Pd *) user_arg_1(); unsigned cnt = 0; - cpu_pool()->for_each_cpu([&] (Cpu & cpu) { + cpu_pool().for_each_cpu([&] (Cpu & cpu) { /* if a cpu needs to update increase the counter */ if (pd->update(cpu)) cnt++; }); @@ -660,8 +657,8 @@ void Thread::_call() case call_id_thread_pager(): _call_pager(); return; case call_id_update_pd(): _call_update_pd(); return; case call_id_new_pd(): - _call_new((Hw::Page_table *) user_arg_2(), - (Genode::Platform_pd *) user_arg_3()); + _call_new(*(Hw::Page_table *) user_arg_2(), + *(Genode::Platform_pd *) user_arg_3()); return; case call_id_delete_pd(): _call_delete(); return; case call_id_new_signal_receiver(): _call_new(); return; @@ -717,7 +714,7 @@ Thread::Thread(unsigned const priority, unsigned const quota, void Thread::print(Genode::Output &out) const { - Genode::print(out, (_pd) ? _pd->platform_pd()->label() : "?"); + Genode::print(out, _pd ? _pd->platform_pd().label() : "?"); Genode::print(out, " -> "); Genode::print(out, label()); } @@ -751,9 +748,9 @@ Core_thread::Core_thread() regs->sp = (addr_t)&__initial_stack_base[0] + DEFAULT_STACK_SIZE; regs->ip = (addr_t)&_core_start; - affinity(&cpu_pool()->primary_cpu()); + affinity(cpu_pool().primary_cpu()); _utcb = utcb; - Thread::_pd = core_pd(); + Thread::_pd = &core_pd(); _become_active(); } diff --git a/repos/base-hw/src/core/kernel/vm_thread_on.cc b/repos/base-hw/src/core/kernel/vm_thread_on.cc index 69947e1e7..a35f815bc 100644 --- a/repos/base-hw/src/core/kernel/vm_thread_on.cc +++ b/repos/base-hw/src/core/kernel/vm_thread_on.cc @@ -18,7 +18,7 @@ void Kernel::Thread::_call_new_vm() { Signal_context * context = - pd()->cap_tree().find(user_arg_4()); + pd().cap_tree().find(user_arg_4()); if (!context) { user_arg_0(cap_id_invalid()); return; diff --git a/repos/base-hw/src/core/object.h b/repos/base-hw/src/core/object.h index 9cfada59f..7ca449ce2 100644 --- a/repos/base-hw/src/core/object.h +++ b/repos/base-hw/src/core/object.h @@ -65,6 +65,8 @@ class Genode::Kernel_object T * kernel_object() { return reinterpret_cast(_data); } + Untyped_capability cap() { return _cap; } + /** * Create the kernel object explicitely via this function */ diff --git a/repos/base-hw/src/core/pager.cc b/repos/base-hw/src/core/pager.cc index 41a91a910..43da9bdc7 100644 --- a/repos/base-hw/src/core/pager.cc +++ b/repos/base-hw/src/core/pager.cc @@ -69,7 +69,7 @@ void Pager_object::unresolved_page_fault_occurred() Platform_thread * const pt = (Platform_thread *)badge(); if (pt && pt->pd()) warning("page fault, pager_object: pd='", pt->pd()->label(), - "' thread='", pt->label(), "' ", pt->kernel_object()->fault()); + "' thread='", pt->label(), "' ", pt->fault_info()); } void Pager_object::print(Output &out) const @@ -94,12 +94,10 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, ** Pager_entrypoint ** **********************/ -void Pager_entrypoint::dissolve(Pager_object * const o) +void Pager_entrypoint::dissolve(Pager_object &o) { - if (o) { - Kernel::kill_signal_context(Capability_space::capid(o->cap())); - remove(o); - } + Kernel::kill_signal_context(Capability_space::capid(o.cap())); + remove(&o); } @@ -109,9 +107,9 @@ Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &) { start(); } -Pager_capability Pager_entrypoint::manage(Pager_object * const o) +Pager_capability Pager_entrypoint::manage(Pager_object &o) { - o->start_paging(kernel_object()); - insert(o); - return reinterpret_cap_cast(o->cap()); + o.start_paging(kernel_object()); + insert(&o); + return reinterpret_cap_cast(o.cap()); } diff --git a/repos/base-hw/src/core/pager.h b/repos/base-hw/src/core/pager.h index 2c4606191..2375e139a 100644 --- a/repos/base-hw/src/core/pager.h +++ b/repos/base-hw/src/core/pager.h @@ -208,12 +208,12 @@ class Genode::Pager_entrypoint : public Object_pool, /** * Associate pager object 'obj' with entry point */ - Pager_capability manage(Pager_object * const obj); + Pager_capability manage(Pager_object &obj); /** * Dissolve pager object 'obj' from entry point */ - void dissolve(Pager_object * const obj); + void dissolve(Pager_object &obj); /********************** diff --git a/repos/base-hw/src/core/platform.cc b/repos/base-hw/src/core/platform.cc index 42d6b7e44..526448e9c 100644 --- a/repos/base-hw/src/core/platform.cc +++ b/repos/base-hw/src/core/platform.cc @@ -97,27 +97,27 @@ addr_t Platform::_rom_module_phys(addr_t virt) Platform::Platform() : - _io_mem_alloc(core_mem_alloc()), - _io_port_alloc(core_mem_alloc()), - _irq_alloc(core_mem_alloc()) + _io_mem_alloc(&core_mem_alloc()), + _io_port_alloc(&core_mem_alloc()), + _irq_alloc(&core_mem_alloc()) { struct Kernel_resource : Exception { }; - _core_mem_alloc.virt_alloc()->add_range(Hw::Mm::core_heap().base, - Hw::Mm::core_heap().size); + _core_mem_alloc.virt_alloc().add_range(Hw::Mm::core_heap().base, + Hw::Mm::core_heap().size); _core_virt_regions().for_each([this] (Hw::Memory_region const & r) { - _core_mem_alloc.virt_alloc()->remove_range(r.base, r.size); }); + _core_mem_alloc.virt_alloc().remove_range(r.base, r.size); }); _boot_info().elf_mappings.for_each([this] (Hw::Mapping const & m) { - _core_mem_alloc.virt_alloc()->remove_range(m.virt(), m.size()); }); + _core_mem_alloc.virt_alloc().remove_range(m.virt(), m.size()); }); _boot_info().ram_regions.for_each([this] (Hw::Memory_region const & region) { - _core_mem_alloc.phys_alloc()->add_range(region.base, region.size); }); + _core_mem_alloc.phys_alloc().add_range(region.base, region.size); }); _init_io_port_alloc(); /* make all non-kernel interrupts available to the interrupt allocator */ for (unsigned i = 0; i < Kernel::Pic::NR_OF_IRQ; i++) { bool kernel_resource = false; - Kernel::cpu_pool()->for_each_cpu([&] (Kernel::Cpu const &cpu) { + Kernel::cpu_pool().for_each_cpu([&] (Kernel::Cpu const &cpu) { if (i == cpu.timer_interrupt_id()) { kernel_resource = true; } @@ -142,11 +142,11 @@ Platform::Platform() unsigned const pages = 1; size_t const log_size = pages << get_page_size_log2(); - ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); + ram_alloc().alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); addr_t const phys_addr = reinterpret_cast(phys_ptr); /* let one page free after the log buffer */ - region_alloc()->alloc_aligned(log_size, &core_local_ptr, get_page_size_log2()); + region_alloc().alloc_aligned(log_size, &core_local_ptr, get_page_size_log2()); addr_t const core_local_addr = reinterpret_cast(core_local_ptr); map_local(phys_addr, core_local_addr, pages); @@ -169,16 +169,16 @@ Platform::Platform() bool Genode::map_local(addr_t from_phys, addr_t to_virt, size_t num_pages, Page_flags flags) { - Platform_pd * pd = Kernel::core_pd()->platform_pd(); - return pd->insert_translation(to_virt, from_phys, - num_pages * get_page_size(), flags); + Platform_pd &pd = Kernel::core_pd().platform_pd(); + return pd.insert_translation(to_virt, from_phys, + num_pages * get_page_size(), flags); } bool Genode::unmap_local(addr_t virt_addr, size_t num_pages) { - Platform_pd * pd = Kernel::core_pd()->platform_pd(); - pd->flush(virt_addr, num_pages * get_page_size()); + Platform_pd &pd = Kernel::core_pd().platform_pd(); + pd.flush(virt_addr, num_pages * get_page_size()); return true; } diff --git a/repos/base-hw/src/core/platform.h b/repos/base-hw/src/core/platform.h index 2e0c52dbe..59119b64c 100644 --- a/repos/base-hw/src/core/platform.h +++ b/repos/base-hw/src/core/platform.h @@ -32,6 +32,7 @@ #include #include #include +#include namespace Genode { class Address_space; @@ -48,7 +49,7 @@ class Genode::Platform : public Genode::Platform_generic Phys_allocator _irq_alloc; /* IRQ allocator */ Rom_fs _rom_fs { }; /* ROM file system */ - static Hw::Boot_info const & _boot_info(); + static Hw::Boot_info const &_boot_info(); static Hw::Memory_region_array const & _core_virt_regions(); /** @@ -120,34 +121,23 @@ class Genode::Platform : public Genode::Platform_generic ** Platform_generic interface ** ********************************/ - Range_allocator * core_mem_alloc() { - return &_core_mem_alloc; } - - Range_allocator * ram_alloc() { - return _core_mem_alloc.phys_alloc(); } - - Range_allocator * region_alloc() { - return _core_mem_alloc.virt_alloc(); } - - Range_allocator * io_mem_alloc() { return &_io_mem_alloc; } - - Range_allocator * io_port_alloc() { return &_io_port_alloc; } - - Range_allocator * irq_alloc() { return &_irq_alloc; } - - addr_t vm_start() const { return Hw::Mm::user().base; } - - size_t vm_size() const { return Hw::Mm::user().size; } - - Rom_fs *rom_fs() { return &_rom_fs; } + Range_allocator &core_mem_alloc() override { return _core_mem_alloc; } + Range_allocator &ram_alloc() override { return _core_mem_alloc.phys_alloc(); } + Range_allocator ®ion_alloc() override { return _core_mem_alloc.virt_alloc(); } + Range_allocator &io_mem_alloc() override { return _io_mem_alloc; } + Range_allocator &io_port_alloc() override { return _io_port_alloc; } + Range_allocator &irq_alloc() override { return _irq_alloc; } + addr_t vm_start() const override { return Hw::Mm::user().base; } + size_t vm_size() const override { return Hw::Mm::user().size; } + Rom_fs &rom_fs() override { return _rom_fs; } inline void wait_for_exit() { while (1) { Kernel::stop_thread(); } }; - bool supports_direct_unmap() const { return 1; } - Address_space * core_pd() { return nullptr; } + bool supports_direct_unmap() const override { return true; } + Address_space &core_pd() { ASSERT_NEVER_CALLED; } - Affinity::Space affinity_space() const { + Affinity::Space affinity_space() const override { return Affinity::Space(_boot_info().cpus); } /* diff --git a/repos/base-hw/src/core/platform_pd.cc b/repos/base-hw/src/core/platform_pd.cc index cbabbf6aa..ebeb1c504 100644 --- a/repos/base-hw/src/core/platform_pd.cc +++ b/repos/base-hw/src/core/platform_pd.cc @@ -29,15 +29,15 @@ using Hw::Page_table; ** Hw::Address_space implementation ** **************************************/ -Core_mem_allocator * Hw::Address_space::_cma() { - return static_cast(platform()->core_mem_alloc()); } +Core_mem_allocator &Hw::Address_space::_cma() { + return static_cast(platform().core_mem_alloc()); } -void * Hw::Address_space::_table_alloc() +void *Hw::Address_space::_table_alloc() { - void * ret; - if (!_cma()->alloc_aligned(sizeof(Page_table), (void**)&ret, - Page_table::ALIGNM_LOG2).ok()) + void * ret = nullptr; + if (!_cma().alloc_aligned(sizeof(Page_table), (void**)&ret, + Page_table::ALIGNM_LOG2).ok()) throw Insufficient_ram_quota(); return ret; } @@ -53,7 +53,7 @@ bool Hw::Address_space::insert_translation(addr_t virt, addr_t phys, _tt.insert_translation(virt, phys, size, flags, _tt_alloc); return true; } catch(Hw::Out_of_tables &) { - flush(platform()->vm_start(), platform()->vm_size()); + flush(platform().vm_start(), platform().vm_size()); } } } catch(...) { @@ -86,16 +86,16 @@ Hw::Address_space::Address_space(Kernel::Pd & pd, Page_table & tt, Hw::Address_space::Address_space(Kernel::Pd & pd) : _tt(*construct_at(_table_alloc(), *((Page_table*)Hw::Mm::core_page_tables().base))), - _tt_phys((addr_t)_cma()->phys_addr(&_tt)), + _tt_phys((addr_t)_cma().phys_addr(&_tt)), _tt_array(new (_cma()) Array([this] (void * virt) { - return (addr_t)_cma()->phys_addr(virt);})), + return (addr_t)_cma().phys_addr(virt);})), _tt_alloc(_tt_array->alloc()), _kernel_pd(pd) { } Hw::Address_space::~Address_space() { - flush(platform()->vm_start(), platform()->vm_size()); + flush(platform().vm_start(), platform().vm_size()); destroy(_cma(), _tt_array); destroy(_cma(), &_tt); } @@ -121,18 +121,18 @@ void Cap_space::upgrade_slab(Allocator &alloc) ** Platform_pd implementation ** ********************************/ -bool Platform_pd::bind_thread(Platform_thread * t) +bool Platform_pd::bind_thread(Platform_thread &t) { /* is this the first and therefore main thread in this PD? */ bool main_thread = !_thread_associated; _thread_associated = true; - t->join_pd(this, main_thread, Address_space::weak_ptr()); + t.join_pd(this, main_thread, Address_space::weak_ptr()); return true; } -void Platform_pd::unbind_thread(Platform_thread *t) { - t->join_pd(nullptr, false, Address_space::weak_ptr()); } +void Platform_pd::unbind_thread(Platform_thread &t) { + t.join_pd(nullptr, false, Address_space::weak_ptr()); } void Platform_pd::assign_parent(Native_capability parent) @@ -144,15 +144,18 @@ void Platform_pd::assign_parent(Native_capability parent) Platform_pd::Platform_pd(Page_table & tt, Page_table::Allocator & alloc) -: Hw::Address_space(*kernel_object(), tt, alloc), - Kernel_object(false, (Page_table*)translation_table_phys(), this), - _label("core") { } +: + Hw::Address_space(*kernel_object(), tt, alloc), + Kernel_object(false, *(Page_table*)translation_table_phys(), *this), + _label("core") +{ } -Platform_pd::Platform_pd(Allocator *, char const *label) -: Hw::Address_space(*kernel_object()), - Kernel_object(true, (Page_table*)translation_table_phys(), this), - _label(label) +Platform_pd::Platform_pd(Allocator &, char const *label) +: + Hw::Address_space(*kernel_object()), + Kernel_object(true, *(Page_table*)translation_table_phys(), *this), + _label(label) { if (!_cap.valid()) { error("failed to create kernel object"); diff --git a/repos/base-hw/src/core/platform_pd.h b/repos/base-hw/src/core/platform_pd.h index 6df3b4b8e..1f6b5f638 100644 --- a/repos/base-hw/src/core/platform_pd.h +++ b/repos/base-hw/src/core/platform_pd.h @@ -76,11 +76,12 @@ class Hw::Address_space : public Genode::Address_space Table & _tt; /* table virt addr */ Genode::addr_t _tt_phys; /* table phys addr */ Array * _tt_array = nullptr; - Table::Allocator & _tt_alloc; /* table allocator */ + Table::Allocator & _tt_alloc; /* table allocator */ Kernel::Pd & _kernel_pd; - static inline Genode::Core_mem_allocator * _cma(); - static inline void * _table_alloc(); + static inline Genode::Core_mem_allocator &_cma(); + + static inline void *_table_alloc(); protected: @@ -193,7 +194,7 @@ class Genode::Platform_pd : public Hw::Address_space, * * \param label name of protection domain */ - Platform_pd(Allocator * md_alloc, char const *label); + Platform_pd(Allocator &md_alloc, char const *label); /** * Destructor @@ -204,14 +205,14 @@ class Genode::Platform_pd : public Hw::Address_space, using Cap_space::upgrade_slab; /** - * Bind thread 't' to protection domain + * Bind thread to protection domain */ - bool bind_thread(Platform_thread * t); + bool bind_thread(Platform_thread &); /** - * Unbind thread 't' from protection domain + * Unbind thread from protection domain */ - void unbind_thread(Platform_thread *t); + void unbind_thread(Platform_thread &); /** * Assign parent interface to protection domain diff --git a/repos/base-hw/src/core/platform_thread.cc b/repos/base-hw/src/core/platform_thread.cc index a577af507..ac74195ba 100644 --- a/repos/base-hw/src/core/platform_thread.cc +++ b/repos/base-hw/src/core/platform_thread.cc @@ -47,28 +47,27 @@ Platform_thread::~Platform_thread() } /* free UTCB */ - core_env()->ram_session()->free(_utcb); + core_env().ram_session()->free(_utcb); } void Platform_thread::quota(size_t const quota) { - Kernel::thread_quota(kernel_object(), quota); } + Kernel::thread_quota(_kobj.kernel_object(), quota); } -Platform_thread::Platform_thread(const char * const label, - Native_utcb * utcb) -: Kernel_object(true, _label), - _pd(Kernel::core_pd()->platform_pd()), - _pager(nullptr), - _utcb_core_addr(utcb), - _utcb_pd_addr(utcb), - _main_thread(false) +Platform_thread::Platform_thread(Label const &label, Native_utcb &utcb) +: + _label(label), + _pd(&Kernel::core_pd().platform_pd()), + _pager(nullptr), + _utcb_core_addr(&utcb), + _utcb_pd_addr(&utcb), + _main_thread(false), + _kobj(true, _label.string()) { - strncpy(_label, label, LABEL_MAX_LEN); - /* create UTCB for a core thread */ void *utcb_phys; - if (!platform()->ram_alloc()->alloc(sizeof(Native_utcb), &utcb_phys)) { + if (!platform().ram_alloc().alloc(sizeof(Native_utcb), &utcb_phys)) { error("failed to allocate UTCB"); throw Out_of_ram(); } @@ -77,27 +76,26 @@ Platform_thread::Platform_thread(const char * const label, } -Platform_thread::Platform_thread(size_t const quota, - const char * const label, - unsigned const virt_prio, - Affinity::Location location, - addr_t const utcb) -: Kernel_object(true, _priority(virt_prio), quota, _label), - _pd(nullptr), - _pager(nullptr), - _utcb_pd_addr((Native_utcb *)utcb), - _main_thread(false) +Platform_thread::Platform_thread(size_t const quota, + Label const &label, + unsigned const virt_prio, + Affinity::Location const location, + addr_t const utcb) +: + _label(label), + _pd(nullptr), + _pager(nullptr), + _utcb_pd_addr((Native_utcb *)utcb), + _main_thread(false), + _kobj(true, _priority(virt_prio), quota, _label.string()) { - strncpy(_label, label, LABEL_MAX_LEN); - try { - _utcb = core_env()->ram_session()->alloc(sizeof(Native_utcb), - CACHED); + _utcb = core_env().ram_session()->alloc(sizeof(Native_utcb), CACHED); } catch (...) { error("failed to allocate UTCB"); throw Out_of_ram(); } - _utcb_core_addr = (Native_utcb *)core_env()->rm_session()->attach(_utcb); + _utcb_core_addr = (Native_utcb *)core_env().rm_session()->attach(_utcb); affinity(location); } @@ -151,12 +149,12 @@ int Platform_thread::start(void * const ip, void * const sp) } return 0; }; - if (core_env()->entrypoint()->apply(_utcb, lambda)) return -1; + if (core_env().entrypoint().apply(_utcb, lambda)) return -1; } /* initialize thread registers */ - kernel_object()->regs->ip = reinterpret_cast(ip); - kernel_object()->regs->sp = reinterpret_cast(sp); + _kobj.kernel_object()->regs->ip = reinterpret_cast(ip); + _kobj.kernel_object()->regs->sp = reinterpret_cast(sp); /* start executing new thread */ if (!_pd) { @@ -167,49 +165,54 @@ int Platform_thread::start(void * const ip, void * const sp) unsigned const cpu = _location.valid() ? _location.xpos() : Cpu::primary_id(); - Native_utcb * utcb = Thread::myself()->utcb(); + Native_utcb &utcb = *Thread::myself()->utcb(); /* reset capability counter */ - utcb->cap_cnt(0); - utcb->cap_add(Capability_space::capid(_cap)); + utcb.cap_cnt(0); + utcb.cap_add(Capability_space::capid(_kobj.cap())); if (_main_thread) { - utcb->cap_add(Capability_space::capid(_pd->parent())); - utcb->cap_add(Capability_space::capid(_utcb)); + utcb.cap_add(Capability_space::capid(_pd->parent())); + utcb.cap_add(Capability_space::capid(_utcb)); } - Kernel::start_thread(kernel_object(), cpu, &_pd->kernel_pd(), + Kernel::start_thread(_kobj.kernel_object(), cpu, &_pd->kernel_pd(), _utcb_core_addr); return 0; } -void Platform_thread::pager(Pager_object * const pager) +void Platform_thread::pager(Pager_object &pager) { using namespace Kernel; - thread_pager(kernel_object(), pager ? Capability_space::capid(pager->cap()) - : cap_id_invalid()); - _pager = pager; + thread_pager(_kobj.kernel_object(), Capability_space::capid(pager.cap())); + _pager = &pager; } -Genode::Pager_object * Platform_thread::pager() { return _pager; } +Genode::Pager_object &Platform_thread::pager() +{ + if (_pager) + return *_pager; + + ASSERT_NEVER_CALLED; +} Thread_state Platform_thread::state() { - Thread_state_base bstate(*kernel_object()->regs); + Thread_state_base bstate(*_kobj.kernel_object()->regs); return Thread_state(bstate); } void Platform_thread::state(Thread_state thread_state) { - Cpu_state * cstate = static_cast(&*kernel_object()->regs); + Cpu_state * cstate = static_cast(&*_kobj.kernel_object()->regs); *cstate = static_cast(thread_state); } void Platform_thread::restart() { - Kernel::restart_thread(Capability_space::capid(_cap)); + Kernel::restart_thread(Capability_space::capid(_kobj.cap())); } diff --git a/repos/base-hw/src/core/platform_thread.h b/repos/base-hw/src/core/platform_thread.h index f75361603..a6f296893 100644 --- a/repos/base-hw/src/core/platform_thread.h +++ b/repos/base-hw/src/core/platform_thread.h @@ -41,7 +41,7 @@ namespace Genode { /** * Userland interface for the management of kernel thread-objects */ - class Platform_thread : public Kernel_object + class Platform_thread : Noncopyable { /* * Noncopyable @@ -49,15 +49,15 @@ namespace Genode { Platform_thread(Platform_thread const &); Platform_thread &operator = (Platform_thread const &); - enum { LABEL_MAX_LEN = 32 }; + typedef String<32> Label; + Label const _label; Platform_pd * _pd; Weak_ptr _address_space { }; Pager_object * _pager; Native_utcb * _utcb_core_addr { }; /* UTCB addr in core */ Native_utcb * _utcb_pd_addr; /* UTCB addr in pd */ Ram_dataspace_capability _utcb { }; /* UTCB dataspace */ - char _label[LABEL_MAX_LEN]; /* * Wether this thread is the main thread of a program. @@ -71,6 +71,8 @@ namespace Genode { Affinity::Location _location { }; + Kernel_object _kobj; + /** * Common construction part */ @@ -95,7 +97,7 @@ namespace Genode { * \param label debugging label * \param utcb virtual address of UTCB within core */ - Platform_thread(const char * const label, Native_utcb * utcb); + Platform_thread(Label const &label, Native_utcb &utcb); /** * Constructor for threads outside of core @@ -105,7 +107,7 @@ namespace Genode { * \param virt_prio unscaled processor-scheduling priority * \param utcb core local pointer to userland stack */ - Platform_thread(size_t const quota, const char * const label, + Platform_thread(size_t const quota, Label const &label, unsigned const virt_prio, Affinity::Location, addr_t const utcb); @@ -114,6 +116,11 @@ namespace Genode { */ ~Platform_thread(); + /** + * Return information about current fault + */ + Kernel::Thread_fault fault_info() { return _kobj.kernel_object()->fault(); } + /** * Join a protection domain * @@ -124,7 +131,7 @@ namespace Genode { * This function has no effect when called more twice for a * given thread. */ - void join_pd(Platform_pd * const pd, bool const main_thread, + void join_pd(Platform_pd *const pd, bool const main_thread, Weak_ptr address_space); /** @@ -140,7 +147,7 @@ namespace Genode { /** * Pause this thread */ - void pause() { Kernel::pause_thread(kernel_object()); } + void pause() { Kernel::pause_thread(_kobj.kernel_object()); } /** * Enable/disable single stepping @@ -150,13 +157,13 @@ namespace Genode { /** * Resume this thread */ - void resume() { Kernel::resume_thread(kernel_object()); } + void resume() { Kernel::resume_thread(_kobj.kernel_object()); } /** * Cancel currently blocking operation */ void cancel_blocking() { - Kernel::cancel_thread_blocking(kernel_object()); } + Kernel::cancel_thread_blocking(_kobj.kernel_object()); } /** * Set CPU quota of the thread to 'quota' @@ -205,11 +212,11 @@ namespace Genode { ** Accessors ** ***************/ - char const * label() const { return _label; }; + Label label() const { return _label; }; - void pager(Pager_object * const pager); + void pager(Pager_object &pager); - Pager_object * pager(); + Pager_object &pager(); Platform_pd * pd() const { return _pd; } diff --git a/repos/base-hw/src/core/ram_dataspace_support.cc b/repos/base-hw/src/core/ram_dataspace_support.cc index 8f2b5653e..cabb03b98 100644 --- a/repos/base-hw/src/core/ram_dataspace_support.cc +++ b/repos/base-hw/src/core/ram_dataspace_support.cc @@ -3,9 +3,6 @@ * \author Martin Stein * \author Stefan Kalkowski * \date 2012-02-12 - * - * TODO: this file is almost identical to - * base-okl4/src/core/ram_dataspace_support.cc, we should merge them */ /* @@ -25,16 +22,16 @@ using namespace Genode; -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *) { } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &) { } +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } -void Ram_dataspace_factory::_clear_ds (Dataspace_component * ds) +void Ram_dataspace_factory::_clear_ds (Dataspace_component &ds) { - size_t page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + size_t page_rounded_size = (ds.size() + get_page_size() - 1) & get_page_mask(); /* allocate range in core's virtual address space */ void *virt_addr; - if (!platform()->region_alloc()->alloc(page_rounded_size, &virt_addr)) { + if (!platform().region_alloc().alloc(page_rounded_size, &virt_addr)) { error("could not allocate virtual address range in core of size ", page_rounded_size); return; @@ -42,7 +39,7 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component * ds) /* map the dataspace's physical pages to corresponding virtual addresses */ size_t num_pages = page_rounded_size >> get_page_size_log2(); - if (!map_local(ds->phys_addr(), (addr_t)virt_addr, num_pages)) { + if (!map_local(ds.phys_addr(), (addr_t)virt_addr, num_pages)) { error("core-local memory mapping failed"); return; } @@ -51,7 +48,7 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component * ds) memset(virt_addr, 0, page_rounded_size); /* uncached dataspaces need to be flushed from the data cache */ - if (ds->cacheability() != CACHED) + if (ds.cacheability() != CACHED) Kernel::update_data_region((addr_t)virt_addr, page_rounded_size); /* invalidate the dataspace memory from instruction cache */ @@ -62,6 +59,6 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component * ds) error("could not unmap core-local address range at ", virt_addr); /* free core's virtual address space */ - platform()->region_alloc()->free(virt_addr, page_rounded_size); + platform().region_alloc().free(virt_addr, page_rounded_size); } diff --git a/repos/base-hw/src/core/region_map_support.cc b/repos/base-hw/src/core/region_map_support.cc index aa840e127..d14c5058b 100644 --- a/repos/base-hw/src/core/region_map_support.cc +++ b/repos/base-hw/src/core/region_map_support.cc @@ -50,7 +50,7 @@ void Pager_entrypoint::entry() continue; } - _fault = pt->kernel_object()->fault(); + _fault = pt->fault_info(); /* try to resolve fault directly via local region managers */ if (po->pager(*this)) continue; diff --git a/repos/base-hw/src/core/spec/arm/kernel/thread.cc b/repos/base-hw/src/core/spec/arm/kernel/thread.cc index 8473cc5f5..79126e9b3 100644 --- a/repos/base-hw/src/core/spec/arm/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/arm/kernel/thread.cc @@ -54,7 +54,7 @@ void Thread::exception(Cpu & cpu) void Kernel::Thread::_call_update_data_region() { - Cpu & cpu = cpu_pool()->cpu(Cpu::executing_id()); + Cpu &cpu = cpu_pool().cpu(Cpu::executing_id()); /* * FIXME: If the caller is not a core thread, the kernel operates in a @@ -78,7 +78,7 @@ void Kernel::Thread::_call_update_data_region() void Kernel::Thread::_call_update_instr_region() { - Cpu & cpu = cpu_pool()->cpu(Cpu::executing_id()); + Cpu &cpu = cpu_pool().cpu(Cpu::executing_id()); /* * FIXME: If the caller is not a core thread, the kernel operates in a @@ -112,7 +112,7 @@ void Kernel::Thread::Pd_update::execute() { }; void Thread::proceed(Cpu & cpu) { - cpu.switch_to(*regs, pd()->mmu_regs); + cpu.switch_to(*regs, pd().mmu_regs); regs->cpu_exception = cpu.stack_start(); kernel_to_user_context_switch((static_cast(&*regs)), diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc index 7edc55ba9..78469c77e 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc @@ -22,10 +22,13 @@ using namespace Kernel; Kernel::Vm::Vm(void * const state, Kernel::Signal_context * const context, void * const /* table */) -: Cpu_job(Cpu_priority::MIN, 0), - _state((Genode::Vm_state * const)state), - _context(context), _table(0) { - affinity(&cpu_pool()->primary_cpu()); } +: + Cpu_job(Cpu_priority::MIN, 0), + _state((Genode::Vm_state * const)state), + _context(context), _table(0) +{ + affinity(cpu_pool().primary_cpu()); +} Kernel::Vm::~Vm() {} @@ -58,10 +61,10 @@ void Vm::proceed(Cpu & cpu) { unsigned const irq = _state->irq_injection; if (irq) { - if (pic()->secure(irq)) { + if (pic().secure(irq)) { Genode::warning("Refuse to inject secure IRQ into VM"); } else { - pic()->trigger(irq); + pic().trigger(irq); _state->irq_injection = 0; } } diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc index a0bd6f7c0..ae99993f7 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc @@ -34,7 +34,7 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint *ds_ep, : _ds_ep(ds_ep), _ds(_ds_size(), _alloc_ds(ram_quota), UNCACHED, true, 0), _ds_cap(static_cap_cast(_ds_ep->manage(&_ds))) { - _ds.assign_core_local_addr(core_env()->rm_session()->attach(_ds_cap)); + _ds.assign_core_local_addr(core_env().rm_session()->attach(_ds_cap)); } @@ -44,6 +44,6 @@ Vm_session_component::~Vm_session_component() _ds_ep->dissolve(&_ds); /* free region in allocator */ - core_env()->rm_session()->detach(_ds.core_local_addr()); - platform()->ram_alloc()->free((void*)_ds.phys_addr()); + core_env().rm_session()->detach(_ds.core_local_addr()); + platform().ram_alloc().free((void*)_ds.phys_addr()); } diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.h b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.h index 45bba287d..4571f629b 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.h +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.h @@ -58,6 +58,8 @@ class Genode::Vm_session_component : public Genode::Rpc_object::cap; + /************************** ** Vm session interface ** diff --git a/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc index 770fc17a7..7c26ea262 100644 --- a/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc @@ -58,7 +58,7 @@ struct Kernel::Vm_irq : Kernel::Irq { Vm_irq(unsigned const irq) : - Kernel::Irq(irq, cpu_pool()->executing_cpu().irq_pool()) + Kernel::Irq(irq, cpu_pool().executing_cpu().irq_pool()) { } /** @@ -66,7 +66,7 @@ struct Kernel::Vm_irq : Kernel::Irq */ void occurred() { - Cpu_job & job = cpu_pool()->executing_cpu().scheduled_job(); + Cpu_job & job = cpu_pool().executing_cpu().scheduled_job(); Vm *vm = dynamic_cast(&job); if (!vm) Genode::error("VM timer interrupt while VM is not runnning!"); @@ -213,7 +213,7 @@ Kernel::Vm::Vm(void * const state, _context(context), _table(table) { - affinity(&cpu_pool()->primary_cpu()); + affinity(cpu_pool().primary_cpu()); Virtual_pic::pic().irq.enable(); vt_host_context.sp = _cpu->stack_start(); diff --git a/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.cc b/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.cc index 48d849760..fff0631e6 100644 --- a/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.cc @@ -22,14 +22,14 @@ using namespace Genode; -static Core_mem_allocator * cma() { - return static_cast(platform()->core_mem_alloc()); } +static Core_mem_allocator & cma() { + return static_cast(platform().core_mem_alloc()); } void Vm_session_component::exception_handler(Signal_context_capability handler) { if (!create((void*)_ds.core_local_addr(), Capability_space::capid(handler), - cma()->phys_addr(&_table))) + cma().phys_addr(&_table))) Genode::warning("Cannot instantiate vm kernel object, invalid signal context?"); } @@ -84,8 +84,8 @@ void * Vm_session_component::_alloc_table() { void * table; /* get some aligned space for the translation table */ - if (!cma()->alloc_aligned(sizeof(Table), (void**)&table, - Table::ALIGNM_LOG2).ok()) { + if (!cma().alloc_aligned(sizeof(Table), (void**)&table, + Table::ALIGNM_LOG2).ok()) { error("failed to allocate kernel object"); throw Insufficient_ram_quota(); } @@ -99,9 +99,9 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint *ds_ep, _ds_cap(static_cap_cast(_ds_ep->manage(&_ds))), _table(*construct_at(_alloc_table())), _table_array(*(new (cma()) Array([this] (void * virt) { - return (addr_t)cma()->phys_addr(virt);}))) + return (addr_t)cma().phys_addr(virt);}))) { - _ds.assign_core_local_addr(core_env()->rm_session()->attach(_ds_cap)); + _ds.assign_core_local_addr(core_env().rm_session()->attach(_ds_cap)); } @@ -111,10 +111,10 @@ Vm_session_component::~Vm_session_component() _ds_ep->dissolve(&_ds); /* free region in allocator */ - core_env()->rm_session()->detach(_ds.core_local_addr()); - platform()->ram_alloc()->free((void*)_ds.phys_addr()); + core_env().rm_session()->detach(_ds.core_local_addr()); + platform().ram_alloc().free((void*)_ds.phys_addr()); /* free guest-to-host page tables */ - destroy(platform()->core_mem_alloc(), &_table); - destroy(platform()->core_mem_alloc(), &_table_array); + destroy(platform().core_mem_alloc(), &_table); + destroy(platform().core_mem_alloc(), &_table_array); } diff --git a/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.h b/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.h index b7ed552c6..c99a16882 100644 --- a/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.h +++ b/repos/base-hw/src/core/spec/arm_v7/virtualization/vm_session_component.h @@ -67,6 +67,8 @@ class Genode::Vm_session_component : public Genode::Rpc_object::cap; + /************************** ** Vm session interface ** diff --git a/repos/base-hw/src/core/spec/arm_v7/vm_session_component.cc b/repos/base-hw/src/core/spec/arm_v7/vm_session_component.cc index a1564c42a..0ce25f3f4 100644 --- a/repos/base-hw/src/core/spec/arm_v7/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm_v7/vm_session_component.cc @@ -22,8 +22,8 @@ addr_t Vm_session_component::_alloc_ds(size_t &ram_quota) { addr_t addr; if (_ds_size() > ram_quota || - platform()->ram_alloc()->alloc_aligned(_ds_size(), (void**)&addr, - get_page_size_log2()).error()) + platform().ram_alloc().alloc_aligned(_ds_size(), (void**)&addr, + get_page_size_log2()).error()) throw Insufficient_ram_quota(); ram_quota -= _ds_size(); return addr; diff --git a/repos/base-hw/src/core/spec/arndale/platform_services.cc b/repos/base-hw/src/core/spec/arndale/platform_services.cc index be4120a84..b34ad48bf 100644 --- a/repos/base-hw/src/core/spec/arndale/platform_services.cc +++ b/repos/base-hw/src/core/spec/arndale/platform_services.cc @@ -28,9 +28,9 @@ extern Genode::addr_t hypervisor_exception_vector; /* * Add ARM virtualization specific vm service */ -void Genode::platform_add_local_services(Rpc_entrypoint *ep, - Sliced_heap *sh, - Registry *services) +void Genode::platform_add_local_services(Rpc_entrypoint &ep, + Sliced_heap &sh, + Registry &services) { using namespace Genode; @@ -39,5 +39,5 @@ void Genode::platform_add_local_services(Rpc_entrypoint *ep, Hw::PAGE_FLAGS_KERN_TEXT); static Vm_root vm_root(ep, sh); - static Core_service vm_service(*services, vm_root); + static Core_service vm_service(services, vm_root); } diff --git a/repos/base-hw/src/core/spec/imx53/trustzone/platform_services.cc b/repos/base-hw/src/core/spec/imx53/trustzone/platform_services.cc index c53353ede..19e0ddf98 100644 --- a/repos/base-hw/src/core/spec/imx53/trustzone/platform_services.cc +++ b/repos/base-hw/src/core/spec/imx53/trustzone/platform_services.cc @@ -27,14 +27,14 @@ extern int monitor_mode_exception_vector; /* * Add TrustZone specific vm service */ -void Genode::platform_add_local_services(Rpc_entrypoint *ep, - Sliced_heap *sliced_heap, - Registry *local_services) +void Genode::platform_add_local_services(Rpc_entrypoint &ep, + Sliced_heap &sliced_heap, + Registry &local_services) { static addr_t const phys_base = Platform::core_phys_addr((addr_t)&monitor_mode_exception_vector); map_local(phys_base, Hw::Mm::system_exception_vector().base, 1, Hw::PAGE_FLAGS_KERN_TEXT); static Vm_root vm_root(ep, sliced_heap); - static Core_service vm_service(*local_services, vm_root); + static Core_service vm_service(local_services, vm_root); } diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc index 91b1bef8b..f0d701fbf 100644 --- a/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc @@ -25,7 +25,7 @@ void Kernel::Thread::Pd_update::execute() /* if this is the last cpu, wake up the caller thread */ if (--cnt == 0) { - cpu_pool()->work_list().remove(&_le); + cpu_pool().work_list().remove(&_le); caller._restart(); } }; @@ -39,7 +39,7 @@ void Kernel::Thread::_call_update_instr_region() { } void Kernel::Thread::proceed(Cpu & cpu) { - cpu.switch_to(*regs, pd()->mmu_regs); + cpu.switch_to(*regs, pd().mmu_regs); asm volatile("mov %0, %%rsp \n" "popq %%r8 \n" diff --git a/repos/base-hw/src/core/spec/x86_64/muen/kernel/thread_exception.cc b/repos/base-hw/src/core/spec/x86_64/muen/kernel/thread_exception.cc index 0843217c5..729fe98e8 100644 --- a/repos/base-hw/src/core/spec/x86_64/muen/kernel/thread_exception.cc +++ b/repos/base-hw/src/core/spec/x86_64/muen/kernel/thread_exception.cc @@ -40,7 +40,7 @@ void Thread::exception(Cpu & cpu) } if (regs->trapno >= Cpu::Context::INTERRUPTS_START && regs->trapno <= Cpu::Context::INTERRUPTS_END) { - pic()->irq_occurred(regs->trapno); + pic().irq_occurred(regs->trapno); _interrupt(cpu.id()); return; } diff --git a/repos/base-hw/src/core/spec/x86_64/muen/kernel/vm.cc b/repos/base-hw/src/core/spec/x86_64/muen/kernel/vm.cc index 99ab0ceba..959601ad5 100644 --- a/repos/base-hw/src/core/spec/x86_64/muen/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/x86_64/muen/kernel/vm.cc @@ -27,7 +27,7 @@ Kernel::Vm::Vm(void * const state, Kernel::Signal_context * const context, _context(context), _table(nullptr) { - affinity(&cpu_pool()->primary_cpu()); + affinity(cpu_pool().primary_cpu()); } @@ -44,7 +44,7 @@ void Kernel::Vm::exception(Cpu & cpu) if (_state->trapno >= Genode::Cpu_state::INTERRUPTS_START && _state->trapno <= Genode::Cpu_state::INTERRUPTS_END) { - pic()->irq_occurred(_state->trapno); + pic().irq_occurred(_state->trapno); _interrupt(cpu.id()); _context->submit(1); return; diff --git a/repos/base-hw/src/core/spec/x86_64/muen/platform_services.cc b/repos/base-hw/src/core/spec/x86_64/muen/platform_services.cc index fce2a96a5..49c54d198 100644 --- a/repos/base-hw/src/core/spec/x86_64/muen/platform_services.cc +++ b/repos/base-hw/src/core/spec/x86_64/muen/platform_services.cc @@ -24,15 +24,15 @@ /* * Add I/O port service and virtualization specific vm service */ -void Genode::platform_add_local_services(Rpc_entrypoint *ep, - Sliced_heap *sh, - Registry *services) +void Genode::platform_add_local_services(Rpc_entrypoint &ep, + Sliced_heap &sliced_heap, + Registry &services) { - static Vm_root vm_root(ep, sh); - static Core_service vm_ls(*services, vm_root); + static Vm_root vm_root(ep, sliced_heap); + static Core_service vm_ls(services, vm_root); - static Io_port_root io_port_root(core_env()->pd_session(), - platform()->io_port_alloc(), sh); - static Core_service io_port_ls(*services, + static Io_port_root io_port_root(*core_env().pd_session(), + platform().io_port_alloc(), sliced_heap); + static Core_service io_port_ls(services, io_port_root); } diff --git a/repos/base-hw/src/core/spec/x86_64/muen/vm_session_component.h b/repos/base-hw/src/core/spec/x86_64/muen/vm_session_component.h index 08609c51a..938046c61 100644 --- a/repos/base-hw/src/core/spec/x86_64/muen/vm_session_component.h +++ b/repos/base-hw/src/core/spec/x86_64/muen/vm_session_component.h @@ -42,6 +42,8 @@ class Genode::Vm_session_component Vm_session_component(Rpc_entrypoint*, size_t) : _state() { } ~Vm_session_component() { } + using Genode::Rpc_object::cap; + /************************** ** Vm session interface ** diff --git a/repos/base-hw/src/core/spec/x86_64/platform_support.cc b/repos/base-hw/src/core/spec/x86_64/platform_support.cc index cb6f4cdd6..a92e4d45c 100644 --- a/repos/base-hw/src/core/spec/x86_64/platform_support.cc +++ b/repos/base-hw/src/core/spec/x86_64/platform_support.cc @@ -31,14 +31,14 @@ void Platform::_init_additional() void *virt_ptr = nullptr; const char *rom_name = "platform_info"; - if (!ram_alloc()->alloc(get_page_size(), &phys_ptr)) { + if (!ram_alloc().alloc(get_page_size(), &phys_ptr)) { error("could not setup platform_info ROM - ram allocation error"); return; } - if (!region_alloc()->alloc(rom_size, &virt_ptr)) { + if (!region_alloc().alloc(rom_size, &virt_ptr)) { error("could not setup platform_info ROM - region allocation error"); - ram_alloc()->free(phys_ptr); + ram_alloc().free(phys_ptr); return; } @@ -47,8 +47,8 @@ void Platform::_init_additional() if (!map_local(phys_addr, virt_addr, pages, Hw::PAGE_FLAGS_KERN_DATA)) { error("could not setup platform_info ROM - map error"); - region_alloc()->free(virt_ptr); - ram_alloc()->free(phys_ptr); + region_alloc().free(virt_ptr); + ram_alloc().free(phys_ptr); return; } @@ -93,7 +93,7 @@ void Platform::_init_additional() return; } - region_alloc()->free(virt_ptr); + region_alloc().free(virt_ptr); _rom_fs.insert( new (core_mem_alloc()) Rom_module(phys_addr, rom_size, rom_name)); @@ -102,7 +102,7 @@ void Platform::_init_additional() void Platform::setup_irq_mode(unsigned irq_number, unsigned trigger, unsigned polarity) { - Kernel::pic()->ioapic.setup_irq_mode(irq_number, trigger, polarity); } + Kernel::pic().ioapic.setup_irq_mode(irq_number, trigger, polarity); } bool Platform::get_msi_params(addr_t, addr_t &, addr_t &, unsigned &) { diff --git a/repos/base-hw/src/core/thread_start.cc b/repos/base-hw/src/core/thread_start.cc index 16926918e..8f2f981d4 100644 --- a/repos/base-hw/src/core/thread_start.cc +++ b/repos/base-hw/src/core/thread_start.cc @@ -51,15 +51,15 @@ void Thread::cancel_blocking() void Thread::_deinit_platform_thread() { /* destruct platform thread */ - destroy(platform()->core_mem_alloc(), native_thread().platform_thread); + destroy(platform().core_mem_alloc(), native_thread().platform_thread); } void Thread::_init_platform_thread(size_t, Type type) { if (type == NORMAL) { - native_thread().platform_thread = new (platform()->core_mem_alloc()) - Platform_thread(_stack->name().string(), &_stack->utcb()); + native_thread().platform_thread = new (platform().core_mem_alloc()) + Platform_thread(_stack->name(), _stack->utcb()); return; } diff --git a/repos/base-linux/src/core/include/dataspace_component.h b/repos/base-linux/src/core/include/dataspace_component.h index 0f01bc001..524c440f2 100644 --- a/repos/base-linux/src/core/include/dataspace_component.h +++ b/repos/base-linux/src/core/include/dataspace_component.h @@ -38,15 +38,15 @@ namespace Genode { { private: - Filename _fname { }; /* filename for mmap */ - size_t _size { 0 }; /* size of dataspace in bytes */ - addr_t _addr { 0 }; /* meaningless on linux */ - int _fd { -1 }; /* file descriptor */ - bool _writable { false }; /* false if read-only */ + Filename _fname { }; /* filename for mmap */ + size_t const _size; /* size of dataspace in bytes */ + addr_t const _addr; /* meaningless on linux */ + int _fd { -1 }; /* file descriptor */ + bool const _writable; /* false if read-only */ /* Holds the dataspace owner if a distinction between owner and * others is necessary on the dataspace, otherwise it is 0 */ - Dataspace_owner * _owner; + Dataspace_owner const * const _owner; static Filename _file_name(const char *args); size_t _file_size(); @@ -72,7 +72,7 @@ namespace Genode { * Default constructor returns invalid dataspace */ Dataspace_component() - : _size(0), _addr(0), _fd(-1), _writable(false), _owner(0) { } + : _size(0), _addr(0), _fd(-1), _writable(false), _owner(nullptr) { } /** * This constructor is only provided for compatibility @@ -81,7 +81,8 @@ namespace Genode { Dataspace_component(size_t size, addr_t, addr_t phys_addr, Cache_attribute, bool, Dataspace_owner *_owner) : - _size(size), _addr(phys_addr), _fd(-1), _owner(_owner) + _size(size), _addr(phys_addr), _fd(-1), _writable(false), + _owner(_owner) { warning("Should only be used for IOMEM and not within Linux."); _fname.buf[0] = 0; @@ -105,20 +106,21 @@ namespace Genode { /** * Check if dataspace is owned by a specified object */ - bool owner(Dataspace_owner const *o) const { return _owner == o; } + bool owner(Dataspace_owner const &o) const { return _owner == &o; } /** * Detach dataspace from all rm sessions. */ void detach_from_rm_sessions() { } + /************************* ** Dataspace interface ** *************************/ - size_t size() { return _size; } - addr_t phys_addr() { return _addr; } - bool writable() { return _writable; } + size_t size() override { return _size; } + addr_t phys_addr() override { return _addr; } + bool writable() override { return _writable; } /**************************************** diff --git a/repos/base-linux/src/core/include/io_mem_session_component.h b/repos/base-linux/src/core/include/io_mem_session_component.h index 0b30408fc..648d5a164 100644 --- a/repos/base-linux/src/core/include/io_mem_session_component.h +++ b/repos/base-linux/src/core/include/io_mem_session_component.h @@ -40,9 +40,9 @@ namespace Genode { * particular MMIO region base, size and * caching demands */ - Io_mem_session_component(Range_allocator *io_mem_alloc, - Range_allocator *ram_alloc, - Rpc_entrypoint *ds_ep, + Io_mem_session_component(Range_allocator &io_mem_alloc, + Range_allocator &ram_alloc, + Rpc_entrypoint &ds_ep, const char *args); /** diff --git a/repos/base-linux/src/core/include/irq_session_component.h b/repos/base-linux/src/core/include/irq_session_component.h index 96ccebec5..c2af40951 100644 --- a/repos/base-linux/src/core/include/irq_session_component.h +++ b/repos/base-linux/src/core/include/irq_session_component.h @@ -34,7 +34,7 @@ class Genode::Irq_session_component : public Rpc_object, /** * Constructor */ - Irq_session_component(Range_allocator *, const char *) { } + Irq_session_component(Range_allocator &, const char *) { } /** * Destructor @@ -49,8 +49,9 @@ class Genode::Irq_session_component : public Rpc_object, void ack_irq() override { } void sigh(Signal_context_capability) override { } Info info() override { - return { .type = Genode::Irq_session::Info::Type::INVALID, - .address = 0, .value = 0 }; } + return { .type = Genode::Irq_session::Info::Type::INVALID, + .address = 0, + .value = 0 }; } }; #endif /* _CORE__INCLUDE__IRQ_SESSION_COMPONENT_H_ */ diff --git a/repos/base-linux/src/core/include/pager.h b/repos/base-linux/src/core/include/pager.h index e17e6ed6a..9639d1b01 100644 --- a/repos/base-linux/src/core/include/pager.h +++ b/repos/base-linux/src/core/include/pager.h @@ -52,9 +52,9 @@ namespace Genode { auto apply(Pager_capability, FUNC f) -> decltype(f(nullptr)) { return f(nullptr); } - Pager_capability manage(Pager_object *) { return Pager_capability(); } + Pager_capability manage(Pager_object &) { return Pager_capability(); } - void dissolve(Pager_object *) { } + void dissolve(Pager_object &) { } }; } diff --git a/repos/base-linux/src/core/include/platform.h b/repos/base-linux/src/core/include/platform.h index 78c3e4d02..d187f2980 100644 --- a/repos/base-linux/src/core/include/platform.h +++ b/repos/base-linux/src/core/include/platform.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace Genode { @@ -36,6 +37,29 @@ namespace Genode { */ Synced_range_allocator _core_mem_alloc; + Rom_fs _dummy_rom_fs { }; + + struct Dummy_allocator : Range_allocator + { + void free(void *, size_t) override { ASSERT_NEVER_CALLED; } + bool need_size_for_free() const override { ASSERT_NEVER_CALLED; } + size_t consumed() const override { ASSERT_NEVER_CALLED; } + size_t overhead(size_t) const override { ASSERT_NEVER_CALLED; } + int add_range (addr_t, size_t ) override { ASSERT_NEVER_CALLED; } + int remove_range(addr_t, size_t ) override { ASSERT_NEVER_CALLED; } + void free(void *) override { ASSERT_NEVER_CALLED; } + size_t avail() const override { ASSERT_NEVER_CALLED; } + bool valid_addr(addr_t ) const override { ASSERT_NEVER_CALLED; } + bool alloc(size_t, void **) override { ASSERT_NEVER_CALLED; } + + Alloc_return alloc_aligned(size_t, void **, int, addr_t, addr_t) override + { ASSERT_NEVER_CALLED; } + + Alloc_return alloc_addr(size_t, addr_t) override + { ASSERT_NEVER_CALLED; } + + } _dummy_alloc { }; + /** * Allocator for pseudo physical memory */ @@ -61,15 +85,14 @@ namespace Genode { int add_range(addr_t, size_t) override { return 0; } int remove_range(addr_t, size_t) override { return 0; } - void free(void *) override { } - void free(void *, size_t) override { } - size_t avail() const override { return ~0; } - bool valid_addr(addr_t) const override { return true; } - size_t overhead(size_t) const override { return 0; } - bool need_size_for_free() const override { return true; } - }; + void free(void *) override { } + void free(void *, size_t) override { } + size_t avail() const override { return ~0; } + bool valid_addr(addr_t) const override { return true; } + size_t overhead(size_t) const override { return 0; } + bool need_size_for_free() const override { return true; } - Pseudo_ram_allocator _ram_alloc { }; + } _ram_alloc { }; public: @@ -83,15 +106,15 @@ namespace Genode { ** Generic platform interface ** ********************************/ - Range_allocator *core_mem_alloc() override { return &_core_mem_alloc; } - Range_allocator *ram_alloc() override { return &_ram_alloc; } - Range_allocator *io_mem_alloc() override { return 0; } - Range_allocator *io_port_alloc() override { return 0; } - Range_allocator *irq_alloc() override { return 0; } - Range_allocator *region_alloc() override { return 0; } + Range_allocator &core_mem_alloc() override { return _core_mem_alloc; } + Range_allocator &ram_alloc() override { return _ram_alloc; } + Range_allocator &io_mem_alloc() override { return _dummy_alloc; } + Range_allocator &io_port_alloc() override { return _dummy_alloc; } + Range_allocator &irq_alloc() override { return _dummy_alloc; } + Range_allocator ®ion_alloc() override { return _dummy_alloc; } addr_t vm_start() const override { return 0; } size_t vm_size() const override { return 0; } - Rom_fs *rom_fs() override { return 0; } + Rom_fs &rom_fs() override { return _dummy_rom_fs; } /* * On Linux, the maximum number of capabilities is primarily diff --git a/repos/base-linux/src/core/include/platform_pd.h b/repos/base-linux/src/core/include/platform_pd.h index b2dcb8103..f61930afd 100644 --- a/repos/base-linux/src/core/include/platform_pd.h +++ b/repos/base-linux/src/core/include/platform_pd.h @@ -26,9 +26,9 @@ namespace Genode { struct Genode::Platform_pd { - Platform_pd(Allocator *, char const *) { } + Platform_pd(Allocator &, char const *) { } - bool bind_thread(Platform_thread *) { return true; } + bool bind_thread(Platform_thread &) { return true; } void assign_parent(Capability) { } }; diff --git a/repos/base-linux/src/core/include/platform_thread.h b/repos/base-linux/src/core/include/platform_thread.h index ebccd765b..bad3c2033 100644 --- a/repos/base-linux/src/core/include/platform_thread.h +++ b/repos/base-linux/src/core/include/platform_thread.h @@ -60,7 +60,7 @@ namespace Genode { /** * Return singleton instance of 'Platform_thread::Registry' */ - static Registry *_registry(); + static Registry &_registry(); unsigned long _tid = -1; unsigned long _pid = -1; @@ -110,8 +110,8 @@ namespace Genode { /** * Dummy implementation of platform-thread interface */ - Pager_object *pager() { return &_pager; } - void pager(Pager_object *) { } + Pager_object &pager() { return _pager; } + void pager(Pager_object &) { } int start(void *, void *) { return 0; } Thread_state state() @@ -164,7 +164,7 @@ namespace Genode { */ static void submit_exception(int pid) { - _registry()->submit_exception(pid); + _registry().submit_exception(pid); } /** diff --git a/repos/base-linux/src/core/include/region_map_component.h b/repos/base-linux/src/core/include/region_map_component.h index 65e105bd8..28d51d82c 100644 --- a/repos/base-linux/src/core/include/region_map_component.h +++ b/repos/base-linux/src/core/include/region_map_component.h @@ -65,22 +65,16 @@ class Genode::Region_map_component : public Rpc_object, Dataspace_capability dataspace() { return Dataspace_capability(); } - Rm_dataspace_component *dataspace_component() { return 0; } + Rm_dataspace_component *dataspace_component() { return nullptr; } void address_space(Platform_pd *) { } }; -struct Genode::Rm_member : Interface +struct Genode::Rm_client : Pager_object { - Region_map_component *member_rm() { return 0; } -}; - - -struct Genode::Rm_client : Pager_object, Rm_member -{ - Rm_client(Cpu_session_capability, Thread_capability, - Region_map_component *, unsigned long, + Rm_client(Cpu_session_capability, Thread_capability, + Region_map_component &, unsigned long, Affinity::Location, Cpu_session::Name const&, Session_label const&) { } diff --git a/repos/base-linux/src/core/include/rpc_cap_factory.h b/repos/base-linux/src/core/include/rpc_cap_factory.h index 9b6000c00..eb5d68a8f 100644 --- a/repos/base-linux/src/core/include/rpc_cap_factory.h +++ b/repos/base-linux/src/core/include/rpc_cap_factory.h @@ -24,7 +24,7 @@ class Genode::Rpc_cap_factory { private: - static Native_capability _alloc(Rpc_cap_factory *owner, + static Native_capability _alloc(Rpc_cap_factory &owner, Native_capability ep); public: diff --git a/repos/base-linux/src/core/include/server_socket_pair.h b/repos/base-linux/src/core/include/server_socket_pair.h index 0b73275bf..5ce82dc20 100644 --- a/repos/base-linux/src/core/include/server_socket_pair.h +++ b/repos/base-linux/src/core/include/server_socket_pair.h @@ -95,7 +95,7 @@ static inline Genode::Socket_pair create_server_socket_pair(long id) throw Connect_failed(); } - socket_pair.client_sd = Genode::ep_sd_registry()->try_associate(socket_pair.client_sd, id); + socket_pair.client_sd = Genode::ep_sd_registry().try_associate(socket_pair.client_sd, id); /* * Wipe Unix domain socket from the file system. It will live as long as diff --git a/repos/base-linux/src/core/io_mem_session_component.cc b/repos/base-linux/src/core/io_mem_session_component.cc index 25e064cb1..6b7ac87ec 100644 --- a/repos/base-linux/src/core/io_mem_session_component.cc +++ b/repos/base-linux/src/core/io_mem_session_component.cc @@ -18,8 +18,8 @@ using namespace Genode; -Io_mem_session_component::Io_mem_session_component(Range_allocator *, - Range_allocator *, - Rpc_entrypoint *, +Io_mem_session_component::Io_mem_session_component(Range_allocator &, + Range_allocator &, + Rpc_entrypoint &, const char *args) { warning("no io_mem support on Linux (args=\"", args, "\")"); } diff --git a/repos/base-linux/src/core/native_cpu_component.cc b/repos/base-linux/src/core/native_cpu_component.cc index f90736e72..20b1275b9 100644 --- a/repos/base-linux/src/core/native_cpu_component.cc +++ b/repos/base-linux/src/core/native_cpu_component.cc @@ -54,7 +54,7 @@ Untyped_capability Native_cpu_component::client_sd(Thread_capability thread_cap) Native_cpu_component::Native_cpu_component(Cpu_session_component &cpu_session, char const *) : - _cpu_session(cpu_session), _thread_ep(*_cpu_session._thread_ep) + _cpu_session(cpu_session), _thread_ep(_cpu_session._thread_ep) { _thread_ep.manage(this); } diff --git a/repos/base-linux/src/core/platform.cc b/repos/base-linux/src/core/platform.cc index aa1867fe4..ea8fe69d6 100644 --- a/repos/base-linux/src/core/platform.cc +++ b/repos/base-linux/src/core/platform.cc @@ -183,7 +183,7 @@ size_t Region_map_mmap::_dataspace_size(Capability ds_cap) return Local_capability::deref(ds_cap)->size(); /* use local function call if called from the entrypoint */ - return core_env()->entrypoint()->apply(ds_cap, [] (Dataspace *ds) { + return core_env().entrypoint().apply(ds_cap, [] (Dataspace *ds) { return ds ? ds->size() : 0; }); } @@ -201,13 +201,13 @@ int Region_map_mmap::_dataspace_fd(Capability ds_cap) * socket descriptor during the RPC handling). When later destroying the * dataspace, the descriptor would unexpectedly be closed again. */ - return core_env()->entrypoint()->apply(lx_ds_cap, [] (Linux_dataspace *ds) { + return core_env().entrypoint().apply(lx_ds_cap, [] (Linux_dataspace *ds) { return ds ? lx_dup(Capability_space::ipc_cap_data(ds->fd()).dst.socket) : -1; }); } bool Region_map_mmap::_dataspace_writable(Dataspace_capability ds_cap) { - return core_env()->entrypoint()->apply(ds_cap, [] (Dataspace *ds) { + return core_env().entrypoint().apply(ds_cap, [] (Dataspace *ds) { return ds ? ds->writable() : false; }); } diff --git a/repos/base-linux/src/core/platform_thread.cc b/repos/base-linux/src/core/platform_thread.cc index 2f602dbdf..08bf2ffb5 100644 --- a/repos/base-linux/src/core/platform_thread.cc +++ b/repos/base-linux/src/core/platform_thread.cc @@ -63,10 +63,10 @@ void Platform_thread::Registry::submit_exception(unsigned long pid) } -Platform_thread::Registry *Platform_thread::_registry() +Platform_thread::Registry &Platform_thread::_registry() { static Platform_thread::Registry registry; - return ®istry; + return registry; } @@ -79,13 +79,13 @@ Platform_thread::Platform_thread(size_t, const char *name, unsigned, { strncpy(_name, name, min(sizeof(_name), strlen(name) + 1)); - _registry()->insert(this); + _registry().insert(this); } Platform_thread::~Platform_thread() { - ep_sd_registry()->disassociate(_socket_pair.client_sd); + ep_sd_registry().disassociate(_socket_pair.client_sd); if (_socket_pair.client_sd) lx_close(_socket_pair.client_sd); @@ -93,7 +93,7 @@ Platform_thread::~Platform_thread() if (_socket_pair.server_sd) lx_close(_socket_pair.server_sd); - _registry()->remove(this); + _registry().remove(this); } diff --git a/repos/base-linux/src/core/ram_dataspace_support.cc b/repos/base-linux/src/core/ram_dataspace_support.cc index 572e741ea..1fe478bda 100644 --- a/repos/base-linux/src/core/ram_dataspace_support.cc +++ b/repos/base-linux/src/core/ram_dataspace_support.cc @@ -33,7 +33,7 @@ using namespace Genode; static int ram_ds_cnt = 0; /* counter for creating unique dataspace IDs */ -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &ds) { char fname[Linux_dataspace::FNAME_LEN]; @@ -41,10 +41,10 @@ void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *ds) snprintf(fname, sizeof(fname), "%s/ds-%d", resource_path(), ram_ds_cnt++); lx_unlink(fname); int const fd = lx_open(fname, O_CREAT|O_RDWR|O_TRUNC|LX_O_CLOEXEC, S_IRWXU); - lx_ftruncate(fd, ds->size()); + lx_ftruncate(fd, ds.size()); /* remember file descriptor in dataspace component object */ - ds->fd(fd); + ds.fd(fd); /* * Wipe the file from the Linux file system. The kernel will still keep the @@ -56,12 +56,12 @@ void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *ds) } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &ds) { - int const fd = Capability_space::ipc_cap_data(ds->fd()).dst.socket; + int const fd = Capability_space::ipc_cap_data(ds.fd()).dst.socket; if (fd != -1) lx_close(fd); } -void Ram_dataspace_factory::_clear_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_clear_ds(Dataspace_component &) { } diff --git a/repos/base-linux/src/core/rom_session_component.cc b/repos/base-linux/src/core/rom_session_component.cc index 0292f35a9..46f704521 100644 --- a/repos/base-linux/src/core/rom_session_component.cc +++ b/repos/base-linux/src/core/rom_session_component.cc @@ -33,19 +33,29 @@ using namespace Genode; -Rom_session_component::Rom_session_component(Rom_fs *, - Rpc_entrypoint *ds_ep, - const char *args) -: _ds(args), _ds_ep(ds_ep) +/** + * Convert 'Capability' to 'Capability' + * + * The downcast from 'Linux_dataspace' to 'Dataspace' happens implicitly by + * passing the argument. To upcast to 'Linux_dataspace' happens explicitly. + */ +static Capability rom_ds_cap(Capability cap) { - Dataspace_capability ds_cap = _ds_ep->manage(&_ds); - _ds_cap = static_cap_cast(ds_cap); + return static_cap_cast(cap); } +Rom_session_component::Rom_session_component(Rom_fs &, + Rpc_entrypoint &ds_ep, + const char *args) +: + _ds(args), _ds_ep(ds_ep), _ds_cap(rom_ds_cap(_ds_ep.manage(&_ds))) +{ } + + Rom_session_component::~Rom_session_component() { - _ds_ep->dissolve(&_ds); + _ds_ep.dissolve(&_ds); int const fd = Capability_space::ipc_cap_data(_ds.fd()).dst.socket; if (fd != -1) diff --git a/repos/base-linux/src/core/thread_linux.cc b/repos/base-linux/src/core/thread_linux.cc index 523fc6ba3..b272a0ac0 100644 --- a/repos/base-linux/src/core/thread_linux.cc +++ b/repos/base-linux/src/core/thread_linux.cc @@ -30,11 +30,11 @@ static void empty_signal_handler(int) { } void Thread::_thread_start() { - Thread * const thread = Thread::myself(); + Thread * const thread_ptr = Thread::myself(); /* use primary stack as alternate stack for fatal signals (exceptions) */ - void *stack_base = (void *)thread->_stack->base(); - size_t stack_size = thread->_stack->top() - thread->_stack->base(); + void *stack_base = (void *)thread_ptr->_stack->base(); + size_t stack_size = thread_ptr->_stack->top() - thread_ptr->_stack->base(); lx_sigaltstack(stack_base, stack_size); diff --git a/repos/base-linux/src/include/base/internal/socket_descriptor_registry.h b/repos/base-linux/src/include/base/internal/socket_descriptor_registry.h index c85844865..189c6970a 100644 --- a/repos/base-linux/src/include/base/internal/socket_descriptor_registry.h +++ b/repos/base-linux/src/include/base/internal/socket_descriptor_registry.h @@ -33,7 +33,7 @@ namespace Genode /** * Return singleton instance of registry for tracking entrypoint sockets */ - Ep_socket_descriptor_registry *ep_sd_registry(); + Ep_socket_descriptor_registry &ep_sd_registry(); } diff --git a/repos/base-linux/src/lib/base/ipc.cc b/repos/base-linux/src/lib/base/ipc.cc index 2ab0d75b0..3c9b63b4d 100644 --- a/repos/base-linux/src/lib/base/ipc.cc +++ b/repos/base-linux/src/lib/base/ipc.cc @@ -91,10 +91,10 @@ static_assert((int)Protocol_header::INVALID_BADGE != (int)Rpc_obj_key::INVALID, ** File-descriptor registry ** ******************************/ -Genode::Ep_socket_descriptor_registry *Genode::ep_sd_registry() +Genode::Ep_socket_descriptor_registry &Genode::ep_sd_registry() { static Genode::Ep_socket_descriptor_registry registry; - return ®istry; + return registry; } @@ -299,7 +299,7 @@ static void extract_sds_from_message(unsigned start_index, int const sd = msg.socket_at_index(start_index + sd_cnt++); int const id = lookup_tid_by_client_socket(sd); - int const associated_sd = Genode::ep_sd_registry()->try_associate(sd, id); + int const associated_sd = Genode::ep_sd_registry().try_associate(sd, id); Native_capability arg_cap = Capability_space::lookup(Rpc_obj_key(badge)); @@ -556,7 +556,7 @@ Ipc_server::~Ipc_server() */ Native_thread &native_thread = Thread::myself()->native_thread(); - Genode::ep_sd_registry()->disassociate(native_thread.socket_pair.client_sd); + Genode::ep_sd_registry().disassociate(native_thread.socket_pair.client_sd); native_thread.is_ipc_server = false; destroy_server_socket_pair(native_thread.socket_pair); diff --git a/repos/base-nova/include/nova/cap_map.h b/repos/base-nova/include/nova/cap_map.h index eda569c9a..d87a93c63 100644 --- a/repos/base-nova/include/nova/cap_map.h +++ b/repos/base-nova/include/nova/cap_map.h @@ -115,7 +115,7 @@ namespace Genode { Cap_index find(addr_t local_sel); - void insert(Cap_range * range) { _tree.insert(range); } + void insert(Cap_range &range) { _tree.insert(&range); } addr_t insert(size_t num_log_2 = 0, addr_t cap = ~0UL); @@ -126,7 +126,7 @@ namespace Genode { /** * Get the global Capability_map of the process. */ - Capability_map *cap_map(); + Capability_map &cap_map(); } #endif /* _INCLUDE__NOVA__CAP_MAP_H_ */ diff --git a/repos/base-nova/src/core/core_region_map.cc b/repos/base-nova/src/core/core_region_map.cc index b63bdb99b..6f7f544bd 100644 --- a/repos/base-nova/src/core/core_region_map.cc +++ b/repos/base-nova/src/core/core_region_map.cc @@ -28,7 +28,7 @@ using namespace Genode; /** * Map dataspace core-locally */ -static inline void * alloc_region(Dataspace_component *ds, const size_t size) +static inline void * alloc_region(Dataspace_component &ds, const size_t size) { /* * Allocate range in core's virtual address space @@ -37,10 +37,10 @@ static inline void * alloc_region(Dataspace_component *ds, const size_t size) * successively weaken the alignment constraint until we hit the page size. */ void *virt_addr = 0; - size_t align_log2 = log2(ds->size()); + size_t align_log2 = log2(ds.size()); for (; align_log2 >= get_page_size_log2(); align_log2--) { - if (platform()->region_alloc()->alloc_aligned(size, - &virt_addr, align_log2).ok()) + if (platform().region_alloc().alloc_aligned(size, + &virt_addr, align_log2).ok()) break; } @@ -53,10 +53,12 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t, Region_map::Local_addr, bool executable, bool writeable) { - auto lambda = [&] (Dataspace_component *ds) -> Local_addr { - if (!ds) + auto lambda = [&] (Dataspace_component *ds_ptr) -> Local_addr { + if (!ds_ptr) throw Invalid_dataspace(); + Dataspace_component &ds = *ds_ptr; + if (use_local_addr) { error("Parameter 'use_local_addr' not supported within core"); return nullptr; @@ -67,7 +69,7 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t, return nullptr; } - const size_t page_rounded_size = align_addr(ds->size(), get_page_size_log2()); + const size_t page_rounded_size = align_addr(ds.size(), get_page_size_log2()); /* allocate the virtual region contiguous for the dataspace */ void * virt_ptr = alloc_region(ds, page_rounded_size); @@ -75,13 +77,13 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t, throw Out_of_ram(); /* map it */ - Nova::Utcb * const utcb = reinterpret_cast(Thread::myself()->utcb()); - const Nova::Rights rights(true, writeable && ds->writable(), executable); + Nova::Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); + const Nova::Rights rights(true, writeable && ds.writable(), executable); - if (map_local(platform_specific()->core_pd_sel(), utcb, - ds->phys_addr(), reinterpret_cast(virt_ptr), + if (map_local(platform_specific().core_pd_sel(), utcb, + ds.phys_addr(), reinterpret_cast(virt_ptr), page_rounded_size >> get_page_size_log2(), rights, true)) { - platform()->region_alloc()->free(virt_ptr, page_rounded_size); + platform().region_alloc().free(virt_ptr, page_rounded_size); throw Out_of_ram(); } @@ -93,10 +95,10 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t, void Core_region_map::detach(Local_addr core_local_addr) { - size_t size = platform_specific()->region_alloc_size_at(core_local_addr); + size_t size = platform_specific().region_alloc_size_at(core_local_addr); - unmap_local(reinterpret_cast(Thread::myself()->utcb()), + unmap_local(*reinterpret_cast(Thread::myself()->utcb()), core_local_addr, size >> get_page_size_log2()); - platform()->region_alloc()->free(core_local_addr); + platform().region_alloc().free(core_local_addr); } diff --git a/repos/base-nova/src/core/core_rpc_cap_alloc.cc b/repos/base-nova/src/core/core_rpc_cap_alloc.cc index b3b8a51d8..395cabf12 100644 --- a/repos/base-nova/src/core/core_rpc_cap_alloc.cc +++ b/repos/base-nova/src/core/core_rpc_cap_alloc.cc @@ -24,7 +24,7 @@ using namespace Genode; static Rpc_cap_factory &rpc_cap_factory() { - static Rpc_cap_factory inst(*platform()->core_mem_alloc()); + static Rpc_cap_factory inst(platform().core_mem_alloc()); return inst; } diff --git a/repos/base-nova/src/core/include/ipc_pager.h b/repos/base-nova/src/core/include/ipc_pager.h index 3b1008616..9c113ec3e 100644 --- a/repos/base-nova/src/core/include/ipc_pager.h +++ b/repos/base-nova/src/core/include/ipc_pager.h @@ -80,7 +80,7 @@ class Genode::Ipc_pager public: - Ipc_pager (Nova::Utcb *, addr_t pd_dst, addr_t pd_core); + Ipc_pager (Nova::Utcb &, addr_t pd_dst, addr_t pd_core); /* * Intel manual: 6.15 EXCEPTION AND INTERRUPT REFERENCE diff --git a/repos/base-nova/src/core/include/map_local.h b/repos/base-nova/src/core/include/map_local.h index b05bb22b0..b8ee65928 100644 --- a/repos/base-nova/src/core/include/map_local.h +++ b/repos/base-nova/src/core/include/map_local.h @@ -37,8 +37,8 @@ namespace Genode { inline bool map_local(addr_t from_phys, addr_t to_virt, size_t num_pages, bool read = true, bool write = true, bool exec = true) { - return (::map_local(platform_specific()->core_pd_sel(), - (Nova::Utcb *)Thread::myself()->utcb(), + return (::map_local(platform_specific().core_pd_sel(), + *(Nova::Utcb *)Thread::myself()->utcb(), from_phys, to_virt, num_pages, Nova::Rights(read, write, exec), true) == 0); } @@ -51,8 +51,7 @@ namespace Genode { */ inline void unmap_local(addr_t virt, size_t num_pages) { - ::unmap_local((Nova::Utcb *)Thread::myself()->utcb(), - virt, num_pages); + ::unmap_local(*(Nova::Utcb *)Thread::myself()->utcb(), virt, num_pages); } } diff --git a/repos/base-nova/src/core/include/nova_util.h b/repos/base-nova/src/core/include/nova_util.h index ab6a7b261..37f5c594c 100644 --- a/repos/base-nova/src/core/include/nova_util.h +++ b/repos/base-nova/src/core/include/nova_util.h @@ -55,17 +55,17 @@ inline Genode::addr_t boot_cpu() * \param kern_pd Whether to map the items from the kernel or from core * \param dma_mem Whether the memory is usable for DMA or not */ -static int map_local(Genode::addr_t const pd, Nova::Utcb * const utcb, +static int map_local(Genode::addr_t const pd, Nova::Utcb &utcb, Nova::Crd const src_crd, Nova::Crd const dst_crd, bool const kern_pd = false, bool const dma_mem = false, bool const write_combined = false) { /* asynchronously map capabilities */ - utcb->set_msg_word(0); + utcb.set_msg_word(0); /* ignore return value as one item always fits into the utcb */ - bool const ok = utcb->append_item(src_crd, 0, kern_pd, false, false, - dma_mem, write_combined); + bool const ok = utcb.append_item(src_crd, 0, kern_pd, false, false, + dma_mem, write_combined); (void)ok; Nova::uint8_t res = Nova::delegate(pd, pd, dst_crd); @@ -76,15 +76,15 @@ static int map_local(Genode::addr_t const pd, Nova::Utcb * const utcb, Hex(src_crd.addr()), ":", Hex(src_crd.order()), ":", Hex(src_crd.type()), "->", Hex(dst_crd.addr()), ":", Hex(dst_crd.order()), ":", Hex(dst_crd.type()), " - ", "result=", Hex(res), " " - "msg=", Hex(utcb->msg_items()), ":", - Hex(utcb->msg_words()), ":", - Hex(utcb->msg()[0]), " !!! " - "utcb=", utcb, " " + "msg=", Hex(utcb.msg_items()), ":", + Hex(utcb.msg_words()), ":", + Hex(utcb.msg()[0]), " !!! " + "utcb=", &utcb, " " "kern=", kern_pd); return res > 0 ? res : -1; } /* clear receive window */ - utcb->crd_rcv = 0; + utcb.crd_rcv = 0; return 0; } @@ -93,13 +93,13 @@ static int map_local(Genode::addr_t const pd, Nova::Utcb * const utcb, static inline int unmap_local(Nova::Crd crd, bool self = true) { return Nova::revoke(crd, self); } -inline int map_local_phys_to_virt(Nova::Utcb * const utcb, Nova::Crd const src, +inline int map_local_phys_to_virt(Nova::Utcb &utcb, Nova::Crd const src, Nova::Crd const dst, Genode::addr_t const pd) { return map_local(pd, utcb, src, dst, true); } -inline int map_local_one_to_one(Nova::Utcb * const utcb, Nova::Crd const crd, +inline int map_local_one_to_one(Nova::Utcb &utcb, Nova::Crd const crd, Genode::addr_t const pd) { return map_local(pd, utcb, crd, crd, true); @@ -128,7 +128,7 @@ lsb_bit(unsigned long const &value, unsigned char const shift = 0) * \param to_start local virtual destination address * \param num_pages number of pages to map */ -inline int map_local(Genode::addr_t const pd, Nova::Utcb *utcb, +inline int map_local(Genode::addr_t const pd, Nova::Utcb &utcb, Genode::addr_t from_start, Genode::addr_t to_start, Genode::size_t num_pages, Nova::Rights const &permission, @@ -190,7 +190,7 @@ inline int map_local(Genode::addr_t const pd, Nova::Utcb *utcb, * \param self map from this pd or solely from other pds * \param rights rights to be revoked, default: all rwx */ -inline void unmap_local(Nova::Utcb *, Genode::addr_t start, +inline void unmap_local(Nova::Utcb &, Genode::addr_t start, Genode::size_t num_pages, bool const self = true, Nova::Rights const rwx = Nova::Rights(true, true, true)) @@ -236,13 +236,13 @@ inline Nova::uint8_t async_map(Genode::Pager_object &pager, Genode::addr_t const target_pd, Nova::Obj_crd const &source_initial_caps, Nova::Obj_crd const &target_initial_caps, - Nova::Utcb *utcb) + Nova::Utcb &utcb) { /* asynchronously map capabilities */ - utcb->set_msg_word(0); + utcb.set_msg_word(0); /* ignore return value as one item always fits into the utcb */ - bool const ok = utcb->append_item(source_initial_caps, 0); + bool const ok = utcb.append_item(source_initial_caps, 0); (void)ok; return syscall_retry(pager, @@ -254,7 +254,7 @@ inline Nova::uint8_t async_map(Genode::Pager_object &pager, inline Nova::uint8_t map_vcpu_portals(Genode::Pager_object &pager, Genode::addr_t const source_exc_base, Genode::addr_t const target_exc_base, - Nova::Utcb *utcb, + Nova::Utcb &utcb, Genode::addr_t const source_pd) { using Nova::Obj_crd; @@ -271,12 +271,12 @@ inline Nova::uint8_t map_pagefault_portal(Genode::Pager_object &pager, Genode::addr_t const source_exc_base, Genode::addr_t const target_exc_base, Genode::addr_t const target_pd, - Nova::Utcb *utcb) + Nova::Utcb &utcb) { using Nova::Obj_crd; using Nova::PT_SEL_PAGE_FAULT; - Genode::addr_t const source_pd = Genode::platform_specific()->core_pd_sel(); + Genode::addr_t const source_pd = Genode::platform_specific().core_pd_sel(); Obj_crd const source_initial_caps(source_exc_base + PT_SEL_PAGE_FAULT, 0); Obj_crd const target_initial_caps(target_exc_base + PT_SEL_PAGE_FAULT, 0); diff --git a/repos/base-nova/src/core/include/pager.h b/repos/base-nova/src/core/include/pager.h index 1e79a909b..f672203b8 100644 --- a/repos/base-nova/src/core/include/pager.h +++ b/repos/base-nova/src/core/include/pager.h @@ -42,15 +42,15 @@ namespace Genode { private: template - __attribute__((regparm(1))) static void _handler(addr_t); + __attribute__((regparm(1))) static void _handler(Pager_object &); public: - Exception_handlers(Pager_object *); + Exception_handlers(Pager_object &); template - void register_handler(Pager_object *, Nova::Mtd, - void (__attribute__((regparm(1)))*)(addr_t) = nullptr); + void register_handler(Pager_object &, Nova::Mtd, + void (__attribute__((regparm(1)))*)(Pager_object &) = nullptr); }; @@ -128,8 +128,8 @@ namespace Genode { addr_t _pd_target; - void _copy_state_from_utcb(Nova::Utcb * utcb); - void _copy_state_to_utcb(Nova::Utcb * utcb); + void _copy_state_from_utcb(Nova::Utcb const &utcb); + void _copy_state_to_utcb(Nova::Utcb &utcb) const; uint8_t _unsynchronized_client_recall(bool get_state_and_block); @@ -139,16 +139,16 @@ namespace Genode { addr_t sel_oom_portal() const { return _selectors + 3; } __attribute__((regparm(1))) - static void _page_fault_handler(addr_t pager_obj); + static void _page_fault_handler(Pager_object &); __attribute__((regparm(1))) - static void _startup_handler(addr_t pager_obj); + static void _startup_handler(Pager_object &); __attribute__((regparm(1))) - static void _invoke_handler(addr_t pager_obj); + static void _invoke_handler(Pager_object &); __attribute__((regparm(1))) - static void _recall_handler(addr_t pager_obj); + static void _recall_handler(Pager_object &); __attribute__((regparm(3))) static void _oom_handler(addr_t, addr_t, addr_t); @@ -439,13 +439,13 @@ namespace Genode { /** * Associate Pager_object with the entry point */ - Pager_capability manage(Pager_object *) { + Pager_capability manage(Pager_object &) { return Pager_capability(); } /** * Dissolve Pager_object from entry point */ - void dissolve(Pager_object *obj); + void dissolve(Pager_object &obj); }; diff --git a/repos/base-nova/src/core/include/platform.h b/repos/base-nova/src/core/include/platform.h index 303ba924e..30c92693c 100644 --- a/repos/base-nova/src/core/include/platform.h +++ b/repos/base-nova/src/core/include/platform.h @@ -72,21 +72,21 @@ namespace Genode { ** Generic platform interface ** ********************************/ - Range_allocator *ram_alloc() override { return _core_mem_alloc.phys_alloc(); } - Range_allocator *io_mem_alloc() override { return &_io_mem_alloc; } - Range_allocator *io_port_alloc() override { return &_io_port_alloc; } - Range_allocator *irq_alloc() override { return &_irq_alloc; } - Range_allocator *region_alloc() override { return _core_mem_alloc.virt_alloc(); } - Range_allocator *core_mem_alloc() override { return &_core_mem_alloc; } + Range_allocator &ram_alloc() override { return _core_mem_alloc.phys_alloc(); } + Range_allocator &io_mem_alloc() override { return _io_mem_alloc; } + Range_allocator &io_port_alloc() override { return _io_port_alloc; } + Range_allocator &irq_alloc() override { return _irq_alloc; } + Range_allocator ®ion_alloc() override { return _core_mem_alloc.virt_alloc(); } + Range_allocator &core_mem_alloc() override { return _core_mem_alloc; } addr_t vm_start() const override { return _vm_base; } size_t vm_size() const override { return _vm_size; } - Rom_fs *rom_fs() override { return &_rom_fs; } + Rom_fs &rom_fs() override { return _rom_fs; } size_t max_caps() const override { return _max_caps; } + void wait_for_exit() override; - void wait_for_exit() override; bool supports_direct_unmap() const override { return true; } - Address_space * core_pd() { return nullptr; } + Address_space &core_pd() { ASSERT_NEVER_CALLED; } Affinity::Space affinity_space() const override { return _cpus; } @@ -105,7 +105,7 @@ namespace Genode { * core_rm_session detach(). */ size_t region_alloc_size_at(void * addr) { - return (*_core_mem_alloc.virt_alloc())()->size_at(addr); } + return (_core_mem_alloc.virt_alloc())()->size_at(addr); } /** * Return kernel CPU ID for given Genode CPU diff --git a/repos/base-nova/src/core/include/platform_pd.h b/repos/base-nova/src/core/include/platform_pd.h index 0c80468d5..3525b5de6 100644 --- a/repos/base-nova/src/core/include/platform_pd.h +++ b/repos/base-nova/src/core/include/platform_pd.h @@ -42,7 +42,7 @@ namespace Genode { /** * Constructors */ - Platform_pd(Allocator * md_alloc, char const *, + Platform_pd(Allocator &md_alloc, char const *, signed pd_id = -1, bool create = true); /** @@ -53,14 +53,14 @@ namespace Genode { /** * Bind thread to protection domain */ - bool bind_thread(Platform_thread *thread); + bool bind_thread(Platform_thread &thread); /** * Unbind thread from protection domain * * Free the thread's slot and update thread object. */ - void unbind_thread(Platform_thread *thread); + void unbind_thread(Platform_thread &thread); /** * Assign parent interface to protection domain diff --git a/repos/base-nova/src/core/include/platform_thread.h b/repos/base-nova/src/core/include/platform_thread.h index cdbd4d0b2..bef720d8b 100644 --- a/repos/base-nova/src/core/include/platform_thread.h +++ b/repos/base-nova/src/core/include/platform_thread.h @@ -26,6 +26,7 @@ /* core includes */ #include +#include namespace Genode { @@ -154,12 +155,18 @@ namespace Genode { /** * Set pager */ - void pager(Pager_object *pager); + void pager(Pager_object &pager); /** * Return pager object */ - Pager_object *pager() { return _pager; } + Pager_object &pager() + { + if (_pager) + return *_pager; + + ASSERT_NEVER_CALLED; + } /** * Return identification of thread when faulting diff --git a/repos/base-nova/src/core/include/signal_broker.h b/repos/base-nova/src/core/include/signal_broker.h index 0380b02cb..b61ee82e9 100644 --- a/repos/base-nova/src/core/include/signal_broker.h +++ b/repos/base-nova/src/core/include/signal_broker.h @@ -89,11 +89,11 @@ class Genode::Signal_broker return Signal_context_capability(); } - Native_capability si = Capability_space::import(cap_map()->insert()); + Native_capability si = Capability_space::import(cap_map().insert()); Signal_context_capability cap = reinterpret_cap_cast(si); uint8_t res = Nova::create_si(cap.local_name(), - platform_specific()->core_pd_sel(), + platform_specific().core_pd_sel(), imprint, sm.local_name()); if (res != Nova::NOVA_OK) { warning("creating signal failed - error ", res); @@ -124,7 +124,7 @@ class Genode::Signal_broker destroy(&_context_slab, context); Nova::revoke(Nova::Obj_crd(context_cap.local_name(), 0)); - cap_map()->remove(context_cap.local_name(), 0); + cap_map().remove(context_cap.local_name(), 0); } void submit(Signal_context_capability, unsigned) diff --git a/repos/base-nova/src/core/ipc_pager.cc b/repos/base-nova/src/core/ipc_pager.cc index c772cb326..1574d2ace 100644 --- a/repos/base-nova/src/core/ipc_pager.cc +++ b/repos/base-nova/src/core/ipc_pager.cc @@ -23,17 +23,17 @@ using namespace Genode; -Ipc_pager::Ipc_pager(Nova::Utcb * utcb, addr_t pd_dst, addr_t pd_core) +Ipc_pager::Ipc_pager(Nova::Utcb &utcb, addr_t pd_dst, addr_t pd_core) : _pd_dst(pd_dst), _pd_core(pd_core), - _fault_ip(utcb->ip), - _fault_addr(utcb->qual[1]), - _sp(utcb->sp), - _fault_type(utcb->qual[0]), + _fault_ip(utcb.ip), + _fault_addr(utcb.qual[1]), + _sp(utcb.sp), + _fault_type(utcb.qual[0]), _syscall_res(Nova::NOVA_OK), - _normal_ipc((((addr_t)&utcb->qual[2] - (addr_t)utcb->msg()) / sizeof(addr_t)) - == utcb->msg_words()) + _normal_ipc((((addr_t)&utcb.qual[2] - (addr_t)utcb.msg()) / sizeof(addr_t)) + == utcb.msg_words()) { /* @@ -46,10 +46,11 @@ Ipc_pager::Ipc_pager(Nova::Utcb * utcb, addr_t pd_dst, addr_t pd_core) void Ipc_pager::set_reply_mapping(Mapping m) { - Nova::Utcb *utcb = (Nova::Utcb *)Thread::myself()->utcb(); - utcb->set_msg_word(0); - bool res = utcb->append_item(m.mem_crd(), 0, true, false, - false, m.dma(), m.write_combined()); + Nova::Utcb &utcb = *(Nova::Utcb *)Thread::myself()->utcb(); + + utcb.set_msg_word(0); + bool res = utcb.append_item(m.mem_crd(), 0, true, false, + false, m.dma(), m.write_combined()); /* one item ever fits on the UTCB */ (void)res; @@ -65,16 +66,16 @@ void Ipc_pager::set_reply_mapping(Mapping m) void Ipc_pager::reply_and_wait_for_fault(addr_t sm) { - Thread * myself = Thread::myself(); - Nova::Utcb * utcb = reinterpret_cast(myself->utcb()); + Thread &myself = *Thread::myself(); + Nova::Utcb &utcb = *reinterpret_cast(myself.utcb()); - utcb->mtd = 0; + utcb.mtd = 0; /* * If it was a normal IPC and the mapping failed, caller may re-try. * Otherwise nothing left to be delegated - done asynchronously beforehand. */ - utcb->set_msg_word((_normal_ipc && _syscall_res != Nova::NOVA_OK) ? 1 : 0); + utcb.set_msg_word((_normal_ipc && _syscall_res != Nova::NOVA_OK) ? 1 : 0); - Nova::reply(myself->stack_top(), sm); + Nova::reply(myself.stack_top(), sm); } diff --git a/repos/base-nova/src/core/irq_session_component.cc b/repos/base-nova/src/core/irq_session_component.cc index ce29d55e3..5e8dc711c 100644 --- a/repos/base-nova/src/core/irq_session_component.cc +++ b/repos/base-nova/src/core/irq_session_component.cc @@ -70,7 +70,7 @@ static bool msi(Genode::addr_t irq_sel, Genode::addr_t phys_mem, Genode::Signal_context_capability sig_cap) { void * virt = 0; - if (platform()->region_alloc()->alloc_aligned(4096, &virt, 12).error()) + if (platform().region_alloc().alloc_aligned(4096, &virt, 12).error()) return false; Genode::addr_t virt_addr = reinterpret_cast(virt); @@ -82,10 +82,10 @@ static bool msi(Genode::addr_t irq_sel, Genode::addr_t phys_mem, Nova::Mem_crd phys_crd(phys_mem >> 12, 0, Rights(true, false, false)); Nova::Mem_crd virt_crd(virt_addr >> 12, 0, Rights(true, false, false)); - Utcb * utcb = reinterpret_cast(Thread::myself()->utcb()); + Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); - if (map_local_phys_to_virt(utcb, phys_crd, virt_crd, platform_specific()->core_pd_sel())) { - platform()->region_alloc()->free(virt, 4096); + if (map_local_phys_to_virt(utcb, phys_crd, virt_crd, platform_specific().core_pd_sel())) { + platform().region_alloc().free(virt, 4096); return false; } @@ -93,7 +93,7 @@ static bool msi(Genode::addr_t irq_sel, Genode::addr_t phys_mem, bool res = associate(irq_sel, msi_addr, msi_data, sig_cap, virt_addr); unmap_local(Nova::Mem_crd(virt_addr >> 12, 0, Rights(true, true, true))); - platform()->region_alloc()->free(virt, 4096); + platform().region_alloc().free(virt, 4096); return res; } @@ -138,12 +138,12 @@ void Irq_object::start(unsigned irq, Genode::addr_t const device_phys) /* map IRQ SM cap from kernel to core at irq_sel selector */ using Nova::Obj_crd; - Obj_crd src(platform_specific()->gsi_base_sel() + irq, 0); + Obj_crd src(platform_specific().gsi_base_sel() + irq, 0); Obj_crd dst(irq_sel(), 0); enum { MAP_FROM_KERNEL_TO_CORE = true }; - int ret = map_local(platform_specific()->core_pd_sel(), - (Nova::Utcb *)Thread::myself()->utcb(), + int ret = map_local(platform_specific().core_pd_sel(), + *(Nova::Utcb *)Thread::myself()->utcb(), src, dst, MAP_FROM_KERNEL_TO_CORE); if (ret) { error("getting IRQ from kernel failed - ", irq); @@ -166,7 +166,7 @@ void Irq_object::start(unsigned irq, Genode::addr_t const device_phys) Irq_object::Irq_object() : - _kernel_caps(cap_map()->insert(KERNEL_CAP_COUNT_LOG2)), + _kernel_caps(cap_map().insert(KERNEL_CAP_COUNT_LOG2)), _msi_addr(0UL), _msi_data(0UL) { } @@ -179,7 +179,7 @@ Irq_object::~Irq_object() /* revoke IRQ SM */ Nova::revoke(Nova::Obj_crd(_kernel_caps, KERNEL_CAP_COUNT_LOG2)); enum { NO_REVOKE_REQUIRED = false }; - cap_map()->remove(_kernel_caps, KERNEL_CAP_COUNT_LOG2, NO_REVOKE_REQUIRED); + cap_map().remove(_kernel_caps, KERNEL_CAP_COUNT_LOG2, NO_REVOKE_REQUIRED); } @@ -188,18 +188,18 @@ Irq_object::~Irq_object() ***************************/ -static Nova::Hip * kernel_hip() +static Nova::Hip const &kernel_hip() { /** * Initial value of esp register, saved by the crt0 startup code. * This value contains the address of the hypervisor information page. */ extern addr_t __initial_sp; - return reinterpret_cast(__initial_sp); + return *reinterpret_cast(__initial_sp); } -Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char *args) : _irq_number(~0U), _irq_alloc(irq_alloc), _irq_object() @@ -208,16 +208,16 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, long device_phys = Arg_string::find_arg(args, "device_config_phys").long_value(0); if (device_phys) { - if ((unsigned long)irq_number >= kernel_hip()->sel_gsi) + if ((unsigned long)irq_number >= kernel_hip().sel_gsi) throw Service_denied(); - irq_number = kernel_hip()->sel_gsi - 1 - irq_number; + irq_number = kernel_hip().sel_gsi - 1 - irq_number; /* XXX last GSI number unknown - assume 40 GSIs (depends on IO-APIC) */ if (irq_number < 40) throw Service_denied(); } - if (!irq_alloc || irq_alloc->alloc_addr(1, irq_number).error()) { + if (irq_alloc.alloc_addr(1, irq_number).error()) { error("unavailable IRQ ", irq_number, " requested"); throw Service_denied(); } @@ -234,7 +234,7 @@ Irq_session_component::~Irq_session_component() return; Genode::addr_t free_irq = _irq_number; - _irq_alloc->free((void *)free_irq); + _irq_alloc.free((void *)free_irq); } diff --git a/repos/base-nova/src/core/native_cpu_component.cc b/repos/base-nova/src/core/native_cpu_component.cc index 0461edb15..f40b38e38 100644 --- a/repos/base-nova/src/core/native_cpu_component.cc +++ b/repos/base-nova/src/core/native_cpu_component.cc @@ -37,7 +37,7 @@ void Native_cpu_component::thread_type(Thread_capability thread_cap, Native_cpu_component::Native_cpu_component(Cpu_session_component &cpu_session, char const *) : - _cpu_session(cpu_session), _thread_ep(*_cpu_session._thread_ep) + _cpu_session(cpu_session), _thread_ep(_cpu_session._thread_ep) { _thread_ep.manage(this); } diff --git a/repos/base-nova/src/core/pager.cc b/repos/base-nova/src/core/pager.cc index b7711a5d8..9b0ac1f8c 100644 --- a/repos/base-nova/src/core/pager.cc +++ b/repos/base-nova/src/core/pager.cc @@ -39,14 +39,14 @@ using namespace Genode; using namespace Nova; -static Nova::Hip * kernel_hip() +static Nova::Hip const &kernel_hip() { /** * Initial value of esp register, saved by the crt0 startup code. * This value contains the address of the hypervisor information page. */ extern addr_t __initial_sp; - return reinterpret_cast(__initial_sp); + return *reinterpret_cast(__initial_sp); } /* pager activation threads storage and handling - one thread per CPU */ @@ -56,14 +56,14 @@ static char pager_activation_mem[sizeof (Pager_activation) * P static Pager_activation_base * pager_threads[PAGER_CPUS]; -static unsigned which_cpu(Pager_activation_base * pager) +static unsigned which_cpu(Pager_activation_base &pager) { Pager_activation_base * start = reinterpret_cast(&pager_activation_mem); Pager_activation_base * end = start + PAGER_CPUS; - if (start <= pager && pager < end) { + if (start <= &pager && &pager < end) { /* pager of one of the non boot CPUs */ - unsigned cpu_id = pager - start; + unsigned cpu_id = &pager - start; return cpu_id; } @@ -106,40 +106,38 @@ struct Page_fault_info }; -void Pager_object::_page_fault_handler(addr_t pager_obj) +void Pager_object::_page_fault_handler(Pager_object &obj) { - Thread * myself = Thread::myself(); - Pager_object * obj = reinterpret_cast(pager_obj); - Utcb * utcb = reinterpret_cast(myself->utcb()); + Thread &myself = *Thread::myself(); + Utcb &utcb = *reinterpret_cast(myself.utcb()); - Ipc_pager ipc_pager(reinterpret_cast(utcb), obj->pd_sel(), - platform_specific()->core_pd_sel()); + Ipc_pager ipc_pager(utcb, obj.pd_sel(), platform_specific().core_pd_sel()); - Pager_activation_base * pager_thread = static_cast(myself); + Pager_activation_base &pager_thread = static_cast(myself); /* potential request to ask for EC cap or signal SM cap */ - if (utcb->msg_words() == 1) - _invoke_handler(pager_obj); + if (utcb.msg_words() == 1) + _invoke_handler(obj); /* - * obj->pager() (pager thread) may issue a signal to the remote region + * obj.pager() (pager thread) may issue a signal to the remote region * handler thread which may respond via wake_up() (ep thread) before * we are done here - we have to lock the whole page lookup procedure */ - obj->_state_lock.lock(); + obj._state_lock.lock(); - obj->_state.thread.ip = ipc_pager.fault_ip(); - obj->_state.thread.sp = 0; - obj->_state.thread.trapno = PT_SEL_PAGE_FAULT; + obj._state.thread.ip = ipc_pager.fault_ip(); + obj._state.thread.sp = 0; + obj._state.thread.trapno = PT_SEL_PAGE_FAULT; - obj->_state.block(); - obj->_state.block_pause_sm(); + obj._state.block(); + obj._state.block_pause_sm(); /* lookup fault address and decide what to do */ - int error = obj->pager(ipc_pager); + int error = obj.pager(ipc_pager); /* don't open receive window for pager threads */ - if (utcb->crd_rcv.value()) + if (utcb.crd_rcv.value()) nova_die(); if (!error && ipc_pager.syscall_result() != Nova::NOVA_OK) { @@ -148,13 +146,14 @@ void Pager_object::_page_fault_handler(addr_t pager_obj) /* dst pd has not enough kernel quota ? - try to recover */ if (ipc_pager.syscall_result() == Nova::NOVA_PD_OOM) { - uint8_t res = obj->handle_oom(); + uint8_t res = obj.handle_oom(); if (res == Nova::NOVA_PD_OOM) { - obj->_state.unblock_pause_sm(); - obj->_state.unblock(); - obj->_state_lock.unlock(); + obj._state.unblock_pause_sm(); + obj._state.unblock(); + obj._state_lock.unlock(); + /* block until revoke is due */ - ipc_pager.reply_and_wait_for_fault(obj->sel_sm_block_oom()); + ipc_pager.reply_and_wait_for_fault(obj.sel_sm_block_oom()); } else if (res == Nova::NOVA_OK) /* succeeded to recover - continue normally */ error = 0; @@ -163,14 +162,14 @@ void Pager_object::_page_fault_handler(addr_t pager_obj) /* good case - found a valid region which is mappable */ if (!error) { - obj->_state.unblock_pause_sm(); - obj->_state.unblock(); - obj->_state_lock.unlock(); + obj._state.unblock_pause_sm(); + obj._state.unblock(); + obj._state_lock.unlock(); ipc_pager.reply_and_wait_for_fault(); } - const char * client_thread = obj->client_thread(); - const char * client_pd = obj->client_pd(); + char const * const client_thread = obj.client_thread(); + char const * const client_pd = obj.client_pd(); Page_fault_info const fault_info(client_pd, client_thread, which_cpu(pager_thread), @@ -182,29 +181,30 @@ void Pager_object::_page_fault_handler(addr_t pager_obj) /* region manager fault - to be handled */ log("page fault, ", fault_info, " reason=", error); - obj->_state_lock.unlock(); + obj._state_lock.unlock(); /* block the faulting thread until region manager is done */ - ipc_pager.reply_and_wait_for_fault(obj->sel_sm_block_pause()); + ipc_pager.reply_and_wait_for_fault(obj.sel_sm_block_pause()); } void Pager_object::exception(uint8_t exit_id) { - Thread *myself = Thread::myself(); - Utcb * utcb = reinterpret_cast(myself->utcb()); - Pager_activation_base * pager_thread = static_cast(myself); + Thread &myself = *Thread::myself(); + Utcb &utcb = *reinterpret_cast(myself.utcb()); + Pager_activation_base &pager_thread = static_cast(myself); - if (exit_id > PT_SEL_PARENT || !pager_thread) + if (exit_id > PT_SEL_PARENT) nova_die(); - addr_t fault_ip = utcb->ip; - uint8_t res = 0xFF; - addr_t mtd = 0; + addr_t const fault_ip = utcb.ip; + + uint8_t res = 0xFF; + addr_t mtd = 0; _state_lock.lock(); - /* remember exception type for cpu_session()->state() calls */ + /* remember exception type for Cpu_session::state() calls */ _state.thread.trapno = exit_id; if (_exception_sigh.valid()) { @@ -229,117 +229,113 @@ void Pager_object::exception(uint8_t exit_id) enum { TRAP_BREAKPOINT = 3 }; if (exit_id == TRAP_BREAKPOINT) { - utcb->ip = fault_ip - 1; - mtd = Mtd::EIP; + utcb.ip = fault_ip - 1; + mtd = Mtd::EIP; } } _state_lock.unlock(); - utcb->set_msg_word(0); - utcb->mtd = mtd; + utcb.set_msg_word(0); + utcb.mtd = mtd; - reply(myself->stack_top()); + reply(myself.stack_top()); } -void Pager_object::_recall_handler(addr_t pager_obj) +void Pager_object::_recall_handler(Pager_object &obj) { - Thread * myself = Thread::myself(); - Pager_object * obj = reinterpret_cast(pager_obj); - Utcb * utcb = reinterpret_cast(myself->utcb()); + Thread &myself = *Thread::myself(); + Utcb &utcb = *reinterpret_cast(myself.utcb()); - obj->_state_lock.lock(); + obj._state_lock.lock(); - if (obj->_state.modified) { - obj->_copy_state_to_utcb(utcb); - obj->_state.modified = false; + if (obj._state.modified) { + obj._copy_state_to_utcb(utcb); + obj._state.modified = false; } else - utcb->mtd = 0; + utcb.mtd = 0; /* switch on/off single step */ - bool singlestep_state = obj->_state.thread.eflags & 0x100UL; - if (obj->_state.singlestep() && !singlestep_state) { - utcb->flags |= 0x100UL; - utcb->mtd |= Mtd::EFL; - } else if (!obj->_state.singlestep() && singlestep_state) { - utcb->flags &= ~0x100UL; - utcb->mtd |= Mtd::EFL; + bool singlestep_state = obj._state.thread.eflags & 0x100UL; + if (obj._state.singlestep() && !singlestep_state) { + utcb.flags |= 0x100UL; + utcb.mtd |= Mtd::EFL; + } else if (!obj._state.singlestep() && singlestep_state) { + utcb.flags &= ~0x100UL; + utcb.mtd |= Mtd::EFL; } /* deliver signal if it was requested */ - if (obj->_state.to_submit()) - obj->submit_exception_signal(); + if (obj._state.to_submit()) + obj.submit_exception_signal(); - /* block until cpu_session()->resume() respectively wake_up() call */ + /* block until Cpu_session()::resume() respectively wake_up() call */ unsigned long sm = 0; - if (obj->_state.blocked()) { - sm = obj->sel_sm_block_pause(); - obj->_state.block_pause_sm(); + if (obj._state.blocked()) { + sm = obj.sel_sm_block_pause(); + obj._state.block_pause_sm(); } - obj->_state_lock.unlock(); + obj._state_lock.unlock(); - utcb->set_msg_word(0); - reply(myself->stack_top(), sm); + utcb.set_msg_word(0); + reply(myself.stack_top(), sm); } -void Pager_object::_startup_handler(addr_t pager_obj) +void Pager_object::_startup_handler(Pager_object &obj) { - Thread *myself = Thread::myself(); - Pager_object * obj = reinterpret_cast(pager_obj); - Utcb * utcb = reinterpret_cast(myself->utcb()); + Thread &myself = *Thread::myself(); + Utcb &utcb = *reinterpret_cast(myself.utcb()); - utcb->ip = obj->_initial_eip; - utcb->sp = obj->_initial_esp; + utcb.ip = obj._initial_eip; + utcb.sp = obj._initial_esp; + utcb.mtd = Mtd::EIP | Mtd::ESP; - utcb->mtd = Mtd::EIP | Mtd::ESP; - - if (obj->_state.singlestep()) { - utcb->flags = 0x100UL; - utcb->mtd |= Mtd::EFL; + if (obj._state.singlestep()) { + utcb.flags = 0x100UL; + utcb.mtd |= Mtd::EFL; } - obj->_state.unblock(); + obj._state.unblock(); - utcb->set_msg_word(0); + utcb.set_msg_word(0); - reply(myself->stack_top()); + reply(myself.stack_top()); } -void Pager_object::_invoke_handler(addr_t pager_obj) +void Pager_object::_invoke_handler(Pager_object &obj) { - Thread *myself = Thread::myself(); - Pager_object * obj = reinterpret_cast(pager_obj); - Utcb * utcb = reinterpret_cast(myself->utcb()); + Thread &myself = *Thread::myself(); + Utcb &utcb = *reinterpret_cast(myself.utcb()); /* receive window must be closed - otherwise implementation bug */ - if (utcb->crd_rcv.value()) + if (utcb.crd_rcv.value()) nova_die(); /* if protocol is violated ignore request */ - if (utcb->msg_words() != 1) { - utcb->mtd = 0; - utcb->set_msg_word(0); - reply(myself->stack_top()); + if (utcb.msg_words() != 1) { + utcb.mtd = 0; + utcb.set_msg_word(0); + reply(myself.stack_top()); } - addr_t const event = utcb->msg()[0]; + addr_t const event = utcb.msg()[0]; /* check for translated pager portals - required for vCPU in remote PDs */ - if (utcb->msg_items() == 1 && utcb->msg_words() == 1 && event == 0xaffe) { + if (utcb.msg_items() == 1 && utcb.msg_words() == 1 && event == 0xaffe) { - Nova::Utcb::Item const * const item = utcb->get_item(0); - Nova::Crd const cap(item->crd); + Nova::Utcb::Item const &item = *utcb.get_item(0); + Nova::Crd const cap(item.crd); /* valid item which got translated ? */ - if (!cap.is_null() && !item->is_del()) { - Rpc_entrypoint *e = core_env()->entrypoint(); - e->apply(cap.base(), + if (!cap.is_null() && !item.is_del()) { + Rpc_entrypoint &e = core_env().entrypoint(); + e.apply(cap.base(), [&] (Cpu_thread_component *source) { if (!source) return; @@ -350,22 +346,22 @@ void Pager_object::_invoke_handler(addr_t pager_obj) return; /* delegate VM-exit portals */ - map_vcpu_portals(*p.pager(), sel_exc_base, sel_exc_base, - utcb, obj->pd_sel()); + map_vcpu_portals(p.pager(), sel_exc_base, sel_exc_base, + utcb, obj.pd_sel()); /* delegate portal to contact pager */ - map_pagefault_portal(*obj, p.pager()->exc_pt_sel_client(), - sel_exc_base, obj->pd_sel(), utcb); + map_pagefault_portal(obj, p.pager().exc_pt_sel_client(), + sel_exc_base, obj.pd_sel(), utcb); }); } - utcb->mtd = 0; - utcb->set_msg_word(0); - reply(myself->stack_top()); + utcb.mtd = 0; + utcb.set_msg_word(0); + reply(myself.stack_top()); } - utcb->mtd = 0; - utcb->set_msg_word(0); + utcb.mtd = 0; + utcb.set_msg_word(0); /* native ec cap requested */ if (event == ~0UL) { @@ -382,32 +378,32 @@ void Pager_object::_invoke_handler(addr_t pager_obj) * takes care that the EC cap itself contains * no usable rights for the clients. */ - bool res = utcb->append_item(Obj_crd(obj->_state.sel_client_ec, 0, - Obj_crd::RIGHT_EC_RECALL), 0); + bool res = utcb.append_item(Obj_crd(obj._state.sel_client_ec, 0, + Obj_crd::RIGHT_EC_RECALL), 0); (void)res; } /* semaphore for signaling thread is requested, reuse PT_SEL_STARTUP. */ if (event == ~0UL - 1) { /* create semaphore only once */ - if (!obj->_state.has_signal_sm()) { + if (!obj._state.has_signal_sm()) { - revoke(Obj_crd(obj->exc_pt_sel_client() + PT_SEL_STARTUP, 0)); + revoke(Obj_crd(obj.exc_pt_sel_client() + PT_SEL_STARTUP, 0)); - bool res = Nova::create_sm(obj->exc_pt_sel_client() + PT_SEL_STARTUP, - platform_specific()->core_pd_sel(), 0); + bool res = Nova::create_sm(obj.exc_pt_sel_client() + PT_SEL_STARTUP, + platform_specific().core_pd_sel(), 0); if (res != Nova::NOVA_OK) - reply(myself->stack_top()); + reply(myself.stack_top()); - obj->_state.mark_signal_sm(); + obj._state.mark_signal_sm(); } - bool res = utcb->append_item(Obj_crd(obj->exc_pt_sel_client() + - PT_SEL_STARTUP, 0), 0); + bool res = utcb.append_item(Obj_crd(obj.exc_pt_sel_client() + + PT_SEL_STARTUP, 0), 0); (void)res; } - reply(myself->stack_top()); + reply(myself.stack_top()); } @@ -467,7 +463,7 @@ uint8_t Pager_object::_unsynchronized_client_recall(bool get_state_and_block) return res; if (get_state_and_block) { - Utcb *utcb = reinterpret_cast(Thread::myself()->utcb()); + Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); _copy_state_from_utcb(utcb); _state.block(); } @@ -487,17 +483,17 @@ void Pager_object::cleanup_call() /* revoke all portals handling the client. */ revoke(Obj_crd(exc_pt_sel_client(), NUM_INITIAL_PT_LOG2)); - Utcb *utcb = reinterpret_cast(Thread::myself()->utcb()); - utcb->set_msg_word(0); - utcb->mtd = 0; + Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); + utcb.set_msg_word(0); + utcb.mtd = 0; if (uint8_t res = call(sel_pt_cleanup())) - error(utcb, " - cleanup call to pager failed res=", res); + error(&utcb, " - cleanup call to pager failed res=", res); } void Pager_object::print(Output &out) const { - Platform_thread * faulter = reinterpret_cast(_badge); + Platform_thread const * const faulter = reinterpret_cast(_badge); Genode::print(out, "pager_object: pd='", faulter ? faulter->pd_name() : "unknown", "' thread='", faulter ? faulter->name() : "unknown", "'"); @@ -530,13 +526,13 @@ static uint8_t create_portal(addr_t pt, addr_t pd, addr_t ec, Mtd mtd, ************************/ template -void Exception_handlers::register_handler(Pager_object *obj, Mtd mtd, - void (* __attribute__((regparm(1))) func)(addr_t)) +void Exception_handlers::register_handler(Pager_object &obj, Mtd mtd, + void (* __attribute__((regparm(1))) func)(Pager_object &)) { - unsigned const genode_cpu_id = obj->location().xpos(); - unsigned const kernel_cpu_id = platform_specific()->kernel_cpu_id(genode_cpu_id); + unsigned const genode_cpu_id = obj.location().xpos(); + unsigned const kernel_cpu_id = platform_specific().kernel_cpu_id(genode_cpu_id); - if (!kernel_hip()->is_cpu_enabled(kernel_cpu_id) || + if (!kernel_hip().is_cpu_enabled(kernel_cpu_id) || !pager_threads[genode_cpu_id]) { warning("invalid CPU parameter used in pager object"); throw Invalid_thread(); @@ -546,22 +542,21 @@ void Exception_handlers::register_handler(Pager_object *obj, Mtd mtd, /* compiler generates instance of exception entry if not specified */ addr_t entry = func ? (addr_t)func : (addr_t)(&_handler); - uint8_t res = create_portal(obj->exc_pt_sel_client() + EV, - platform_specific()->core_pd_sel(), ec_sel, mtd, entry, obj); + uint8_t res = create_portal(obj.exc_pt_sel_client() + EV, + platform_specific().core_pd_sel(), ec_sel, mtd, entry, &obj); if (res != Nova::NOVA_OK) throw Invalid_thread(); } template -void Exception_handlers::_handler(addr_t obj) +void Exception_handlers::_handler(Pager_object &obj) { - Pager_object * pager_obj = reinterpret_cast(obj); - pager_obj->exception(EV); + obj.exception(EV); } -Exception_handlers::Exception_handlers(Pager_object *obj) +Exception_handlers::Exception_handlers(Pager_object &obj) { register_handler<0>(obj, Mtd(Mtd::EIP)); register_handler<1>(obj, Mtd(Mtd::EIP)); @@ -603,16 +598,16 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, Cpu_session::Name const &) : _badge(badge), - _selectors(cap_map()->insert(2)), - _client_exc_pt_sel(cap_map()->insert(NUM_INITIAL_PT_LOG2)), + _selectors(cap_map().insert(2)), + _client_exc_pt_sel(cap_map().insert(NUM_INITIAL_PT_LOG2)), _cpu_session_cap(cpu_session_cap), _thread_cap(thread_cap), _location(location), - _exceptions(this), + _exceptions(*this), _pd_target(Native_thread::INVALID_INDEX) { uint8_t res; - addr_t const pd_sel = platform_specific()->core_pd_sel(); + addr_t const pd_sel = platform_specific().core_pd_sel(); _state._status = 0; _state.modified = false; _state.sel_client_ec = Native_thread::INVALID_INDEX; @@ -630,8 +625,8 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, /* place Pager_object on specified CPU by selecting proper pager thread */ unsigned const genode_cpu_id = location.xpos(); - unsigned const kernel_cpu_id = platform_specific()->kernel_cpu_id(genode_cpu_id); - if (!kernel_hip()->is_cpu_enabled(kernel_cpu_id) || + unsigned const kernel_cpu_id = platform_specific().kernel_cpu_id(genode_cpu_id); + if (!kernel_hip().is_cpu_enabled(kernel_cpu_id) || !pager_threads[genode_cpu_id]) { warning("invalid CPU parameter used in pager object"); throw Invalid_thread(); @@ -640,18 +635,18 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, addr_t ec_sel = pager_threads[genode_cpu_id]->native_thread().ec_sel; /* create portal for page-fault handler - 14 */ - _exceptions.register_handler<14>(this, Mtd::QUAL | Mtd::EIP, + _exceptions.register_handler<14>(*this, Mtd::QUAL | Mtd::EIP, _page_fault_handler); /* create portal for startup handler - 26 */ Mtd const mtd_startup(Mtd::ESP | Mtd::EIP); - _exceptions.register_handler(this, mtd_startup, + _exceptions.register_handler(*this, mtd_startup, _startup_handler); /* create portal for recall handler - 31 */ Mtd const mtd_recall(Mtd::ESP | Mtd::EIP | Mtd::ACDB | Mtd::EFL | Mtd::EBSD | Mtd::FSGS); - _exceptions.register_handler(this, mtd_recall, + _exceptions.register_handler(*this, mtd_recall, _recall_handler); /* @@ -693,8 +688,8 @@ Pager_object::~Pager_object() /* revoke portal used for the cleanup call and sm cap for blocking state */ revoke(Obj_crd(_selectors, 2)); - cap_map()->remove(_selectors, 2, false); - cap_map()->remove(exc_pt_sel_client(), NUM_INITIAL_PT_LOG2, false); + cap_map().remove(_selectors, 2, false); + cap_map().remove(exc_pt_sel_client(), NUM_INITIAL_PT_LOG2, false); } @@ -711,7 +706,7 @@ uint8_t Pager_object::handle_oom(addr_t pd_from, addr_t pd_to, Policy policy, addr_t sm_notify, char const * dst_pd, char const * dst_thread) { - addr_t const core_pd_sel = platform_specific()->core_pd_sel(); + addr_t const core_pd_sel = platform_specific().core_pd_sel(); enum { QUOTA_TRANSFER_PAGES = 2 }; @@ -794,10 +789,10 @@ void Pager_object::_oom_handler(addr_t pager_dst, addr_t pager_src, asm volatile ("" : "=S" (reason)); } - Thread * myself = Thread::myself(); - Utcb * utcb = reinterpret_cast(myself->utcb()); - Pager_object * obj_dst = reinterpret_cast(pager_dst); - Pager_object * obj_src = reinterpret_cast(pager_src); + Thread &myself = *Thread::myself(); + Utcb &utcb = *reinterpret_cast(myself.utcb()); + Pager_object &obj_dst = *reinterpret_cast(pager_dst); + Pager_object &obj_src = *reinterpret_cast(pager_src); /* Policy used if the Process of the paged thread runs out of memory */ enum Policy policy = Policy::UPGRADE_CORE_TO_DST; @@ -819,19 +814,19 @@ void Pager_object::_oom_handler(addr_t pager_dst, addr_t pager_src, * This pager thread should never send words (untyped items) - it just * answers page faults by typed items (memory mappings). */ - assert |= utcb->msg_words(); + assert |= utcb.msg_words(); if (assert) { error("unknown OOM case - stop core pager thread"); - utcb->set_msg_word(0); - reply(myself->stack_top(), myself->native_thread().exc_pt_sel + Nova::SM_SEL_EC); + utcb.set_msg_word(0); + reply(myself.stack_top(), myself.native_thread().exc_pt_sel + Nova::SM_SEL_EC); } /* be strict in case of the -strict- STOP policy - stop causing thread */ if (policy == STOP) { error("PD has insufficient kernel memory left - stop thread"); - utcb->set_msg_word(0); - reply(myself->stack_top(), obj_dst->sel_sm_block_pause()); + utcb.set_msg_word(0); + reply(myself.stack_top(), obj_dst.sel_sm_block_pause()); } char const * src_pd = "core"; @@ -843,8 +838,8 @@ void Pager_object::_oom_handler(addr_t pager_dst, addr_t pager_src, case SRC_PD_UNKNOWN: /* should not happen on Genode - we create and know every PD in core */ error("Unknown PD has insufficient kernel memory left - stop thread"); - utcb->set_msg_word(0); - reply(myself->stack_top(), myself->native_thread().exc_pt_sel + Nova::SM_SEL_EC); + utcb.set_msg_word(0); + reply(myself.stack_top(), myself.native_thread().exc_pt_sel + Nova::SM_SEL_EC); case SRC_CORE_PD: /* core PD -> other PD, which has insufficient kernel resources */ @@ -852,33 +847,32 @@ void Pager_object::_oom_handler(addr_t pager_dst, addr_t pager_src, if (!(reason & SELF)) { /* case that src thread != this thread in core */ src_thread = "unknown"; - utcb->set_msg_word(0); + utcb.set_msg_word(0); } - transfer_from = platform_specific()->core_pd_sel(); + transfer_from = platform_specific().core_pd_sel(); break; default: /* non core PD -> non core PD */ - utcb->set_msg_word(0); + utcb.set_msg_word(0); if (pager_src == pager_dst || policy == UPGRADE_CORE_TO_DST) - transfer_from = platform_specific()->core_pd_sel(); + transfer_from = platform_specific().core_pd_sel(); else { /* delegation of items between different PDs */ - src_pd = obj_src->client_pd(); - src_thread = obj_src->client_thread(); - transfer_from = obj_src->pd_sel(); + src_pd = obj_src.client_pd(); + src_thread = obj_src.client_thread(); + transfer_from = obj_src.pd_sel(); } } - uint8_t res = obj_dst->handle_oom(transfer_from, src_pd, src_thread, - policy); + uint8_t res = obj_dst.handle_oom(transfer_from, src_pd, src_thread, policy); if (res == Nova::NOVA_OK) /* handling succeeded - continue with original IPC */ - reply(myself->stack_top()); + reply(myself.stack_top()); /* transfer nothing */ - utcb->set_msg_word(0); + utcb.set_msg_word(0); if (res != Nova::NOVA_PD_OOM) error("upgrading kernel memory failed, policy ", (int)policy, ", " @@ -887,7 +881,7 @@ void Pager_object::_oom_handler(addr_t pager_dst, addr_t pager_src, /* else: caller will get blocked until RCU period is over */ /* block caller in semaphore */ - reply(myself->stack_top(), obj_dst->sel_sm_block_oom()); + reply(myself.stack_top(), obj_dst.sel_sm_block_oom()); } @@ -895,10 +889,10 @@ addr_t Pager_object::get_oom_portal() { addr_t const pt_oom = sel_oom_portal(); unsigned const genode_cpu_id = _location.xpos(); - unsigned const kernel_cpu_id = platform_specific()->kernel_cpu_id(genode_cpu_id); - addr_t const core_pd_sel = platform_specific()->core_pd_sel(); + unsigned const kernel_cpu_id = platform_specific().kernel_cpu_id(genode_cpu_id); + addr_t const core_pd_sel = platform_specific().core_pd_sel(); - if (kernel_hip()->is_cpu_enabled(kernel_cpu_id) && + if (kernel_hip().is_cpu_enabled(kernel_cpu_id) && pager_threads[genode_cpu_id]) { addr_t const ec_sel = pager_threads[genode_cpu_id]->native_thread().ec_sel; @@ -934,7 +928,7 @@ const char * Pager_object::client_pd() const Pager_activation_base::Pager_activation_base(const char *name, size_t stack_size) : Thread(Cpu_session::Weight::DEFAULT_WEIGHT, name, stack_size, - Affinity::Location(which_cpu(this), 0)), + Affinity::Location(which_cpu(*this), 0)), _cap(Native_capability()), _ep(0), _cap_valid(Lock::LOCKED) { /* creates local EC */ @@ -954,8 +948,8 @@ void Pager_activation_base::entry() { } Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &) { /* sanity check for pager threads */ - if (kernel_hip()->cpu_max() > PAGER_CPUS) { - error("kernel supports more CPUs (", kernel_hip()->cpu_max(), ") " + if (kernel_hip().cpu_max() > PAGER_CPUS) { + error("kernel supports more CPUs (", kernel_hip().cpu_max(), ") " "than Genode (", (unsigned)PAGER_CPUS, ")"); nova_die(); } @@ -964,9 +958,9 @@ Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &) typedef Pager_activation Pager; Pager * pager_of_cpu = reinterpret_cast(&pager_activation_mem); - for (unsigned i = 0; i < kernel_hip()->cpus(); i++, pager_of_cpu++) { - unsigned const kernel_cpu_id = platform_specific()->kernel_cpu_id(i); - if (!kernel_hip()->is_cpu_enabled(kernel_cpu_id)) + for (unsigned i = 0; i < kernel_hip().cpus(); i++, pager_of_cpu++) { + unsigned const kernel_cpu_id = platform_specific().kernel_cpu_id(i); + if (!kernel_hip().is_cpu_enabled(kernel_cpu_id)) continue; pager_threads[i] = pager_of_cpu; @@ -975,8 +969,8 @@ Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &) } -void Pager_entrypoint::dissolve(Pager_object *obj) +void Pager_entrypoint::dissolve(Pager_object &obj) { /* take care that no faults are in-flight */ - obj->cleanup_call(); + obj.cleanup_call(); } diff --git a/repos/base-nova/src/core/pd_session_support.cc b/repos/base-nova/src/core/pd_session_support.cc index 204fb09ad..99a25a0a3 100644 --- a/repos/base-nova/src/core/pd_session_support.cc +++ b/repos/base-nova/src/core/pd_session_support.cc @@ -11,8 +11,9 @@ * under the terms of the GNU Affero General Public License version 3. */ -/* Core */ +/* core */ #include +#include using namespace Genode; @@ -34,10 +35,10 @@ bool Pd_session_component::assign_pci(addr_t pci_config_memory, uint16_t bdf) void Pd_session_component::map(addr_t virt, addr_t size) { - Genode::addr_t const pd_core = platform_specific()->core_pd_sel(); + Genode::addr_t const pd_core = platform_specific().core_pd_sel(); Platform_pd &target_pd = *_pd; Genode::addr_t const pd_dst = target_pd.pd_sel(); - Nova::Utcb *utcb = reinterpret_cast(Thread::myself()->utcb()); + Nova::Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); auto lambda = [&] (Region_map_component *region_map, Rm_region *region, @@ -45,26 +46,29 @@ void Pd_session_component::map(addr_t virt, addr_t size) addr_t const region_offset, addr_t const dst_region_size) -> addr_t { - Dataspace_component * dsc = region ? region->dataspace() : nullptr; + Dataspace_component * dsc = region ? ®ion->dataspace() : nullptr; if (!dsc) { struct No_dataspace{}; throw No_dataspace(); } + if (!region_map) { + ASSERT_NEVER_CALLED; + } Mapping mapping = Region_map_component::create_map_item(region_map, - region, + *region, ds_offset, region_offset, - dsc, virt, + *dsc, virt, dst_region_size); /* asynchronously map memory */ uint8_t err = Nova::NOVA_PD_OOM; do { - utcb->set_msg_word(0); - bool res = utcb->append_item(mapping.mem_crd(), 0, true, false, - false, mapping.dma(), - mapping.write_combined()); + utcb.set_msg_word(0); + bool res = utcb.append_item(mapping.mem_crd(), 0, true, false, + false, mapping.dma(), + mapping.write_combined()); /* one item ever fits on the UTCB */ (void)res; diff --git a/repos/base-nova/src/core/platform.cc b/repos/base-nova/src/core/platform.cc index 753520768..ec4247afb 100644 --- a/repos/base-nova/src/core/platform.cc +++ b/repos/base-nova/src/core/platform.cc @@ -58,7 +58,7 @@ extern addr_t __initial_sp; /** * Pointer to the UTCB of the main thread */ -Utcb *__main_thread_utcb; +static Utcb *__main_thread_utcb; /** @@ -79,14 +79,14 @@ addr_t Platform::_map_pages(addr_t const phys_addr, addr_t const pages, addr_t const size = pages << get_page_size_log2(); /* try to reserve contiguous virtual area */ - void *core_local_ptr = 0; - if (region_alloc()->alloc_aligned(size + (guard_page ? get_page_size() : 0), - &core_local_ptr, get_page_size_log2()).error()) + void *core_local_ptr = nullptr; + if (region_alloc().alloc_aligned(size + (guard_page ? get_page_size() : 0), + &core_local_ptr, get_page_size_log2()).error()) return 0; addr_t const core_local_addr = reinterpret_cast(core_local_ptr); - int res = map_local(_core_pd_sel, __main_thread_utcb, phys_addr, + int res = map_local(_core_pd_sel, *__main_thread_utcb, phys_addr, core_local_addr, pages, Nova::Rights(true, true, false), true); @@ -226,7 +226,7 @@ static addr_t init_core_page_fault_handler(addr_t const core_pd_sel) EXC_BASE = 0 }; - addr_t ec_sel = cap_map()->insert(1); + addr_t ec_sel = cap_map().insert(1); uint8_t ret = create_ec(ec_sel, core_pd_sel, boot_cpu(), CORE_PAGER_UTCB_ADDR, core_pager_stack_top(), @@ -276,14 +276,15 @@ struct Resolution : Register<64> ** Platform ** **************/ -Platform::Platform() : - _io_mem_alloc(core_mem_alloc()), _io_port_alloc(core_mem_alloc()), - _irq_alloc(core_mem_alloc()), +Platform::Platform() +: + _io_mem_alloc(&core_mem_alloc()), _io_port_alloc(&core_mem_alloc()), + _irq_alloc(&core_mem_alloc()), _vm_base(0x1000), _vm_size(0), _cpus(Affinity::Space(1,1)) { - Hip *hip = (Hip *)__initial_sp; + Hip const &hip = *(Hip *)__initial_sp; /* check for right API version */ - if (hip->api_version != 8) + if (hip.api_version != 8) nova_die(); /* @@ -295,23 +296,23 @@ Platform::Platform() : * 'Platform_thread::_location' in 'platform_thread.cc'. Also look * at the 'Thread::start' function in core/thread_start.cc. */ - _cpus = Affinity::Space(hip->cpus(), 1); + _cpus = Affinity::Space(hip.cpus(), 1); /* register UTCB of main thread */ __main_thread_utcb = (Utcb *)(__initial_sp - get_page_size()); /* set core pd selector */ - _core_pd_sel = hip->sel_exc; + _core_pd_sel = hip.sel_exc; /* create lock used by capability allocator */ Nova::create_sm(Nova::SM_SEL_EC, core_pd_sel(), 0); /* locally map the whole I/O port range */ enum { ORDER_64K = 16 }; - map_local_one_to_one(__main_thread_utcb, Io_crd(0, ORDER_64K), _core_pd_sel); + map_local_one_to_one(*__main_thread_utcb, Io_crd(0, ORDER_64K), _core_pd_sel); /* map BDA region, console reads IO ports at BDA_VIRT_ADDR + 0x400 */ enum { BDA_PHY = 0x0U, BDA_VIRT = 0x1U, BDA_VIRT_ADDR = 0x1000U }; - map_local_phys_to_virt(__main_thread_utcb, + map_local_phys_to_virt(*__main_thread_utcb, Mem_crd(BDA_PHY, 0, Rights(true, false, false)), Mem_crd(BDA_VIRT, 0, Rights(true, false, false)), _core_pd_sel); @@ -326,50 +327,50 @@ Platform::Platform() : * we do this that early, because Core_mem_allocator uses * the main_thread_utcb very early to establish mappings */ - if (map_local(_core_pd_sel, __main_thread_utcb, (addr_t)__main_thread_utcb, + if (map_local(_core_pd_sel, *__main_thread_utcb, (addr_t)__main_thread_utcb, (addr_t)main_thread_utcb(), 1, Rights(true, true, false))) { error("could not remap utcb of main thread"); nova_die(); } /* sanity checks */ - if (hip->sel_exc + 3 > NUM_INITIAL_PT_RESERVED) { + if (hip.sel_exc + 3 > NUM_INITIAL_PT_RESERVED) { error("configuration error (NUM_INITIAL_PT_RESERVED)"); nova_die(); } /* init genode cpu ids based on kernel cpu ids (used for syscalls) */ - if (sizeof(map_cpu_ids) / sizeof(map_cpu_ids[0]) < hip->cpu_max()) { - error("number of max CPUs is larger than expected - ", hip->cpu_max(), + if (sizeof(map_cpu_ids) / sizeof(map_cpu_ids[0]) < hip.cpu_max()) { + error("number of max CPUs is larger than expected - ", hip.cpu_max(), " vs ", sizeof(map_cpu_ids) / sizeof(map_cpu_ids[0])); nova_die(); } - if (!hip->remap_cpu_ids(map_cpu_ids, boot_cpu())) { + if (!hip.remap_cpu_ids(map_cpu_ids, boot_cpu())) { error("re-ording cpu_id failed"); nova_die(); } /* map idle SCs */ - unsigned const log2cpu = log2(hip->cpu_max()); - if ((1U << log2cpu) != hip->cpu_max()) { + unsigned const log2cpu = log2(hip.cpu_max()); + if ((1U << log2cpu) != hip.cpu_max()) { error("number of max CPUs is not of power of 2"); nova_die(); } - addr_t sc_idle_base = cap_map()->insert(log2cpu + 1); + addr_t sc_idle_base = cap_map().insert(log2cpu + 1); if (sc_idle_base & ((1UL << log2cpu) - 1)) { error("unaligned sc_idle_base value ", Hex(sc_idle_base)); nova_die(); } - if (map_local(_core_pd_sel, __main_thread_utcb, Obj_crd(0, log2cpu), + if (map_local(_core_pd_sel, *__main_thread_utcb, Obj_crd(0, log2cpu), Obj_crd(sc_idle_base, log2cpu), true)) nova_die(); /* test reading out idle SCs */ bool sc_init = true; - for (unsigned i = 0; i < hip->cpu_max(); i++) { + for (unsigned i = 0; i < hip.cpu_max(); i++) { - if (!hip->is_cpu_enabled(i)) + if (!hip.is_cpu_enabled(i)) continue; uint64_t n_time; @@ -393,9 +394,9 @@ Platform::Platform() : addr_t const ec_core_exc_sel = init_core_page_fault_handler(core_pd_sel()); if (verbose_boot_info) { - if (hip->has_feature_vmx()) + if (hip.has_feature_vmx()) log("Hypervisor features VMX"); - if (hip->has_feature_svm()) + if (hip.has_feature_svm()) log("Hypervisor features SVM"); log("Hypervisor reports ", _cpus.width(), "x", _cpus.height(), " " "CPU", _cpus.total() > 1 ? "s" : " "); @@ -403,28 +404,36 @@ Platform::Platform() : warning("CPU has no invariant TSC."); log("CPU ID (genode->kernel:package:core:thread) remapping"); - unsigned const cpus = hip->cpus(); - for (unsigned i = 0; i < cpus; i++) - log(" remap (", i, "->", map_cpu_ids[i], ":", - hip->cpu_desc_of_cpu(map_cpu_ids[i])->package, ":", - hip->cpu_desc_of_cpu(map_cpu_ids[i])->core, ":", - hip->cpu_desc_of_cpu(map_cpu_ids[i])->thread, ") ", - boot_cpu() == map_cpu_ids[i] ? "boot cpu" : ""); + unsigned const cpus = hip.cpus(); + for (unsigned i = 0; i < cpus; i++) { + + Hip::Cpu_desc const * const cpu_desc_ptr = hip.cpu_desc_of_cpu(map_cpu_ids[i]); + + if (cpu_desc_ptr) { + log(" remap (", i, "->", map_cpu_ids[i], ":", + cpu_desc_ptr->package, ":", + cpu_desc_ptr->core, ":", + cpu_desc_ptr->thread, ") ", + boot_cpu() == map_cpu_ids[i] ? "boot cpu" : ""); + } else { + error("missing descriptor for CPU ", i); + } + } } /* initialize core allocators */ - size_t const num_mem_desc = (hip->hip_length - hip->mem_desc_offset) - / hip->mem_desc_size; + size_t const num_mem_desc = (hip.hip_length - hip.mem_desc_offset) + / hip.mem_desc_size; if (verbose_boot_info) log("Hypervisor info page contains ", num_mem_desc, " memory descriptors:"); - addr_t mem_desc_base = ((addr_t)hip + hip->mem_desc_offset); + addr_t mem_desc_base = ((addr_t)&hip + hip.mem_desc_offset); /* define core's virtual address space */ addr_t virt_beg = _vm_base; addr_t virt_end = _vm_size; - _core_mem_alloc.virt_alloc()->add_range(virt_beg, virt_end - virt_beg); + _core_mem_alloc.virt_alloc().add_range(virt_beg, virt_end - virt_beg); /* exclude core image from core's virtual address allocator */ addr_t const core_virt_beg = trunc_page((addr_t)&_prog_img_beg); @@ -433,7 +442,7 @@ Platform::Platform() : addr_t const binaries_end = round_page((addr_t)&_boot_modules_binaries_end); size_t const core_size = binaries_beg - core_virt_beg; - region_alloc()->remove_range(core_virt_beg, core_size); + region_alloc().remove_range(core_virt_beg, core_size); if (verbose_boot_info || binaries_end != core_virt_end) { log("core image ", @@ -447,22 +456,22 @@ Platform::Platform() : /* ROM modules are un-used by core - de-detach region */ addr_t const binaries_size = binaries_end - binaries_beg; - unmap_local(__main_thread_utcb, binaries_beg, binaries_size >> 12); + unmap_local(*__main_thread_utcb, binaries_beg, binaries_size >> 12); /* preserve Bios Data Area (BDA) in core's virtual address space */ - region_alloc()->remove_range(BDA_VIRT_ADDR, 0x1000); + region_alloc().remove_range(BDA_VIRT_ADDR, 0x1000); /* preserve stack area in core's virtual address space */ - region_alloc()->remove_range(stack_area_virtual_base(), - stack_area_virtual_size()); + region_alloc().remove_range(stack_area_virtual_base(), + stack_area_virtual_size()); /* exclude utcb of core pager thread + empty guard pages before and after */ - region_alloc()->remove_range(CORE_PAGER_UTCB_ADDR - get_page_size(), - get_page_size() * 3); + region_alloc().remove_range(CORE_PAGER_UTCB_ADDR - get_page_size(), + get_page_size() * 3); /* exclude utcb of main thread and hip + empty guard pages before and after */ - region_alloc()->remove_range((addr_t)__main_thread_utcb - get_page_size(), - get_page_size() * 4); + region_alloc().remove_range((addr_t)__main_thread_utcb - get_page_size(), + get_page_size() * 4); /* sanity checks */ addr_t check [] = { @@ -532,7 +541,7 @@ Platform::Platform() : " - size: ", Hex(size, Hex::PREFIX, Hex::PAD)); _io_mem_alloc.remove_range(base, size); - ram_alloc()->add_range(base, size); + ram_alloc().add_range(base, size); } uint64_t hyp_log = 0; @@ -583,12 +592,12 @@ Platform::Platform() : mem_desc->type == Hip::Mem_desc::ACPI_NVS_MEMORY) _io_mem_alloc.add_range(base, size); - ram_alloc()->remove_range(base, size); + ram_alloc().remove_range(base, size); } /* needed as I/O memory by the VESA driver */ _io_mem_alloc.add_range(0, 0x1000); - ram_alloc()->remove_range(0, 0x1000); + ram_alloc().remove_range(0, 0x1000); /* exclude pages holding multi-boot command lines from core allocators */ mem_desc = (Hip::Mem_desc *)mem_desc_base; @@ -600,8 +609,8 @@ Platform::Platform() : curr_cmd_line_page = mem_desc->aux >> get_page_size_log2(); if (curr_cmd_line_page == prev_cmd_line_page) continue; - ram_alloc()->remove_range(curr_cmd_line_page << get_page_size_log2(), - get_page_size() * 2); + ram_alloc().remove_range(curr_cmd_line_page << get_page_size_log2(), + get_page_size() * 2); prev_cmd_line_page = curr_cmd_line_page; } @@ -661,14 +670,14 @@ Platform::Platform() : unsigned const pages = 1; void * phys_ptr = nullptr; - if (ram_alloc()->alloc_aligned(get_page_size(), &phys_ptr, - get_page_size_log2()).ok()) { + if (ram_alloc().alloc_aligned(get_page_size(), &phys_ptr, + get_page_size_log2()).ok()) { addr_t const phys_addr = reinterpret_cast(phys_ptr); addr_t const core_local_addr = _map_pages(phys_addr, pages); if (!core_local_addr) { - ram_alloc()->free(phys_ptr); + ram_alloc().free(phys_ptr); } else { Genode::Xml_generator xml(reinterpret_cast(core_local_addr), @@ -703,35 +712,44 @@ Platform::Platform() : }); xml.node("hardware", [&] () { xml.node("features", [&] () { - xml.attribute("svm", hip->has_feature_svm()); - xml.attribute("vmx", hip->has_feature_vmx()); + xml.attribute("svm", hip.has_feature_svm()); + xml.attribute("vmx", hip.has_feature_vmx()); }); xml.node("tsc", [&] () { xml.attribute("invariant", cpuid_invariant_tsc()); - xml.attribute("freq_khz" , hip->tsc_freq); + xml.attribute("freq_khz" , hip.tsc_freq); }); xml.node("cpus", [&] () { - unsigned const cpus = hip->cpus(); + unsigned const cpus = hip.cpus(); for (unsigned i = 0; i < cpus; i++) { + + Hip::Cpu_desc const * const cpu_desc_ptr = + hip.cpu_desc_of_cpu(Platform::kernel_cpu_id(i)); + + if (!cpu_desc_ptr) + continue; + + Hip::Cpu_desc const &cpu_desc = *cpu_desc_ptr; + xml.node("cpu", [&] () { - unsigned const kernel_cpu_id = Platform::kernel_cpu_id(i); xml.attribute("id", i); - xml.attribute("package", hip->cpu_desc_of_cpu(kernel_cpu_id)->package); - xml.attribute("core", hip->cpu_desc_of_cpu(kernel_cpu_id)->core); - xml.attribute("thread", hip->cpu_desc_of_cpu(kernel_cpu_id)->thread); - xml.attribute("family", String<5>(Hex(hip->cpu_desc_of_cpu(kernel_cpu_id)->family))); - xml.attribute("model", String<5>(Hex(hip->cpu_desc_of_cpu(kernel_cpu_id)->model))); - xml.attribute("stepping", String<5>(Hex(hip->cpu_desc_of_cpu(kernel_cpu_id)->stepping))); - xml.attribute("platform", String<5>(Hex(hip->cpu_desc_of_cpu(kernel_cpu_id)->platform))); - xml.attribute("patch", String<12>(Hex(hip->cpu_desc_of_cpu(kernel_cpu_id)->patch))); + xml.attribute("package", cpu_desc.package); + xml.attribute("core", cpu_desc.core); + xml.attribute("thread", cpu_desc.thread); + xml.attribute("family", String<5>(Hex(cpu_desc.family))); + xml.attribute("model", String<5>(Hex(cpu_desc.model))); + xml.attribute("stepping", String<5>(Hex(cpu_desc.stepping))); + xml.attribute("platform", String<5>(Hex(cpu_desc.platform))); + xml.attribute("patch", String<12>(Hex(cpu_desc.patch))); }); } }); }); }); - unmap_local(__main_thread_utcb, core_local_addr, pages); - region_alloc()->free(reinterpret_cast(core_local_addr), pages * get_page_size()); + unmap_local(*__main_thread_utcb, core_local_addr, pages); + region_alloc().free(reinterpret_cast(core_local_addr), + pages * get_page_size()); _rom_fs.insert(new (core_mem_alloc()) Rom_module(phys_addr, pages * get_page_size(), @@ -746,8 +764,8 @@ Platform::Platform() : unsigned const pages = 4; size_t const log_size = pages << get_page_size_log2(); - if (ram_alloc()->alloc_aligned(log_size, &phys_ptr, - get_page_size_log2()).ok()) { + if (ram_alloc().alloc_aligned(log_size, &phys_ptr, + get_page_size_log2()).ok()) { addr_t const phys_addr = reinterpret_cast(phys_ptr); @@ -760,7 +778,7 @@ Platform::Platform() : init_core_log( Core_log_range { virt, log_size } ); } else - ram_alloc()->free(phys_ptr); + ram_alloc().free(phys_ptr); } } @@ -773,8 +791,8 @@ Platform::Platform() : _io_port_alloc.add_range(0, 0x10000); /* IRQ allocator */ - _irq_alloc.add_range(0, hip->sel_gsi); - _gsi_base_sel = (hip->mem_desc_offset - hip->cpu_desc_offset) / hip->cpu_desc_size; + _irq_alloc.add_range(0, hip.sel_gsi); + _gsi_base_sel = (hip.mem_desc_offset - hip.cpu_desc_offset) / hip.cpu_desc_size; log(_rom_fs); @@ -786,24 +804,24 @@ Platform::Platform() : for (unsigned i = 0; i < 32; i++) { void * phys_ptr = nullptr; - if (ram_alloc()->alloc_aligned(get_page_size(), &phys_ptr, - get_page_size_log2()).error()) + if (ram_alloc().alloc_aligned(get_page_size(), &phys_ptr, + get_page_size_log2()).error()) break; addr_t phys_addr = reinterpret_cast(phys_ptr); addr_t core_local_addr = _map_pages(phys_addr, 1); if (!core_local_addr) { - ram_alloc()->free(phys_ptr); + ram_alloc().free(phys_ptr); break; } - Cap_range * range = reinterpret_cast(core_local_addr); - construct_at(range, index); + Cap_range &range = *reinterpret_cast(core_local_addr); + construct_at(&range, index); - cap_map()->insert(range); + cap_map().insert(range); - index = range->base() + range->elements(); + index = range.base() + range.elements(); } _max_caps = index - first_index; @@ -812,7 +830,7 @@ Platform::Platform() : unsigned kernel_cpu_id = Platform::kernel_cpu_id(genode_cpu_id); - if (!hip->is_cpu_enabled(kernel_cpu_id)) + if (!hip.is_cpu_enabled(kernel_cpu_id)) continue; struct Trace_source : public Trace::Source::Info_accessor, @@ -914,7 +932,7 @@ Platform::Platform() : new (core_mem_alloc()) Core_trace_source(Trace::sources(), Affinity::Location(0, 0, _cpus.width(), 1), - hip->sel_exc + 1, "root"); + hip.sel_exc + 1, "root"); } @@ -942,11 +960,11 @@ bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr, unsigned size) { /* platform_specific()->core_pd_sel() deadlocks if called from platform constructor */ - Hip const * const hip = (Hip const * const)__initial_sp; - Genode::addr_t const core_pd_sel = hip->sel_exc; + Hip const &hip = *(Hip const * const)__initial_sp; + Genode::addr_t const core_pd_sel = hip.sel_exc; map_local(core_pd_sel, - (Utcb *)Thread::myself()->utcb(), phys_addr, + *(Utcb *)Thread::myself()->utcb(), phys_addr, virt_addr, size / get_page_size(), Rights(true, true, false), true); return true; @@ -955,7 +973,7 @@ bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr, bool Mapped_mem_allocator::_unmap_local(addr_t virt_addr, addr_t, unsigned size) { - unmap_local((Utcb *)Thread::myself()->utcb(), + unmap_local(*(Utcb *)Thread::myself()->utcb(), virt_addr, size / get_page_size()); return true; } diff --git a/repos/base-nova/src/core/platform_pd.cc b/repos/base-nova/src/core/platform_pd.cc index 32bf1d3f9..705889e8e 100644 --- a/repos/base-nova/src/core/platform_pd.cc +++ b/repos/base-nova/src/core/platform_pd.cc @@ -26,15 +26,15 @@ using namespace Genode; ** Public object members ** ***************************/ -bool Platform_pd::bind_thread(Platform_thread *thread) +bool Platform_pd::bind_thread(Platform_thread &thread) { - thread->bind_to_pd(this, _thread_cnt == 0); + thread.bind_to_pd(this, _thread_cnt == 0); _thread_cnt++; return true; } -void Platform_pd::unbind_thread(Platform_thread *) +void Platform_pd::unbind_thread(Platform_thread &) { warning(__func__, "not implemented"); } @@ -47,8 +47,8 @@ void Platform_pd::assign_parent(Native_capability parent) } -Platform_pd::Platform_pd(Allocator *, char const *label, signed, bool) -: _thread_cnt(0), _pd_sel(cap_map()->insert()), _label(label) +Platform_pd::Platform_pd(Allocator &, char const *label, signed, bool) +: _thread_cnt(0), _pd_sel(cap_map().insert()), _label(label) { if (_pd_sel == Native_thread::INVALID_INDEX) { error("platform pd creation failed "); @@ -57,7 +57,7 @@ Platform_pd::Platform_pd(Allocator *, char const *label, signed, bool) /* create task */ enum { KEEP_FREE_PAGES_NOT_AVAILABLE_FOR_UPGRADE = 2, UPPER_LIMIT_PAGES = 32 }; - uint8_t res = Nova::create_pd(_pd_sel, platform_specific()->core_pd_sel(), + uint8_t res = Nova::create_pd(_pd_sel, platform_specific().core_pd_sel(), Nova::Obj_crd(), KEEP_FREE_PAGES_NOT_AVAILABLE_FOR_UPGRADE, UPPER_LIMIT_PAGES); @@ -74,7 +74,7 @@ Platform_pd::~Platform_pd() /* Revoke and free cap, pd is gone */ Nova::revoke(Nova::Obj_crd(_pd_sel, 0)); - cap_map()->remove(_pd_sel, 0, false); + cap_map().remove(_pd_sel, 0, false); } diff --git a/repos/base-nova/src/core/platform_thread.cc b/repos/base-nova/src/core/platform_thread.cc index f745f4024..a986abe7e 100644 --- a/repos/base-nova/src/core/platform_thread.cc +++ b/repos/base-nova/src/core/platform_thread.cc @@ -37,12 +37,12 @@ using namespace Genode; static uint8_t map_thread_portals(Pager_object &pager, addr_t const target_exc_base, - Nova::Utcb *utcb) + Nova::Utcb &utcb) { using Nova::Obj_crd; using Nova::NUM_INITIAL_PT_LOG2; - addr_t const source_pd = platform_specific()->core_pd_sel(); + addr_t const source_pd = platform_specific().core_pd_sel(); addr_t const source_exc_base = pager.exc_pt_sel_client(); addr_t const target_pd = pager.pd_sel(); @@ -89,9 +89,9 @@ int Platform_thread::start(void *ip, void *sp) return -2; } - Utcb * const utcb = reinterpret_cast(Thread::myself()->utcb()); - unsigned const kernel_cpu_id = platform_specific()->kernel_cpu_id(_location.xpos()); - addr_t const source_pd = platform_specific()->core_pd_sel(); + Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); + unsigned const kernel_cpu_id = platform_specific().kernel_cpu_id(_location.xpos()); + addr_t const source_pd = platform_specific().core_pd_sel(); addr_t const pt_oom = _pager->get_oom_portal(); if (!pt_oom || map_local(source_pd, utcb, @@ -313,9 +313,9 @@ unsigned long long Platform_thread::execution_time() const } -void Platform_thread::pager(Pager_object *pager) +void Platform_thread::pager(Pager_object &pager) { - _pager = pager; + _pager = &pager; _pager->assign_pd(_pd->pd_sel()); } @@ -340,7 +340,7 @@ void Platform_thread::thread_type(Nova_native_cpu::Thread_type thread_type, Platform_thread::Platform_thread(size_t, const char *name, unsigned prio, Affinity::Location affinity, int) : - _pd(0), _pager(0), _id_base(cap_map()->insert(2)), + _pd(0), _pager(0), _id_base(cap_map().insert(2)), _sel_exc_base(Native_thread::INVALID_INDEX), _location(affinity), _features(0), _priority(Cpu_session::scale_priority(Nova::Qpd::DEFAULT_PRIORITY, prio)), @@ -370,5 +370,5 @@ Platform_thread::~Platform_thread() /* free ec and sc caps */ revoke(Obj_crd(_id_base, 2)); - cap_map()->remove(_id_base, 2, false); + cap_map().remove(_id_base, 2, false); } diff --git a/repos/base-nova/src/core/ram_dataspace_support.cc b/repos/base-nova/src/core/ram_dataspace_support.cc index 0c5043b3d..342586dc1 100644 --- a/repos/base-nova/src/core/ram_dataspace_support.cc +++ b/repos/base-nova/src/core/ram_dataspace_support.cc @@ -26,10 +26,10 @@ using namespace Genode; -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } -static inline void * alloc_region(Dataspace_component *ds, const size_t size) +static inline void * alloc_region(Dataspace_component &ds, const size_t size) { /* * Allocate range in core's virtual address space @@ -38,10 +38,10 @@ static inline void * alloc_region(Dataspace_component *ds, const size_t size) * successively weaken the alignment constraint until we hit the page size. */ void *virt_addr = 0; - size_t align_log2 = log2(ds->size()); + size_t align_log2 = log2(ds.size()); for (; align_log2 >= get_page_size_log2(); align_log2--) { - if (platform()->region_alloc()->alloc_aligned(size, - &virt_addr, align_log2).ok()) + if (platform().region_alloc().alloc_aligned(size, + &virt_addr, align_log2).ok()) break; } @@ -49,12 +49,12 @@ static inline void * alloc_region(Dataspace_component *ds, const size_t size) } -void Ram_dataspace_factory::_clear_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_clear_ds(Dataspace_component &ds) { - size_t page_rounded_size = align_addr(ds->size(), get_page_size_log2()); + size_t const page_rounded_size = align_addr(ds.size(), get_page_size_log2()); size_t memset_count = page_rounded_size / 4; - addr_t memset_ptr = ds->core_local_addr(); + addr_t memset_ptr = ds.core_local_addr(); if ((memset_count * 4 == page_rounded_size) && !(memset_ptr & 0x3)) asm volatile ("rep stosl" : "+D" (memset_ptr), "+c" (memset_count) @@ -63,37 +63,37 @@ void Ram_dataspace_factory::_clear_ds(Dataspace_component *ds) memset(reinterpret_cast(memset_ptr), 0, page_rounded_size); /* we don't keep any core-local mapping */ - unmap_local(reinterpret_cast(Thread::myself()->utcb()), - ds->core_local_addr(), + unmap_local(*reinterpret_cast(Thread::myself()->utcb()), + ds.core_local_addr(), page_rounded_size >> get_page_size_log2()); - platform()->region_alloc()->free((void*)ds->core_local_addr(), - page_rounded_size); + platform().region_alloc().free((void*)ds.core_local_addr(), + page_rounded_size); - ds->assign_core_local_addr(nullptr); + ds.assign_core_local_addr(nullptr); } -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *ds) { +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &ds) { - size_t page_rounded_size = align_addr(ds->size(), get_page_size_log2()); + size_t page_rounded_size = align_addr(ds.size(), get_page_size_log2()); /* allocate the virtual region contiguous for the dataspace */ - void * virt_ptr = alloc_region(ds, page_rounded_size); + void * const virt_ptr = alloc_region(ds, page_rounded_size); if (!virt_ptr) throw Core_virtual_memory_exhausted(); /* map it writeable for _clear_ds */ - Nova::Utcb * const utcb = reinterpret_cast(Thread::myself()->utcb()); + Nova::Utcb &utcb = *reinterpret_cast(Thread::myself()->utcb()); const Nova::Rights rights_rw(true, true, false); - if (map_local(platform_specific()->core_pd_sel(), utcb, ds->phys_addr(), + if (map_local(platform_specific().core_pd_sel(), utcb, ds.phys_addr(), reinterpret_cast(virt_ptr), page_rounded_size >> get_page_size_log2(), rights_rw, true)) { - platform()->region_alloc()->free(virt_ptr, page_rounded_size); + platform().region_alloc().free(virt_ptr, page_rounded_size); throw Core_virtual_memory_exhausted(); } /* assign virtual address to the dataspace to be used by clear_ds */ - ds->assign_core_local_addr(virt_ptr); + ds.assign_core_local_addr(virt_ptr); } diff --git a/repos/base-nova/src/core/rpc_cap_factory.cc b/repos/base-nova/src/core/rpc_cap_factory.cc index 04574a46a..a2fdb4d0c 100644 --- a/repos/base-nova/src/core/rpc_cap_factory.cc +++ b/repos/base-nova/src/core/rpc_cap_factory.cc @@ -23,8 +23,8 @@ using namespace Genode; Native_capability Rpc_cap_factory::alloc(Native_capability ep, addr_t entry, addr_t mtd) { - addr_t const pt_sel = cap_map()->insert(); - addr_t const pd_sel = platform_specific()->core_pd_sel(); + addr_t const pt_sel = cap_map().insert(); + addr_t const pd_sel = platform_specific().core_pd_sel(); addr_t const ec_sel = ep.local_name(); using namespace Nova; @@ -54,7 +54,7 @@ Native_capability Rpc_cap_factory::alloc(Native_capability ep, addr_t entry, add destroy(&_slab, pt_cap); /* cleanup unused selectors */ - cap_map()->remove(pt_sel, 0, false); + cap_map().remove(pt_sel, 0, false); return Native_capability(); } @@ -69,7 +69,7 @@ void Rpc_cap_factory::free(Native_capability cap) for (Cap_object *obj = _list.first(); obj ; obj = obj->next()) { if (cap.local_name() == (long)obj->_cap_sel) { Nova::revoke(Nova::Obj_crd(obj->_cap_sel, 0)); - cap_map()->remove(obj->_cap_sel, 0, false); + cap_map().remove(obj->_cap_sel, 0, false); _list.remove(obj); destroy(&_slab, obj); @@ -90,7 +90,7 @@ Rpc_cap_factory::~Rpc_cap_factory() for (Cap_object *obj; (obj = _list.first()); ) { Nova::revoke(Nova::Obj_crd(obj->_cap_sel, 0)); - cap_map()->remove(obj->_cap_sel, 0, false); + cap_map().remove(obj->_cap_sel, 0, false); _list.remove(obj); destroy(&_slab, obj); diff --git a/repos/base-nova/src/core/spec/x86_32/pager.cc b/repos/base-nova/src/core/spec/x86_32/pager.cc index bd43ff88c..e0bb2652c 100644 --- a/repos/base-nova/src/core/spec/x86_32/pager.cc +++ b/repos/base-nova/src/core/spec/x86_32/pager.cc @@ -19,42 +19,43 @@ using namespace Genode; -void Pager_object::_copy_state_from_utcb(Nova::Utcb * utcb) +void Pager_object::_copy_state_from_utcb(Nova::Utcb const &utcb) { - _state.thread.eax = utcb->ax; - _state.thread.ecx = utcb->cx; - _state.thread.edx = utcb->dx; - _state.thread.ebx = utcb->bx; + _state.thread.eax = utcb.ax; + _state.thread.ecx = utcb.cx; + _state.thread.edx = utcb.dx; + _state.thread.ebx = utcb.bx; - _state.thread.ebp = utcb->bp; - _state.thread.esi = utcb->si; - _state.thread.edi = utcb->di; + _state.thread.ebp = utcb.bp; + _state.thread.esi = utcb.si; + _state.thread.edi = utcb.di; - _state.thread.sp = utcb->sp; - _state.thread.ip = utcb->ip; - _state.thread.eflags = utcb->flags; + _state.thread.sp = utcb.sp; + _state.thread.ip = utcb.ip; + _state.thread.eflags = utcb.flags; - _state.thread.exception = utcb->qual[0]; + _state.thread.exception = utcb.qual[0]; } -void Pager_object::_copy_state_to_utcb(Nova::Utcb * utcb) + +void Pager_object::_copy_state_to_utcb(Nova::Utcb &utcb) const { - utcb->ax = _state.thread.eax; - utcb->cx = _state.thread.ecx; - utcb->dx = _state.thread.edx; - utcb->bx = _state.thread.ebx; + utcb.ax = _state.thread.eax; + utcb.cx = _state.thread.ecx; + utcb.dx = _state.thread.edx; + utcb.bx = _state.thread.ebx; - utcb->bp = _state.thread.ebp; - utcb->si = _state.thread.esi; - utcb->di = _state.thread.edi; + utcb.bp = _state.thread.ebp; + utcb.si = _state.thread.esi; + utcb.di = _state.thread.edi; - utcb->sp = _state.thread.sp; - utcb->ip = _state.thread.ip; - utcb->flags = _state.thread.eflags; + utcb.sp = _state.thread.sp; + utcb.ip = _state.thread.ip; + utcb.flags = _state.thread.eflags; - utcb->mtd = Nova::Mtd::ACDB | - Nova::Mtd::EBSD | - Nova::Mtd::ESP | - Nova::Mtd::EIP | - Nova::Mtd::EFL; + utcb.mtd = Nova::Mtd::ACDB | + Nova::Mtd::EBSD | + Nova::Mtd::ESP | + Nova::Mtd::EIP | + Nova::Mtd::EFL; } diff --git a/repos/base-nova/src/core/spec/x86_64/pager.cc b/repos/base-nova/src/core/spec/x86_64/pager.cc index 450b2f0a4..68b7ad555 100644 --- a/repos/base-nova/src/core/spec/x86_64/pager.cc +++ b/repos/base-nova/src/core/spec/x86_64/pager.cc @@ -19,62 +19,62 @@ using namespace Genode; -void Pager_object::_copy_state_from_utcb(Nova::Utcb * utcb) +void Pager_object::_copy_state_from_utcb(Nova::Utcb const &utcb) { - _state.thread.rax = utcb->ax; - _state.thread.rcx = utcb->cx; - _state.thread.rdx = utcb->dx; - _state.thread.rbx = utcb->bx; + _state.thread.rax = utcb.ax; + _state.thread.rcx = utcb.cx; + _state.thread.rdx = utcb.dx; + _state.thread.rbx = utcb.bx; - _state.thread.rbp = utcb->bp; - _state.thread.rsi = utcb->si; - _state.thread.rdi = utcb->di; + _state.thread.rbp = utcb.bp; + _state.thread.rsi = utcb.si; + _state.thread.rdi = utcb.di; - _state.thread.r8 = utcb->r8; - _state.thread.r9 = utcb->r9; - _state.thread.r10 = utcb->r10; - _state.thread.r11 = utcb->r11; - _state.thread.r12 = utcb->r12; - _state.thread.r13 = utcb->r13; - _state.thread.r14 = utcb->r14; - _state.thread.r15 = utcb->r15; + _state.thread.r8 = utcb.r8; + _state.thread.r9 = utcb.r9; + _state.thread.r10 = utcb.r10; + _state.thread.r11 = utcb.r11; + _state.thread.r12 = utcb.r12; + _state.thread.r13 = utcb.r13; + _state.thread.r14 = utcb.r14; + _state.thread.r15 = utcb.r15; - _state.thread.sp = utcb->sp; - _state.thread.ip = utcb->ip; - _state.thread.eflags = utcb->flags; + _state.thread.sp = utcb.sp; + _state.thread.ip = utcb.ip; + _state.thread.eflags = utcb.flags; - _state.thread.exception = utcb->qual[0]; + _state.thread.exception = utcb.qual[0]; } -void Pager_object::_copy_state_to_utcb(Nova::Utcb * utcb) +void Pager_object::_copy_state_to_utcb(Nova::Utcb &utcb) const { - utcb->ax = _state.thread.rax; - utcb->cx = _state.thread.rcx; - utcb->dx = _state.thread.rdx; - utcb->bx = _state.thread.rbx; + utcb.ax = _state.thread.rax; + utcb.cx = _state.thread.rcx; + utcb.dx = _state.thread.rdx; + utcb.bx = _state.thread.rbx; - utcb->bp = _state.thread.rbp; - utcb->si = _state.thread.rsi; - utcb->di = _state.thread.rdi; + utcb.bp = _state.thread.rbp; + utcb.si = _state.thread.rsi; + utcb.di = _state.thread.rdi; - utcb->r8 = _state.thread.r8; - utcb->r9 = _state.thread.r9; - utcb->r10 = _state.thread.r10; - utcb->r11 = _state.thread.r11; - utcb->r12 = _state.thread.r12; - utcb->r13 = _state.thread.r13; - utcb->r14 = _state.thread.r14; - utcb->r15 = _state.thread.r15; + utcb.r8 = _state.thread.r8; + utcb.r9 = _state.thread.r9; + utcb.r10 = _state.thread.r10; + utcb.r11 = _state.thread.r11; + utcb.r12 = _state.thread.r12; + utcb.r13 = _state.thread.r13; + utcb.r14 = _state.thread.r14; + utcb.r15 = _state.thread.r15; - utcb->sp = _state.thread.sp; - utcb->ip = _state.thread.ip; - utcb->flags = _state.thread.eflags; + utcb.sp = _state.thread.sp; + utcb.ip = _state.thread.ip; + utcb.flags = _state.thread.eflags; - utcb->mtd = Nova::Mtd::ACDB | - Nova::Mtd::EBSD | - Nova::Mtd::R8_R15 | - Nova::Mtd::EIP | - Nova::Mtd::ESP | - Nova::Mtd::EFL; + utcb.mtd = Nova::Mtd::ACDB | + Nova::Mtd::EBSD | + Nova::Mtd::R8_R15 | + Nova::Mtd::EIP | + Nova::Mtd::ESP | + Nova::Mtd::EFL; } diff --git a/repos/base-nova/src/core/thread_start.cc b/repos/base-nova/src/core/thread_start.cc index f65e65439..de3dd0c56 100644 --- a/repos/base-nova/src/core/thread_start.cc +++ b/repos/base-nova/src/core/thread_start.cc @@ -43,7 +43,7 @@ void Thread::_init_platform_thread(size_t, Type type) if (type == MAIN) { /* set EC selector according to NOVA spec */ - native_thread().ec_sel = platform_specific()->core_pd_sel() + 1; + native_thread().ec_sel = platform_specific().core_pd_sel() + 1; /* * Exception base of first thread in core is 0. We have to set @@ -54,12 +54,12 @@ void Thread::_init_platform_thread(size_t, Type type) return; } - native_thread().ec_sel = cap_map()->insert(1); - native_thread().exc_pt_sel = cap_map()->insert(NUM_INITIAL_PT_LOG2); + native_thread().ec_sel = cap_map().insert(1); + native_thread().exc_pt_sel = cap_map().insert(NUM_INITIAL_PT_LOG2); /* create running semaphore required for locking */ addr_t rs_sel =native_thread().exc_pt_sel + SM_SEL_EC; - uint8_t res = create_sm(rs_sel, platform_specific()->core_pd_sel(), 0); + uint8_t res = create_sm(rs_sel, platform_specific().core_pd_sel(), 0); if (res != NOVA_OK) { error("create_sm returned ", res); throw Cpu_session::Thread_creation_failed(); @@ -72,8 +72,8 @@ void Thread::_deinit_platform_thread() unmap_local(Nova::Obj_crd(native_thread().ec_sel, 1)); unmap_local(Nova::Obj_crd(native_thread().exc_pt_sel, Nova::NUM_INITIAL_PT_LOG2)); - cap_map()->remove(native_thread().ec_sel, 1, false); - cap_map()->remove(native_thread().exc_pt_sel, Nova::NUM_INITIAL_PT_LOG2, false); + cap_map().remove(native_thread().ec_sel, 1, false); + cap_map().remove(native_thread().exc_pt_sel, Nova::NUM_INITIAL_PT_LOG2, false); /* revoke utcb */ Nova::Rights rwx(true, true, true); @@ -90,9 +90,8 @@ void Thread::start() */ using namespace Nova; - addr_t sp = _stack->top(); - addr_t utcb = reinterpret_cast(&_stack->utcb()); - Utcb * utcb_obj = reinterpret_cast(&_stack->utcb()); + addr_t sp = _stack->top(); + Utcb &utcb = *reinterpret_cast(&_stack->utcb()); Affinity::Location location = _affinity; @@ -101,21 +100,21 @@ void Thread::start() /* create local EC */ enum { LOCAL_THREAD = false }; - unsigned const kernel_cpu_id = platform_specific()->kernel_cpu_id(location.xpos()); + unsigned const kernel_cpu_id = platform_specific().kernel_cpu_id(location.xpos()); uint8_t res = create_ec(native_thread().ec_sel, - platform_specific()->core_pd_sel(), kernel_cpu_id, - utcb, sp, native_thread().exc_pt_sel, LOCAL_THREAD); + platform_specific().core_pd_sel(), kernel_cpu_id, + (mword_t)&utcb, sp, native_thread().exc_pt_sel, LOCAL_THREAD); if (res != NOVA_OK) { error("create_ec returned ", res, " cpu=", location.xpos()); throw Cpu_session::Thread_creation_failed(); } /* default: we don't accept any mappings or translations */ - utcb_obj->crd_rcv = Obj_crd(); - utcb_obj->crd_xlt = Obj_crd(); + utcb.crd_rcv = Obj_crd(); + utcb.crd_xlt = Obj_crd(); - if (map_local(platform_specific()->core_pd_sel(), - reinterpret_cast(Thread::myself()->utcb()), + if (map_local(platform_specific().core_pd_sel(), + *reinterpret_cast(Thread::myself()->utcb()), Obj_crd(PT_SEL_PAGE_FAULT, 0), Obj_crd(native_thread().exc_pt_sel + PT_SEL_PAGE_FAULT, 0))) { error("could not create page fault portal"); @@ -148,7 +147,7 @@ void Thread::start() } }; - new (*platform()->core_mem_alloc()) + new (platform().core_mem_alloc()) Core_trace_source(Trace::sources(), *this); } diff --git a/repos/base-nova/src/lib/base/cap_map.cc b/repos/base-nova/src/lib/base/cap_map.cc index 2d761e045..82c0a8add 100644 --- a/repos/base-nova/src/lib/base/cap_map.cc +++ b/repos/base-nova/src/lib/base/cap_map.cc @@ -21,10 +21,10 @@ using namespace Genode; -Capability_map *Genode::cap_map() +Capability_map &Genode::cap_map() { static Genode::Capability_map map; - return ↦ + return map; } diff --git a/repos/base-nova/src/lib/base/capability.cc b/repos/base-nova/src/lib/base/capability.cc index 1237a6b21..cc9f16b63 100644 --- a/repos/base-nova/src/lib/base/capability.cc +++ b/repos/base-nova/src/lib/base/capability.cc @@ -29,14 +29,14 @@ Native_capability::Native_capability() void Native_capability::_inc() { - Cap_index idx(cap_map()->find(local_name())); + Cap_index idx(cap_map().find(local_name())); idx.inc(); } void Native_capability::_dec() { - Cap_index idx(cap_map()->find(local_name())); + Cap_index idx(cap_map().find(local_name())); idx.dec(); } diff --git a/repos/base-nova/src/lib/base/ipc.cc b/repos/base-nova/src/lib/base/ipc.cc index 5b86f9bdf..a6650dd3d 100644 --- a/repos/base-nova/src/lib/base/ipc.cc +++ b/repos/base-nova/src/lib/base/ipc.cc @@ -154,7 +154,7 @@ bool Receive_window::rcv_cleanup(bool keep, unsigned short const new_max) /* free rest of indexes if new_max is smaller then last window */ if (i >= new_max && _rcv_pt_cap_free[i] == FREE_SEL) - cap_map()->remove(_rcv_pt_base + i, 0, false); + cap_map().remove(_rcv_pt_base + i, 0, false); } return false; @@ -164,7 +164,7 @@ bool Receive_window::rcv_cleanup(bool keep, unsigned short const new_max) for (unsigned i = 0; i < MAX_CAP_ARGS; i++) { if (_rcv_pt_cap_free[i] == FREE_INVALID) continue; - cap_map()->remove(_rcv_pt_base + i, 0, _rcv_pt_cap_free[i] != FREE_SEL); + cap_map().remove(_rcv_pt_base + i, 0, _rcv_pt_cap_free[i] != FREE_SEL); } return true; @@ -191,7 +191,7 @@ bool Receive_window::prepare_rcv_window(Nova::Utcb &utcb, addr_t rcv_window) /* allocate receive window if necessary, otherwise use old one */ if (rcv_invalid() || rcv_cleanup(true, 1U << _rcv_wnd_log2)) { - _rcv_pt_base = cap_map()->insert(_rcv_wnd_log2); + _rcv_pt_base = cap_map().insert(_rcv_wnd_log2); if (_rcv_pt_base == INVALID_INDEX) { /* no mappings can be received */ diff --git a/repos/base-nova/src/lib/base/stack.cc b/repos/base-nova/src/lib/base/stack.cc index a271a8f18..3d6f8925c 100644 --- a/repos/base-nova/src/lib/base/stack.cc +++ b/repos/base-nova/src/lib/base/stack.cc @@ -61,10 +61,10 @@ class Initial_cap_range : public Cap_range }; -Initial_cap_range * initial_cap_range() +Initial_cap_range &initial_cap_range() { static Initial_cap_range s; - return &s; + return s; } @@ -76,26 +76,26 @@ void prepare_init_main_thread() { using namespace Genode; - cap_map()->insert(initial_cap_range()); + cap_map().insert(initial_cap_range()); /* for Core we can't perform the following code so early */ if (!__initial_sp) { enum { CAP_RANGES = 32 }; - unsigned index = initial_cap_range()->base() + - initial_cap_range()->elements(); + unsigned index = initial_cap_range().base() + + initial_cap_range().elements(); static char local[CAP_RANGES][sizeof(Cap_range)]; for (unsigned i = 0; i < CAP_RANGES; i++) { - Cap_range * range = reinterpret_cast(local[i]); - construct_at(range, index); + Cap_range &range = *reinterpret_cast(local[i]); + construct_at(&range, index); - cap_map()->insert(range); + cap_map().insert(range); - index = range->base() + range->elements(); + index = range.base() + range.elements(); } } } @@ -103,8 +103,8 @@ void prepare_init_main_thread() void prepare_reinit_main_thread() { using namespace Genode; - construct_at(cap_map()); - construct_at(initial_cap_range()); + construct_at(&cap_map()); + construct_at(&initial_cap_range()); prepare_init_main_thread(); } diff --git a/repos/base-nova/src/lib/base/thread_start.cc b/repos/base-nova/src/lib/base/thread_start.cc index a1b0bcc92..eae8efa59 100644 --- a/repos/base-nova/src/lib/base/thread_start.cc +++ b/repos/base-nova/src/lib/base/thread_start.cc @@ -103,7 +103,7 @@ void Thread::_init_platform_thread(size_t weight, Type type) addr_t utcb = reinterpret_cast(&_stack->utcb()); revoke(Mem_crd(utcb >> 12, 0, rwx)); - native_thread().exc_pt_sel = cap_map()->insert(NUM_INITIAL_PT_LOG2); + native_thread().exc_pt_sel = cap_map().insert(NUM_INITIAL_PT_LOG2); if (native_thread().exc_pt_sel == Native_thread::INVALID_INDEX) throw Cpu_session::Thread_creation_failed(); @@ -124,14 +124,14 @@ void Thread::_deinit_platform_thread() if (native_thread().ec_sel != Native_thread::INVALID_INDEX) { revoke(Obj_crd(native_thread().ec_sel, 0)); - cap_map()->remove(native_thread().ec_sel, 0, false); + cap_map().remove(native_thread().ec_sel, 0, false); } /* de-announce thread */ if (_thread_cap.valid()) _cpu_session->kill_thread(_thread_cap); - cap_map()->remove(native_thread().exc_pt_sel, NUM_INITIAL_PT_LOG2); + cap_map().remove(native_thread().exc_pt_sel, NUM_INITIAL_PT_LOG2); } @@ -173,7 +173,7 @@ void Thread::start() cpu_thread.start(thread_ip, _stack->top()); /* request native EC thread cap */ - native_thread().ec_sel = cap_map()->insert(); + native_thread().ec_sel = cap_map().insert(); if (native_thread().ec_sel == Native_thread::INVALID_INDEX) throw Cpu_session::Thread_creation_failed(); diff --git a/repos/base-nova/src/test/platform/main.cc b/repos/base-nova/src/test/platform/main.cc index a08abcf5f..1965929d1 100644 --- a/repos/base-nova/src/test/platform/main.cc +++ b/repos/base-nova/src/test/platform/main.cc @@ -388,7 +388,7 @@ void test_server_oom(Genode::Env &env) } /* be evil and keep this cap by manually incrementing the ref count */ - Cap_index idx(cap_map()->find(got_cap.local_name())); + Cap_index idx(cap_map().find(got_cap.local_name())); idx.inc(); if (i % 5000 == 4999) @@ -663,16 +663,16 @@ Main::Main(Env &env) : env(env) static char local[128][sizeof(Cap_range)]; for (unsigned i = 0; i < sizeof(local) / sizeof (local[0]); i++) { - Cap_range * range = construct_at(local[i], index); + Cap_range &range = *construct_at(local[i], index); - cap_map()->insert(range); + cap_map().insert(range); - index = range->base() + range->elements(); + index = range.base() + range.elements(); }; - addr_t sel_pd = cap_map()->insert(); + addr_t sel_pd = cap_map().insert(); addr_t sel_ec = myself->native_thread().ec_sel; - addr_t sel_cap = cap_map()->insert(); + addr_t sel_cap = cap_map().insert(); addr_t handler = 0UL; uint8_t res = 0; diff --git a/repos/base-nova/src/test/platform/server.h b/repos/base-nova/src/test/platform/server.h index 266f0f334..abd215ca0 100644 --- a/repos/base-nova/src/test/platform/server.h +++ b/repos/base-nova/src/test/platform/server.h @@ -96,7 +96,7 @@ inline bool Test::Component::cap_void(Genode::Native_capability got_cap, return false; /* be evil and keep this cap by manually incrementing the ref count */ - Genode::Cap_index idx(Genode::cap_map()->find(got_cap.local_name())); + Genode::Cap_index idx(Genode::cap_map().find(got_cap.local_name())); idx.inc(); return true; diff --git a/repos/base-okl4/src/core/core_region_map.cc b/repos/base-okl4/src/core/core_region_map.cc index 14f322b35..c5e1c0d4d 100644 --- a/repos/base-okl4/src/core/core_region_map.cc +++ b/repos/base-okl4/src/core/core_region_map.cc @@ -26,15 +26,16 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t size, { using namespace Okl4; - auto lambda = [&] (Dataspace_component *ds) -> void* { + auto lambda = [&] (Dataspace_component *ds) -> void * + { if (!ds) throw Invalid_dataspace(); if (size == 0) size = ds->size(); - size_t page_rounded_size = (size + get_page_size() - 1) - & get_page_mask(); + size_t const page_rounded_size = (size + get_page_size() - 1) + & get_page_mask(); if (use_local_addr) { error("parameter 'use_local_addr' not supported within core"); @@ -48,7 +49,7 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t size, /* allocate range in core's virtual address space */ void *virt_addr; - if (!platform()->region_alloc()->alloc(page_rounded_size, &virt_addr)) { + if (!platform().region_alloc().alloc(page_rounded_size, &virt_addr)) { error("could not allocate virtual address range in core of size ", page_rounded_size); return nullptr; diff --git a/repos/base-okl4/src/core/include/platform.h b/repos/base-okl4/src/core/include/platform.h index 862373f64..4d340d660 100644 --- a/repos/base-okl4/src/core/include/platform.h +++ b/repos/base-okl4/src/core/include/platform.h @@ -84,17 +84,29 @@ namespace Genode { /** * Accessor for core pd object */ - Platform_pd *core_pd() { return _core_pd; } + Platform_pd &core_pd() + { + if (_core_pd) + return *_core_pd; + + ASSERT_NEVER_CALLED; + } /** * Accessor for core pager thread object */ - Platform_thread *core_pager() { return _core_pager; } + Platform_thread &core_pager() + { + if (_core_pager) + return *_core_pager; + + ASSERT_NEVER_CALLED; + } /** * Accessor for platform thread object slab allocator */ - Thread_slab *thread_slab() { return &_thread_slab; } + Thread_slab &thread_slab() { return _thread_slab; } /********************************************** ** Callbacks used for parsing the boot info ** @@ -116,15 +128,15 @@ namespace Genode { ** Generic platform interface ** ********************************/ - Range_allocator *ram_alloc() override { return _core_mem_alloc.phys_alloc(); } - Range_allocator *io_mem_alloc() override { return &_io_mem_alloc; } - Range_allocator *io_port_alloc() override { return &_io_port_alloc; } - Range_allocator *irq_alloc() override { return &_irq_alloc; } - Range_allocator *region_alloc() override { return _core_mem_alloc.virt_alloc(); } - Range_allocator *core_mem_alloc() override { return &_core_mem_alloc; } + Range_allocator &ram_alloc() override { return _core_mem_alloc.phys_alloc(); } + Range_allocator &io_mem_alloc() override { return _io_mem_alloc; } + Range_allocator &io_port_alloc() override { return _io_port_alloc; } + Range_allocator &irq_alloc() override { return _irq_alloc; } + Range_allocator ®ion_alloc() override { return _core_mem_alloc.virt_alloc(); } + Range_allocator &core_mem_alloc() override { return _core_mem_alloc; } addr_t vm_start() const override { return _vm_start; } size_t vm_size() const override { return _vm_size; } - Rom_fs *rom_fs() override { return &_rom_fs; } + Rom_fs &rom_fs() override { return _rom_fs; } size_t max_caps() const override { return Capability_space::max_caps(); } void wait_for_exit(); diff --git a/repos/base-okl4/src/core/include/platform_pd.h b/repos/base-okl4/src/core/include/platform_pd.h index 5605721a1..4360b4988 100644 --- a/repos/base-okl4/src/core/include/platform_pd.h +++ b/repos/base-okl4/src/core/include/platform_pd.h @@ -90,7 +90,7 @@ namespace Genode { * * Again a special case for Core thread0. */ - int _alloc_thread(int thread_id, Platform_thread *thread); + int _alloc_thread(int thread_id, Platform_thread &thread); /** * Thread deallocation @@ -167,7 +167,7 @@ namespace Genode { * Constructors */ Platform_pd(bool core); - Platform_pd(Allocator *, char const *); + Platform_pd(Allocator &, char const *); /** * Destructor @@ -179,14 +179,14 @@ namespace Genode { * * This function allocates the physical L4 thread ID. */ - bool bind_thread(Platform_thread *thread); + bool bind_thread(Platform_thread &thread); /** * Unbind thread from protection domain * * Free the thread's slot and update thread object. */ - void unbind_thread(Platform_thread *thread); + void unbind_thread(Platform_thread &thread); /** * Assign parent interface to protection domain @@ -195,7 +195,7 @@ namespace Genode { Platform_thread* space_pager() const { return _space_pager; } - void space_pager(Platform_thread *pd); + void space_pager(Platform_thread &pd); int pd_id() const { return _pd_id; } diff --git a/repos/base-okl4/src/core/include/platform_thread.h b/repos/base-okl4/src/core/include/platform_thread.h index 8c12cf5e2..1b750027e 100644 --- a/repos/base-okl4/src/core/include/platform_thread.h +++ b/repos/base-okl4/src/core/include/platform_thread.h @@ -20,6 +20,7 @@ /* core includes */ #include #include +#include namespace Genode { @@ -34,15 +35,17 @@ namespace Genode { Platform_thread(Platform_thread const &); Platform_thread &operator = (Platform_thread const &); - int _thread_id; /* plain thread number */ - Okl4::L4_ThreadId_t _l4_thread_id; /* L4 thread ID */ - char _name[32]; /* thread name that will be - registered at the kernel - debugger */ - Platform_pd *_platform_pd; /* protection domain thread - is bound to */ - unsigned _priority; /* thread priority */ - Pager_object *_pager; + int _thread_id = THREAD_INVALID; /* plain thread number */ + + Okl4::L4_ThreadId_t _l4_thread_id; /* L4 thread ID */ + + char _name[32]; /* thread name that will be + registered at the kernel + debugger */ + Platform_pd *_platform_pd; /* protection domain thread + is bound to */ + unsigned _priority; /* thread priority */ + Pager_object *_pager; public: @@ -52,10 +55,16 @@ namespace Genode { /** * Constructor */ - Platform_thread(size_t, const char *name = 0, - unsigned priority = 0, - Affinity::Location = Affinity::Location(), - addr_t utcb = 0, int thread_id = THREAD_INVALID); + Platform_thread(size_t, const char *name, + unsigned priority, + Affinity::Location, + addr_t utcb); + + /** + * Constructor used for core-internal threads + */ + Platform_thread(char const *name) + : Platform_thread(0, name, 0, Affinity::Location(), 0) { } /** * Destructor @@ -102,7 +111,7 @@ namespace Genode { * \param pd platform pd, thread is bound to */ void bind(int thread_id, Okl4::L4_ThreadId_t l4_thread_id, - Platform_pd *pd); + Platform_pd &pd); /** * Unbind this thread @@ -128,8 +137,15 @@ namespace Genode { /** * Return/set pager */ - Pager_object *pager() const { return _pager; } - void pager(Pager_object *pager) { _pager = pager; } + Pager_object &pager() const + { + if (_pager) + return *_pager; + + ASSERT_NEVER_CALLED; + } + + void pager(Pager_object &pager) { _pager = &pager; } /** * Get the 'Platform_pd' object this thread belongs to diff --git a/repos/base-okl4/src/core/include/rpc_cap_factory.h b/repos/base-okl4/src/core/include/rpc_cap_factory.h index 9b6000c00..eb5d68a8f 100644 --- a/repos/base-okl4/src/core/include/rpc_cap_factory.h +++ b/repos/base-okl4/src/core/include/rpc_cap_factory.h @@ -24,7 +24,7 @@ class Genode::Rpc_cap_factory { private: - static Native_capability _alloc(Rpc_cap_factory *owner, + static Native_capability _alloc(Rpc_cap_factory &owner, Native_capability ep); public: diff --git a/repos/base-okl4/src/core/include/util.h b/repos/base-okl4/src/core/include/util.h index f64b87bf8..cde941391 100644 --- a/repos/base-okl4/src/core/include/util.h +++ b/repos/base-okl4/src/core/include/util.h @@ -58,7 +58,7 @@ namespace Genode { } } - constexpr addr_t get_page_mask() { return ~(get_page_size() - 1); } + constexpr addr_t get_page_mask() { return ~(get_page_size() - 1); } inline size_t get_super_page_size_log2() { diff --git a/repos/base-okl4/src/core/irq_session_component.cc b/repos/base-okl4/src/core/irq_session_component.cc index 54cbd1615..698db4833 100644 --- a/repos/base-okl4/src/core/irq_session_component.cc +++ b/repos/base-okl4/src/core/irq_session_component.cc @@ -128,7 +128,7 @@ Irq_object::Irq_object(unsigned irq) ***************************/ -Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char *args) : _irq_number(Arg_string::find_arg(args, "irq_number").long_value(-1)), @@ -139,7 +139,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, if (msi) throw Service_denied(); - if (!irq_alloc || irq_alloc->alloc_addr(1, _irq_number).error()) { + if (irq_alloc.alloc_addr(1, _irq_number).error()) { error("unavailable IRQ ", Hex(_irq_number), " requested"); throw Service_denied(); } diff --git a/repos/base-okl4/src/core/platform.cc b/repos/base-okl4/src/core/platform.cc index c10cb1d92..d9b7e6b9f 100644 --- a/repos/base-okl4/src/core/platform.cc +++ b/repos/base-okl4/src/core/platform.cc @@ -57,9 +57,9 @@ int Platform::bi_init_mem(Okl4::uintptr_t virt_base, Okl4::uintptr_t virt_end, Okl4::uintptr_t phys_base, Okl4::uintptr_t phys_end, const Okl4::bi_user_data_t *data) { - Platform *p = (Platform *)data->user_data; - p->_core_mem_alloc.phys_alloc()->add_range(phys_base, phys_end - phys_base + 1); - p->_core_mem_alloc.virt_alloc()->add_range(virt_base, virt_end - virt_base + 1); + Platform &p = *(Platform *)data->user_data; + p._core_mem_alloc.phys_alloc().add_range(phys_base, phys_end - phys_base + 1); + p._core_mem_alloc.virt_alloc().add_range(virt_base, virt_end - virt_base + 1); return 0; } @@ -71,8 +71,8 @@ int Platform::bi_add_virt_mem(Okl4::bi_name_t, Okl4::uintptr_t base, if (base < get_page_size() || end < get_page_size()) return 0; - Platform *p = (Platform *)data->user_data; - p->_core_mem_alloc.virt_alloc()->add_range(base, end - base + 1); + Platform &p = *(Platform *)data->user_data; + p._core_mem_alloc.virt_alloc().add_range(base, end - base + 1); return 0; } @@ -81,8 +81,8 @@ int Platform::bi_add_phys_mem(Okl4::bi_name_t pool, Okl4::uintptr_t base, Okl4::uintptr_t end, const Okl4::bi_user_data_t *data) { if (pool == 2) { - Platform *p = (Platform *)data->user_data; - p->_core_mem_alloc.phys_alloc()->add_range(base, end - base + 1); + Platform &p = *(Platform *)data->user_data; + p._core_mem_alloc.phys_alloc().add_range(base, end - base + 1); } return 0; } @@ -91,10 +91,11 @@ int Platform::bi_add_phys_mem(Okl4::bi_name_t pool, Okl4::uintptr_t base, static char init_slab_block_rom[get_page_size()]; static char init_slab_block_thread[get_page_size()]; -Platform::Platform() : - _io_mem_alloc(core_mem_alloc()), _io_port_alloc(core_mem_alloc()), - _irq_alloc(core_mem_alloc()), - _rom_slab(core_mem_alloc(), (Slab_block *)&init_slab_block_rom), +Platform::Platform() +: + _io_mem_alloc(&core_mem_alloc()), _io_port_alloc(&core_mem_alloc()), + _irq_alloc(&core_mem_alloc()), + _rom_slab(&core_mem_alloc(), (Slab_block *)&init_slab_block_rom), _thread_slab(core_mem_alloc(), (Slab_block *)&init_slab_block_thread) { /* @@ -160,8 +161,8 @@ Platform::Platform() : _init_rom_modules(); /* preserve stack area in core's virtual address space */ - _core_mem_alloc.virt_alloc()->remove_range(stack_area_virtual_base(), - stack_area_virtual_size()); + _core_mem_alloc.virt_alloc().remove_range(stack_area_virtual_base(), + stack_area_virtual_size()); _vm_start = 0x1000; _vm_size = 0xc0000000 - _vm_start; @@ -169,7 +170,7 @@ Platform::Platform() : log(_rom_fs); /* setup task object for core task */ - _core_pd = new(core_mem_alloc()) Platform_pd(true); + _core_pd = new (core_mem_alloc()) Platform_pd(true); /* * We setup the thread object for thread0 in core task using a special @@ -177,10 +178,10 @@ Platform::Platform() : * the situation that task_id == thread_id of first task. But since we do * not destroy this task, it should be no problem. */ - Platform_thread *core_thread = - new(&_thread_slab) Platform_thread(0, "core.main"); + Platform_thread &core_thread = + *new (&_thread_slab) Platform_thread("core.main"); - core_thread->set_l4_thread_id(Okl4::L4_rootserver); + core_thread.set_l4_thread_id(Okl4::L4_rootserver); _core_pd->bind_thread(core_thread); @@ -191,11 +192,11 @@ Platform::Platform() : unsigned const pages = 1; size_t const log_size = pages << get_page_size_log2(); - ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); + ram_alloc().alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); addr_t const phys_addr = reinterpret_cast(phys_ptr); /* let one page free after the log buffer */ - region_alloc()->alloc_aligned(log_size, &core_local_ptr, get_page_size_log2()); + region_alloc().alloc_aligned(log_size, &core_local_ptr, get_page_size_log2()); addr_t const core_local_addr = reinterpret_cast(core_local_ptr); map_local(phys_addr, core_local_addr, pages); diff --git a/repos/base-okl4/src/core/platform_pd.cc b/repos/base-okl4/src/core/platform_pd.cc index db997b22b..e7b6af726 100644 --- a/repos/base-okl4/src/core/platform_pd.cc +++ b/repos/base-okl4/src/core/platform_pd.cc @@ -40,7 +40,7 @@ void Platform_pd::_create_pd(bool syscall) L4_Word_t control = L4_SpaceCtrl_new; L4_ClistId_t cap_list = L4_rootclist; L4_Word_t utcb_area_size = L4_GetUtcbSize()*(1 << Thread_id_bits::THREAD); - L4_Word_t utcb_location = platform_specific()->utcb_base() + L4_Word_t utcb_location = platform_specific().utcb_base() + _pd_id*utcb_area_size; L4_Fpage_t utcb_area = L4_Fpage(utcb_location, utcb_area_size); L4_Word_t resources = 0; @@ -66,7 +66,7 @@ void Platform_pd::_destroy_pd() L4_Word_t control = L4_SpaceCtrl_delete; L4_ClistId_t cap_list = L4_rootclist; L4_Word_t utcb_area_size = L4_GetUtcbSize()*(1 << Thread_id_bits::THREAD); - L4_Word_t utcb_location = platform_specific()->utcb_base() + L4_Word_t utcb_location = platform_specific().utcb_base() + _pd_id*utcb_area_size; L4_Fpage_t utcb_area = L4_Fpage(utcb_location, utcb_area_size); L4_Word_t resources = 0; @@ -134,7 +134,7 @@ Platform_thread* Platform_pd::_next_thread() } -int Platform_pd::_alloc_thread(int thread_id, Platform_thread *thread) +int Platform_pd::_alloc_thread(int thread_id, Platform_thread &thread) { int i = thread_id; @@ -149,7 +149,7 @@ int Platform_pd::_alloc_thread(int thread_id, Platform_thread *thread) if (_threads[i]) return -2; } - _threads[i] = thread; + _threads[i] = &thread; return i; } @@ -169,12 +169,12 @@ void Platform_pd::_free_thread(int thread_id) ** Public object members ** ***************************/ -bool Platform_pd::bind_thread(Platform_thread *thread) +bool Platform_pd::bind_thread(Platform_thread &thread) { using namespace Okl4; /* thread_id is THREAD_INVALID by default - only core is the special case */ - int thread_id = thread->thread_id(); + int thread_id = thread.thread_id(); L4_ThreadId_t l4_thread_id; int t = _alloc_thread(thread_id, thread); @@ -186,41 +186,42 @@ bool Platform_pd::bind_thread(Platform_thread *thread) l4_thread_id = make_l4_id(_pd_id, thread_id); /* finally inform thread about binding */ - thread->bind(thread_id, l4_thread_id, this); + thread.bind(thread_id, l4_thread_id, *this); return true; } -void Platform_pd::unbind_thread(Platform_thread *thread) +void Platform_pd::unbind_thread(Platform_thread &thread) { - int thread_id = thread->thread_id(); + int thread_id = thread.thread_id(); /* unbind thread before proceeding */ - thread->unbind(); + thread.unbind(); _free_thread(thread_id); } -void Platform_pd::space_pager(Platform_thread *thread) +void Platform_pd::space_pager(Platform_thread &thread) { using namespace Okl4; - L4_Word_t control = L4_SpaceCtrl_space_pager; - L4_SpaceId_t pager_space = L4_SpaceId(thread->pd()->pd_id()); + L4_Word_t control = L4_SpaceCtrl_space_pager; + L4_SpaceId_t pager_space = L4_SpaceId(thread.pd()->pd_id()); L4_ClistId_t cap_list = L4_rootclist; L4_Word_t utcb_area_size = L4_GetUtcbSize()*(1 << Thread_id_bits::THREAD); - L4_Word_t utcb_location = platform_specific()->utcb_base() + L4_Word_t utcb_location = platform_specific().utcb_base() + _pd_id*utcb_area_size; L4_Fpage_t utcb_area = L4_Fpage(utcb_location, utcb_area_size); L4_Word_t resources = 0; L4_Word_t old_resources = 0; /* set the space pager */ - _space_pager = thread; + _space_pager = &thread; L4_LoadMR(0,pager_space.raw); - int ret = L4_SpaceControl(L4_SpaceId(_pd_id), control, cap_list, utcb_area, - resources, &old_resources); + int ret = L4_SpaceControl(L4_SpaceId(_pd_id), + control, cap_list, utcb_area, + resources, &old_resources); if (ret != 1) error("L4_SpaceControl(new space_pager...) returned ", ret, ", error=", @@ -307,7 +308,7 @@ Platform_pd::Platform_pd(bool) : _space_pager(0) } -Platform_pd::Platform_pd(Allocator *, char const *) +Platform_pd::Platform_pd(Allocator &, char const *) { _init_threads(); @@ -323,7 +324,7 @@ Platform_pd::Platform_pd(Allocator *, char const *) Platform_pd::~Platform_pd() { /* unbind all threads */ - while (Platform_thread *t = _next_thread()) unbind_thread(t); + while (Platform_thread *t = _next_thread()) unbind_thread(*t); _destroy_pd(); _free_pd(); diff --git a/repos/base-okl4/src/core/platform_thread.cc b/repos/base-okl4/src/core/platform_thread.cc index d0401c131..2efc0cfe3 100644 --- a/repos/base-okl4/src/core/platform_thread.cc +++ b/repos/base-okl4/src/core/platform_thread.cc @@ -52,7 +52,7 @@ int Platform_thread::start(void *ip, void *sp, unsigned) L4_ThreadId_t exception_handler = pager; L4_Word_t resources = 0; L4_Word_t utcb_size_per_task = L4_GetUtcbSize()*(1 << Thread_id_bits::THREAD); - L4_Word_t utcb_location = platform_specific()->utcb_base() + L4_Word_t utcb_location = platform_specific().utcb_base() + _platform_pd->pd_id()*utcb_size_per_task + _thread_id*L4_GetUtcbSize(); /* @@ -121,11 +121,11 @@ void Platform_thread::resume() void Platform_thread::bind(int thread_id, L4_ThreadId_t l4_thread_id, - Platform_pd *pd) + Platform_pd &pd) { _thread_id = thread_id; _l4_thread_id = l4_thread_id; - _platform_pd = pd; + _platform_pd = &pd; } @@ -139,7 +139,7 @@ void Platform_thread::unbind() _thread_id = THREAD_INVALID; _l4_thread_id = L4_nilthread; - _platform_pd = 0; + _platform_pd = nullptr; } @@ -171,9 +171,10 @@ unsigned long Platform_thread::pager_object_badge() const Platform_thread::Platform_thread(size_t, const char *name, unsigned prio, - Affinity::Location, addr_t, int thread_id) -: _thread_id(thread_id), _l4_thread_id(L4_nilthread), _platform_pd(0), - _priority(prio), _pager(0) + Affinity::Location, addr_t) +: + _l4_thread_id(L4_nilthread), _platform_pd(0), + _priority(prio), _pager(0) { strncpy(_name, name, sizeof(_name)); } @@ -186,5 +187,5 @@ Platform_thread::~Platform_thread() * Thread::unbind() */ if (_platform_pd) - _platform_pd->unbind_thread(this); + _platform_pd->unbind_thread(*this); } diff --git a/repos/base-okl4/src/core/ram_dataspace_support.cc b/repos/base-okl4/src/core/ram_dataspace_support.cc index e346d742f..d79b9d4ed 100644 --- a/repos/base-okl4/src/core/ram_dataspace_support.cc +++ b/repos/base-okl4/src/core/ram_dataspace_support.cc @@ -27,16 +27,16 @@ using namespace Genode; -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *) { } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &) { } +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } -void Ram_dataspace_factory::_clear_ds (Dataspace_component *ds) +void Ram_dataspace_factory::_clear_ds (Dataspace_component &ds) { - size_t page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + size_t page_rounded_size = (ds.size() + get_page_size() - 1) & get_page_mask(); /* allocate range in core's virtual address space */ void *virt_addr; - if (!platform()->region_alloc()->alloc(page_rounded_size, &virt_addr)) { + if (!platform().region_alloc().alloc(page_rounded_size, &virt_addr)) { error("could not allocate virtual address range in core of size ", page_rounded_size); return; @@ -44,7 +44,7 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component *ds) /* map the dataspace's physical pages to corresponding virtual addresses */ size_t num_pages = page_rounded_size >> get_page_size_log2(); - if (!map_local(ds->phys_addr(), (addr_t)virt_addr, num_pages)) { + if (!map_local(ds.phys_addr(), (addr_t)virt_addr, num_pages)) { error("core-local memory mapping failed, error=", Okl4::L4_ErrorCode()); return; } @@ -60,5 +60,5 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component *ds) "error=", Okl4::L4_ErrorCode()); /* free core's virtual address space */ - platform()->region_alloc()->free(virt_addr, page_rounded_size); + platform().region_alloc().free(virt_addr, page_rounded_size); } diff --git a/repos/base-okl4/src/core/spec/x86/platform_x86.cc b/repos/base-okl4/src/core/spec/x86/platform_x86.cc deleted file mode 100644 index 7b77b907d..000000000 --- a/repos/base-okl4/src/core/spec/x86/platform_x86.cc +++ /dev/null @@ -1,31 +0,0 @@ -/* - * \brief x86-specific platform definitions - * \author Stefan Kalkowski - * \date 2012-10-02 - */ - -/* - * Copyright (C) 2012-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -/* Genode includes */ -#include - -/* core includes */ -#include -#include -#include - -using namespace Genode; - -void Platform::add_local_services(Rpc_entrypoint *e, Sliced_heap *sliced_heap, - Core_env *env, Service_registry *local_services) -{ - /* add x86 specific ioport service */ - static Io_port_root io_port_root(env->cap_session(), io_port_alloc(), sliced_heap); - static Local_service io_port_ls(Io_port_session::service_name(), &io_port_root); - local_services->insert(&io_port_ls); -} diff --git a/repos/base-okl4/src/core/thread_start.cc b/repos/base-okl4/src/core/thread_start.cc index 855dc4fd1..6567188e0 100644 --- a/repos/base-okl4/src/core/thread_start.cc +++ b/repos/base-okl4/src/core/thread_start.cc @@ -37,10 +37,10 @@ void Thread::_thread_start() void Thread::start() { /* create and start platform thread */ - native_thread().pt = new(platform_specific()->thread_slab()) - Platform_thread(0, _stack->name().string()); + native_thread().pt = new (platform_specific().thread_slab()) + Platform_thread(_stack->name().string()); - platform_specific()->core_pd()->bind_thread(native_thread().pt); + platform_specific().core_pd().bind_thread(*native_thread().pt); native_thread().pt->start((void *)_thread_start, stack_top()); } @@ -57,5 +57,5 @@ void Thread::cancel_blocking() void Thread::_deinit_platform_thread() { /* destruct platform thread */ - destroy(platform_specific()->thread_slab(), native_thread().pt); + destroy(platform_specific().thread_slab(), native_thread().pt); } diff --git a/repos/base-pistachio/src/core/include/map_local.h b/repos/base-pistachio/src/core/include/map_local.h index cf04c2416..d28e14796 100644 --- a/repos/base-pistachio/src/core/include/map_local.h +++ b/repos/base-pistachio/src/core/include/map_local.h @@ -44,7 +44,7 @@ namespace Genode { inline static bool map_local(addr_t from_addr, addr_t to_addr, size_t num_pages) { - Pistachio::L4_ThreadId_t core_pager = platform_specific()->core_pager()->native_thread_id(); + Pistachio::L4_ThreadId_t core_pager = platform_specific().core_pager().native_thread_id(); addr_t offset = 0; size_t page_size = get_page_size(); diff --git a/repos/base-pistachio/src/core/include/platform.h b/repos/base-pistachio/src/core/include/platform.h index cad8b1953..4efb93c2b 100644 --- a/repos/base-pistachio/src/core/include/platform.h +++ b/repos/base-pistachio/src/core/include/platform.h @@ -34,12 +34,6 @@ namespace Genode { { private: - /* - * Noncopyable - */ - Platform(Platform const &); - Platform &operator = (Platform const &); - /* * Shortcut for the type of allocator instances for physical resources */ @@ -113,7 +107,7 @@ namespace Genode { /** * Return singleton instance of Sigma0 pager object */ - static Sigma0 *sigma0(); + static Sigma0 &sigma0(); /** * Core pager thread that handles core-internal page-faults @@ -123,7 +117,7 @@ namespace Genode { /** * Constructor */ - Core_pager(Platform_pd *core_pd); + Core_pager(Platform_pd &core_pd); int pager(Ipc_pager &) { /* never called */ return -1; } }; @@ -131,7 +125,7 @@ namespace Genode { /** * Return singleton instance of core pager object */ - Core_pager *core_pager(); + Core_pager &core_pager(); /** * Constructor @@ -141,22 +135,22 @@ namespace Genode { /** * Return singleton instance of core PD object */ - Platform_pd *core_pd(); + Platform_pd &core_pd(); /******************************** ** Generic platform interface ** ********************************/ - Range_allocator *core_mem_alloc() override { return &_ram_alloc; } - Range_allocator *ram_alloc() override { return &_ram_alloc; } - Range_allocator *io_mem_alloc() override { return &_io_mem_alloc; } - Range_allocator *io_port_alloc() override { return &_io_port_alloc; } - Range_allocator *irq_alloc() override { return &_irq_alloc; } - Range_allocator *region_alloc() override { return &_region_alloc; } + Range_allocator &core_mem_alloc() override { return _ram_alloc; } + Range_allocator &ram_alloc() override { return _ram_alloc; } + Range_allocator &io_mem_alloc() override { return _io_mem_alloc; } + Range_allocator &io_port_alloc() override { return _io_port_alloc; } + Range_allocator &irq_alloc() override { return _irq_alloc; } + Range_allocator ®ion_alloc() override { return _region_alloc; } addr_t vm_start() const override { return _vm_start; } size_t vm_size() const override { return _vm_size; } - Rom_fs *rom_fs() override { return &_rom_fs; } + Rom_fs &rom_fs() override { return _rom_fs; } size_t max_caps() const override { return Capability_space::max_caps(); } void wait_for_exit(); diff --git a/repos/base-pistachio/src/core/include/platform_pd.h b/repos/base-pistachio/src/core/include/platform_pd.h index f22219357..94d44cda6 100644 --- a/repos/base-pistachio/src/core/include/platform_pd.h +++ b/repos/base-pistachio/src/core/include/platform_pd.h @@ -97,7 +97,7 @@ namespace Genode { * * Again a special case for Core thread0. */ - int _alloc_thread(int thread_id, Platform_thread *thread); + int _alloc_thread(int thread_id, Platform_thread &thread); /** * Thread deallocation @@ -190,7 +190,7 @@ namespace Genode { * Constructors */ Platform_pd(bool core); - Platform_pd(Allocator * md_alloc, char const *, + Platform_pd(Allocator &md_alloc, char const *, signed pd_id = PD_INVALID, bool create = true); /** @@ -211,16 +211,16 @@ namespace Genode { * * This function allocates the physical L4 thread ID. */ - bool bind_thread(Platform_thread *thread); + bool bind_thread(Platform_thread &thread); - int bind_initial_thread(Platform_thread *thread); + int bind_initial_thread(Platform_thread &thread); /** * Unbind thread from protection domain * * Free the thread's slot and update thread object. */ - void unbind_thread(Platform_thread *thread); + void unbind_thread(Platform_thread &thread); /** * Assign parent interface to protection domain diff --git a/repos/base-pistachio/src/core/include/platform_thread.h b/repos/base-pistachio/src/core/include/platform_thread.h index 9b0ec37f8..17377b1e0 100644 --- a/repos/base-pistachio/src/core/include/platform_thread.h +++ b/repos/base-pistachio/src/core/include/platform_thread.h @@ -21,6 +21,7 @@ /* core includes */ #include #include +#include /* Pistachio includes */ namespace Pistachio { @@ -53,12 +54,14 @@ namespace Genode { Platform_thread(Platform_thread const &); Platform_thread &operator = (Platform_thread const &); - int _thread_id; - L4_ThreadId_t _l4_thread_id; - char _name[32]; /* thread name at kernel debugger */ + typedef String<32> Name; + + int _thread_id = THREAD_INVALID; + L4_ThreadId_t _l4_thread_id = L4_nilthread; + Name const _name; /* thread name at kernel debugger */ Platform_pd *_platform_pd = nullptr; - unsigned _priority; - Pager_object *_pager; + unsigned _priority = 0; + Pager_object *_pager = nullptr; Affinity::Location _location { }; public: @@ -69,9 +72,16 @@ namespace Genode { /** * Constructor */ - Platform_thread(size_t, const char *name = 0, unsigned priority = 0, - Affinity::Location = Affinity::Location(), - addr_t utcb = 0, int thread_id = THREAD_INVALID); + Platform_thread(size_t, char const *name, unsigned priority, + Affinity::Location, addr_t) + : + _name(name), _priority(priority) + { } + + /** + * Constructor used for core-internal threads + */ + Platform_thread(char const *name) : _name(name) { } /** * Destructor @@ -117,7 +127,7 @@ namespace Genode { * \param pd platform pd, thread is bound to */ void bind(int thread_id, Pistachio::L4_ThreadId_t l4_thread_id, - Platform_pd *pd); + Platform_pd &pd); /** * Unbind this thread @@ -144,8 +154,15 @@ namespace Genode { /** * Return/set pager */ - Pager_object *pager() const { return _pager; } - void pager(Pager_object *pager) { _pager = pager; } + Pager_object &pager() const + { + if (_pager) + return *_pager; + + ASSERT_NEVER_CALLED; + } + + void pager(Pager_object &pager) { _pager = &pager; } /** * Return identification of thread when faulting @@ -180,7 +197,7 @@ namespace Genode { int thread_id() const { return _thread_id; } Pistachio::L4_ThreadId_t native_thread_id() const { return _l4_thread_id; } - const char *name() const { return _name; } + Name name() const { return _name; } /* use only for core... */ void set_l4_thread_id(Pistachio::L4_ThreadId_t id) { _l4_thread_id = id; } diff --git a/repos/base-pistachio/src/core/include/rpc_cap_factory.h b/repos/base-pistachio/src/core/include/rpc_cap_factory.h index 9b6000c00..eb5d68a8f 100644 --- a/repos/base-pistachio/src/core/include/rpc_cap_factory.h +++ b/repos/base-pistachio/src/core/include/rpc_cap_factory.h @@ -24,7 +24,7 @@ class Genode::Rpc_cap_factory { private: - static Native_capability _alloc(Rpc_cap_factory *owner, + static Native_capability _alloc(Rpc_cap_factory &owner, Native_capability ep); public: diff --git a/repos/base-pistachio/src/core/io_mem_session_support.cc b/repos/base-pistachio/src/core/io_mem_session_support.cc index 7d7074897..8f9d1717d 100644 --- a/repos/base-pistachio/src/core/io_mem_session_support.cc +++ b/repos/base-pistachio/src/core/io_mem_session_support.cc @@ -76,7 +76,7 @@ addr_t Io_mem_session_component::_map_local(addr_t base, size_t size) /* find appropriate region for mapping */ void *result = 0; - if (platform()->region_alloc()->alloc_aligned(size, &result, alignment).error()) + if (platform().region_alloc().alloc_aligned(size, &result, alignment).error()) error(__func__, ": alloc_aligned failed!"); local_base = (addr_t)result; diff --git a/repos/base-pistachio/src/core/irq_session_component.cc b/repos/base-pistachio/src/core/irq_session_component.cc index 4119a0bda..6e17e70b8 100644 --- a/repos/base-pistachio/src/core/irq_session_component.cc +++ b/repos/base-pistachio/src/core/irq_session_component.cc @@ -126,7 +126,7 @@ Irq_object::Irq_object(unsigned irq) ***************************/ -Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char *args) : _irq_number(Arg_string::find_arg(args, "irq_number").long_value(-1)), @@ -137,7 +137,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, if (msi) throw Service_denied(); - if (!irq_alloc || irq_alloc->alloc_addr(1, _irq_number).error()) { + if (irq_alloc.alloc_addr(1, _irq_number).error()) { error("unavailable IRQ ", Hex(_irq_number), " requested"); throw Service_denied(); } diff --git a/repos/base-pistachio/src/core/platform.cc b/repos/base-pistachio/src/core/platform.cc index 6d43b369d..5068e4b57 100644 --- a/repos/base-pistachio/src/core/platform.cc +++ b/repos/base-pistachio/src/core/platform.cc @@ -212,23 +212,23 @@ Platform::Sigma0::Sigma0() } -Platform::Sigma0 *Platform::sigma0() +Platform::Sigma0 &Platform::sigma0() { static Sigma0 _sigma0; - return &_sigma0; + return _sigma0; } -Platform::Core_pager::Core_pager(Platform_pd *core_pd) +Platform::Core_pager::Core_pager(Platform_pd &core_pd) : - Platform_thread(0, "core.pager"), + Platform_thread("core.pager"), Pager_object(Cpu_session_capability(), Thread_capability(), 0, Affinity::Location(), Session_label(), Cpu_session::Name(name())) { Platform_thread::pager(sigma0()); - core_pd->bind_thread(this); + core_pd.bind_thread(*this); cap(Capability_space::import(native_thread_id(), Rpc_obj_key())); /* stack begins at the top end of the '_core_pager_stack' array */ @@ -240,10 +240,10 @@ Platform::Core_pager::Core_pager(Platform_pd *core_pd) } -Platform::Core_pager *Platform::core_pager() +Platform::Core_pager &Platform::core_pager() { static Core_pager _core_pager(core_pd()); - return &_core_pager; + return _core_pager; } @@ -495,8 +495,6 @@ void Platform::_setup_basics() /* add KIP as ROM module */ _rom_fs.insert(&_kip_rom); - // Get virtual bootinfo address. - L4_Fpage_t bipage = L4_Sigma0_GetPage(get_sigma0(), L4_Fpage(kip->BootInfo, get_page_size())); @@ -567,18 +565,19 @@ void Platform::_setup_basics() } -Platform_pd *Platform::core_pd() +Platform_pd &Platform::core_pd() { /* on first call, setup task object for core task */ static Platform_pd _core_pd(true); - return &_core_pd; + return _core_pd; } -Platform::Platform() : - _ram_alloc(nullptr), _io_mem_alloc(core_mem_alloc()), - _io_port_alloc(core_mem_alloc()), _irq_alloc(core_mem_alloc()), - _region_alloc(core_mem_alloc()), +Platform::Platform() +: + _ram_alloc(nullptr), _io_mem_alloc(&core_mem_alloc()), + _io_port_alloc(&core_mem_alloc()), _irq_alloc(&core_mem_alloc()), + _region_alloc(&core_mem_alloc()), _kip_rom((addr_t)Pistachio::get_kip(), sizeof(Pistachio::L4_KernelInterfacePage_t), "pistachio_kip") { @@ -605,12 +604,12 @@ Platform::Platform() : * thread_id of first task. But since we do not destroy this * task, it should be no problem. */ - static Platform_thread core_thread(0, "core.main"); + static Platform_thread core_thread("core.main"); core_thread.set_l4_thread_id(Pistachio::L4_MyGlobalId()); core_thread.pager(sigma0()); - core_pd()->bind_thread(&core_thread); + core_pd().bind_thread(core_thread); /* core log as ROM module */ { @@ -618,14 +617,14 @@ Platform::Platform() : unsigned const pages = 1; size_t const log_size = pages << get_page_size_log2(); - ram_alloc()->alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); + ram_alloc().alloc_aligned(log_size, &phys_ptr, get_page_size_log2()); addr_t const phys_addr = reinterpret_cast(phys_ptr); void * const core_local_ptr = phys_ptr; addr_t const core_local_addr = phys_addr; /* let one page free after the log buffer */ - region_alloc()->remove_range(core_local_addr, log_size + get_page_size()); + region_alloc().remove_range(core_local_addr, log_size + get_page_size()); memset(core_local_ptr, 0, log_size); diff --git a/repos/base-pistachio/src/core/platform_pd.cc b/repos/base-pistachio/src/core/platform_pd.cc index 9e884d1b0..2200659e3 100644 --- a/repos/base-pistachio/src/core/platform_pd.cc +++ b/repos/base-pistachio/src/core/platform_pd.cc @@ -147,7 +147,7 @@ Platform_thread* Platform_pd::_next_thread() } -int Platform_pd::_alloc_thread(int thread_id, Platform_thread *thread) +int Platform_pd::_alloc_thread(int thread_id, Platform_thread &thread) { int i = thread_id; @@ -164,7 +164,7 @@ int Platform_pd::_alloc_thread(int thread_id, Platform_thread *thread) if (_threads[i]) return -2; } - _threads[i] = thread; + _threads[i] = &thread; return i; } @@ -183,12 +183,12 @@ void Platform_pd::_free_thread(int thread_id) ** Public object members ** ***************************/ -bool Platform_pd::bind_thread(Platform_thread *thread) +bool Platform_pd::bind_thread(Platform_thread &thread) { using namespace Pistachio; /* thread_id is THREAD_INVALID by default - only core is the special case */ - int thread_id = thread->thread_id(); + int thread_id = thread.thread_id(); L4_ThreadId_t l4_thread_id; int t = _alloc_thread(thread_id, thread); @@ -200,18 +200,18 @@ bool Platform_pd::bind_thread(Platform_thread *thread) l4_thread_id = make_l4_id(_pd_id, thread_id, _version); /* finally inform thread about binding */ - thread->bind(thread_id, l4_thread_id, this); + thread.bind(thread_id, l4_thread_id, *this); return true; } -void Platform_pd::unbind_thread(Platform_thread *thread) +void Platform_pd::unbind_thread(Platform_thread &thread) { - int thread_id = thread->thread_id(); + int thread_id = thread.thread_id(); /* unbind thread before proceeding */ - thread->unbind(); + thread.unbind(); _free_thread(thread_id); @@ -326,7 +326,7 @@ Platform_pd::Platform_pd(bool) : _l4_task_id(L4_MyGlobalId()) } -Platform_pd::Platform_pd(Allocator *, char const *, signed pd_id, bool create) +Platform_pd::Platform_pd(Allocator &, char const *, signed pd_id, bool create) { if (!create) panic("create must be true."); @@ -348,7 +348,7 @@ Platform_pd::Platform_pd(Allocator *, char const *, signed pd_id, bool create) Platform_pd::~Platform_pd() { /* unbind all threads */ - while (Platform_thread *t = _next_thread()) unbind_thread(t); + while (Platform_thread *t = _next_thread()) unbind_thread(*t); _destroy_pd(); _free_pd(); diff --git a/repos/base-pistachio/src/core/platform_thread.cc b/repos/base-pistachio/src/core/platform_thread.cc index 3901e1d10..8f33a7d6c 100644 --- a/repos/base-pistachio/src/core/platform_thread.cc +++ b/repos/base-pistachio/src/core/platform_thread.cc @@ -137,11 +137,11 @@ void Platform_thread::resume() void Platform_thread::bind(int thread_id, L4_ThreadId_t l4_thread_id, - Platform_pd *pd) + Platform_pd &pd) { _thread_id = thread_id; _l4_thread_id = l4_thread_id; - _platform_pd = pd; + _platform_pd = &pd; } @@ -223,14 +223,6 @@ void Platform_thread::cancel_blocking() } -Platform_thread::Platform_thread(size_t, const char *name, unsigned prio, - Affinity::Location, addr_t, int id) -: _thread_id(id), _l4_thread_id(L4_nilthread), _priority(prio), _pager(0) -{ - strncpy(_name, name, sizeof(_name)); -} - - Platform_thread::~Platform_thread() { /* @@ -238,5 +230,5 @@ Platform_thread::~Platform_thread() * Thread::unbind() */ if (_platform_pd) - _platform_pd->unbind_thread(this); + _platform_pd->unbind_thread(*this); } diff --git a/repos/base-pistachio/src/core/ram_dataspace_support.cc b/repos/base-pistachio/src/core/ram_dataspace_support.cc index b1e0ebb19..18e63f332 100644 --- a/repos/base-pistachio/src/core/ram_dataspace_support.cc +++ b/repos/base-pistachio/src/core/ram_dataspace_support.cc @@ -18,10 +18,10 @@ using namespace Genode; -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *) { } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *) { } +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &) { } +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } -void Ram_dataspace_factory::_clear_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_clear_ds(Dataspace_component &ds) { - memset((void *)ds->phys_addr(), 0, ds->size()); + memset((void *)ds.phys_addr(), 0, ds.size()); } diff --git a/repos/base-pistachio/src/core/thread_start.cc b/repos/base-pistachio/src/core/thread_start.cc index 34903e189..53eebe162 100644 --- a/repos/base-pistachio/src/core/thread_start.cc +++ b/repos/base-pistachio/src/core/thread_start.cc @@ -37,12 +37,12 @@ void Thread::_thread_start() void Thread::start() { /* create and start platform thread */ - native_thread().pt = new(platform()->core_mem_alloc()) - Platform_thread(0, _stack->name().string()); + native_thread().pt = new (platform().core_mem_alloc()) + Platform_thread(_stack->name().string()); - platform_specific()->core_pd()->bind_thread(native_thread().pt); + platform_specific().core_pd().bind_thread(*native_thread().pt); - native_thread().pt->pager(platform_specific()->core_pager()); + native_thread().pt->pager(platform_specific().core_pager()); native_thread().l4id = native_thread().pt->native_thread_id(); native_thread().pt->start((void *)_thread_start, stack_top()); @@ -60,5 +60,5 @@ void Thread::cancel_blocking() void Thread::_deinit_platform_thread() { /* destruct platform thread */ - destroy(platform()->core_mem_alloc(), native_thread().pt); + destroy(platform().core_mem_alloc(), native_thread().pt); } diff --git a/repos/base-sel4/src/core/capability_space.cc b/repos/base-sel4/src/core/capability_space.cc index fec6ca539..c30dd7359 100644 --- a/repos/base-sel4/src/core/capability_space.cc +++ b/repos/base-sel4/src/core/capability_space.cc @@ -80,7 +80,7 @@ Capability_space::create_rpc_obj_cap(Native_capability ep_cap, Rpc_obj_key rpc_obj_key) { /* allocate core-local selector for RPC object */ - Cap_sel const rpc_obj_sel = platform_specific()->core_sel_alloc().alloc(); + Cap_sel const rpc_obj_sel = platform_specific().core_sel_alloc().alloc(); /* create Genode capability */ Native_capability::Data &data = @@ -170,13 +170,13 @@ Native_capability Capability_space::lookup(Rpc_obj_key rpc_obj_key) unsigned Capability_space::alloc_rcv_sel() { - return platform_specific()->alloc_core_rcv_sel(); + return platform_specific().alloc_core_rcv_sel(); } void Capability_space::reset_sel(unsigned sel) { - return platform_specific()->reset_sel(sel); + return platform_specific().reset_sel(sel); } diff --git a/repos/base-sel4/src/core/core_region_map.cc b/repos/base-sel4/src/core/core_region_map.cc index 03e12d8c9..fb20e0c0e 100644 --- a/repos/base-sel4/src/core/core_region_map.cc +++ b/repos/base-sel4/src/core/core_region_map.cc @@ -47,7 +47,7 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t size, off_t offset, /* allocate range in core's virtual address space */ void *virt_addr; - if (!platform()->region_alloc()->alloc(page_rounded_size, &virt_addr)) { + if (!platform().region_alloc().alloc(page_rounded_size, &virt_addr)) { error("could not allocate virtual address range in core of size ", page_rounded_size); return nullptr; @@ -66,7 +66,7 @@ Core_region_map::attach(Dataspace_capability ds_cap, size_t size, off_t offset, void Core_region_map::detach(Local_addr core_local_addr) { - size_t size = platform_specific()->region_alloc_size_at(core_local_addr); + size_t size = platform_specific().region_alloc_size_at(core_local_addr); if (!unmap_local(core_local_addr, size >> get_page_size_log2())) { Genode::error("could not unmap core virtual address ", @@ -74,5 +74,5 @@ void Core_region_map::detach(Local_addr core_local_addr) return; } - platform()->region_alloc()->free(core_local_addr); + platform().region_alloc().free(core_local_addr); } diff --git a/repos/base-sel4/src/core/include/map_local.h b/repos/base-sel4/src/core/include/map_local.h index 21a88af88..ce43051b8 100644 --- a/repos/base-sel4/src/core/include/map_local.h +++ b/repos/base-sel4/src/core/include/map_local.h @@ -38,7 +38,7 @@ namespace Genode { { enum { DONT_FLUSH = false, WRITEABLE = true, NON_EXECUTABLE = false }; try { - platform = platform ? platform : platform_specific(); + platform = platform ? platform : &platform_specific(); platform->core_vm_space().map(from_phys, to_virt, num_pages, Cache_attribute::CACHED, WRITEABLE, NON_EXECUTABLE, @@ -57,7 +57,7 @@ namespace Genode { Platform * platform = nullptr, bool const invalidate = false) { - platform = platform ? platform : platform_specific(); + platform = platform ? platform : &platform_specific(); return platform->core_vm_space().unmap(virt_addr, num_pages, invalidate); } } diff --git a/repos/base-sel4/src/core/include/pager.h b/repos/base-sel4/src/core/include/pager.h index cbf184cac..c1c48aa77 100644 --- a/repos/base-sel4/src/core/include/pager.h +++ b/repos/base-sel4/src/core/include/pager.h @@ -183,12 +183,12 @@ class Genode::Pager_entrypoint : public Object_pool, /** * Associate Pager_object with the entry point */ - Pager_capability manage(Pager_object *obj); + Pager_capability manage(Pager_object &); /** * Dissolve Pager_object from entry point */ - void dissolve(Pager_object *obj); + void dissolve(Pager_object &); /********************** diff --git a/repos/base-sel4/src/core/include/platform.h b/repos/base-sel4/src/core/include/platform.h index 1258f9c83..2134a8f46 100644 --- a/repos/base-sel4/src/core/include/platform.h +++ b/repos/base-sel4/src/core/include/platform.h @@ -20,6 +20,7 @@ #include #include #include +#include namespace Genode { class Platform; @@ -83,12 +84,6 @@ class Genode::Platform : public Platform_generic { private: - /* - * Noncopyable - */ - Platform(Platform const &); - Platform &operator = (Platform const &); - Core_mem_allocator _core_mem_alloc { }; /* core-accessible memory */ Phys_allocator _io_mem_alloc; /* MMIO allocator */ Phys_allocator _io_port_alloc; /* I/O port allocator */ @@ -215,7 +210,7 @@ class Genode::Platform : public Platform_generic /** * Shortcut for physical memory allocator */ - Range_allocator &_phys_alloc = *_core_mem_alloc.phys_alloc(); + Range_allocator &_phys_alloc = _core_mem_alloc.phys_alloc(); /** * Initialize core allocators @@ -244,21 +239,23 @@ class Genode::Platform : public Platform_generic ** Generic platform interface ** ********************************/ - Range_allocator *ram_alloc() { return _core_mem_alloc.phys_alloc(); } - Range_allocator *io_mem_alloc() { return &_io_mem_alloc; } - Range_allocator *io_port_alloc() { return &_io_port_alloc; } - Range_allocator *irq_alloc() { return &_irq_alloc; } - Range_allocator *region_alloc() { return _core_mem_alloc.virt_alloc(); } - Range_allocator *core_mem_alloc() { return &_core_mem_alloc; } + Range_allocator &ram_alloc() { return _core_mem_alloc.phys_alloc(); } + Range_allocator &io_mem_alloc() { return _io_mem_alloc; } + Range_allocator &io_port_alloc() { return _io_port_alloc; } + Range_allocator &irq_alloc() { return _irq_alloc; } + Range_allocator ®ion_alloc() { return _core_mem_alloc.virt_alloc(); } + Range_allocator &core_mem_alloc() { return _core_mem_alloc; } addr_t vm_start() const { return _vm_base; } size_t vm_size() const { return _vm_size; } - Rom_fs *rom_fs() { return &_rom_fs; } + Rom_fs &rom_fs() { return _rom_fs; } Affinity::Space affinity_space() const override { return sel4_boot_info().numNodes; } bool supports_direct_unmap() const override { return true; } - Address_space * core_pd() { return nullptr; } + + Address_space &core_pd() { ASSERT_NEVER_CALLED; } + /******************* ** seL4 specific ** @@ -284,7 +281,7 @@ class Genode::Platform : public Platform_generic * core_rm_session detach(). */ size_t region_alloc_size_at(void * addr) { - return (*_core_mem_alloc.virt_alloc())()->size_at(addr); } + return (_core_mem_alloc.virt_alloc())()->size_at(addr); } size_t max_caps() const override { diff --git a/repos/base-sel4/src/core/include/platform_pd.h b/repos/base-sel4/src/core/include/platform_pd.h index 3e6fa2bce..6fe53d18a 100644 --- a/repos/base-sel4/src/core/include/platform_pd.h +++ b/repos/base-sel4/src/core/include/platform_pd.h @@ -71,8 +71,7 @@ class Genode::Platform_pd : public Address_space /** * Constructors */ - Platform_pd(Allocator * md_alloc, char const *, - signed pd_id = -1, bool create = true); + Platform_pd(Allocator &md_alloc, char const *); /** * Destructor @@ -82,14 +81,14 @@ class Genode::Platform_pd : public Address_space /** * Bind thread to protection domain */ - bool bind_thread(Platform_thread *thread); + bool bind_thread(Platform_thread &); /** * Unbind thread from protection domain * * Free the thread's slot and update thread object. */ - void unbind_thread(Platform_thread *thread); + void unbind_thread(Platform_thread &); /** * Assign parent interface to protection domain diff --git a/repos/base-sel4/src/core/include/platform_thread.h b/repos/base-sel4/src/core/include/platform_thread.h index 256d42181..186061877 100644 --- a/repos/base-sel4/src/core/include/platform_thread.h +++ b/repos/base-sel4/src/core/include/platform_thread.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace Genode { @@ -80,8 +81,8 @@ class Genode::Platform_thread : public List::Element /** * Constructor */ - Platform_thread(size_t, const char *name = 0, unsigned priority = 0, - Affinity::Location = Affinity::Location(), addr_t utcb = 0); + Platform_thread(size_t, const char *name, unsigned priority, + Affinity::Location, addr_t utcb); /** * Destructor @@ -144,12 +145,15 @@ class Genode::Platform_thread : public List::Element ** Accessor functions ** ************************/ - /** - * Set pager capability - */ - Pager_object *pager(Pager_object *) const { return _pager; } - void pager(Pager_object *pager) { _pager = pager; } - Pager_object *pager() { return _pager; } + void pager(Pager_object &pager) { _pager = &pager; } + + Pager_object &pager() + { + if (_pager) + return *_pager; + + ASSERT_NEVER_CALLED; + } /** * Return identification of thread when faulting diff --git a/repos/base-sel4/src/core/include/thread_sel4.h b/repos/base-sel4/src/core/include/thread_sel4.h index 341caa0b0..ae146e08e 100644 --- a/repos/base-sel4/src/core/include/thread_sel4.h +++ b/repos/base-sel4/src/core/include/thread_sel4.h @@ -75,8 +75,8 @@ void Genode::Thread_info::init_tcb(Platform &platform, void Genode::Thread_info::init(addr_t const utcb_virt_addr, unsigned const prio) { - Platform &platform = *platform_specific(); - Range_allocator &phys_alloc = *platform.ram_alloc(); + Platform &platform = platform_specific(); + Range_allocator &phys_alloc = platform.ram_alloc(); /* create IPC buffer of one page */ ipc_buffer_phys = Untyped_memory::alloc_page(phys_alloc); @@ -119,20 +119,20 @@ void Genode::Thread_info::destruct() { if (lock_sel.value()) { seL4_CNode_Delete(seL4_CapInitThreadCNode, lock_sel.value(), 32); - platform_specific()->core_sel_alloc().free(lock_sel); + platform_specific().core_sel_alloc().free(lock_sel); } if (ep_sel.value()) { seL4_CNode_Delete(seL4_CapInitThreadCNode, ep_sel.value(), 32); - platform_specific()->core_sel_alloc().free(ep_sel); + platform_specific().core_sel_alloc().free(ep_sel); } if (tcb_sel.value()) { seL4_CNode_Delete(seL4_CapInitThreadCNode, tcb_sel.value(), 32); - platform_specific()->core_sel_alloc().free(tcb_sel); + platform_specific().core_sel_alloc().free(tcb_sel); } if (ipc_buffer_phys) { - Platform &platform = *platform_specific(); - Range_allocator &phys_alloc = *platform.ram_alloc(); + Platform &platform = platform_specific(); + Range_allocator &phys_alloc = platform.ram_alloc(); Untyped_memory::convert_to_untyped_frames(ipc_buffer_phys, 4096); Untyped_memory::free_page(phys_alloc, ipc_buffer_phys); } diff --git a/repos/base-sel4/src/core/irq_session_component.cc b/repos/base-sel4/src/core/irq_session_component.cc index b6d1e1afc..9608b4f4b 100644 --- a/repos/base-sel4/src/core/irq_session_component.cc +++ b/repos/base-sel4/src/core/irq_session_component.cc @@ -28,8 +28,8 @@ bool Irq_object::associate(Irq_session::Trigger const irq_trigger, Irq_session::Polarity const irq_polarity) { /* allocate notification object within core's CNode */ - Platform &platform = *platform_specific(); - Range_allocator &phys_alloc = *platform.ram_alloc(); + Platform &platform = platform_specific(); + Range_allocator &phys_alloc = platform.ram_alloc(); { addr_t const phys_addr = Untyped_memory::alloc_page(phys_alloc); @@ -82,11 +82,11 @@ void Irq_object::entry() } } -void Genode::Irq_object::ack_irq() +void Irq_object::ack_irq() { int res = seL4_IRQHandler_Ack(_kernel_irq_sel.value()); if (res != seL4_NoError) - Genode::error("ack_irq failed - ", res); + error("ack_irq failed - ", res); } Irq_object::Irq_object(unsigned irq) @@ -94,12 +94,12 @@ Irq_object::Irq_object(unsigned irq) Thread_deprecated<4096>("irq"), _sync_bootup(Lock::LOCKED), _irq(irq), - _kernel_irq_sel(platform_specific()->core_sel_alloc().alloc()), - _kernel_notify_sel(platform_specific()->core_sel_alloc().alloc()) + _kernel_irq_sel(platform_specific().core_sel_alloc().alloc()), + _kernel_notify_sel(platform_specific().core_sel_alloc().alloc()) { } -Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, +Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char *args) : _irq_number(Arg_string::find_arg(args, "irq_number").long_value(-1)), @@ -110,8 +110,8 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, if (msi) throw Service_denied(); - if (!irq_alloc || irq_alloc->alloc_addr(1, _irq_number).error()) { - Genode::error("unavailable IRQ ", _irq_number, " requested"); + if (irq_alloc.alloc_addr(1, _irq_number).error()) { + error("unavailable IRQ ", _irq_number, " requested"); throw Service_denied(); } @@ -119,7 +119,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, Irq_args const irq_args(args); if (!_irq_object.associate(irq_args.trigger(), irq_args.polarity())) { - Genode::error("could not associate with IRQ ", irq_args.irq_number()); + error("could not associate with IRQ ", irq_args.irq_number()); throw Service_denied(); } @@ -129,7 +129,7 @@ Irq_session_component::Irq_session_component(Range_allocator *irq_alloc, Irq_session_component::~Irq_session_component() { - Genode::error(__PRETTY_FUNCTION__, "- not yet implemented."); + error(__PRETTY_FUNCTION__, "- not yet implemented."); } @@ -139,13 +139,13 @@ void Irq_session_component::ack_irq() } -void Irq_session_component::sigh(Genode::Signal_context_capability cap) +void Irq_session_component::sigh(Signal_context_capability cap) { _irq_object.sigh(cap); } -Genode::Irq_session::Info Irq_session_component::info() +Irq_session::Info Irq_session_component::info() { /* no MSI support */ return { .type = Info::Type::INVALID, .address = 0, .value = 0 }; diff --git a/repos/base-sel4/src/core/pager.cc b/repos/base-sel4/src/core/pager.cc index 0ae9a1f15..9106e03fd 100644 --- a/repos/base-sel4/src/core/pager.cc +++ b/repos/base-sel4/src/core/pager.cc @@ -98,7 +98,7 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session, Cpu_session::Name const &name) : _badge(badge), _cpu_session_cap(cpu_session), _thread_cap(thread), - _reply_cap(platform_specific()->core_sel_alloc().alloc()), + _reply_cap(platform_specific().core_sel_alloc().alloc()), _pd_label(pd_label), _name(name) { } @@ -106,7 +106,7 @@ Pager_object::Pager_object(Cpu_session_capability cpu_session, Pager_object::~Pager_object() { seL4_CNode_Delete(seL4_CapInitThreadCNode, _reply_cap.value(), 32); - platform_specific()->core_sel_alloc().free(_reply_cap); + platform_specific().core_sel_alloc().free(_reply_cap); /* invalidate reply cap for Pager_object::wait_for_fault() _reply_sel */ _reply_cap = Cap_sel(0); } @@ -143,21 +143,21 @@ Untyped_capability Pager_entrypoint::_pager_object_cap(unsigned long badge) } -void Pager_entrypoint::dissolve(Pager_object *obj) +void Pager_entrypoint::dissolve(Pager_object &obj) { using Pool = Object_pool; - if (obj) Pool::remove(obj); + Pool::remove(&obj); } -Pager_capability Pager_entrypoint::manage(Pager_object *obj) +Pager_capability Pager_entrypoint::manage(Pager_object &obj) { - Native_capability cap = _pager_object_cap(obj->badge()); + Native_capability cap = _pager_object_cap(obj.badge()); /* add server object to object pool */ - obj->cap(cap); - insert(obj); + obj.cap(cap); + insert(&obj); /* return capability that uses the object id as badge */ return reinterpret_cap_cast(cap); diff --git a/repos/base-sel4/src/core/platform.cc b/repos/base-sel4/src/core/platform.cc index 9999fcb60..44381fd45 100644 --- a/repos/base-sel4/src/core/platform.cc +++ b/repos/base-sel4/src/core/platform.cc @@ -115,7 +115,7 @@ void Platform::_init_allocators() if (device) _io_mem_alloc.add_range(phys_addr, phys_size); else - _core_mem_alloc.phys_alloc()->add_range(phys_addr, phys_size); + _core_mem_alloc.phys_alloc().add_range(phys_addr, phys_size); _unused_phys_alloc.remove_range(phys_addr, phys_size); }); @@ -135,7 +135,7 @@ void Platform::_init_allocators() addr_t const image_elf_size = core_virt_end - core_virt_beg; _unused_virt_alloc.remove_range(core_virt_beg, image_elf_size); - _core_mem_alloc.virt_alloc()->add_range(modules_start, core_virt_end - modules_start); + _core_mem_alloc.virt_alloc().add_range(modules_start, core_virt_end - modules_start); /* remove initial IPC buffer from core's virtual address allocator */ seL4_BootInfo const &bi = sel4_boot_info(); @@ -358,20 +358,20 @@ void Platform::_init_rom_modules() void *virt_ptr = nullptr; const char *rom_name = "platform_info"; - addr_t const phys_addr = Untyped_memory::alloc_page(*ram_alloc()); + addr_t const phys_addr = Untyped_memory::alloc_page(ram_alloc()); Untyped_memory::convert_to_page_frames(phys_addr, pages); - if (region_alloc()->alloc_aligned(rom_size, &virt_ptr, get_page_size_log2()).error()) { + if (region_alloc().alloc_aligned(rom_size, &virt_ptr, get_page_size_log2()).error()) { error("could not setup platform_info ROM - region allocation error"); - Untyped_memory::free_page(*ram_alloc(), phys_addr); + Untyped_memory::free_page(ram_alloc(), phys_addr); return; } addr_t const virt_addr = reinterpret_cast(virt_ptr); if (!map_local(phys_addr, virt_addr, pages, this)) { error("could not setup platform_info ROM - map error"); - region_alloc()->free(virt_ptr); - Untyped_memory::free_page(*ram_alloc(), phys_addr); + region_alloc().free(virt_ptr); + Untyped_memory::free_page(ram_alloc(), phys_addr); return; } @@ -484,7 +484,7 @@ void Platform::_init_rom_modules() error("could not setup platform_info ROM - unmap error"); return; } - region_alloc()->free(virt_ptr); + region_alloc().free(virt_ptr); _rom_fs.insert( new (core_mem_alloc()) Rom_module(phys_addr, rom_size, rom_name)); @@ -494,10 +494,10 @@ void Platform::_init_rom_modules() Platform::Platform() : - _io_mem_alloc(core_mem_alloc()), _io_port_alloc(core_mem_alloc()), - _irq_alloc(core_mem_alloc()), - _unused_phys_alloc(core_mem_alloc()), - _unused_virt_alloc(core_mem_alloc()), + _io_mem_alloc(&core_mem_alloc()), _io_port_alloc(&core_mem_alloc()), + _irq_alloc(&core_mem_alloc()), + _unused_phys_alloc(&core_mem_alloc()), + _unused_virt_alloc(&core_mem_alloc()), _init_unused_phys_alloc_done((_init_unused_phys_alloc(), true)), _vm_base(0x2000), /* 2nd page is used as IPC buffer of main thread */ _vm_size(3*1024*1024*1024UL - _vm_base), /* use the lower 3GiB */ @@ -526,7 +526,7 @@ Platform::Platform() Cap_sel core_sel = _core_sel_alloc.alloc(); { - addr_t const phys_addr = Untyped_memory::alloc_page(*ram_alloc()); + addr_t const phys_addr = Untyped_memory::alloc_page(ram_alloc()); seL4_Untyped const service = Untyped_memory::untyped_sel(phys_addr).value(); create(service, core_cnode().sel(), core_sel); } @@ -555,7 +555,7 @@ Platform::Platform() addr_t const virt_addr = (addr_t)virt_ptr; /* add to available virtual region of core */ - _core_mem_alloc.virt_alloc()->add_range(virt_addr, virt_size); + _core_mem_alloc.virt_alloc().add_range(virt_addr, virt_size); /* back region by page tables */ _core_vm_space.unsynchronized_alloc_page_tables(virt_addr, virt_size); @@ -576,8 +576,8 @@ Platform::Platform() */ Info trace_source_info() const override { - Genode::Thread * me = Genode::Thread::myself(); - addr_t const ipc_buffer = reinterpret_cast(me->utcb()); + Genode::Thread &myself = *Genode::Thread::myself(); + addr_t const ipc_buffer = reinterpret_cast(myself.utcb()); seL4_IPCBuffer * ipcbuffer = reinterpret_cast(ipc_buffer); uint64_t const * buf = reinterpret_cast(ipcbuffer->msg); @@ -602,7 +602,7 @@ Platform::Platform() new (core_mem_alloc()) Idle_trace_source(Trace::sources(), *this, - *_core_mem_alloc.phys_alloc(), + _core_mem_alloc.phys_alloc(), Affinity::Location(cpu_id, 0, affinity_space().width(), affinity_space().height())); @@ -617,11 +617,11 @@ Platform::Platform() unsigned const pages = 1; size_t const log_size = pages << get_page_size_log2(); - addr_t const phys_addr = Untyped_memory::alloc_page(*ram_alloc()); + addr_t const phys_addr = Untyped_memory::alloc_page(ram_alloc()); Untyped_memory::convert_to_page_frames(phys_addr, pages); /* let one page free after the log buffer */ - region_alloc()->alloc_aligned(log_size + get_page_size(), &core_local_ptr, get_page_size_log2()); + region_alloc().alloc_aligned(log_size + get_page_size(), &core_local_ptr, get_page_size_log2()); addr_t const core_local_addr = reinterpret_cast(core_local_ptr); map_local(phys_addr, core_local_addr, pages, this); diff --git a/repos/base-sel4/src/core/platform_pd.cc b/repos/base-sel4/src/core/platform_pd.cc index 5b35b1d9e..2efe030b0 100644 --- a/repos/base-sel4/src/core/platform_pd.cc +++ b/repos/base-sel4/src/core/platform_pd.cc @@ -52,30 +52,28 @@ static Pd_id_alloc &pd_id_alloc() } -bool Platform_pd::bind_thread(Platform_thread *thread) +bool Platform_pd::bind_thread(Platform_thread &thread) { - ASSERT(thread); - try { /* allocate fault handler selector in the PD's CSpace */ - thread->_fault_handler_sel = alloc_sel(); + thread._fault_handler_sel = alloc_sel(); /* allocate endpoint selector in the PD's CSpace */ - thread->_ep_sel = alloc_sel(); + thread._ep_sel = alloc_sel(); /* allocate asynchronous selector used for locks in the PD's CSpace */ - thread->_lock_sel = thread->_utcb ? alloc_sel() : Cap_sel(INITIAL_SEL_LOCK); + thread._lock_sel = thread._utcb ? alloc_sel() : Cap_sel(INITIAL_SEL_LOCK); } catch (Platform_pd::Sel_bit_alloc::Out_of_indices) { - if (thread->_fault_handler_sel.value()) { - free_sel(thread->_fault_handler_sel); - thread->_fault_handler_sel = Cap_sel(0); + if (thread._fault_handler_sel.value()) { + free_sel(thread._fault_handler_sel); + thread._fault_handler_sel = Cap_sel(0); } - if (thread->_ep_sel.value()) { - free_sel(thread->_ep_sel); - thread->_ep_sel = Cap_sel(0); + if (thread._ep_sel.value()) { + free_sel(thread._ep_sel); + thread._ep_sel = Cap_sel(0); } return false; } - thread->_pd = this; + thread._pd = this; /* * Map IPC buffer @@ -87,31 +85,29 @@ bool Platform_pd::bind_thread(Platform_thread *thread) * to attach the UTCB as a dataspace to the stack area to make the RM * session aware to the mapping. This code is missing. */ - addr_t const utcb = (thread->_utcb) ? thread->_utcb - : (addr_t)thread->INITIAL_IPC_BUFFER_VIRT; + addr_t const utcb = (thread._utcb) ? thread._utcb + : (addr_t)thread.INITIAL_IPC_BUFFER_VIRT; enum { WRITABLE = true, ONE_PAGE = 1, FLUSHABLE = true, NON_EXECUTABLE = false }; _vm_space.alloc_page_tables(utcb, get_page_size()); - _vm_space.map(thread->_info.ipc_buffer_phys, utcb, ONE_PAGE, + _vm_space.map(thread._info.ipc_buffer_phys, utcb, ONE_PAGE, Cache_attribute::CACHED, WRITABLE, NON_EXECUTABLE, FLUSHABLE); return true; } -void Platform_pd::unbind_thread(Platform_thread *thread) +void Platform_pd::unbind_thread(Platform_thread &thread) { - if (!thread) - return; + if (thread._utcb) + free_sel(thread._lock_sel); - if (thread->_utcb) - free_sel(thread->_lock_sel); - free_sel(thread->_fault_handler_sel); - free_sel(thread->_ep_sel); + free_sel(thread._fault_handler_sel); + free_sel(thread._ep_sel); - if (thread->_utcb) - _vm_space.unmap(thread->_utcb, 1); + if (thread._utcb) + _vm_space.unmap(thread._utcb, 1); else - _vm_space.unmap(thread->INITIAL_IPC_BUFFER_VIRT, 1); + _vm_space.unmap(thread.INITIAL_IPC_BUFFER_VIRT, 1); } @@ -126,7 +122,7 @@ void Platform_pd::assign_parent(Native_capability parent) * Install parent endpoint selector at the predefined position * INITIAL_SEL_PARENT within the PD's CSpace. */ - _cspace_cnode_2nd[0]->copy(platform_specific()->core_cnode(), + _cspace_cnode_2nd[0]->copy(platform_specific().core_cnode(), Cnode_index(ipc_cap_data.sel), Cnode_index(INITIAL_SEL_PARENT)); } @@ -205,41 +201,41 @@ void Platform_pd::flush(addr_t virt_addr, size_t size, Core_local_addr) } -Platform_pd::Platform_pd(Allocator * md_alloc, char const *label, signed, bool) +Platform_pd::Platform_pd(Allocator &md_alloc, char const *label) : _id(pd_id_alloc().alloc()), - _page_table_registry(*md_alloc), - _page_directory_sel(platform_specific()->core_sel_alloc().alloc()), + _page_table_registry(md_alloc), + _page_directory_sel(platform_specific().core_sel_alloc().alloc()), _page_directory(_init_page_directory()), _vm_space(_page_directory_sel, - platform_specific()->core_sel_alloc(), - *platform()->ram_alloc(), - platform_specific()->top_cnode(), - platform_specific()->core_cnode(), - platform_specific()->phys_cnode(), + platform_specific().core_sel_alloc(), + platform().ram_alloc(), + platform_specific().top_cnode(), + platform_specific().core_cnode(), + platform_specific().phys_cnode(), _id, _page_table_registry, label), - _cspace_cnode_1st(platform_specific()->core_cnode().sel(), - platform_specific()->core_sel_alloc().alloc(), + _cspace_cnode_1st(platform_specific().core_cnode().sel(), + platform_specific().core_sel_alloc().alloc(), CSPACE_SIZE_LOG2_1ST, - *platform()->ram_alloc()) + platform().ram_alloc()) { /* add all 2nd level CSpace's to 1st level CSpace */ for (unsigned i = 0; i < sizeof(_cspace_cnode_2nd) / sizeof(_cspace_cnode_2nd[0]); i++) { - _cspace_cnode_2nd[i].construct(platform_specific()->core_cnode().sel(), - platform_specific()->core_sel_alloc().alloc(), + _cspace_cnode_2nd[i].construct(platform_specific().core_cnode().sel(), + platform_specific().core_sel_alloc().alloc(), CSPACE_SIZE_LOG2_2ND, - *platform()->ram_alloc()); + platform().ram_alloc()); - _cspace_cnode_1st.copy(platform_specific()->core_cnode(), + _cspace_cnode_1st.copy(platform_specific().core_cnode(), _cspace_cnode_2nd[i]->sel(), Cnode_index(i)); } /* install CSpace selector at predefined position in the PD's CSpace */ - _cspace_cnode_2nd[0]->copy(platform_specific()->core_cnode(), + _cspace_cnode_2nd[0]->copy(platform_specific().core_cnode(), _cspace_cnode_1st.sel(), Cnode_index(INITIAL_SEL_CNODE)); } @@ -250,13 +246,13 @@ Platform_pd::~Platform_pd() for (unsigned i = 0; i < sizeof(_cspace_cnode_2nd) / sizeof(_cspace_cnode_2nd[0]); i++) { _cspace_cnode_1st.remove(Cnode_index(i)); - _cspace_cnode_2nd[i]->destruct(*platform()->ram_alloc(), true); - platform_specific()->core_sel_alloc().free(_cspace_cnode_2nd[i]->sel()); + _cspace_cnode_2nd[i]->destruct(platform().ram_alloc(), true); + platform_specific().core_sel_alloc().free(_cspace_cnode_2nd[i]->sel()); } - _cspace_cnode_1st.destruct(*platform()->ram_alloc(), true); - platform_specific()->core_sel_alloc().free(_cspace_cnode_1st.sel()); + _cspace_cnode_1st.destruct(platform().ram_alloc(), true); + platform_specific().core_sel_alloc().free(_cspace_cnode_1st.sel()); _deinit_page_directory(_page_directory); - platform_specific()->core_sel_alloc().free(_page_directory_sel); + platform_specific().core_sel_alloc().free(_page_directory_sel); } diff --git a/repos/base-sel4/src/core/platform_thread.cc b/repos/base-sel4/src/core/platform_thread.cc index fa326c00c..c3185ccac 100644 --- a/repos/base-sel4/src/core/platform_thread.cc +++ b/repos/base-sel4/src/core/platform_thread.cc @@ -71,8 +71,8 @@ class Platform_thread_registry : Noncopyable } if (installed != 1) { - Genode::error("install mapping is wrong ", installed, - " result=", result); + error("install mapping is wrong ", installed, + " result=", result); result = false; } @@ -106,7 +106,7 @@ static void prepopulate_ipc_buffer(addr_t ipc_buffer_phys, Cap_sel ep_sel, /* allocate range in core's virtual address space */ void *virt_addr; - if (!platform()->region_alloc()->alloc(page_rounded_size, &virt_addr)) { + if (!platform().region_alloc().alloc(page_rounded_size, &virt_addr)) { error("could not allocate virtual address range in core of size ", page_rounded_size); return; @@ -122,13 +122,13 @@ static void prepopulate_ipc_buffer(addr_t ipc_buffer_phys, Cap_sel ep_sel, /* unmap IPC buffer from core */ if (!unmap_local((addr_t)virt_addr, 1)) { - Genode::error("could not unmap core virtual address ", - virt_addr, " in ", __PRETTY_FUNCTION__); + error("could not unmap core virtual address ", + virt_addr, " in ", __PRETTY_FUNCTION__); return; } /* free core's virtual address space */ - platform()->region_alloc()->free(virt_addr, page_rounded_size); + platform().region_alloc().free(virt_addr, page_rounded_size); } @@ -145,15 +145,15 @@ int Platform_thread::start(void *ip, void *sp, unsigned int) Cap_sel const pager_sel(Capability_space::ipc_cap_data(_pager->cap()).sel); /* install page-fault handler endpoint selector to the PD's CSpace */ - _pd->cspace_cnode(_fault_handler_sel).copy(platform_specific()->core_cnode(), + _pd->cspace_cnode(_fault_handler_sel).copy(platform_specific().core_cnode(), pager_sel, _fault_handler_sel); /* install the thread's endpoint selector to the PD's CSpace */ - _pd->cspace_cnode(_ep_sel).copy(platform_specific()->core_cnode(), + _pd->cspace_cnode(_ep_sel).copy(platform_specific().core_cnode(), _info.ep_sel, _ep_sel); /* install the thread's notification object to the PD's CSpace */ - _pd->cspace_cnode(_lock_sel).mint(platform_specific()->core_cnode(), + _pd->cspace_cnode(_lock_sel).mint(platform_specific().core_cnode(), _info.lock_sel, _lock_sel); /* @@ -222,7 +222,7 @@ Platform_thread::Platform_thread(size_t, const char *name, unsigned priority, : _name(name), _utcb(utcb), - _pager_obj_sel(platform_specific()->core_sel_alloc().alloc()), + _pager_obj_sel(platform_specific().core_sel_alloc().alloc()), _location(location), _priority(Cpu_session::scale_priority(CONFIG_NUM_PRIORITIES, priority)) @@ -241,7 +241,7 @@ Platform_thread::~Platform_thread() { if (_pd) { seL4_TCB_Suspend(_info.tcb_sel.value()); - _pd->unbind_thread(this); + _pd->unbind_thread(*this); } if (_pager) { @@ -255,20 +255,19 @@ Platform_thread::~Platform_thread() _info.destruct(); platform_thread_registry().remove(*this); - platform_specific()->core_sel_alloc().free(_pager_obj_sel); + platform_specific().core_sel_alloc().free(_pager_obj_sel); } unsigned long long Platform_thread::execution_time() const { - Genode::Thread * me = Genode::Thread::myself(); - - if (!me || !me->utcb()) { - Genode::error("don't know myself"); + if (!Thread::myself() || !Thread::myself()->utcb()) { + error("don't know myself"); return 0; } + Thread &myself = *Thread::myself(); - seL4_IPCBuffer * ipcbuffer = reinterpret_cast(me->utcb()); - uint64_t const * values = reinterpret_cast(ipcbuffer->msg); + seL4_IPCBuffer &ipc_buffer = *reinterpret_cast(myself.utcb()); + uint64_t const * values = reinterpret_cast(ipc_buffer.msg); /* kernel puts execution time on ipc buffer of calling thread */ seL4_BenchmarkGetThreadUtilisation(_info.tcb_sel.value()); diff --git a/repos/base-sel4/src/core/ram_dataspace_support.cc b/repos/base-sel4/src/core/ram_dataspace_support.cc index 448319e0c..0d0ea8311 100644 --- a/repos/base-sel4/src/core/ram_dataspace_support.cc +++ b/repos/base-sel4/src/core/ram_dataspace_support.cc @@ -20,32 +20,32 @@ using namespace Genode; -void Ram_dataspace_factory::_export_ram_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &ds) { - size_t const page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + size_t const page_rounded_size = (ds.size() + get_page_size() - 1) & get_page_mask(); size_t const num_pages = page_rounded_size >> get_page_size_log2(); - Untyped_memory::convert_to_page_frames(ds->phys_addr(), num_pages); + Untyped_memory::convert_to_page_frames(ds.phys_addr(), num_pages); } -void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component *ds) +void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &ds) { - size_t const page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + size_t const page_rounded_size = (ds.size() + get_page_size() - 1) & get_page_mask(); - Untyped_memory::convert_to_untyped_frames(ds->phys_addr(), page_rounded_size); + Untyped_memory::convert_to_untyped_frames(ds.phys_addr(), page_rounded_size); } -void Ram_dataspace_factory::_clear_ds (Dataspace_component *ds) +void Ram_dataspace_factory::_clear_ds (Dataspace_component &ds) { - size_t const page_rounded_size = (ds->size() + get_page_size() - 1) & get_page_mask(); + size_t const page_rounded_size = (ds.size() + get_page_size() - 1) & get_page_mask(); enum { ONE_PAGE = 1 }; /* allocate one page in core's virtual address space */ void *virt_addr_ptr = nullptr; - if (!platform()->region_alloc()->alloc(get_page_size(), &virt_addr_ptr) || + if (!platform().region_alloc().alloc(get_page_size(), &virt_addr_ptr) || !virt_addr_ptr) ASSERT(!"could not map 4k inside core"); @@ -54,7 +54,7 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component *ds) /* map each page of dataspace one at a time and clear it */ for (addr_t offset = 0; offset < page_rounded_size; offset += get_page_size()) { - addr_t const phys_addr = ds->phys_addr() + offset; + addr_t const phys_addr = ds.phys_addr() + offset; /* map one physical page to the core-local address */ if (!map_local(phys_addr, virt_addr, ONE_PAGE)) { @@ -67,9 +67,9 @@ void Ram_dataspace_factory::_clear_ds (Dataspace_component *ds) *dst++ = 0; /* unmap cleared page from core */ - unmap_local(virt_addr, ONE_PAGE, nullptr, ds->cacheability() != CACHED); + unmap_local(virt_addr, ONE_PAGE, nullptr, ds.cacheability() != CACHED); } /* free core's virtual address space */ - platform()->region_alloc()->free(virt_addr_ptr, get_page_size()); + platform().region_alloc().free(virt_addr_ptr, get_page_size()); } diff --git a/repos/base-sel4/src/core/signal_source_component.cc b/repos/base-sel4/src/core/signal_source_component.cc index 0d5ea80e3..17faa4d95 100644 --- a/repos/base-sel4/src/core/signal_source_component.cc +++ b/repos/base-sel4/src/core/signal_source_component.cc @@ -29,14 +29,14 @@ using namespace Genode; ** Signal-source component ** *****************************/ -void Signal_source_component::release(Signal_context_component *context) +void Signal_source_component::release(Signal_context_component &context) { - if (context && context->enqueued()) - _signal_queue.remove(context); + if (context.enqueued()) + _signal_queue.remove(&context); } -void Signal_source_component::submit(Signal_context_component *context, +void Signal_source_component::submit(Signal_context_component &context, unsigned long cnt) { /* @@ -44,12 +44,12 @@ void Signal_source_component::submit(Signal_context_component *context, * signal will be delivered as result of the next * 'wait_for_signal' call. */ - context->increment_signal_cnt(cnt); + context.increment_signal_cnt(cnt); - if (context->enqueued()) + if (context.enqueued()) return; - _signal_queue.enqueue(context); + _signal_queue.enqueue(&context); seL4_Signal(Capability_space::ipc_cap_data(_notify).sel.value()); } @@ -61,19 +61,19 @@ Signal_source::Signal Signal_source_component::wait_for_signal() return Signal(0, 0); /* just a dummy */ /* dequeue and return pending signal */ - Signal_context_component *context = _signal_queue.dequeue(); - Signal result(context->imprint(), context->cnt()); - context->reset_signal_cnt(); + Signal_context_component &context = *_signal_queue.dequeue(); + Signal result(context.imprint(), context.cnt()); + context.reset_signal_cnt(); return result; } -Signal_source_component::Signal_source_component(Rpc_entrypoint *ep) +Signal_source_component::Signal_source_component(Rpc_entrypoint &ep) : _entrypoint(ep) { - Platform &platform = *platform_specific(); - Range_allocator &phys_alloc = *platform.ram_alloc(); + Platform &platform = platform_specific(); + Range_allocator &phys_alloc = platform.ram_alloc(); addr_t const phys_addr = Untyped_memory::alloc_page(phys_alloc); seL4_Untyped const service = Untyped_memory::untyped_sel(phys_addr).value(); diff --git a/repos/base-sel4/src/core/spec/arm/platform.cc b/repos/base-sel4/src/core/spec/arm/platform.cc index c6e9d32ed..70f60d05d 100644 --- a/repos/base-sel4/src/core/spec/arm/platform.cc +++ b/repos/base-sel4/src/core/spec/arm/platform.cc @@ -17,26 +17,35 @@ /* core includes */ #include #include +#include #include "arch_kernel_object.h" -using Genode::Phys_allocator; -using Genode::Allocator; +using namespace Genode; -static Phys_allocator &phys_alloc_16k(Allocator * core_mem_alloc = nullptr) +static Phys_allocator *_phys_alloc_16k_ptr; + + +static Phys_allocator &phys_alloc_16k() { - static Genode::Phys_allocator phys_alloc_16k(core_mem_alloc); - return phys_alloc_16k; + if (_phys_alloc_16k_ptr) + return *_phys_alloc_16k_ptr; + + ASSERT_NEVER_CALLED; } + seL4_Word Genode::Untyped_memory::smallest_page_type() { return seL4_ARM_SmallPageObject; } + void Genode::Platform::init_sel4_ipc_buffer() { } + long Genode::Platform::_unmap_page_frame(Cap_sel const &sel) { return seL4_ARM_Page_Unmap(sel.value()); } + void Genode::Platform::_init_core_page_table_registry() { seL4_BootInfo const &bi = sel4_boot_info(); @@ -58,8 +67,11 @@ void Genode::Platform::_init_core_page_table_registry() } /* initialize 16k memory allocator */ - phys_alloc_16k(core_mem_alloc()); - + { + static Genode::Phys_allocator inst(&core_mem_alloc()); + _phys_alloc_16k_ptr = &inst; + } + /* reserve some memory for page directory construction - must be 16k on ARM */ enum { MAX_PROCESS_COUNT = 32 }; addr_t const max_pd_mem = MAX_PROCESS_COUNT * (1UL << Page_directory_kobj::SIZE_LOG2); @@ -74,6 +86,7 @@ void Genode::Platform::_init_core_page_table_registry() log(":phys_mem_16k: ", phys_alloc_16k()); } + Genode::addr_t Genode::Platform_pd::_init_page_directory() const { /* page directory table contains 4096 elements of 32bits -> 16k required */ @@ -83,10 +96,10 @@ Genode::addr_t Genode::Platform_pd::_init_page_directory() const seL4_Untyped const service = Untyped_memory::_core_local_sel(Core_cspace::TOP_CNODE_UNTYPED_16K, phys_addr, Page_directory_kobj::SIZE_LOG2).value(); create(service, - platform_specific()->core_cnode().sel(), + platform_specific().core_cnode().sel(), _page_directory_sel); - long ret = seL4_ARM_ASIDPool_Assign(platform_specific()->asid_pool().value(), + long ret = seL4_ARM_ASIDPool_Assign(platform_specific().asid_pool().value(), _page_directory_sel.value()); if (ret != seL4_NoError) @@ -95,6 +108,7 @@ Genode::addr_t Genode::Platform_pd::_init_page_directory() const return phys_addr; } + void Genode::Platform_pd::_deinit_page_directory(addr_t phys_addr) const { int ret = seL4_CNode_Delete(seL4_CapInitThreadCNode, diff --git a/repos/base-sel4/src/core/spec/x86_32/platform_pd.cc b/repos/base-sel4/src/core/spec/x86_32/platform_pd.cc index 64a6adb9a..358cabb79 100644 --- a/repos/base-sel4/src/core/spec/x86_32/platform_pd.cc +++ b/repos/base-sel4/src/core/spec/x86_32/platform_pd.cc @@ -16,16 +16,17 @@ #include "arch_kernel_object.h" + Genode::addr_t Genode::Platform_pd::_init_page_directory() const { - addr_t const phys_addr = Untyped_memory::alloc_page(*platform()->ram_alloc()); + addr_t const phys_addr = Untyped_memory::alloc_page(platform().ram_alloc()); seL4_Untyped const service = Untyped_memory::untyped_sel(phys_addr).value(); create(service, - platform_specific()->core_cnode().sel(), + platform_specific().core_cnode().sel(), _page_directory_sel); - long ret = seL4_X86_ASIDPool_Assign(platform_specific()->asid_pool().value(), + long ret = seL4_X86_ASIDPool_Assign(platform_specific().asid_pool().value(), _page_directory_sel.value()); if (ret != seL4_NoError) @@ -34,6 +35,7 @@ Genode::addr_t Genode::Platform_pd::_init_page_directory() const return phys_addr; } + void Genode::Platform_pd::_deinit_page_directory(addr_t phys_addr) const { int ret = seL4_CNode_Delete(seL4_CapInitThreadCNode, @@ -44,5 +46,5 @@ void Genode::Platform_pd::_deinit_page_directory(addr_t phys_addr) const return; } - Untyped_memory::free_page(*platform()->ram_alloc(), phys_addr); + Untyped_memory::free_page(platform().ram_alloc(), phys_addr); } diff --git a/repos/base-sel4/src/core/spec/x86_64/platform_pd.cc b/repos/base-sel4/src/core/spec/x86_64/platform_pd.cc index b7f9104a5..bf14ba27e 100644 --- a/repos/base-sel4/src/core/spec/x86_64/platform_pd.cc +++ b/repos/base-sel4/src/core/spec/x86_64/platform_pd.cc @@ -18,13 +18,13 @@ Genode::addr_t Genode::Platform_pd::_init_page_directory() const { - addr_t const phys_addr = Untyped_memory::alloc_page(*platform()->ram_alloc()); + addr_t const phys_addr = Untyped_memory::alloc_page(platform().ram_alloc()); seL4_Untyped const service = Untyped_memory::untyped_sel(phys_addr).value(); - create(service, platform_specific()->core_cnode().sel(), + create(service, platform_specific().core_cnode().sel(), _page_directory_sel); - long ret = seL4_X86_ASIDPool_Assign(platform_specific()->asid_pool().value(), + long ret = seL4_X86_ASIDPool_Assign(platform_specific().asid_pool().value(), _page_directory_sel.value()); if (ret != seL4_NoError) @@ -43,5 +43,5 @@ void Genode::Platform_pd::_deinit_page_directory(addr_t phys_addr) const return; } - Untyped_memory::free_page(*platform()->ram_alloc(), phys_addr); + Untyped_memory::free_page(platform().ram_alloc(), phys_addr); } diff --git a/repos/base-sel4/src/core/stack_area.cc b/repos/base-sel4/src/core/stack_area.cc index 373876465..8ce9e4555 100644 --- a/repos/base-sel4/src/core/stack_area.cc +++ b/repos/base-sel4/src/core/stack_area.cc @@ -50,7 +50,7 @@ class Stack_area_region_map : public Region_map using Ds_slab = Synced_allocator >; - Ds_slab _ds_slab { platform()->core_mem_alloc() }; + Ds_slab _ds_slab { platform().core_mem_alloc() }; public: @@ -63,29 +63,25 @@ class Stack_area_region_map : public Region_map size = round_page(size); /* allocate physical memory */ - Range_allocator &phys_alloc = *platform_specific()->ram_alloc(); + Range_allocator &phys_alloc = platform_specific().ram_alloc(); size_t const num_pages = size >> get_page_size_log2(); addr_t const phys = Untyped_memory::alloc_pages(phys_alloc, num_pages); Untyped_memory::convert_to_page_frames(phys, num_pages); - Dataspace_component *ds = new (&_ds_slab) + Dataspace_component &ds = *new (&_ds_slab) Dataspace_component(size, 0, phys, CACHED, true, 0); - if (!ds) { - error(__func__, ": dataspace for core stack does not exist"); - return (addr_t)0; - } addr_t const core_local_addr = stack_area_virtual_base() + (addr_t)local_addr; - if (!map_local(ds->phys_addr(), core_local_addr, - ds->size() >> get_page_size_log2())) { - error(__func__, ": could not map phys ", Hex(ds->phys_addr()), " " + if (!map_local(ds.phys_addr(), core_local_addr, + ds.size() >> get_page_size_log2())) { + error(__func__, ": could not map phys ", Hex(ds.phys_addr()), " " "at local ", Hex(core_local_addr)); return (addr_t)0; } - ds->assign_core_local_addr((void*)core_local_addr); + ds.assign_core_local_addr((void*)core_local_addr); return local_addr; } diff --git a/repos/base-sel4/src/core/thread_start.cc b/repos/base-sel4/src/core/thread_start.cc index 45893061f..82411a769 100644 --- a/repos/base-sel4/src/core/thread_start.cc +++ b/repos/base-sel4/src/core/thread_start.cc @@ -54,7 +54,7 @@ void Thread::_init_platform_thread(size_t, Type type) native_thread().ep_sel = thread_info.ep_sel.value(); native_thread().lock_sel = thread_info.lock_sel.value(); - Platform &platform = *platform_specific(); + Platform &platform = platform_specific(); seL4_CNode_CapData guard = seL4_CNode_CapData_new(0, CONFIG_WORD_SIZE - 32); seL4_CNode_CapData no_cap_data = { { 0 } }; @@ -87,8 +87,7 @@ void Thread::_deinit_platform_thread() error(__PRETTY_FUNCTION__, ": seL4_CNode_Delete (", Hex(native_thread().lock_sel), ") returned ", res); - Platform &platform = *platform_specific(); - platform.core_sel_alloc().free(Cap_sel(native_thread().lock_sel)); + platform_specific().core_sel_alloc().free(Cap_sel(native_thread().lock_sel)); } @@ -110,16 +109,17 @@ void Thread::start() private Trace::Control, private Trace::Source { - Thread &_thread; + Thread &_thread; /** * Trace::Source::Info_accessor interface */ Info trace_source_info() const override { - Thread * const me = Thread::myself(); - seL4_IPCBuffer * const ipcbuffer = reinterpret_cast(me->utcb()); - uint64_t const * const buf = reinterpret_cast(ipcbuffer->msg); + Thread &myself = *Thread::myself(); + + seL4_IPCBuffer &ipc_buffer = *reinterpret_cast(myself.utcb()); + uint64_t const * const buf = reinterpret_cast(ipc_buffer.msg); seL4_BenchmarkGetThreadUtilisation(_thread.native_thread().tcb_sel); uint64_t const thread_time = buf[BENCHMARK_TCB_UTILISATION]; @@ -138,7 +138,7 @@ void Thread::start() } }; - new (*platform()->core_mem_alloc()) + new (platform().core_mem_alloc()) Core_trace_source(Trace::sources(), *this); } diff --git a/repos/base/src/core/core_rpc_cap_alloc.cc b/repos/base/src/core/core_rpc_cap_alloc.cc index 92915d49b..f26ffeee7 100644 --- a/repos/base/src/core/core_rpc_cap_alloc.cc +++ b/repos/base/src/core/core_rpc_cap_alloc.cc @@ -23,7 +23,7 @@ using namespace Genode; static Rpc_cap_factory &rpc_cap_factory() { - static Rpc_cap_factory inst(*platform()->core_mem_alloc()); + static Rpc_cap_factory inst(platform().core_mem_alloc()); return inst; } diff --git a/repos/base/src/core/cpu_session_component.cc b/repos/base/src/core/cpu_session_component.cc index b82b098d5..f3ce44837 100644 --- a/repos/base/src/core/cpu_session_component.cc +++ b/repos/base/src/core/cpu_session_component.cc @@ -60,13 +60,13 @@ Thread_capability Cpu_session_component::create_thread(Capability pd Lock::Guard slab_lock_guard(_thread_alloc_lock); thread = new (&_thread_alloc) Cpu_thread_component( - cap(), *_thread_ep, *_pager_ep, *pd, _trace_control_area, + cap(), _thread_ep, _pager_ep, *pd, _trace_control_area, _trace_sources, weight, _weight_to_quota(weight.value), _thread_affinity(affinity), _label, thread_name, _priority, utcb); }; - try { _thread_ep->apply(pd_cap, create_thread_lambda); } + try { _thread_ep.apply(pd_cap, create_thread_lambda); } catch (Allocator::Out_of_memory) { throw Out_of_ram(); } catch (Native_capability::Reference_count_overflow) { throw Thread_creation_failed(); } @@ -100,7 +100,7 @@ Affinity::Location Cpu_session_component::_thread_affinity(Affinity::Location lo void Cpu_session_component::_unsynchronized_kill_thread(Thread_capability thread_cap) { Cpu_thread_component *thread = nullptr; - _thread_ep->apply(thread_cap, [&] (Cpu_thread_component *t) { thread = t; }); + _thread_ep.apply(thread_cap, [&] (Cpu_thread_component *t) { thread = t; }); if (!thread) return; @@ -170,12 +170,12 @@ static size_t remaining_session_ram_quota(char const *args) } -void Cpu_session_component::_transfer_quota(Cpu_session_component * const dst, +void Cpu_session_component::_transfer_quota(Cpu_session_component &dst, size_t const quota) { if (!quota) { return; } _decr_quota(quota); - dst->_incr_quota(quota); + dst._incr_quota(quota); } @@ -202,10 +202,10 @@ int Cpu_session_component::transfer_quota(Cpu_session_capability dst_cap, return -3; } /* transfer quota */ - _transfer_quota(dst, quota); + _transfer_quota(*dst, quota); return 0; }; - return _session_ep->apply(dst_cap, lambda); + return _session_ep.apply(dst_cap, lambda); } @@ -235,14 +235,14 @@ int Cpu_session_component::ref_account(Cpu_session_capability ref_cap) _ref->_insert_ref_member(this); return 0; }; - return _session_ep->apply(ref_cap, lambda); + return _session_ep.apply(ref_cap, lambda); } -Cpu_session_component::Cpu_session_component(Rpc_entrypoint *session_ep, - Rpc_entrypoint *thread_ep, - Pager_entrypoint *pager_ep, - Allocator *md_alloc, +Cpu_session_component::Cpu_session_component(Rpc_entrypoint &session_ep, + Rpc_entrypoint &thread_ep, + Pager_entrypoint &pager_ep, + Allocator &md_alloc, Trace::Source_registry &trace_sources, char const *args, Affinity const &affinity, @@ -251,11 +251,11 @@ Cpu_session_component::Cpu_session_component(Rpc_entrypoint *session_ep, _label(label_from_args(args)), _session_ep(session_ep), _thread_ep(thread_ep), _pager_ep(pager_ep), - _md_alloc(md_alloc, remaining_session_ram_quota(args)), - _thread_alloc(&_md_alloc), _priority(0), + _md_alloc(&md_alloc, remaining_session_ram_quota(args)), + _thread_alloc(_md_alloc), _priority(0), /* map affinity to a location within the physical affinity space */ - _location(affinity.scale_to(platform()->affinity_space())), + _location(affinity.scale_to(platform().affinity_space())), _trace_sources(trace_sources), _quota(quota), _ref(0), _native_cpu(*this, args) @@ -283,16 +283,16 @@ void Cpu_session_component::_deinit_ref_account() if (!_ref) { return; } /* give back our remaining quota to our ref account */ - _transfer_quota(_ref, _quota); + _transfer_quota(*_ref, _quota); /* remove ref-account relation between us and our ref-account */ Cpu_session_component * const orig_ref = _ref; - _ref->_remove_ref_member(this); + _ref->_remove_ref_member(*this); /* redirect ref-account relation of ref members to our prior ref account */ Lock::Guard lock_guard(_ref_members_lock); for (Cpu_session_component * s; (s = _ref_members.first()); ) { - _unsync_remove_ref_member(s); + _unsync_remove_ref_member(*s); orig_ref->_insert_ref_member(s); } } diff --git a/repos/base/src/core/cpu_thread_component.cc b/repos/base/src/core/cpu_thread_component.cc index 3facfa74c..bea6bc4a3 100644 --- a/repos/base/src/core/cpu_thread_component.cc +++ b/repos/base/src/core/cpu_thread_component.cc @@ -21,8 +21,8 @@ void Cpu_thread_component::_update_exception_sigh() { Signal_context_capability sigh = _thread_sigh.valid() ? _thread_sigh : _session_sigh; - if (_platform_thread.pager()) - _platform_thread.pager()->exception_handler(sigh); + + _platform_thread.pager().exception_handler(sigh); } diff --git a/repos/base/src/core/dataspace_component.cc b/repos/base/src/core/dataspace_component.cc index 7af6f5789..ed19e743d 100644 --- a/repos/base/src/core/dataspace_component.cc +++ b/repos/base/src/core/dataspace_component.cc @@ -18,17 +18,17 @@ using namespace Genode; -void Dataspace_component::attached_to(Rm_region *region) +void Dataspace_component::attached_to(Rm_region ®ion) { Lock::Guard lock_guard(_lock); - _regions.insert(region); + _regions.insert(®ion); } -void Dataspace_component::detached_from(Rm_region *region) +void Dataspace_component::detached_from(Rm_region ®ion) { Lock::Guard lock_guard(_lock); - _regions.remove(region); + _regions.remove(®ion); } void Dataspace_component::detach_from_rm_sessions() @@ -43,7 +43,7 @@ void Dataspace_component::detach_from_rm_sessions() * and thereby removes the current region from the '_regions' list. */ _lock.unlock(); - r->rm()->detach((void *)r->base()); + r->rm().detach((void *)r->base()); _lock.lock(); } diff --git a/repos/base/src/core/include/constrained_core_ram.h b/repos/base/src/core/include/constrained_core_ram.h index 2b074bc6c..51b4939b0 100644 --- a/repos/base/src/core/include/constrained_core_ram.h +++ b/repos/base/src/core/include/constrained_core_ram.h @@ -80,8 +80,8 @@ class Genode::Constrained_core_ram : public Allocator core_mem_allocated -= page_aligned_size; } - size_t consumed() const override { return core_mem_allocated; } - size_t overhead(size_t) const override { return 0; } + size_t consumed() const override { return core_mem_allocated; } + size_t overhead(size_t) const override { return 0; } bool need_size_for_free() const override { return true; } }; #endif /* _CORE__INCLUDE__CORE_CONSTRAINED_CORE_RAM_H_ */ diff --git a/repos/base/src/core/include/core_env.h b/repos/base/src/core/include/core_env.h index e9a6b0970..ce5c19d26 100644 --- a/repos/base/src/core/include/core_env.h +++ b/repos/base/src/core/include/core_env.h @@ -31,11 +31,11 @@ namespace Genode { class Core_env; - extern Core_env *core_env(); + extern Core_env &core_env(); } -class Genode::Core_env : public Env_deprecated +class Genode::Core_env : public Env_deprecated, Noncopyable { private: @@ -62,26 +62,27 @@ class Genode::Core_env : public Env_deprecated _pd_session(_entrypoint, _entrypoint, Session::Resources { - Ram_quota { platform()->ram_alloc()->avail() }, - Cap_quota { platform()->max_caps() } }, + Ram_quota { platform().ram_alloc().avail() }, + Cap_quota { platform().max_caps() } }, Session::Label("core"), Session::Diag{false}, - *platform()->ram_alloc(), + platform().ram_alloc(), Ram_dataspace_factory::any_phys_range(), - Ram_dataspace_factory::Virt_range { platform()->vm_start(), platform()->vm_size() }, + Ram_dataspace_factory::Virt_range { platform().vm_start(), + platform().vm_size() }, _region_map, *((Pager_entrypoint *)nullptr), "" /* args to native PD */, - *platform_specific()->core_mem_alloc()) + platform_specific().core_mem_alloc()) { _pd_session.init_cap_and_ram_accounts(); } ~Core_env() { parent()->exit(0); } - Rpc_entrypoint *entrypoint() { return &_entrypoint; } - Ram_allocator &ram_allocator() { return _synced_ram_allocator; } - Region_map &local_rm() { return _region_map; } + Rpc_entrypoint &entrypoint() { return _entrypoint; } + Ram_allocator &ram_allocator() { return _synced_ram_allocator; } + Region_map &local_rm() { return _region_map; } Rpc_entrypoint &signal_ep(); diff --git a/repos/base/src/core/include/core_mem_alloc.h b/repos/base/src/core/include/core_mem_alloc.h index 38c642580..aeaa30549 100644 --- a/repos/base/src/core/include/core_mem_alloc.h +++ b/repos/base/src/core/include/core_mem_alloc.h @@ -198,9 +198,6 @@ class Genode::Mapped_mem_allocator : public Genode::Core_mem_translator */ class Genode::Core_mem_allocator : public Genode::Core_mem_translator { - public: - - protected: /** @@ -226,16 +223,16 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator Synced_mapped_allocator _virt_alloc; /** - * Unsynchronized core-mapped memory allocator - * - * This allocator is internally used within this class for - * allocating meta data for the other allocators. It is not - * synchronized to avoid nested locking. The lock-guarded - * access to this allocator from the outer world is - * provided via the 'Allocator' interface implemented by - * 'Core_mem_allocator'. The allocator works at byte - * granularity. - */ + * Unsynchronized core-mapped memory allocator + * + * This allocator is internally used within this class for + * allocating meta data for the other allocators. It is not + * synchronized to avoid nested locking. The lock-guarded + * access to this allocator from the outer world is + * provided via the 'Allocator' interface implemented by + * 'Core_mem_allocator'. The allocator works at byte + * granularity. + */ Mapped_mem_allocator _mem_alloc; public: @@ -251,12 +248,12 @@ class Genode::Core_mem_allocator : public Genode::Core_mem_translator /** * Access physical-memory allocator */ - Synced_mapped_allocator *phys_alloc() { return &_phys_alloc; } + Synced_mapped_allocator &phys_alloc() { return _phys_alloc; } /** * Access core's virtual-memory allocator */ - Synced_mapped_allocator *virt_alloc() { return &_virt_alloc; } + Synced_mapped_allocator &virt_alloc() { return _virt_alloc; } /*********************************** diff --git a/repos/base/src/core/include/cpu_root.h b/repos/base/src/core/include/cpu_root.h index 6f93e9fda..17c6e4b43 100644 --- a/repos/base/src/core/include/cpu_root.h +++ b/repos/base/src/core/include/cpu_root.h @@ -26,17 +26,11 @@ namespace Genode { { private: - Rpc_entrypoint *_thread_ep; - Pager_entrypoint *_pager_ep; - Allocator *_md_alloc; + Rpc_entrypoint &_thread_ep; + Pager_entrypoint &_pager_ep; + Allocator &_md_alloc; Trace::Source_registry &_trace_sources; - /* - * Noncopyable - */ - Cpu_root(Cpu_root const &); - Cpu_root &operator = (Cpu_root const &); - protected: Cpu_session_component *_create_session(char const *args, @@ -50,12 +44,12 @@ namespace Genode { return new (md_alloc()) Cpu_session_component( - Root_component::ep(), + *Root_component::ep(), _thread_ep, _pager_ep, _md_alloc, _trace_sources, args, affinity, 0); } - void _upgrade_session(Cpu_session_component *cpu, const char *args) + void _upgrade_session(Cpu_session_component *cpu, const char *args) override { size_t ram_quota = Arg_string::find_arg(args, "ram_quota").ulong_value(0); cpu->upgrade_ram_quota(ram_quota); @@ -70,13 +64,13 @@ namespace Genode { * \param thread_ep entry point for managing threads * \param md_alloc meta data allocator to be used by root component */ - Cpu_root(Rpc_entrypoint *session_ep, - Rpc_entrypoint *thread_ep, - Pager_entrypoint *pager_ep, - Allocator *md_alloc, + Cpu_root(Rpc_entrypoint &session_ep, + Rpc_entrypoint &thread_ep, + Pager_entrypoint &pager_ep, + Allocator &md_alloc, Trace::Source_registry &trace_sources) : - Root_component(session_ep, md_alloc), + Root_component(&session_ep, &md_alloc), _thread_ep(thread_ep), _pager_ep(pager_ep), _md_alloc(md_alloc), _trace_sources(trace_sources) { } diff --git a/repos/base/src/core/include/cpu_session_component.h b/repos/base/src/core/include/cpu_session_component.h index a743c091b..8100cba1b 100644 --- a/repos/base/src/core/include/cpu_session_component.h +++ b/repos/base/src/core/include/cpu_session_component.h @@ -40,10 +40,10 @@ class Genode::Cpu_session_component : public Rpc_object, { private: - Session_label const _label; - Rpc_entrypoint * const _session_ep; - Rpc_entrypoint *_thread_ep; - Pager_entrypoint *_pager_ep; + Session_label const _label; + Rpc_entrypoint &_session_ep; + Rpc_entrypoint &_thread_ep; + Pager_entrypoint &_pager_ep; Allocator_guard _md_alloc; /* guarded meta-data allocator */ Cpu_thread_allocator _thread_alloc; /* meta-data allocator */ Lock _thread_alloc_lock { }; /* protect allocator access */ @@ -83,8 +83,7 @@ class Genode::Cpu_session_component : public Rpc_object, void _incr_quota(size_t const quota); void _update_thread_quota(Cpu_thread_component &) const; void _update_each_thread_quota(); - void _transfer_quota(Cpu_session_component * const dst, - size_t const quota); + void _transfer_quota(Cpu_session_component &dst, size_t const quota); void _insert_ref_member(Cpu_session_component * const s) { @@ -93,13 +92,13 @@ class Genode::Cpu_session_component : public Rpc_object, s->_ref = this; } - void _unsync_remove_ref_member(Cpu_session_component * const s) + void _unsync_remove_ref_member(Cpu_session_component &s) { - s->_ref = 0; - _ref_members.remove(s); + s._ref = 0; + _ref_members.remove(&s); } - void _remove_ref_member(Cpu_session_component * const s) + void _remove_ref_member(Cpu_session_component &s) { Lock::Guard lock_guard(_ref_members_lock); _unsync_remove_ref_member(s); @@ -140,10 +139,10 @@ class Genode::Cpu_session_component : public Rpc_object, /** * Constructor */ - Cpu_session_component(Rpc_entrypoint *session_ep, - Rpc_entrypoint *thread_ep, - Pager_entrypoint *pager_ep, - Allocator *md_alloc, + Cpu_session_component(Rpc_entrypoint &session_ep, + Rpc_entrypoint &thread_ep, + Pager_entrypoint &pager_ep, + Allocator &md_alloc, Trace::Source_registry &trace_sources, const char *args, Affinity const &affinity, size_t quota); diff --git a/repos/base/src/core/include/cpu_thread_component.h b/repos/base/src/core/include/cpu_thread_component.h index 2fabb8194..11498073d 100644 --- a/repos/base/src/core/include/cpu_thread_component.h +++ b/repos/base/src/core/include/cpu_thread_component.h @@ -147,7 +147,7 @@ class Genode::Cpu_thread_component : public Rpc_object, _trace_control_slot(trace_control_area), _trace_sources(trace_sources), _rm_client(cpu_session_cap, _ep.manage(this), - &_address_space_region_map, + _address_space_region_map, _platform_thread.pager_object_badge(), _platform_thread.affinity(), pd.label(), name) @@ -161,20 +161,20 @@ class Genode::Cpu_thread_component : public Rpc_object, * object from the object pool */ try { - _pager_ep.manage(&_rm_client); + _pager_ep.manage(_rm_client); } catch (...) { _ep.dissolve(this); throw; } - _platform_thread.pager(&_rm_client); + _platform_thread.pager(_rm_client); _trace_sources.insert(&_trace_source); } ~Cpu_thread_component() { _trace_sources.remove(&_trace_source); - _pager_ep.dissolve(&_rm_client); + _pager_ep.dissolve(_rm_client); _ep.dissolve(this); _address_space_region_map.remove_client(_rm_client); diff --git a/repos/base/src/core/include/dataspace_component.h b/repos/base/src/core/include/dataspace_component.h index 74aaa5bf1..5f4c94cec 100644 --- a/repos/base/src/core/include/dataspace_component.h +++ b/repos/base/src/core/include/dataspace_component.h @@ -134,8 +134,8 @@ namespace Genode { void assign_core_local_addr(void *addr) { _core_local_addr = (addr_t)addr; } - void attached_to(Rm_region *region); - void detached_from(Rm_region *region); + void attached_to(Rm_region ®ion); + void detached_from(Rm_region ®ion); /** * Detach dataspace from all rm sessions. @@ -145,9 +145,9 @@ namespace Genode { /** * Check if dataspace is owned by a specific owner */ - bool owner(Dataspace_owner const *o) const { return _owner == o; } + bool owner(Dataspace_owner const &o) const { return _owner == &o; } - List *regions() { return &_regions; } + List ®ions() { return _regions; } /************************* ** Dataspace interface ** diff --git a/repos/base/src/core/include/io_mem_root.h b/repos/base/src/core/include/io_mem_root.h index 9cb212a46..b758b4342 100644 --- a/repos/base/src/core/include/io_mem_root.h +++ b/repos/base/src/core/include/io_mem_root.h @@ -25,15 +25,9 @@ namespace Genode { private: - Range_allocator *_io_mem_alloc; /* MMIO region allocator */ - Range_allocator *_ram_alloc; /* RAM allocator */ - Rpc_entrypoint *_ds_ep; /* entry point for managing io_mem dataspaces */ - - /* - * Noncopyable - */ - Io_mem_root(Io_mem_root const &); - Io_mem_root &operator = (Io_mem_root const &); + Range_allocator &_io_mem_alloc; /* MMIO region allocator */ + Range_allocator &_ram_alloc; /* RAM allocator */ + Rpc_entrypoint &_ds_ep; /* entry point for managing io_mem dataspaces */ protected: @@ -55,13 +49,13 @@ namespace Genode { * \param ram_alloc platform RAM allocator * \param md_alloc meta-data allocator to be used by root component */ - Io_mem_root(Rpc_entrypoint *session_ep, - Rpc_entrypoint *ds_ep, - Range_allocator *io_mem_alloc, - Range_allocator *ram_alloc, - Allocator *md_alloc) + Io_mem_root(Rpc_entrypoint &session_ep, + Rpc_entrypoint &ds_ep, + Range_allocator &io_mem_alloc, + Range_allocator &ram_alloc, + Allocator &md_alloc) : - Root_component(session_ep, md_alloc), + Root_component(&session_ep, &md_alloc), _io_mem_alloc(io_mem_alloc), _ram_alloc(ram_alloc), _ds_ep(ds_ep) { } }; } diff --git a/repos/base/src/core/include/io_mem_session_component.h b/repos/base/src/core/include/io_mem_session_component.h index eee3bc50a..ef52dae0d 100644 --- a/repos/base/src/core/include/io_mem_session_component.h +++ b/repos/base/src/core/include/io_mem_session_component.h @@ -28,12 +28,6 @@ namespace Genode { { private: - /* - * Noncopyable - */ - Io_mem_session_component(Io_mem_session_component const &); - Io_mem_session_component &operator = (Io_mem_session_component const &); - /* * Helper class used to pass the dataspace attributes as * parameters from the _prepare_io_mem function to the @@ -90,13 +84,13 @@ namespace Genode { bool valid() { return size() != 0; } }; - Range_allocator *_io_mem_alloc; + Range_allocator &_io_mem_alloc; Io_dataspace_component _ds; - Rpc_entrypoint *_ds_ep; + Rpc_entrypoint &_ds_ep; Io_mem_dataspace_capability _ds_cap { }; Cache_attribute _cacheable { UNCACHED }; - Dataspace_attr _prepare_io_mem(const char *args, Range_allocator *ram_alloc); + Dataspace_attr _prepare_io_mem(const char *args, Range_allocator &ram_alloc); /******************************************** @@ -133,9 +127,9 @@ namespace Genode { * particular MMIO region base, size and * caching demands */ - Io_mem_session_component(Range_allocator *io_mem_alloc, - Range_allocator *ram_alloc, - Rpc_entrypoint *ds_ep, + Io_mem_session_component(Range_allocator &io_mem_alloc, + Range_allocator &ram_alloc, + Rpc_entrypoint &ds_ep, const char *args); /** diff --git a/repos/base/src/core/include/io_port_root.h b/repos/base/src/core/include/io_port_root.h index 2ae0fe237..30a17365a 100644 --- a/repos/base/src/core/include/io_port_root.h +++ b/repos/base/src/core/include/io_port_root.h @@ -29,11 +29,11 @@ namespace Genode { public: - Io_port_handler(Pd_session *pd_session) : - _ep(pd_session, STACK_SIZE, "ioport") + Io_port_handler(Pd_session &pd_session) : + _ep(&pd_session, STACK_SIZE, "ioport") { } - Rpc_entrypoint *entrypoint() { return &_ep; } + Rpc_entrypoint &entrypoint() { return _ep; } }; class Io_port_root : private Io_port_handler, @@ -42,13 +42,7 @@ namespace Genode { private: - Range_allocator *_io_port_alloc; /* I/O port allocator */ - - /* - * Noncopyable - */ - Io_port_root(Io_port_root const &); - Io_port_root &operator = (Io_port_root const &); + Range_allocator &_io_port_alloc; /* I/O port allocator */ protected: @@ -64,12 +58,12 @@ namespace Genode { * \param io_port_alloc platform IO_PORT allocator * \param md_alloc meta-data allocator to be used by root component */ - Io_port_root(Pd_session *pd_session, - Range_allocator *io_port_alloc, - Allocator *md_alloc) + Io_port_root(Pd_session &pd_session, + Range_allocator &io_port_alloc, + Allocator &md_alloc) : Io_port_handler(pd_session), - Root_component(entrypoint(), md_alloc), + Root_component(&entrypoint(), &md_alloc), _io_port_alloc(io_port_alloc) { } }; } diff --git a/repos/base/src/core/include/io_port_session_component.h b/repos/base/src/core/include/io_port_session_component.h index 002930a9a..ba75df0e7 100644 --- a/repos/base/src/core/include/io_port_session_component.h +++ b/repos/base/src/core/include/io_port_session_component.h @@ -30,7 +30,7 @@ namespace Genode { { private: - Range_allocator *_io_port_alloc; + Range_allocator &_io_port_alloc; unsigned short _base = 0; unsigned short _size = 0; @@ -40,12 +40,6 @@ namespace Genode { bool _in_bounds(unsigned short address, unsigned width) { return (address >= _base) && (address + width <= _base + _size); } - /* - * Noncopyable - */ - Io_port_session_component(Io_port_session_component const &); - Io_port_session_component &operator = (Io_port_session_component const &); - public: /** @@ -56,7 +50,7 @@ namespace Genode { * particular port base and size * \throw Service_denied */ - Io_port_session_component(Range_allocator *io_port_alloc, + Io_port_session_component(Range_allocator &io_port_alloc, const char *args); /** diff --git a/repos/base/src/core/include/irq_args.h b/repos/base/src/core/include/irq_args.h index 9b544dbe1..8f26cd46e 100644 --- a/repos/base/src/core/include/irq_args.h +++ b/repos/base/src/core/include/irq_args.h @@ -73,9 +73,9 @@ class Genode::Irq_args } } - long irq_number() const { return _irq_number; } - Irq_session::Trigger trigger() const { return _irq_trigger; } - Irq_session::Polarity polarity() const { return _irq_polarity; } + long irq_number() const { return _irq_number; } + Irq_session::Trigger trigger() const { return _irq_trigger; } + Irq_session::Polarity polarity() const { return _irq_polarity; } }; #endif /* _CORE__INCLUDE__IRQ_ARGS_H_ */ diff --git a/repos/base/src/core/include/irq_root.h b/repos/base/src/core/include/irq_root.h index 837914281..fbaa87be2 100644 --- a/repos/base/src/core/include/irq_root.h +++ b/repos/base/src/core/include/irq_root.h @@ -35,13 +35,7 @@ class Genode::Irq_root : public Root_component enum { STACK_SIZE = sizeof(long)*1024 }; Rpc_entrypoint _session_ep; - Range_allocator *_irq_alloc; /* platform irq allocator */ - - /* - * Noncopyable - */ - Irq_root(Irq_root const &); - Irq_root &operator = (Irq_root const &); + Range_allocator &_irq_alloc; /* platform irq allocator */ protected: @@ -57,11 +51,11 @@ class Genode::Irq_root : public Root_component * \param irq_alloc IRQ range that can be assigned to clients * \param md_alloc meta-data allocator to be used by root component */ - Irq_root(Pd_session *pd_session, - Range_allocator *irq_alloc, Allocator *md_alloc) + Irq_root(Pd_session &pd_session, + Range_allocator &irq_alloc, Allocator &md_alloc) : - Root_component(&_session_ep, md_alloc), - _session_ep(pd_session, STACK_SIZE, "irq"), + Root_component(&_session_ep, &md_alloc), + _session_ep(&pd_session, STACK_SIZE, "irq"), _irq_alloc(irq_alloc) { } }; diff --git a/repos/base/src/core/include/irq_session_component.h b/repos/base/src/core/include/irq_session_component.h index 6cd04f58b..6871c09f6 100644 --- a/repos/base/src/core/include/irq_session_component.h +++ b/repos/base/src/core/include/irq_session_component.h @@ -33,15 +33,9 @@ class Genode::Irq_session_component : public Rpc_object, friend class List; unsigned _irq_number; - Range_allocator *_irq_alloc; + Range_allocator &_irq_alloc; Irq_object _irq_object; - /* - * Noncopyable - */ - Irq_session_component(Irq_session_component const &); - Irq_session_component &operator = (Irq_session_component const &); - public: /** @@ -50,7 +44,7 @@ class Genode::Irq_session_component : public Rpc_object, * \param irq_alloc platform-dependent IRQ allocator * \param args session construction arguments */ - Irq_session_component(Range_allocator *irq_alloc, const char *args); + Irq_session_component(Range_allocator &irq_alloc, const char *args); /** * Destructor diff --git a/repos/base/src/core/include/log_root.h b/repos/base/src/core/include/log_root.h index 72e505d1b..206e30904 100644 --- a/repos/base/src/core/include/log_root.h +++ b/repos/base/src/core/include/log_root.h @@ -46,8 +46,10 @@ namespace Genode { * \param session_ep entry point for managing cpu session objects * \param md_alloc meta-data allocator to be used by root component */ - Log_root(Rpc_entrypoint *session_ep, Allocator *md_alloc): - Root_component(session_ep, md_alloc) { } + Log_root(Rpc_entrypoint &session_ep, Allocator &md_alloc) + : + Root_component(&session_ep, &md_alloc) + { } }; } diff --git a/repos/base/src/core/include/pager.h b/repos/base/src/core/include/pager.h index c38cdd973..4ee2afabe 100644 --- a/repos/base/src/core/include/pager.h +++ b/repos/base/src/core/include/pager.h @@ -57,7 +57,7 @@ class Genode::Pager_object : public Object_pool::Entry /** * Local name for this pager object */ - unsigned long _badge; + unsigned long const _badge; Cpu_session_capability _cpu_session_cap; Thread_capability _thread_cap; @@ -157,7 +157,7 @@ class Genode::Pager_object : public Object_pool::Entry void print(Output &out) const { Genode::print(out, "pager_object: pd='", _pd_label, - "' thread='", _name, "'"); + "' thread='", _name, "'"); } }; @@ -190,12 +190,12 @@ class Genode::Pager_entrypoint : public Object_pool, /** * Associate Pager_object with the entry point */ - Pager_capability manage(Pager_object *obj); + Pager_capability manage(Pager_object &obj); /** * Dissolve Pager_object from entry point */ - void dissolve(Pager_object *obj); + void dissolve(Pager_object &obj); /********************** diff --git a/repos/base/src/core/include/pd_root.h b/repos/base/src/core/include/pd_root.h index 66675e4ae..824cbcf89 100644 --- a/repos/base/src/core/include/pd_root.h +++ b/repos/base/src/core/include/pd_root.h @@ -53,8 +53,8 @@ class Genode::Pd_root : public Genode::Root_componentvm_start(), - platform()->vm_size() }; + return Ram_dataspace_factory::Virt_range { platform().vm_start(), + platform().vm_size() }; } protected: @@ -74,7 +74,7 @@ class Genode::Pd_root : public Genode::Root_componentupgrade(ram_quota_from_args(args)); pd->upgrade(cap_quota_from_args(args)); diff --git a/repos/base/src/core/include/pd_session_component.h b/repos/base/src/core/include/pd_session_component.h index deb186cb6..5eabe923c 100644 --- a/repos/base/src/core/include/pd_session_component.h +++ b/repos/base/src/core/include/pd_session_component.h @@ -143,8 +143,8 @@ class Genode::Pd_session_component : public Session_object _stack_area (ep, _sliced_heap, pager_ep, 0, stack_area_virtual_size(), diag), _linker_area(ep, _sliced_heap, pager_ep, 0, LINKER_AREA_SIZE, diag) { - if (platform()->core_needs_platform_pd() || label != "core") { - _pd.construct(&_sliced_heap, _label.string()); + if (platform().core_needs_platform_pd() || label != "core") { + _pd.construct(_sliced_heap, _label.string()); _address_space.address_space(&*_pd); } } @@ -172,7 +172,7 @@ class Genode::Pd_session_component : public Session_object */ bool bind_thread(Platform_thread &thread) { - return _pd->bind_thread(&thread); + return _pd->bind_thread(thread); } Region_map_component &address_space_region_map() diff --git a/repos/base/src/core/include/platform_generic.h b/repos/base/src/core/include/platform_generic.h index 22a5f857b..1bc50b2a5 100644 --- a/repos/base/src/core/include/platform_generic.h +++ b/repos/base/src/core/include/platform_generic.h @@ -37,32 +37,32 @@ namespace Genode { /** * Allocator of core-local mapped virtual memory */ - virtual Range_allocator *core_mem_alloc() = 0; + virtual Range_allocator &core_mem_alloc() = 0; /** * Allocator of physical memory */ - virtual Range_allocator *ram_alloc() = 0; + virtual Range_allocator &ram_alloc() = 0; /** * Allocator of free address ranges within core */ - virtual Range_allocator *region_alloc() = 0; + virtual Range_allocator ®ion_alloc() = 0; /** * I/O memory allocator */ - virtual Range_allocator *io_mem_alloc() = 0; + virtual Range_allocator &io_mem_alloc() = 0; /** * I/O port allocator */ - virtual Range_allocator *io_port_alloc() = 0; + virtual Range_allocator &io_port_alloc() = 0; /** * IRQ allocator */ - virtual Range_allocator *irq_alloc() = 0; + virtual Range_allocator &irq_alloc() = 0; /** * Virtual memory configuration accessors @@ -73,7 +73,7 @@ namespace Genode { /** * ROM modules */ - virtual Rom_fs *rom_fs() = 0; + virtual Rom_fs &rom_fs() = 0; /** * Wait for exit condition @@ -110,7 +110,7 @@ namespace Genode { /** * Request pointer to static generic platform interface of core */ - extern Platform_generic *platform(); + extern Platform_generic &platform(); class Platform; @@ -119,7 +119,7 @@ namespace Genode { * * This function should only be called from platform-specific code. */ - extern Platform *platform_specific(); + extern Platform &platform_specific(); } #endif /* _CORE__INCLUDE__PLATFORM_GENERIC_H_ */ diff --git a/repos/base/src/core/include/platform_services.h b/repos/base/src/core/include/platform_services.h index abb8bb715..f05c1fd07 100644 --- a/repos/base/src/core/include/platform_services.h +++ b/repos/base/src/core/include/platform_services.h @@ -30,9 +30,9 @@ namespace Genode { * \param md metadata allocator for session components * \param reg registry where to add platform-specific services */ - void platform_add_local_services(Rpc_entrypoint *ep, - Sliced_heap *md, - Registry *reg); + void platform_add_local_services(Rpc_entrypoint &ep, + Sliced_heap &md, + Registry ®); } #endif /* _CORE__INCLUDE__PLATFORM_SERVICES_H_ */ diff --git a/repos/base/src/core/include/ram_dataspace_factory.h b/repos/base/src/core/include/ram_dataspace_factory.h index 556b12be6..13faaa191 100644 --- a/repos/base/src/core/include/ram_dataspace_factory.h +++ b/repos/base/src/core/include/ram_dataspace_factory.h @@ -69,17 +69,17 @@ class Genode::Ram_dataspace_factory : public Ram_allocator, * * \throw Core_virtual_memory_exhausted */ - void _export_ram_ds(Dataspace_component *ds); + void _export_ram_ds(Dataspace_component &ds); /** * Revert export of RAM dataspace */ - void _revoke_ram_ds(Dataspace_component *ds); + void _revoke_ram_ds(Dataspace_component &ds); /** * Zero-out content of dataspace */ - void _clear_ds(Dataspace_component *ds); + void _clear_ds(Dataspace_component &ds); public: diff --git a/repos/base/src/core/include/region_map_component.h b/repos/base/src/core/include/region_map_component.h index 8bd456e51..811a47ace 100644 --- a/repos/base/src/core/include/region_map_component.h +++ b/repos/base/src/core/include/region_map_component.h @@ -63,41 +63,37 @@ class Genode::Rm_region : public List::Element { private: - addr_t _base = 0; - size_t _size = 0; - bool _write = false; - bool _exec = false; + addr_t const _base; + size_t const _size; + bool const _write; + bool const _exec; + off_t const _off; - Dataspace_component *_dsc = nullptr; - off_t _off = 0; - - Region_map_component *_rm = nullptr; + Dataspace_component &_dsc; + Region_map_component &_rm; public: - /** - * Default constructor - invalid region - */ - Rm_region() { } - Rm_region(addr_t base, size_t size, bool write, - Dataspace_component *dsc, off_t offset, - Region_map_component *rm, bool exec) - : _base(base), _size(size), _write(write), _exec(exec), - _dsc(dsc), _off(offset), _rm(rm) { } + Dataspace_component &dsc, off_t offset, + Region_map_component &rm, bool exec) + : + _base(base), _size(size), _write(write), _exec(exec), _off(offset), + _dsc(dsc), _rm(rm) + { } /*************** ** Accessors ** ***************/ - addr_t base() const { return _base; } - size_t size() const { return _size; } - bool write() const { return _write; } - bool executable() const { return _exec; } - Dataspace_component* dataspace() const { return _dsc; } - off_t offset() const { return _off; } - Region_map_component* rm() const { return _rm; } + addr_t base() const { return _base; } + size_t size() const { return _size; } + bool write() const { return _write; } + bool executable() const { return _exec; } + Dataspace_component &dataspace() const { return _dsc; } + off_t offset() const { return _off; } + Region_map_component &rm() const { return _rm; } }; @@ -117,17 +113,11 @@ class Genode::Rm_faulter : Fifo::Element, Interface { private: - Pager_object *_pager_object = nullptr; + Pager_object &_pager_object; Lock _lock { }; Weak_ptr _faulting_region_map { }; Region_map::State _fault_state { }; - /* - * Noncopyable - */ - Rm_faulter(Rm_faulter const &); - Rm_faulter &operator = (Rm_faulter const &); - friend class Fifo; public: @@ -139,14 +129,14 @@ class Genode::Rm_faulter : Fifo::Element, Interface * * Currently, there is only one pager in core. */ - Rm_faulter(Pager_object *pager_object) : _pager_object(pager_object) { } + explicit Rm_faulter(Pager_object &pager_object) : _pager_object(pager_object) { } using Fifo::Element::next; /** * Assign fault state */ - void fault(Region_map_component *faulting_region_map, + void fault(Region_map_component &faulting_region_map, Region_map::State fault_state); /** @@ -155,7 +145,7 @@ class Genode::Rm_faulter : Fifo::Element, Interface * This function must be called when destructing region maps * to prevent dangling pointers in '_faulters' lists. */ - void dissolve_from_faulting_region_map(Region_map_component *); + void dissolve_from_faulting_region_map(Region_map_component &); /** * Return true if page fault occurred in specified address range @@ -188,13 +178,7 @@ class Genode::Rm_client : public Pager_object, public Rm_faulter, friend class List; - Region_map_component *_region_map = nullptr; - - /* - * Noncopyable - */ - Rm_client(Rm_client const &); - Rm_client &operator = (Rm_client const &); + Region_map_component &_region_map; public: @@ -208,13 +192,13 @@ class Genode::Rm_client : public Pager_object, public Rm_faulter, */ Rm_client(Cpu_session_capability cpu_session, Thread_capability thread, - Region_map_component *rm, unsigned long badge, + Region_map_component &rm, unsigned long badge, Affinity::Location location, Session_label const &pd_label, Cpu_session::Name const &name) : Pager_object(cpu_session, thread, badge, location, pd_label, name), - Rm_faulter(this), _region_map(rm) + Rm_faulter(static_cast(*this)), _region_map(rm) { } int pager(Ipc_pager &pager); @@ -222,7 +206,7 @@ class Genode::Rm_client : public Pager_object, public Rm_faulter, /** * Return region map that the RM client is member of */ - Region_map_component *member_rm() { return _region_map; } + Region_map_component &member_rm() { return _region_map; } }; @@ -236,9 +220,9 @@ class Genode::Region_map_component : private Weak_object, Session::Diag const _diag; - Rpc_entrypoint *_ds_ep; - Rpc_entrypoint *_thread_ep; - Rpc_entrypoint *_session_ep; + Rpc_entrypoint &_ds_ep; + Rpc_entrypoint &_thread_ep; + Rpc_entrypoint &_session_ep; Allocator &_md_alloc; @@ -313,12 +297,12 @@ class Genode::Region_map_component : private Weak_object, for fault resolution */ List _clients { }; /* list of RM clients using this region map */ Lock _lock { }; /* lock for map and list */ - Pager_entrypoint *_pager_ep; + Pager_entrypoint &_pager_ep; Rm_dataspace_component _ds; /* dataspace representation of region map */ Dataspace_capability _ds_cap; template - auto _apply_to_dataspace(addr_t addr, F f, addr_t offset, + auto _apply_to_dataspace(addr_t addr, F const &f, addr_t offset, unsigned level, addr_t dst_region_size) -> typename Trait::Functor::Return_type { @@ -332,7 +316,7 @@ class Genode::Region_map_component : private Weak_object, /* lookup region and dataspace */ Rm_region *region = _map.metadata((void*)addr); - Dataspace_component *dsc = region ? region->dataspace() + Dataspace_component *dsc = region ? ®ion->dataspace() : nullptr; if (region && dst_region_size > region->size()) @@ -358,7 +342,7 @@ class Genode::Region_map_component : private Weak_object, --level, dst_region_size); }; - return _session_ep->apply(cap, lambda); + return _session_ep.apply(cap, lambda); } /* @@ -413,18 +397,18 @@ class Genode::Region_map_component : private Weak_object, * \param pf_addr page-fault address * \param pf_type type of page fault (read/write/execute) */ - void fault(Rm_faulter *faulter, addr_t pf_addr, + void fault(Rm_faulter &faulter, addr_t pf_addr, Region_map::State::Fault_type pf_type); /** * Dissolve faulter from region map */ - void discard_faulter(Rm_faulter *faulter, bool do_lock); + void discard_faulter(Rm_faulter &faulter, bool do_lock); /** * Return the dataspace representation of this region map */ - Rm_dataspace_component *dataspace_component() { return &_ds; } + Rm_dataspace_component &dataspace_component() { return _ds; } /** * Apply a function to dataspace attached at a given address @@ -453,10 +437,10 @@ class Genode::Region_map_component : private Weak_object, * Create mapping item to be placed into the page table */ static Mapping create_map_item(Region_map_component *region_map, - Rm_region *region, + Rm_region ®ion, addr_t ds_offset, addr_t region_offset, - Dataspace_component *dsc, + Dataspace_component &dsc, addr_t, addr_t); /************************** diff --git a/repos/base/src/core/include/rm_root.h b/repos/base/src/core/include/rm_root.h index 2010cd26e..294354bfe 100644 --- a/repos/base/src/core/include/rm_root.h +++ b/repos/base/src/core/include/rm_root.h @@ -40,10 +40,10 @@ class Genode::Rm_root : public Root_component Rm_session_component(*this->ep(), *md_alloc(), _pager_ep, ram_quota); } - void _upgrade_session(Rm_session_component *rm, const char *args) + void _upgrade_session(Rm_session_component &rm, const char *args) { size_t ram_quota = Arg_string::find_arg(args, "ram_quota").ulong_value(0); - rm->upgrade_ram_quota(ram_quota); + rm.upgrade_ram_quota(ram_quota); } public: @@ -55,11 +55,11 @@ class Genode::Rm_root : public Root_component * \param md_alloc meta data allocator to be used by root component * \param pager_ep pager entrypoint */ - Rm_root(Rpc_entrypoint *session_ep, - Allocator *md_alloc, + Rm_root(Rpc_entrypoint &session_ep, + Allocator &md_alloc, Pager_entrypoint &pager_ep) : - Root_component(session_ep, md_alloc), + Root_component(&session_ep, &md_alloc), _pager_ep(pager_ep) { } }; diff --git a/repos/base/src/core/include/rom_root.h b/repos/base/src/core/include/rom_root.h index 8329f1ca5..2195a2f12 100644 --- a/repos/base/src/core/include/rom_root.h +++ b/repos/base/src/core/include/rom_root.h @@ -24,18 +24,12 @@ namespace Genode { private: - Rom_fs *_rom_fs; /* rom file system */ - Rpc_entrypoint *_ds_ep; /* entry point for managing rom dataspaces */ - - /* - * Noncopyable - */ - Rom_root(Rom_root const &); - Rom_root &operator = (Rom_root const &); + Rom_fs &_rom_fs; /* rom file system */ + Rpc_entrypoint &_ds_ep; /* entry point for managing rom dataspaces */ protected: - Rom_session_component *_create_session(const char *args) { + Rom_session_component *_create_session(const char *args) override { return new (md_alloc()) Rom_session_component(_rom_fs, _ds_ep, args); } public: @@ -48,12 +42,12 @@ namespace Genode { * \param rom_fs platform ROM file system * \param md_alloc meta-data allocator to be used by root component */ - Rom_root(Rpc_entrypoint *session_ep, - Rpc_entrypoint *ds_ep, - Rom_fs *rom_fs, - Allocator *md_alloc) + Rom_root(Rpc_entrypoint &session_ep, + Rpc_entrypoint &ds_ep, + Rom_fs &rom_fs, + Allocator &md_alloc) : - Root_component(session_ep, md_alloc), + Root_component(&session_ep, &md_alloc), _rom_fs(rom_fs), _ds_ep(ds_ep) { } }; } diff --git a/repos/base/src/core/include/rom_session_component.h b/repos/base/src/core/include/rom_session_component.h index e9aae36ee..c584701f5 100644 --- a/repos/base/src/core/include/rom_session_component.h +++ b/repos/base/src/core/include/rom_session_component.h @@ -26,18 +26,22 @@ namespace Genode { { private: - Rom_module const *_rom_module { nullptr }; - Dataspace_component _ds { }; - Rpc_entrypoint *_ds_ep { nullptr }; - Rom_dataspace_capability _ds_cap { }; + Rom_module const * const _rom_module = nullptr; + Dataspace_component _ds; + Rpc_entrypoint &_ds_ep; + Rom_dataspace_capability _ds_cap; - Rom_module const * _find_rom(Rom_fs *rom_fs, const char *args) + Rom_module const &_find_rom(Rom_fs &rom_fs, const char *args) { /* extract label */ Session_label const label = label_from_args(args); /* find ROM module for trailing label element */ - return rom_fs->find(label.last_element().string()); + Rom_module const * rom = rom_fs.find(label.last_element().string()); + if (rom) + return *rom; + + throw Service_denied(); } /* @@ -56,9 +60,9 @@ namespace Genode { * corresponding the rom session * \param args session-construction arguments */ - Rom_session_component(Rom_fs *rom_fs, - Rpc_entrypoint *ds_ep, - const char *args); + Rom_session_component(Rom_fs &rom_fs, + Rpc_entrypoint &ds_ep, + const char *args); /** * Destructor @@ -70,8 +74,8 @@ namespace Genode { ** Rom session interface ** ***************************/ - Rom_dataspace_capability dataspace() { return _ds_cap; } - void sigh(Signal_context_capability) { } + Rom_dataspace_capability dataspace() override { return _ds_cap; } + void sigh(Signal_context_capability) override { } }; } diff --git a/repos/base/src/core/include/signal_broker.h b/repos/base/src/core/include/signal_broker.h index 4c1971af8..a16e372e3 100644 --- a/repos/base/src/core/include/signal_broker.h +++ b/repos/base/src/core/include/signal_broker.h @@ -44,7 +44,7 @@ class Genode::Signal_broker _md_alloc(md_alloc), _source_ep(source_ep), _context_ep(context_ep), - _source(&_context_ep), + _source(_context_ep), _source_cap(_source_ep.manage(&_source)) { } @@ -69,10 +69,10 @@ class Genode::Signal_broker * XXX For now, we ignore the signal-source argument as we * create only a single receiver for each PD. */ - Signal_context_component *context = new (&_contexts_slab) - Signal_context_component(imprint, &_source); + Signal_context_component &context = *new (&_contexts_slab) + Signal_context_component(imprint, _source); - return _context_ep.manage(context); + return _context_ep.manage(&context); } void free_context(Signal_context_capability context_cap) @@ -95,9 +95,8 @@ class Genode::Signal_broker return; /* release solely in context of context_ep thread */ - if (context->enqueued() && context->source() && - !_context_ep.is_myself()) - _delivery_proxy.release(context); + if (context->enqueued() && !_context_ep.is_myself()) + _delivery_proxy.release(*context); destroy(&_contexts_slab, context); } diff --git a/repos/base/src/core/include/signal_delivery_proxy.h b/repos/base/src/core/include/signal_delivery_proxy.h index bab57f15b..46b4a3c02 100644 --- a/repos/base/src/core/include/signal_delivery_proxy.h +++ b/repos/base/src/core/include/signal_delivery_proxy.h @@ -57,7 +57,7 @@ namespace Genode { { _ep.apply(cap, [&] (Signal_context_component *context) { if (context) - context->source()->submit(context, cnt); + context->source().submit(*context, cnt); else warning("invalid signal-context capability"); }); @@ -66,8 +66,8 @@ namespace Genode { void _release_from_ep(addr_t const context_addr) { Signal_context_component * context = reinterpret_cast(context_addr); - if (context && context->source()) - context->source()->release(context); + if (context) + context->source().release(*context); } /** @@ -89,8 +89,8 @@ namespace Genode { * * Called from threads other than 'ep'. */ - void release(Signal_context_component * context) { - _proxy_cap.call(reinterpret_cast(context)); } + void release(Signal_context_component &context) { + _proxy_cap.call(reinterpret_cast(&context)); } }; } diff --git a/repos/base/src/core/include/signal_source_component.h b/repos/base/src/core/include/signal_source_component.h index 50749b4b9..863b76f43 100644 --- a/repos/base/src/core/include/signal_source_component.h +++ b/repos/base/src/core/include/signal_source_component.h @@ -43,20 +43,14 @@ class Genode::Signal_context_component : public Rpc_object, long _imprint; int _cnt = 0; - Signal_source_component *_source; - - /* - * Noncopyable - */ - Signal_context_component(Signal_context_component const &); - Signal_context_component &operator = (Signal_context_component const &); + Signal_source_component &_source; public: /** * Constructor */ - Signal_context_component(long imprint, Signal_source_component *source) + Signal_context_component(long imprint, Signal_source_component &source) : _imprint(imprint), _source(source) { } /** @@ -74,9 +68,10 @@ class Genode::Signal_context_component : public Rpc_object, */ void reset_signal_cnt() { _cnt = 0; } - long imprint() { return _imprint; } - int cnt() { return _cnt; } - Signal_source_component *source() { return _source; } + long imprint() const { return _imprint; } + int cnt() const { return _cnt; } + + Signal_source_component &source() { return _source; } using Signal_queue::Element::enqueued; }; @@ -87,27 +82,21 @@ class Genode::Signal_source_component : public Signal_source_rpc_object private: Signal_queue _signal_queue { }; - Rpc_entrypoint *_entrypoint; + Rpc_entrypoint &_entrypoint; Native_capability _reply_cap { }; - /* - * Noncopyable - */ - Signal_source_component(Signal_source_component const &); - Signal_source_component &operator = (Signal_source_component const &); - public: /** * Constructor */ - Signal_source_component(Rpc_entrypoint *rpc_entrypoint); + Signal_source_component(Rpc_entrypoint &); ~Signal_source_component(); - void release(Signal_context_component *context); + void release(Signal_context_component &context); - void submit(Signal_context_component *context, + void submit(Signal_context_component &context, unsigned long cnt); /***************************** @@ -120,8 +109,8 @@ class Genode::Signal_source_component : public Signal_source_rpc_object Genode::Signal_context_component::~Signal_context_component() { - if (enqueued() && _source) - _source->release(this); + if (enqueued()) + _source.release(*this); } #endif /* _CORE__INCLUDE__SIGNAL_SOURCE_COMPONENT_H_ */ diff --git a/repos/base/src/core/include/trace/control_area.h b/repos/base/src/core/include/trace/control_area.h index a3279edb5..bc8788734 100644 --- a/repos/base/src/core/include/trace/control_area.h +++ b/repos/base/src/core/include/trace/control_area.h @@ -43,7 +43,7 @@ class Genode::Trace::Control_area static Trace::Control *_try_attach(Dataspace_capability ds) { try { return env_deprecated()->rm_session()->attach(ds); } - catch (...) { return 0; } + catch (...) { return nullptr; } } bool _index_valid(int index) const @@ -97,7 +97,7 @@ class Genode::Trace::Control_area Trace::Control *at(unsigned index) { - return _index_valid(index) ? &_local_base[index] : 0; + return _index_valid(index) ? &_local_base[index] : nullptr; } }; diff --git a/repos/base/src/core/include/trace/policy_registry.h b/repos/base/src/core/include/trace/policy_registry.h index d7ef25d91..79ded6255 100644 --- a/repos/base/src/core/include/trace/policy_registry.h +++ b/repos/base/src/core/include/trace/policy_registry.h @@ -78,11 +78,11 @@ class Genode::Trace::Policy_registry Lock _lock { }; List _policies { }; - Policy *_unsynchronized_lookup(Policy_owner const &owner, Policy_id id) + Policy &_unsynchronized_lookup(Policy_owner const &owner, Policy_id id) { for (Policy *p = _policies.first(); p; p = p->next()) if (p->owned_by(owner) && p->has_id(id)) - return p; + return *p; throw Nonexistent_policy(); } @@ -93,7 +93,7 @@ class Genode::Trace::Policy_registry if (p->owned_by(owner)) return p; - return 0; + return nullptr; } public: @@ -111,8 +111,8 @@ class Genode::Trace::Policy_registry { Lock::Guard guard(_lock); - Policy *policy = new (&md_alloc) Policy(owner, id, md_alloc, ds, size); - _policies.insert(policy); + Policy &policy = *new (&md_alloc) Policy(owner, id, md_alloc, ds, size); + _policies.insert(&policy); } void remove(Policy_owner &owner, Policy_id id) @@ -144,14 +144,14 @@ class Genode::Trace::Policy_registry { Lock::Guard guard(_lock); - return _unsynchronized_lookup(owner, id)->dataspace(); + return _unsynchronized_lookup(owner, id).dataspace(); } size_t size(Policy_owner &owner, Policy_id id) { Lock::Guard guard(_lock); - return _unsynchronized_lookup(owner, id)->size(); + return _unsynchronized_lookup(owner, id).size(); } }; diff --git a/repos/base/src/core/include/trace/root.h b/repos/base/src/core/include/trace/root.h index fbf2efdbc..666cb13bb 100644 --- a/repos/base/src/core/include/trace/root.h +++ b/repos/base/src/core/include/trace/root.h @@ -46,7 +46,7 @@ class Genode::Trace::Root : public Genode::Root_component parent_levels, label_from_args(args).string(), _sources, _policies); } - void _upgrade_session(Session_component *s, const char *args) + void _upgrade_session(Session_component *s, const char *args) override { size_t ram_quota = Arg_string::find_arg(args, "ram_quota").ulong_value(0); s->upgrade_ram_quota(ram_quota); @@ -62,10 +62,10 @@ class Genode::Trace::Root : public Genode::Root_component * \param ram_quota RAM for tracing purposes of this session * \param arg_buffer_size session argument-buffer size */ - Root(Rpc_entrypoint *session_ep, Allocator *md_alloc, + Root(Rpc_entrypoint &session_ep, Allocator &md_alloc, Source_registry &sources, Policy_registry &policies) : - Root_component(session_ep, md_alloc), + Root_component(&session_ep, &md_alloc), _sources(sources), _policies(policies) { } }; diff --git a/repos/base/src/core/include/trace/session_component.h b/repos/base/src/core/include/trace/session_component.h index 866d91303..38a8c2afd 100644 --- a/repos/base/src/core/include/trace/session_component.h +++ b/repos/base/src/core/include/trace/session_component.h @@ -39,8 +39,8 @@ class Genode::Trace::Session_component Allocator_guard _md_alloc; Tslab _subjects_slab; Tslab _policies_slab; - unsigned _parent_levels; - Session_label _label; + unsigned const _parent_levels; + Session_label const _label; Source_registry &_sources; Policy_registry &_policies; Subject_registry _subjects; diff --git a/repos/base/src/core/include/trace/source_registry.h b/repos/base/src/core/include/trace/source_registry.h index 2bc79057c..9c3bb4ba1 100644 --- a/repos/base/src/core/include/trace/source_registry.h +++ b/repos/base/src/core/include/trace/source_registry.h @@ -73,7 +73,7 @@ class Genode::Trace::Source Control &_control; Dataspace_capability _policy { }; Dataspace_capability _buffer { }; - Source_owner const *_owner = nullptr; + Source_owner const *_owner_ptr = nullptr; static unsigned _alloc_unique_id(); @@ -112,21 +112,21 @@ class Genode::Trace::Source void enable() { _control.enable(); } void disable() { _control.disable(); } - bool try_acquire(Source_owner const *new_owner) + bool try_acquire(Source_owner const &new_owner) { - if (_owner && _owner != new_owner) + if (_owner_ptr && _owner_ptr != &new_owner) return false; - _owner = new_owner; + _owner_ptr = &new_owner; return true; } - bool owned_by(Source_owner const *owner) { return owner == _owner; } + bool owned_by(Source_owner const &owner) { return &owner == _owner_ptr; } - void release_ownership(Source_owner const *owner) + void release_ownership(Source_owner const &owner) { if (owned_by(owner)) - _owner = 0; + _owner_ptr = nullptr; } bool error() const { return _control.has_error(); } diff --git a/repos/base/src/core/include/trace/subject_registry.h b/repos/base/src/core/include/trace/subject_registry.h index e8bf6fd85..b04484e03 100644 --- a/repos/base/src/core/include/trace/subject_registry.h +++ b/repos/base/src/core/include/trace/subject_registry.h @@ -54,15 +54,15 @@ class Genode::Trace::Subject { private: - Ram_session *_ram { nullptr }; - size_t _size { 0 }; - Ram_dataspace_capability _ds { }; + Ram_session *_ram_ptr { nullptr }; + size_t _size { 0 }; + Ram_dataspace_capability _ds { }; void _reset() { - _ram = 0; - _size = 0; - _ds = Ram_dataspace_capability(); + _ram_ptr = nullptr; + _size = 0; + _ds = Ram_dataspace_capability(); } /* @@ -88,9 +88,9 @@ class Genode::Trace::Subject if (_size) return false; - _ram = &ram; - _size = size; - _ds = ram.alloc(size); + _ram_ptr = &ram; + _size = size; + _ds = ram.alloc(size); return true; } @@ -103,9 +103,9 @@ class Genode::Trace::Subject if (!from_ds.valid()) return false; - _ram = &ram; - _size = size; - _ds = ram.alloc(_size); + _ram_ptr = &ram; + _size = size; + _ds = ram.alloc(_size); /* copy content */ void *src = env_deprecated()->rm_session()->attach(from_ds), @@ -124,8 +124,8 @@ class Genode::Trace::Subject */ size_t flush() { - if (_ram) - _ram->free(_ds); + if (_ram_ptr) + _ram_ptr->free(_ds); _reset(); return 0; @@ -154,8 +154,8 @@ class Genode::Trace::Subject return Subject_info::DEAD; if (source->enabled()) - return source->owned_by(this) ? Subject_info::TRACED - : Subject_info::FOREIGN; + return source->owned_by(*this) ? Subject_info::TRACED + : Subject_info::FOREIGN; if (source->error()) return Subject_info::ERROR; @@ -210,7 +210,7 @@ class Genode::Trace::Subject if (!source.valid()) throw Source_is_dead(); - if (!source->try_acquire(this)) + if (!source->try_acquire(*this)) throw Traced_by_other_session(); source->trace(_policy.dataspace(), _buffer.dataspace()); @@ -340,13 +340,13 @@ class Genode::Trace::Subject_registry * * \return RAM resources released during destruction */ - size_t _unsynchronized_destroy(Subject *s) + size_t _unsynchronized_destroy(Subject &s) { - _entries.remove(s); + _entries.remove(&s); - size_t const released_ram = s->release(); + size_t const released_ram = s.release(); - destroy(&_md_alloc, s); + destroy(&_md_alloc, &s); return released_ram; }; @@ -356,11 +356,11 @@ class Genode::Trace::Subject_registry * * \throw Nonexistent_subject */ - Subject *_unsynchronized_lookup_by_id(Subject_id id) + Subject &_unsynchronized_lookup_by_id(Subject_id id) { for (Subject *s = _entries.first(); s; s = s->next()) if (s->id() == id) - return s; + return *s; throw Nonexistent_subject(); } @@ -389,7 +389,7 @@ class Genode::Trace::Subject_registry Lock guard(_lock); while (Subject *s = _entries.first()) - _unsynchronized_destroy(s); + _unsynchronized_destroy(*s); } /** @@ -427,14 +427,11 @@ class Genode::Trace::Subject_registry { Lock guard(_lock); - Subject *subject = _unsynchronized_lookup_by_id(subject_id); - if (subject) - return _unsynchronized_destroy(subject); - - return 0; + Subject &subject = _unsynchronized_lookup_by_id(subject_id); + return _unsynchronized_destroy(subject); } - Subject *lookup_by_id(Subject_id id) + Subject &lookup_by_id(Subject_id id) { Lock guard(_lock); diff --git a/repos/base/src/core/include/vm_root.h b/repos/base/src/core/include/vm_root.h index def04074d..77721fd72 100644 --- a/repos/base/src/core/include/vm_root.h +++ b/repos/base/src/core/include/vm_root.h @@ -41,9 +41,9 @@ class Genode::Vm_root : public Root_component * \param session_ep entrypoint managing vm_session components * \param md_alloc meta-data allocator to be used by root component */ - Vm_root(Rpc_entrypoint *session_ep, - Allocator *md_alloc) - : Root_component(session_ep, md_alloc) { } + Vm_root(Rpc_entrypoint &session_ep, + Allocator &md_alloc) + : Root_component(&session_ep, &md_alloc) { } }; #endif /* _CORE__INCLUDE__VM_ROOT_H_ */ diff --git a/repos/base/src/core/io_mem_session_component.cc b/repos/base/src/core/io_mem_session_component.cc index e4b5db237..3adf2fa0c 100644 --- a/repos/base/src/core/io_mem_session_component.cc +++ b/repos/base/src/core/io_mem_session_component.cc @@ -24,7 +24,7 @@ using namespace Genode; Io_mem_session_component::Dataspace_attr Io_mem_session_component::_prepare_io_mem(const char *args, - Range_allocator *ram_alloc) + Range_allocator &ram_alloc) { addr_t req_base = Arg_string::find_arg(args, "base").ulong_value(0); size_t req_size = Arg_string::find_arg(args, "size").ulong_value(0); @@ -42,14 +42,14 @@ Io_mem_session_component::_prepare_io_mem(const char *args, /* check for RAM collision */ int ret; - if ((ret = ram_alloc->remove_range(base, size))) { + if ((ret = ram_alloc.remove_range(base, size))) { error("I/O memory ", Hex_range(base, size), " " "used by RAM allocator (", ret, ")"); return Dataspace_attr(); } /* allocate region */ - switch (_io_mem_alloc->alloc_addr(req_size, req_base).value) { + switch (_io_mem_alloc.alloc_addr(req_size, req_base).value) { case Range_allocator::Alloc_return::RANGE_CONFLICT: error("I/O memory ", Hex_range(req_base, req_size), " not available"); return Dataspace_attr(); @@ -68,9 +68,9 @@ Io_mem_session_component::_prepare_io_mem(const char *args, } -Io_mem_session_component::Io_mem_session_component(Range_allocator *io_mem_alloc, - Range_allocator *ram_alloc, - Rpc_entrypoint *ds_ep, +Io_mem_session_component::Io_mem_session_component(Range_allocator &io_mem_alloc, + Range_allocator &ram_alloc, + Rpc_entrypoint &ds_ep, const char *args) : _io_mem_alloc(io_mem_alloc), @@ -84,14 +84,14 @@ Io_mem_session_component::Io_mem_session_component(Range_allocator *io_mem_alloc throw Service_denied(); } - _ds_cap = static_cap_cast(_ds_ep->manage(&_ds)); + _ds_cap = static_cap_cast(_ds_ep.manage(&_ds)); } Io_mem_session_component::~Io_mem_session_component() { /* dissolve IO_MEM dataspace from service entry point */ - _ds_ep->dissolve(&_ds); + _ds_ep.dissolve(&_ds); /* flush local mapping of IO_MEM */ _unmap_local(_ds.core_local_addr(), _ds.size()); @@ -103,5 +103,5 @@ Io_mem_session_component::~Io_mem_session_component() */ /* free region in IO_MEM allocator */ - _io_mem_alloc->free(reinterpret_cast(_ds.req_base)); + _io_mem_alloc.free(reinterpret_cast(_ds.req_base)); } diff --git a/repos/base/src/core/main.cc b/repos/base/src/core/main.cc index 27ef4238a..1501b3e5b 100644 --- a/repos/base/src/core/main.cc +++ b/repos/base/src/core/main.cc @@ -47,7 +47,7 @@ using namespace Genode; ** Core environment/platform support ** ***************************************/ -Core_env * Genode::core_env() +Core_env &Genode::core_env() { /* * Make sure to initialize the platform before constructing the core @@ -71,22 +71,22 @@ Core_env * Genode::core_env() signal_transmitter_initialized = (init_core_signal_transmitter(_env.signal_ep()), true); - return &_env; + return _env; } -Env_deprecated * Genode::env_deprecated() { - return core_env(); } +Env_deprecated *Genode::env_deprecated() { + return &core_env(); } -Platform *Genode::platform_specific() +Platform &Genode::platform_specific() { static Platform _platform; - return &_platform; + return _platform; } -Platform_generic *Genode::platform() { return platform_specific(); } +Platform_generic &Genode::platform() { return platform_specific(); } Thread_capability Genode::main_thread_cap() { return Thread_capability(); } @@ -231,11 +231,11 @@ int main() static Trace::Policy_registry trace_policies; - static Rpc_entrypoint &ep = *core_env()->entrypoint(); - static Ram_allocator &core_ram_alloc = core_env()->ram_allocator(); - static Region_map &local_rm = core_env()->local_rm(); - Pd_session &core_pd = *core_env()->pd_session(); - Capability core_pd_cap = core_env()->pd_session_cap(); + static Rpc_entrypoint &ep = core_env().entrypoint(); + static Ram_allocator &core_ram_alloc = core_env().ram_allocator(); + static Region_map &local_rm = core_env().local_rm(); + Pd_session &core_pd = *core_env().pd_session(); + Capability core_pd_cap = core_env().pd_session_cap(); static Registry services; @@ -252,20 +252,20 @@ int main() static Pager_entrypoint pager_ep(rpc_cap_factory); - static Rom_root rom_root (&ep, &ep, platform()->rom_fs(), &sliced_heap); - static Rm_root rm_root (&ep, &sliced_heap, pager_ep); - static Cpu_root cpu_root (&ep, &ep, &pager_ep, &sliced_heap, + static Rom_root rom_root (ep, ep, platform().rom_fs(), sliced_heap); + static Rm_root rm_root (ep, sliced_heap, pager_ep); + static Cpu_root cpu_root (ep, ep, pager_ep, sliced_heap, Trace::sources()); - static Pd_root pd_root (ep, core_env()->signal_ep(), pager_ep, - *platform()->ram_alloc(), + static Pd_root pd_root (ep, core_env().signal_ep(), pager_ep, + platform().ram_alloc(), local_rm, sliced_heap, - *platform_specific()->core_mem_alloc()); - static Log_root log_root (&ep, &sliced_heap); - static Io_mem_root io_mem_root (&ep, &ep, platform()->io_mem_alloc(), - platform()->ram_alloc(), &sliced_heap); - static Irq_root irq_root (core_env()->pd_session(), - platform()->irq_alloc(), &sliced_heap); - static Trace::Root trace_root (&ep, &sliced_heap, Trace::sources(), trace_policies); + platform_specific().core_mem_alloc()); + static Log_root log_root (ep, sliced_heap); + static Io_mem_root io_mem_root (ep, ep, platform().io_mem_alloc(), + platform().ram_alloc(), sliced_heap); + static Irq_root irq_root (*core_env().pd_session(), + platform().irq_alloc(), sliced_heap); + static Trace::Root trace_root (ep, sliced_heap, Trace::sources(), trace_policies); static Core_service rom_service (services, rom_root); static Core_service rm_service (services, rm_root); @@ -277,7 +277,7 @@ int main() static Core_service trace_service (services, trace_root); /* make platform-specific services known to service pool */ - platform_add_local_services(&ep, &sliced_heap, &services); + platform_add_local_services(ep, sliced_heap, services); size_t const avail_ram_quota = core_pd.avail_ram().value; size_t const avail_cap_quota = core_pd.avail_caps().value; @@ -300,7 +300,7 @@ int main() /* CPU session representing core */ static Cpu_session_component - core_cpu(&ep, &ep, &pager_ep, &sliced_heap, Trace::sources(), + core_cpu(ep, ep, pager_ep, sliced_heap, Trace::sources(), "label=\"core\"", Affinity(), Cpu_session::QUOTA_LIMIT); Cpu_session_capability core_cpu_cap = ep.manage(&core_cpu); @@ -308,10 +308,10 @@ int main() "assigned to init"); static Reconstructible - init(services, local_rm, core_pd, core_pd_cap, core_cpu, core_cpu_cap, + init(services, local_rm, core_pd, core_pd_cap, core_cpu, core_cpu_cap, init_cap_quota, init_ram_quota, ep); - platform()->wait_for_exit(); + platform().wait_for_exit(); init.destruct(); return 0; diff --git a/repos/base/src/core/pager_ep.cc b/repos/base/src/core/pager_ep.cc index e1dfc113e..aae61f852 100644 --- a/repos/base/src/core/pager_ep.cc +++ b/repos/base/src/core/pager_ep.cc @@ -84,21 +84,21 @@ void Pager_entrypoint::entry() } -void Pager_entrypoint::dissolve(Pager_object *obj) +void Pager_entrypoint::dissolve(Pager_object &obj) { using Pool = Object_pool; - if (obj) Pool::remove(obj); + Pool::remove(&obj); } -Pager_capability Pager_entrypoint::manage(Pager_object *obj) +Pager_capability Pager_entrypoint::manage(Pager_object &obj) { - Native_capability cap = _pager_object_cap(obj->badge()); + Native_capability cap = _pager_object_cap(obj.badge()); /* add server object to object pool */ - obj->cap(cap); - insert(obj); + obj.cap(cap); + insert(&obj); /* return capability that uses the object id as badge */ return reinterpret_cap_cast(cap); diff --git a/repos/base/src/core/platform_rom_modules.cc b/repos/base/src/core/platform_rom_modules.cc index d21b67395..a885038b3 100644 --- a/repos/base/src/core/platform_rom_modules.cc +++ b/repos/base/src/core/platform_rom_modules.cc @@ -29,9 +29,9 @@ void Platform::_init_rom_modules() Cstring((char const *)header->name), "'"); continue; } - Rom_module *rom_module = new (core_mem_alloc()) + Rom_module &rom_module = *new (core_mem_alloc()) Rom_module(_rom_module_phys(header->base), header->size, (char const *)header->name); - _rom_fs.insert(rom_module); + _rom_fs.insert(&rom_module); } } diff --git a/repos/base/src/core/platform_services.cc b/repos/base/src/core/platform_services.cc index dae837343..91d82ce1b 100644 --- a/repos/base/src/core/platform_services.cc +++ b/repos/base/src/core/platform_services.cc @@ -15,5 +15,5 @@ #include -void Genode::platform_add_local_services(Rpc_entrypoint *, Sliced_heap*, - Registry *) { } +void Genode::platform_add_local_services(Rpc_entrypoint &, Sliced_heap &, + Registry &) { } diff --git a/repos/base/src/core/ram_dataspace_factory.cc b/repos/base/src/core/ram_dataspace_factory.cc index ff7299c24..42cc882ef 100644 --- a/repos/base/src/core/ram_dataspace_factory.cc +++ b/repos/base/src/core/ram_dataspace_factory.cc @@ -37,7 +37,7 @@ Ram_dataspace_factory::alloc(size_t ds_size, Cache_attribute cached) * If this does not work, we subsequently weaken the alignment constraint * until the allocation succeeds. */ - void *ds_addr = 0; + void *ds_addr = nullptr; bool alloc_succeeded = false; /* @@ -115,16 +115,16 @@ Ram_dataspace_factory::alloc(size_t ds_size, Cache_attribute cached) * \throw Out_of_ram * \throw Out_of_caps */ - Dataspace_component * const ds = new (_ds_slab) + Dataspace_component &ds = *new (_ds_slab) Dataspace_component(ds_size, (addr_t)ds_addr, cached, true, this); /* create native shared memory representation of dataspace */ try { _export_ram_ds(ds); } catch (Core_virtual_memory_exhausted) { - warning("could not export RAM dataspace of size ", ds->size()); + warning("could not export RAM dataspace of size ", ds.size()); /* cleanup unneeded resources */ - destroy(_ds_slab, ds); + destroy(_ds_slab, &ds); throw Out_of_ram(); } @@ -135,7 +135,7 @@ Ram_dataspace_factory::alloc(size_t ds_size, Cache_attribute cached) */ _clear_ds(ds); - Dataspace_capability result = _ep.manage(ds); + Dataspace_capability result = _ep.manage(&ds); phys_alloc_guard.ack = true; @@ -149,7 +149,7 @@ void Ram_dataspace_factory::free(Ram_dataspace_capability ds_cap) _ep.apply(ds_cap, [&] (Dataspace_component *c) { if (!c) return; - if (!c->owner(this)) return; + if (!c->owner(*this)) return; ds = c; @@ -162,7 +162,7 @@ void Ram_dataspace_factory::free(Ram_dataspace_capability ds_cap) ds->detach_from_rm_sessions(); /* destroy native shared memory representation */ - _revoke_ram_ds(ds); + _revoke_ram_ds(*ds); /* free physical memory that was backing the dataspace */ _phys_alloc.free((void *)ds->phys_addr(), ds_size); @@ -178,7 +178,7 @@ size_t Ram_dataspace_factory::dataspace_size(Ram_dataspace_capability ds_cap) co { size_t result = 0; _ep.apply(ds_cap, [&] (Dataspace_component *c) { - if (c && c->owner(this)) + if (c && c->owner(*this)) result = c->size(); }); return result; diff --git a/repos/base/src/core/region_map_component.cc b/repos/base/src/core/region_map_component.cc index 6233b5b22..e3de5b622 100644 --- a/repos/base/src/core/region_map_component.cc +++ b/repos/base/src/core/region_map_component.cc @@ -189,7 +189,7 @@ int Rm_client::pager(Ipc_pager &pager) addr_t const region_offset, addr_t const dst_region_size) -> int { - Dataspace_component * dsc = region ? region->dataspace() : nullptr; + Dataspace_component * dsc = region ? ®ion->dataspace() : nullptr; if (!dsc) { /* @@ -199,13 +199,13 @@ int Rm_client::pager(Ipc_pager &pager) */ /* print a warning if it's no managed-dataspace */ - if (region_map == member_rm()) + if (region_map == &member_rm()) print_page_fault("no RM attachment", pf_addr, pf_ip, pf_type, *this); /* register fault at responsible region map */ if (region_map) - region_map->fault(this, pf_addr - region_offset, pf_type); + region_map->fault(*this, pf_addr - region_offset, pf_type); /* there is no attachment return an error condition */ return 1; @@ -222,7 +222,7 @@ int Rm_client::pager(Ipc_pager &pager) /* register fault at responsible region map */ if (region_map) - region_map->fault(this, pf_addr - region_offset, pf_type); + region_map->fault(*this, pf_addr - region_offset, pf_type); return 2; } @@ -233,15 +233,15 @@ int Rm_client::pager(Ipc_pager &pager) /* register fault at responsible region map */ if (region_map) - region_map->fault(this, pf_addr - region_offset, pf_type); + region_map->fault(*this, pf_addr - region_offset, pf_type); return 3; } Mapping mapping = Region_map_component::create_map_item(region_map, - region, + *region, ds_offset, region_offset, - dsc, pf_addr, + *dsc, pf_addr, dst_region_size); /* @@ -259,7 +259,7 @@ int Rm_client::pager(Ipc_pager &pager) pager.set_reply_mapping(mapping); return 0; }; - return member_rm()->apply_to_dataspace(pf_addr, lambda); + return member_rm().apply_to_dataspace(pf_addr, lambda); } @@ -267,31 +267,31 @@ int Rm_client::pager(Ipc_pager &pager) ** Faulter ** *************/ -void Rm_faulter::fault(Region_map_component *faulting_region_map, +void Rm_faulter::fault(Region_map_component &faulting_region_map, Region_map::State fault_state) { Lock::Guard lock_guard(_lock); - _faulting_region_map = faulting_region_map->weak_ptr(); + _faulting_region_map = faulting_region_map.weak_ptr(); _fault_state = fault_state; - _pager_object->unresolved_page_fault_occurred(); + _pager_object.unresolved_page_fault_occurred(); } -void Rm_faulter::dissolve_from_faulting_region_map(Region_map_component * caller) +void Rm_faulter::dissolve_from_faulting_region_map(Region_map_component &caller) { /* serialize access */ Lock::Guard lock_guard(_lock); enum { DO_LOCK = true }; - if (caller->equals(_faulting_region_map)) { - caller->discard_faulter(this, !DO_LOCK); + if (caller.equals(_faulting_region_map)) { + caller.discard_faulter(*this, !DO_LOCK); } else { Locked_ptr locked_ptr(_faulting_region_map); if (locked_ptr.valid()) - locked_ptr->discard_faulter(this, DO_LOCK); + locked_ptr->discard_faulter(*this, DO_LOCK); } _faulting_region_map = Genode::Weak_ptr(); @@ -302,7 +302,7 @@ void Rm_faulter::continue_after_resolved_fault() { Lock::Guard lock_guard(_lock); - _pager_object->wake_up(); + _pager_object.wake_up(); _faulting_region_map = Genode::Weak_ptr(); _fault_state = Region_map::State(); } @@ -313,18 +313,20 @@ void Rm_faulter::continue_after_resolved_fault() **************************/ Mapping Region_map_component::create_map_item(Region_map_component *, - Rm_region *region, + Rm_region ®ion, addr_t const ds_offset, addr_t const region_offset, - Dataspace_component *dsc, + Dataspace_component &dsc, addr_t const page_addr, addr_t const dst_region_size) { - addr_t ds_base = dsc->map_src_addr(); + addr_t const ds_base = dsc.map_src_addr(); + Fault_area src_fault_area(ds_base + ds_offset); Fault_area dst_fault_area(page_addr); - src_fault_area.constrain(ds_base, dsc->size()); - dst_fault_area.constrain(region_offset + region->base(), dst_region_size); + + src_fault_area.constrain(ds_base, dsc.size()); + dst_fault_area.constrain(region_offset + region.base(), dst_region_size); /* * Determine mapping size compatible with source and destination, @@ -340,9 +342,9 @@ Mapping Region_map_component::create_map_item(Region_map_component *, error("invalid mapping"); return Mapping(dst_fault_area.base(), src_fault_area.base(), - dsc->cacheability(), dsc->io_mem(), - map_size_log2, region->write() && dsc->writable(), - region->executable()); + dsc.cacheability(), dsc.io_mem(), + map_size_log2, region.write() && dsc.writable(), + region.executable()); }; @@ -434,15 +436,16 @@ Region_map_component::attach(Dataspace_capability ds_cap, size_t size, /* store attachment info in meta data */ try { - _map.metadata(attach_at, Rm_region((addr_t)attach_at, size, - dsc->writable() && writeable, - dsc, offset, this, executable)); + _map.construct_metadata(attach_at, + (addr_t)attach_at, size, + dsc->writable() && writeable, + *dsc, offset, *this, executable); } catch (Allocator_avl_tpl::Assign_metadata_failed) { error("failed to store attachment info"); throw Invalid_dataspace(); } - Rm_region *region = _map.metadata(attach_at); + Rm_region ®ion = *_map.metadata(attach_at); /* inform dataspace about attachment */ dsc->attached_to(region); @@ -464,7 +467,7 @@ Region_map_component::attach(Dataspace_capability ds_cap, size_t size, return attach_at; }; - return _ds_ep->apply(ds_cap, lambda); + return _ds_ep.apply(ds_cap, lambda); } @@ -474,7 +477,7 @@ addr_t Region_map_component::_core_local_addr(Rm_region & region) * If this region references a managed dataspace, * we have to recursively request the core-local address */ - if (region.dataspace()->sub_rm().valid()) { + if (region.dataspace().sub_rm().valid()) { auto lambda = [&] (Region_map_component * rmc) -> addr_t { /** @@ -485,11 +488,11 @@ addr_t Region_map_component::_core_local_addr(Rm_region & region) : nullptr;; return r ? rmc->_core_local_addr(*r) : 0; }; - return _session_ep->apply(region.dataspace()->sub_rm(), lambda); + return _session_ep.apply(region.dataspace().sub_rm(), lambda); } /* return core-local address of dataspace + region offset */ - return region.dataspace()->core_local_addr() + region.offset(); + return region.dataspace().core_local_addr() + region.offset(); } @@ -501,7 +504,7 @@ void Region_map_component::_unmap_region(addr_t base, size_t size) * Iterate over all regions that reference this region map * as managed dataspace */ - for (Rm_region * r = dataspace_component()->regions()->first(); + for (Rm_region * r = dataspace_component().regions().first(); r; r = r->List::Element::next()) { /** @@ -514,8 +517,7 @@ void Region_map_component::_unmap_region(addr_t base, size_t size) /* if size is not zero, there is an overlap */ if (ds_size) - r->rm()->_unmap_region(r->base() + ds_base - r->offset(), - ds_size); + r->rm()._unmap_region(r->base() + ds_base - r->offset(), ds_size); } } @@ -538,16 +540,10 @@ void Region_map_component::detach(Local_addr local_addr) warning("detach: ", static_cast(local_addr), " is not " "the beginning of the region ", Hex(region_ptr->base())); - Dataspace_component *dsc = region_ptr->dataspace(); - - if (!dsc) { - if (_diag.enabled) - warning("detach: region of ", this, " may be inconsistent!"); - return; - } + Dataspace_component &dsc = region_ptr->dataspace(); /* inform dataspace about detachment */ - dsc->detached_from(region_ptr); + dsc.detached_from(*region_ptr); /* * Create local copy of region data because the '_map.metadata' of the @@ -562,7 +558,7 @@ void Region_map_component::detach(Local_addr local_addr) */ _map.free(reinterpret_cast(region.base())); - if (!platform()->supports_direct_unmap()) { + if (!platform().supports_direct_unmap()) { /* * Determine core local address of the region, where necessary. @@ -575,7 +571,7 @@ void Region_map_component::detach(Local_addr local_addr) */ Address_space::Core_local_addr core_local { _core_local_addr(region) }; if (core_local.value) - platform_specific()->core_pd()->flush(0, region.size(), core_local); + platform_specific().core_pd().flush(0, region.size(), core_local); } else { /* @@ -599,31 +595,31 @@ void Region_map_component::remove_client(Rm_client &rm_client) Lock::Guard lock_guard(_lock); _clients.remove(&rm_client); - rm_client.dissolve_from_faulting_region_map(this); + rm_client.dissolve_from_faulting_region_map(*this); } -void Region_map_component::fault(Rm_faulter *faulter, addr_t pf_addr, +void Region_map_component::fault(Rm_faulter &faulter, addr_t pf_addr, Region_map::State::Fault_type pf_type) { /* remember fault state in faulting thread */ - faulter->fault(this, Region_map::State(pf_type, pf_addr)); + faulter.fault(*this, Region_map::State(pf_type, pf_addr)); /* enqueue faulter */ - _faulters.enqueue(faulter); + _faulters.enqueue(&faulter); /* issue fault signal */ _fault_notifier.submit(); } -void Region_map_component::discard_faulter(Rm_faulter *faulter, bool do_lock) +void Region_map_component::discard_faulter(Rm_faulter &faulter, bool do_lock) { if (do_lock) { Lock::Guard lock_guard(_lock); - _faulters.remove(faulter); + _faulters.remove(&faulter); } else - _faulters.remove(faulter); + _faulters.remove(&faulter); } @@ -639,14 +635,14 @@ Region_map::State Region_map_component::state() Lock::Guard lock_guard(_lock); /* pick one of the currently faulted threads */ - Rm_faulter *faulter = _faulters.head(); + Rm_faulter *faulter_ptr = _faulters.head(); /* return ready state if there are not current faulters */ - if (!faulter) + if (!faulter_ptr) return Region_map::State(); /* return fault information regarding the first faulter of the list */ - return faulter->fault_state(); + return faulter_ptr->fault_state(); } @@ -661,11 +657,11 @@ Region_map_component::Region_map_component(Rpc_entrypoint &ep, size_t vm_size, Session::Diag diag) : - _diag(diag), _ds_ep(&ep), _thread_ep(&ep), _session_ep(&ep), + _diag(diag), _ds_ep(ep), _thread_ep(ep), _session_ep(ep), _md_alloc(md_alloc), - _map(&_md_alloc), _pager_ep(&pager_ep), + _map(&_md_alloc), _pager_ep(pager_ep), _ds(align_addr(vm_size, get_page_size_log2())), - _ds_cap(_type_deduction_helper(_ds_ep->manage(&_ds))) + _ds_cap(_type_deduction_helper(_ds_ep.manage(&_ds))) { /* configure managed VM area */ _map.add_range(vm_start, align_addr(vm_size, get_page_size_log2())); @@ -686,10 +682,10 @@ Region_map_component::~Region_map_component() * there capabilities before it gets dissolved in the next step. */ _ds.detach_from_rm_sessions(); - _ds_ep->dissolve(this); + _ds_ep.dissolve(this); /* dissolve all clients from pager entrypoint */ - Rm_client *cl; + Rm_client *cl = nullptr; do { Cpu_session_capability cpu_session_cap; Thread_capability thread_cap; @@ -698,7 +694,7 @@ Region_map_component::~Region_map_component() cl = _clients.first(); if (!cl) break; - cl->dissolve_from_faulting_region_map(this); + cl->dissolve_from_faulting_region_map(*this); cpu_session_cap = cl->cpu_session_cap(); thread_cap = cl->thread_cap(); @@ -711,7 +707,7 @@ Region_map_component::~Region_map_component() if (cpu_session) cpu_session->kill_thread(thread_cap); }; - _thread_ep->apply(cpu_session_cap, lambda); + _thread_ep.apply(cpu_session_cap, lambda); } while (cl); /* detach all regions */ @@ -728,5 +724,5 @@ Region_map_component::~Region_map_component() } /* revoke dataspace representation */ - _ds_ep->dissolve(&_ds); + _ds_ep.dissolve(&_ds); } diff --git a/repos/base/src/core/rom_session_component.cc b/repos/base/src/core/rom_session_component.cc index 745401467..5dc789588 100644 --- a/repos/base/src/core/rom_session_component.cc +++ b/repos/base/src/core/rom_session_component.cc @@ -18,24 +18,19 @@ using namespace Genode; -Rom_session_component::Rom_session_component(Rom_fs *rom_fs, - Rpc_entrypoint *ds_ep, +Rom_session_component::Rom_session_component(Rom_fs &rom_fs, + Rpc_entrypoint &ds_ep, const char *args) : - _rom_module(_find_rom(rom_fs, args)), + _rom_module(&_find_rom(rom_fs, args)), _ds(_rom_module ? _rom_module->size : 0, _rom_module ? _rom_module->addr : 0, CACHED, false, 0), - _ds_ep(ds_ep) -{ - /* ROM module not found */ - if (!_rom_module) - throw Service_denied(); - - _ds_cap = static_cap_cast(_ds_ep->manage(&_ds)); -} + _ds_ep(ds_ep), + _ds_cap(static_cap_cast(_ds_ep.manage(&_ds))) +{ } Rom_session_component::~Rom_session_component() { - _ds_ep->dissolve(&_ds); + _ds_ep.dissolve(&_ds); } diff --git a/repos/base/src/core/rpc_cap_factory_l4.cc b/repos/base/src/core/rpc_cap_factory_l4.cc index d64b00557..c427cd7c0 100644 --- a/repos/base/src/core/rpc_cap_factory_l4.cc +++ b/repos/base/src/core/rpc_cap_factory_l4.cc @@ -25,7 +25,7 @@ using namespace Genode; static unsigned unique_id_cnt; -Native_capability Rpc_cap_factory::_alloc(Rpc_cap_factory *, +Native_capability Rpc_cap_factory::_alloc(Rpc_cap_factory &, Native_capability ep) { if (!ep.valid()) { @@ -45,7 +45,7 @@ Native_capability Rpc_cap_factory::_alloc(Rpc_cap_factory *, Native_capability Rpc_cap_factory::alloc(Native_capability ep) { - return Rpc_cap_factory::_alloc(this, ep); + return Rpc_cap_factory::_alloc(*this, ep); } diff --git a/repos/base/src/core/signal_source_component.cc b/repos/base/src/core/signal_source_component.cc index 50ebbedd0..12a2f9b85 100644 --- a/repos/base/src/core/signal_source_component.cc +++ b/repos/base/src/core/signal_source_component.cc @@ -24,14 +24,14 @@ using namespace Genode; ** Signal-source component ** *****************************/ -void Signal_source_component::release(Signal_context_component *context) +void Signal_source_component::release(Signal_context_component &context) { - if (context && context->enqueued()) - _signal_queue.remove(context); + if (context.enqueued()) + _signal_queue.remove(&context); } -void Signal_source_component::submit(Signal_context_component *context, +void Signal_source_component::submit(Signal_context_component &context, unsigned long cnt) { /* @@ -39,7 +39,7 @@ void Signal_source_component::submit(Signal_context_component *context, * signal will be delivered as result of the next * 'wait_for_signal' call. */ - context->increment_signal_cnt(cnt); + context.increment_signal_cnt(cnt); /* * If the client is blocking at the signal source (indicated by @@ -47,19 +47,19 @@ void Signal_source_component::submit(Signal_context_component *context, */ if (_reply_cap.valid()) { - _entrypoint->reply_signal_info(_reply_cap, context->imprint(), context->cnt()); + _entrypoint.reply_signal_info(_reply_cap, context.imprint(), context.cnt()); /* * We unblocked the client and, therefore, can invalidate * the reply capability. */ _reply_cap = Untyped_capability(); - context->reset_signal_cnt(); + context.reset_signal_cnt(); } else { - if (!context->enqueued()) - _signal_queue.enqueue(context); + if (!context.enqueued()) + _signal_queue.enqueue(&context); } } @@ -73,20 +73,20 @@ Signal_source::Signal Signal_source_component::wait_for_signal() * Keep reply capability for outstanding request to be used * for the later call of 'explicit_reply()'. */ - _reply_cap = _entrypoint->reply_dst(); - _entrypoint->omit_reply(); + _reply_cap = _entrypoint.reply_dst(); + _entrypoint.omit_reply(); return Signal(0, 0); /* just a dummy */ } /* dequeue and return pending signal */ - Signal_context_component *context = _signal_queue.dequeue(); - Signal result(context->imprint(), context->cnt()); - context->reset_signal_cnt(); + Signal_context_component &context = *_signal_queue.dequeue(); + Signal result(context.imprint(), context.cnt()); + context.reset_signal_cnt(); return result; } -Signal_source_component::Signal_source_component(Rpc_entrypoint *ep) +Signal_source_component::Signal_source_component(Rpc_entrypoint &ep) : _entrypoint(ep) { } @@ -97,6 +97,6 @@ Signal_source_component::~Signal_source_component() if (!_reply_cap.valid()) return; - _entrypoint->reply_signal_info(_reply_cap, 0, 0); + _entrypoint.reply_signal_info(_reply_cap, 0, 0); _reply_cap = Untyped_capability(); } diff --git a/repos/base/src/core/spec/x86/io_port_session_component.cc b/repos/base/src/core/spec/x86/io_port_session_component.cc index 3c24e647a..dc0176c5d 100644 --- a/repos/base/src/core/spec/x86/io_port_session_component.cc +++ b/repos/base/src/core/spec/x86/io_port_session_component.cc @@ -26,7 +26,7 @@ using namespace Genode; ** Constructor / destructor ** ******************************/ -Io_port_session_component::Io_port_session_component(Range_allocator *io_port_alloc, +Io_port_session_component::Io_port_session_component(Range_allocator &io_port_alloc, const char *args) : _io_port_alloc(io_port_alloc) { @@ -35,7 +35,7 @@ Io_port_session_component::Io_port_session_component(Range_allocator *io_port_al unsigned size = Arg_string::find_arg(args, "io_port_size").ulong_value(0); /* allocate region (also checks out-of-bounds regions) */ - switch (io_port_alloc->alloc_addr(size, base).value) { + switch (io_port_alloc.alloc_addr(size, base).value) { case Range_allocator::Alloc_return::RANGE_CONFLICT: error("I/O port ", Hex_range(base, size), " not available"); @@ -56,5 +56,5 @@ Io_port_session_component::Io_port_session_component(Range_allocator *io_port_al Io_port_session_component::~Io_port_session_component() { - _io_port_alloc->free(reinterpret_cast(_base)); + _io_port_alloc.free(reinterpret_cast(_base)); } diff --git a/repos/base/src/core/spec/x86/platform_services.cc b/repos/base/src/core/spec/x86/platform_services.cc index 088ee53c2..db5411645 100644 --- a/repos/base/src/core/spec/x86/platform_services.cc +++ b/repos/base/src/core/spec/x86/platform_services.cc @@ -24,13 +24,13 @@ /* * Add x86 specific ioport service */ -void Genode::platform_add_local_services(Rpc_entrypoint*, - Sliced_heap *sliced_heap, - Registry *local_services) +void Genode::platform_add_local_services(Rpc_entrypoint &, + Sliced_heap &sliced_heap, + Registry &local_services) { - static Io_port_root io_port_root(core_env()->pd_session(), - platform()->io_port_alloc(), sliced_heap); + static Io_port_root io_port_root(*core_env().pd_session(), + platform().io_port_alloc(), sliced_heap); static Core_service - io_port_ls(*local_services, io_port_root); + io_port_ls(local_services, io_port_root); } diff --git a/repos/base/src/core/stack_area.cc b/repos/base/src/core/stack_area.cc index 0050cb2bb..64bb18a71 100644 --- a/repos/base/src/core/stack_area.cc +++ b/repos/base/src/core/stack_area.cc @@ -59,7 +59,7 @@ class Stack_area_region_map : public Region_map using Ds_slab = Synced_allocator >; - Ds_slab _ds_slab { platform()->core_mem_alloc() }; + Ds_slab _ds_slab { platform().core_mem_alloc() }; public: @@ -71,31 +71,27 @@ class Stack_area_region_map : public Region_map { /* allocate physical memory */ size = round_page(size); - void *phys_base; - Range_allocator *ra = platform_specific()->ram_alloc(); - if (ra->alloc_aligned(size, &phys_base, - get_page_size_log2()).error()) { + void *phys_base = nullptr; + Range_allocator &ra = platform_specific().ram_alloc(); + if (ra.alloc_aligned(size, &phys_base, + get_page_size_log2()).error()) { error("could not allocate backing store for new stack"); return (addr_t)0; } - Dataspace_component *ds = new (&_ds_slab) + Dataspace_component &ds = *new (&_ds_slab) Dataspace_component(size, 0, (addr_t)phys_base, CACHED, true, 0); - if (!ds) { - error("dataspace for core stack does not exist"); - return (addr_t)0; - } - addr_t core_local_addr = stack_area_virtual_base() + (addr_t)local_addr; + addr_t const core_local_addr = stack_area_virtual_base() + (addr_t)local_addr; - if (!map_local(ds->phys_addr(), core_local_addr, - ds->size() >> get_page_size_log2())) { - error("could not map phys ", Hex(ds->phys_addr()), + if (!map_local(ds.phys_addr(), core_local_addr, + ds.size() >> get_page_size_log2())) { + error("could not map phys ", Hex(ds.phys_addr()), " at local ", Hex(core_local_addr)); return (addr_t)0; } - ds->assign_core_local_addr((void*)core_local_addr); + ds.assign_core_local_addr((void*)core_local_addr); return local_addr; } diff --git a/repos/base/src/core/trace_session_component.cc b/repos/base/src/core/trace_session_component.cc index cf461ffa6..80d656440 100644 --- a/repos/base/src/core/trace_session_component.cc +++ b/repos/base/src/core/trace_session_component.cc @@ -90,9 +90,9 @@ void Session_component::trace(Subject_id subject_id, Policy_id policy_id, throw Out_of_ram(); try { - Trace::Subject *subject = _subjects.lookup_by_id(subject_id); - subject->trace(policy_id, _policies.dataspace(*this, policy_id), - policy_size, _ram, buffer_size); + Trace::Subject &subject = _subjects.lookup_by_id(subject_id); + subject.trace(policy_id, _policies.dataspace(*this, policy_id), + policy_size, _ram, buffer_size); } catch (...) { /* revert withdrawal or quota */ _md_alloc.upgrade(required_ram); @@ -110,25 +110,25 @@ void Session_component::rule(Session_label const &, Thread_name const &, void Session_component::pause(Subject_id subject_id) { - _subjects.lookup_by_id(subject_id)->pause(); + _subjects.lookup_by_id(subject_id).pause(); } void Session_component::resume(Subject_id subject_id) { - _subjects.lookup_by_id(subject_id)->resume(); + _subjects.lookup_by_id(subject_id).resume(); } Subject_info Session_component::subject_info(Subject_id subject_id) { - return _subjects.lookup_by_id(subject_id)->info(); + return _subjects.lookup_by_id(subject_id).info(); } Dataspace_capability Session_component::buffer(Subject_id subject_id) { - return _subjects.lookup_by_id(subject_id)->buffer(); + return _subjects.lookup_by_id(subject_id).buffer(); } diff --git a/repos/ports/include/vmm/vcpu_thread.h b/repos/ports/include/vmm/vcpu_thread.h index 7b732c011..00c5e7ce1 100644 --- a/repos/ports/include/vmm/vcpu_thread.h +++ b/repos/ports/include/vmm/vcpu_thread.h @@ -69,7 +69,7 @@ class Vmm::Vcpu_other_pd : public Vmm::Vcpu_thread Genode::size_t = 0 /* stack_size */) : _pd_cap(pd_cap), _location(location), _cpu_session(cpu_session), - _exc_pt_sel(Genode::cap_map()->insert(Nova::NUM_INITIAL_VCPU_PT_LOG2)) + _exc_pt_sel(Genode::cap_map().insert(Nova::NUM_INITIAL_VCPU_PT_LOG2)) { } void start(Genode::addr_t sel_ec) @@ -131,10 +131,10 @@ class Vmm::Vcpu_same_pd : public Vmm::Vcpu_thread, Genode::Thread Thread(WEIGHT, "vCPU", stack_size, Type::NORMAL, cpu_session, location) { /* release pre-allocated selectors of Thread */ - Genode::cap_map()->remove(native_thread().exc_pt_sel, Nova::NUM_INITIAL_PT_LOG2); + Genode::cap_map().remove(native_thread().exc_pt_sel, Nova::NUM_INITIAL_PT_LOG2); /* allocate correct number of selectors */ - this->native_thread().exc_pt_sel = cap_map()->insert(Nova::NUM_INITIAL_VCPU_PT_LOG2); + this->native_thread().exc_pt_sel = cap_map().insert(Nova::NUM_INITIAL_VCPU_PT_LOG2); /* tell generic thread code that this becomes a vCPU */ this->native_thread().vcpu = true; @@ -145,10 +145,10 @@ class Vmm::Vcpu_same_pd : public Vmm::Vcpu_thread, Genode::Thread using namespace Nova; revoke(Nova::Obj_crd(this->native_thread().exc_pt_sel, NUM_INITIAL_VCPU_PT_LOG2)); - cap_map()->remove(this->native_thread().exc_pt_sel, NUM_INITIAL_VCPU_PT_LOG2, false); + cap_map().remove(this->native_thread().exc_pt_sel, NUM_INITIAL_VCPU_PT_LOG2, false); /* allocate selectors for ~Thread */ - this->native_thread().exc_pt_sel = cap_map()->insert(Nova::NUM_INITIAL_PT_LOG2); + this->native_thread().exc_pt_sel = cap_map().insert(Nova::NUM_INITIAL_PT_LOG2); } addr_t exc_base() { return this->native_thread().exc_pt_sel; } diff --git a/repos/ports/src/virtualbox/spec/nova/vcpu.h b/repos/ports/src/virtualbox/spec/nova/vcpu.h index 746a11efd..2a5c730cf 100644 --- a/repos/ports/src/virtualbox/spec/nova/vcpu.h +++ b/repos/ports/src/virtualbox/spec/nova/vcpu.h @@ -780,7 +780,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, _start_routine(start_routine), _start_routine_arg(arg), _vcpu(cpu_session, location, pd_vcpu), - _ec_sel(Genode::cap_map()->insert()), + _ec_sel(Genode::cap_map().insert()), _irq_win(false), _cpu_id(cpu_id) { } diff --git a/repos/ports/src/virtualbox5/spec/nova/vcpu.h b/repos/ports/src/virtualbox5/spec/nova/vcpu.h index c0a385ce0..b033e3ce7 100644 --- a/repos/ports/src/virtualbox5/spec/nova/vcpu.h +++ b/repos/ports/src/virtualbox5/spec/nova/vcpu.h @@ -801,7 +801,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, _start_routine(start_routine), _start_routine_arg(arg), _vcpu(cpu_session, location, pd_vcpu), - _ec_sel(Genode::cap_map()->insert()), + _ec_sel(Genode::cap_map().insert()), _cpu_id(cpu_id) { }