base-hw: no unmanaged_singleton in kernel thread

The unmanaged-singleton approach was used in this context only because of the
alignment requirement of the Core main-UTCB. This, however can also be achieved
with the new 'Aligned' utility, allowing the UTCB to be a member of the Core
main-thread object.

Ref #4217
This commit is contained in:
Martin Stein 2021-07-20 13:09:41 +02:00 committed by Norman Feske
parent b6641eaa25
commit 0c61b25bcf
2 changed files with 10 additions and 12 deletions

View File

@ -17,8 +17,6 @@
#include <cpu_session/cpu_session.h>
/* base-internal includes */
#include <base/internal/unmanaged_singleton.h>
#include <base/internal/native_utcb.h>
#include <base/internal/crt0.h>
/* core includes */
@ -884,24 +882,20 @@ Core_main_thread::Core_main_thread(Irq::Pool &user_irq_pool,
{
using namespace Genode;
static Native_utcb * const utcb =
unmanaged_singleton<Native_utcb, get_page_size()>();
static addr_t const utcb_phys = Platform::core_phys_addr((addr_t)utcb);
/* map UTCB */
Genode::map_local(utcb_phys, (addr_t)utcb_main_thread(),
Genode::map_local(Platform::core_phys_addr((addr_t)&_utcb_instance),
(addr_t)utcb_main_thread(),
sizeof(Native_utcb) / get_page_size());
utcb->cap_add(core_capid());
utcb->cap_add(cap_id_invalid());
utcb->cap_add(cap_id_invalid());
_utcb_instance.cap_add(core_capid());
_utcb_instance.cap_add(cap_id_invalid());
_utcb_instance.cap_add(cap_id_invalid());
/* start thread with stack pointer at the top of stack */
regs->sp = (addr_t)&__initial_stack_base[0] + DEFAULT_STACK_SIZE;
regs->ip = (addr_t)&_core_start;
affinity(_cpu_pool.primary_cpu());
_utcb = utcb;
_utcb = &_utcb_instance;
Thread::_pd = &core_pd;
_become_active();
}

View File

@ -445,6 +445,10 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
*/
class Kernel::Core_main_thread : public Core_object<Kernel::Thread>
{
private:
Native_utcb _utcb_instance alignas(Hw::get_page_size()) { };
public:
Core_main_thread(Irq::Pool &user_irq_pool,