mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-03 04:26:45 +00:00
base-hw: Core PD as Main member
Let the Core protection-domain object be a member of the one Kernel::Main object instead of having it as global static variable. Ref #4217
This commit is contained in:
parent
d6e347163d
commit
b6641eaa25
@ -51,7 +51,6 @@ SRC_CC += pager.cc
|
|||||||
SRC_CC += _main.cc
|
SRC_CC += _main.cc
|
||||||
SRC_CC += kernel/cpu.cc
|
SRC_CC += kernel/cpu.cc
|
||||||
SRC_CC += kernel/cpu_scheduler.cc
|
SRC_CC += kernel/cpu_scheduler.cc
|
||||||
SRC_CC += kernel/init.cc
|
|
||||||
SRC_CC += kernel/ipc_node.cc
|
SRC_CC += kernel/ipc_node.cc
|
||||||
SRC_CC += kernel/irq.cc
|
SRC_CC += kernel/irq.cc
|
||||||
SRC_CC += kernel/main.cc
|
SRC_CC += kernel/main.cc
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/thread.h>
|
#include <kernel/thread.h>
|
||||||
#include <kernel/irq.h>
|
#include <kernel/irq.h>
|
||||||
#include <kernel/pd.h>
|
#include <kernel/pd.h>
|
||||||
@ -106,14 +105,15 @@ extern "C" void idle_thread_main(void);
|
|||||||
|
|
||||||
Cpu::Idle_thread::Idle_thread(Irq::Pool &user_irq_pool,
|
Cpu::Idle_thread::Idle_thread(Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool,
|
Cpu_pool &cpu_pool,
|
||||||
Cpu &cpu)
|
Cpu &cpu,
|
||||||
|
Pd &core_pd)
|
||||||
:
|
:
|
||||||
Thread { user_irq_pool, cpu_pool, "idle" }
|
Thread { user_irq_pool, cpu_pool, core_pd, "idle" }
|
||||||
{
|
{
|
||||||
regs->ip = (addr_t)&idle_thread_main;
|
regs->ip = (addr_t)&idle_thread_main;
|
||||||
|
|
||||||
affinity(cpu);
|
affinity(cpu);
|
||||||
Thread::_pd = &core_pd();
|
Thread::_pd = &core_pd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -175,12 +175,13 @@ addr_t Cpu::stack_start()
|
|||||||
|
|
||||||
Cpu::Cpu(unsigned const id,
|
Cpu::Cpu(unsigned const id,
|
||||||
Irq::Pool &user_irq_pool,
|
Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool)
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd)
|
||||||
:
|
:
|
||||||
_id { id },
|
_id { id },
|
||||||
_timer { *this },
|
_timer { *this },
|
||||||
_scheduler { _idle, _quota(), _fill() },
|
_scheduler { _idle, _quota(), _fill() },
|
||||||
_idle { user_irq_pool, cpu_pool, *this },
|
_idle { user_irq_pool, cpu_pool, *this, core_pd },
|
||||||
_ipi_irq { *this },
|
_ipi_irq { *this },
|
||||||
_global_work_list { cpu_pool.work_list() }
|
_global_work_list { cpu_pool.work_list() }
|
||||||
{
|
{
|
||||||
@ -192,10 +193,11 @@ Cpu::Cpu(unsigned const id,
|
|||||||
** Cpu_pool **
|
** Cpu_pool **
|
||||||
**************/
|
**************/
|
||||||
|
|
||||||
void Cpu_pool::initialize_executing_cpu(Irq::Pool &user_irq_pool)
|
void Cpu_pool::initialize_executing_cpu(Irq::Pool &user_irq_pool,
|
||||||
|
Pd &core_pd)
|
||||||
{
|
{
|
||||||
unsigned id = Cpu::executing_id();
|
unsigned id = Cpu::executing_id();
|
||||||
_cpus[id].construct(id, user_irq_pool, *this);
|
_cpus[id].construct(id, user_irq_pool, *this, core_pd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +104,8 @@ class Kernel::Cpu : public Genode::Cpu, private Irq::Pool, private Timeout
|
|||||||
*/
|
*/
|
||||||
Idle_thread(Irq::Pool &user_irq_pool,
|
Idle_thread(Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool,
|
Cpu_pool &cpu_pool,
|
||||||
Cpu &cpu);
|
Cpu &cpu,
|
||||||
|
Pd &core_pd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -131,7 +132,8 @@ class Kernel::Cpu : public Genode::Cpu, private Irq::Pool, private Timeout
|
|||||||
*/
|
*/
|
||||||
Cpu(unsigned const id,
|
Cpu(unsigned const id,
|
||||||
Irq::Pool &user_irq_pool,
|
Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool);
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd);
|
||||||
|
|
||||||
static inline unsigned primary_id() { return 0; }
|
static inline unsigned primary_id() { return 0; }
|
||||||
|
|
||||||
@ -202,7 +204,8 @@ class Kernel::Cpu_pool
|
|||||||
|
|
||||||
Cpu_pool(unsigned nr_of_cpus);
|
Cpu_pool(unsigned nr_of_cpus);
|
||||||
|
|
||||||
void initialize_executing_cpu(Irq::Pool &user_irq_pool);
|
void initialize_executing_cpu(Irq::Pool &user_irq_pool,
|
||||||
|
Pd &core_pd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return object of CPU 'id'
|
* Return object of CPU 'id'
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Common kernel initialization
|
|
||||||
* \author Martin Stein
|
|
||||||
* \author Stefan Kalkowski
|
|
||||||
* \date 2015-12-20
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2015-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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* core includes */
|
|
||||||
#include <kernel/pd.h>
|
|
||||||
#include <platform_pd.h>
|
|
||||||
|
|
||||||
/* base includes */
|
|
||||||
#include <base/internal/unmanaged_singleton.h>
|
|
||||||
|
|
||||||
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<Genode::Core_platform_pd>()->kernel_pd(); }
|
|
@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/ipc_node.h>
|
#include <kernel/ipc_node.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/thread.h>
|
#include <kernel/thread.h>
|
||||||
|
|
||||||
using namespace Kernel;
|
using namespace Kernel;
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/irq.h>
|
#include <kernel/irq.h>
|
||||||
|
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Singlethreaded minimalistic kernel
|
|
||||||
* \author Martin Stein
|
|
||||||
* \author Stefan Kalkowski
|
|
||||||
* \date 2013-09-30
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2013-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__KERNEL__KERNEL_H_
|
|
||||||
#define _CORE__KERNEL__KERNEL_H_
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
|
|
||||||
class Pd;
|
|
||||||
|
|
||||||
Pd &core_pd();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _CORE__KERNEL__KERNEL_H_ */
|
|
@ -15,10 +15,15 @@
|
|||||||
/* base includes */
|
/* base includes */
|
||||||
#include <util/reconstructible.h>
|
#include <util/reconstructible.h>
|
||||||
|
|
||||||
|
/* base Core includes */
|
||||||
|
#include <map_local.h>
|
||||||
|
|
||||||
/* base-hw Core includes */
|
/* base-hw Core includes */
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/lock.h>
|
#include <kernel/lock.h>
|
||||||
#include <kernel/main.h>
|
#include <kernel/main.h>
|
||||||
|
#include <platform_pd.h>
|
||||||
|
#include <platform_thread.h>
|
||||||
|
|
||||||
/* base-hw-internal includes */
|
/* base-hw-internal includes */
|
||||||
#include <hw/boot_info.h>
|
#include <hw/boot_info.h>
|
||||||
@ -43,11 +48,16 @@ class Kernel::Main
|
|||||||
Lock _data_lock { };
|
Lock _data_lock { };
|
||||||
Cpu_pool _cpu_pool;
|
Cpu_pool _cpu_pool;
|
||||||
Irq::Pool _user_irq_pool { };
|
Irq::Pool _user_irq_pool { };
|
||||||
|
Genode::Core_platform_pd _core_platform_pd { };
|
||||||
Genode::Constructible<Core_main_thread> _core_main_thread { };
|
Genode::Constructible<Core_main_thread> _core_main_thread { };
|
||||||
|
|
||||||
void _handle_kernel_entry();
|
void _handle_kernel_entry();
|
||||||
|
|
||||||
Main(unsigned nr_of_cpus);
|
Main(unsigned nr_of_cpus);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
static Genode::Platform_pd &core_platform_pd();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -83,6 +93,9 @@ void Kernel::main_handle_kernel_entry()
|
|||||||
|
|
||||||
void Kernel::main_initialize_and_handle_kernel_entry()
|
void Kernel::main_initialize_and_handle_kernel_entry()
|
||||||
{
|
{
|
||||||
|
static_assert(sizeof(Genode::sizet_arithm_t) >= 2 * sizeof(size_t),
|
||||||
|
"Bad result type for size_t arithmetics.");
|
||||||
|
|
||||||
using Boot_info = Hw::Boot_info<Board::Boot_info>;
|
using Boot_info = Hw::Boot_info<Board::Boot_info>;
|
||||||
|
|
||||||
static volatile bool instance_initialized { false };
|
static volatile bool instance_initialized { false };
|
||||||
@ -121,7 +134,8 @@ void Kernel::main_initialize_and_handle_kernel_entry()
|
|||||||
Lock::Guard guard(Main::_instance->_data_lock);
|
Lock::Guard guard(Main::_instance->_data_lock);
|
||||||
instance_initialized = true;
|
instance_initialized = true;
|
||||||
Main::_instance->_cpu_pool.initialize_executing_cpu(
|
Main::_instance->_cpu_pool.initialize_executing_cpu(
|
||||||
Main::_instance->_user_irq_pool);
|
Main::_instance->_user_irq_pool,
|
||||||
|
Main::_instance->_core_platform_pd.kernel_pd());
|
||||||
|
|
||||||
nr_of_initialized_cpus++;
|
nr_of_initialized_cpus++;
|
||||||
};
|
};
|
||||||
@ -148,7 +162,8 @@ void Kernel::main_initialize_and_handle_kernel_entry()
|
|||||||
|
|
||||||
Main::_instance->_core_main_thread.construct(
|
Main::_instance->_core_main_thread.construct(
|
||||||
Main::_instance->_user_irq_pool,
|
Main::_instance->_user_irq_pool,
|
||||||
Main::_instance->_cpu_pool);
|
Main::_instance->_cpu_pool,
|
||||||
|
Main::_instance->_core_platform_pd.kernel_pd());
|
||||||
|
|
||||||
boot_info.core_main_thread_utcb =
|
boot_info.core_main_thread_utcb =
|
||||||
(addr_t)Main::_instance->_core_main_thread->utcb();
|
(addr_t)Main::_instance->_core_main_thread->utcb();
|
||||||
@ -170,7 +185,38 @@ void Kernel::main_initialize_and_handle_kernel_entry()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Genode::Platform_pd &Kernel::Main::core_platform_pd()
|
||||||
|
{
|
||||||
|
return _instance->_core_platform_pd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Kernel::time_t Kernel::main_read_idle_thread_execution_time(unsigned cpu_idx)
|
Kernel::time_t Kernel::main_read_idle_thread_execution_time(unsigned cpu_idx)
|
||||||
{
|
{
|
||||||
return Main::_instance->_cpu_pool.cpu(cpu_idx).idle_thread().execution_time();
|
return Main::_instance->_cpu_pool.cpu(cpu_idx).idle_thread().execution_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Genode::Platform_pd &
|
||||||
|
Genode::Platform_thread::_kernel_main_get_core_platform_pd()
|
||||||
|
{
|
||||||
|
return Kernel::Main::core_platform_pd();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Genode::map_local(addr_t from_phys, addr_t to_virt, size_t num_pages,
|
||||||
|
Page_flags flags)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
Kernel::Main::core_platform_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)
|
||||||
|
{
|
||||||
|
Kernel::Main::core_platform_pd().flush(
|
||||||
|
virt_addr, num_pages * get_page_size());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
#include <kernel/object.h>
|
#include <kernel/object.h>
|
||||||
#include <kernel/pd.h>
|
#include <kernel/pd.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
|
|
||||||
#include <util/construct_at.h>
|
#include <util/construct_at.h>
|
||||||
|
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/core_interface.h>
|
#include <kernel/core_interface.h>
|
||||||
#include <kernel/interface.h>
|
#include <kernel/interface.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
@ -228,9 +227,24 @@ class Kernel::Core_object_identity : public Object_identity,
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Core_object_identity(T & object)
|
/**
|
||||||
: Object_identity(object.kernel_object()),
|
* Constructor used for objects other than the Core PD
|
||||||
Object_identity_reference(this, core_pd()) { }
|
*/
|
||||||
|
Core_object_identity(Pd &core_pd,
|
||||||
|
T &object)
|
||||||
|
:
|
||||||
|
Object_identity(object.kernel_object()),
|
||||||
|
Object_identity_reference(this, core_pd)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor used for Core PD object
|
||||||
|
*/
|
||||||
|
Core_object_identity(T &core_pd)
|
||||||
|
:
|
||||||
|
Object_identity(core_pd.kernel_object()),
|
||||||
|
Object_identity_reference(this, core_pd)
|
||||||
|
{ }
|
||||||
|
|
||||||
capid_t core_capid() { return capid(); }
|
capid_t core_capid() { return capid(); }
|
||||||
|
|
||||||
@ -248,9 +262,26 @@ class Kernel::Core_object : public T, Kernel::Core_object_identity<T>
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor used for objects other than the Core PD
|
||||||
|
*/
|
||||||
|
template <typename... ARGS>
|
||||||
|
Core_object(Pd &core_pd,
|
||||||
|
ARGS &&... args)
|
||||||
|
:
|
||||||
|
T(args...),
|
||||||
|
Core_object_identity<T>(core_pd, *static_cast<T*>(this))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor used for Core PD object
|
||||||
|
*/
|
||||||
template <typename... ARGS>
|
template <typename... ARGS>
|
||||||
Core_object(ARGS &&... args)
|
Core_object(ARGS &&... args)
|
||||||
: T(args...), Core_object_identity<T>(*static_cast<T*>(this)) { }
|
:
|
||||||
|
T(args...),
|
||||||
|
Core_object_identity<T>(*static_cast<T*>(this))
|
||||||
|
{ }
|
||||||
|
|
||||||
using Kernel::Core_object_identity<T>::core_capid;
|
using Kernel::Core_object_identity<T>::core_capid;
|
||||||
using Kernel::Core_object_identity<T>::capid;
|
using Kernel::Core_object_identity<T>::capid;
|
||||||
|
@ -116,12 +116,4 @@ class Kernel::Pd
|
|||||||
bool core_pd() const { return _core_pd; }
|
bool core_pd() const { return _core_pd; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline Kernel::Core_object_identity<Kernel::Pd>::Core_object_identity(Kernel::Pd & pd)
|
|
||||||
:
|
|
||||||
Object_identity(pd.kernel_object()),
|
|
||||||
Object_identity_reference(this, pd.core_pd() ? pd : core_pd())
|
|
||||||
{ }
|
|
||||||
|
|
||||||
#endif /* _CORE__KERNEL__PD_H_ */
|
#endif /* _CORE__KERNEL__PD_H_ */
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
/* core includes */
|
/* core includes */
|
||||||
#include <hw/assert.h>
|
#include <hw/assert.h>
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/thread.h>
|
#include <kernel/thread.h>
|
||||||
#include <kernel/irq.h>
|
#include <kernel/irq.h>
|
||||||
#include <kernel/log.h>
|
#include <kernel/log.h>
|
||||||
@ -98,7 +97,7 @@ void Thread::ipc_copy_msg(Thread &sender)
|
|||||||
Reference *dst_oir = oir->find(pd());
|
Reference *dst_oir = oir->find(pd());
|
||||||
|
|
||||||
/* if it is not found, and the target is not core, create a reference */
|
/* if it is not found, and the target is not core, create a reference */
|
||||||
if (!dst_oir && (&pd() != &core_pd())) {
|
if (!dst_oir && (&pd() != &_core_pd)) {
|
||||||
dst_oir = oir->factory(_obj_id_ref_ptr[i], pd());
|
dst_oir = oir->factory(_obj_id_ref_ptr[i], pd());
|
||||||
if (dst_oir) _obj_id_ref_ptr[i] = nullptr;
|
if (dst_oir) _obj_id_ref_ptr[i] = nullptr;
|
||||||
}
|
}
|
||||||
@ -683,7 +682,7 @@ void Thread::_call_new_obj()
|
|||||||
|
|
||||||
using Thread_identity = Genode::Constructible<Core_object_identity<Thread>>;
|
using Thread_identity = Genode::Constructible<Core_object_identity<Thread>>;
|
||||||
Thread_identity & coi = *(Thread_identity*)user_arg_1();
|
Thread_identity & coi = *(Thread_identity*)user_arg_1();
|
||||||
coi.construct(*thread);
|
coi.construct(_core_pd, *thread);
|
||||||
user_arg_0(coi->core_capid());
|
user_arg_0(coi->core_capid());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -774,12 +773,13 @@ void Thread::_call()
|
|||||||
/* switch over kernel calls that are restricted to core */
|
/* switch over kernel calls that are restricted to core */
|
||||||
switch (call_id) {
|
switch (call_id) {
|
||||||
case call_id_new_thread():
|
case call_id_new_thread():
|
||||||
_call_new<Thread>(_user_irq_pool, _cpu_pool, (unsigned) user_arg_2(),
|
_call_new<Thread>(_user_irq_pool, _cpu_pool, _core_pd,
|
||||||
|
(unsigned) user_arg_2(),
|
||||||
(unsigned) _core_to_kernel_quota(user_arg_3()),
|
(unsigned) _core_to_kernel_quota(user_arg_3()),
|
||||||
(char const *) user_arg_4());
|
(char const *) user_arg_4());
|
||||||
return;
|
return;
|
||||||
case call_id_new_core_thread():
|
case call_id_new_core_thread():
|
||||||
_call_new<Thread>(_user_irq_pool, _cpu_pool,
|
_call_new<Thread>(_user_irq_pool, _cpu_pool, _core_pd,
|
||||||
(char const *) user_arg_2());
|
(char const *) user_arg_2());
|
||||||
return;
|
return;
|
||||||
case call_id_thread_quota(): _call_thread_quota(); return;
|
case call_id_thread_quota(): _call_thread_quota(); return;
|
||||||
@ -839,6 +839,7 @@ void Thread::_mmu_exception()
|
|||||||
|
|
||||||
Thread::Thread(Irq::Pool &user_irq_pool,
|
Thread::Thread(Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool,
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd,
|
||||||
unsigned const priority,
|
unsigned const priority,
|
||||||
unsigned const quota,
|
unsigned const quota,
|
||||||
char const *const label,
|
char const *const label,
|
||||||
@ -848,6 +849,7 @@ Thread::Thread(Irq::Pool &user_irq_pool,
|
|||||||
Cpu_job { priority, quota },
|
Cpu_job { priority, quota },
|
||||||
_user_irq_pool { user_irq_pool },
|
_user_irq_pool { user_irq_pool },
|
||||||
_cpu_pool { cpu_pool },
|
_cpu_pool { cpu_pool },
|
||||||
|
_core_pd { core_pd },
|
||||||
_ipc_node { *this },
|
_ipc_node { *this },
|
||||||
_state { AWAITS_START },
|
_state { AWAITS_START },
|
||||||
_label { label },
|
_label { label },
|
||||||
@ -874,9 +876,11 @@ Genode::uint8_t __initial_stack_base[DEFAULT_STACK_SIZE];
|
|||||||
** Core_main_thread **
|
** Core_main_thread **
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
Core_main_thread::Core_main_thread(Irq::Pool &user_irq_pool, Cpu_pool &cpu_pool)
|
Core_main_thread::Core_main_thread(Irq::Pool &user_irq_pool,
|
||||||
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd)
|
||||||
:
|
:
|
||||||
Core_object<Thread>(user_irq_pool, cpu_pool, "core")
|
Core_object<Thread>(core_pd, user_irq_pool, cpu_pool, core_pd, "core")
|
||||||
{
|
{
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
@ -898,6 +902,6 @@ Core_main_thread::Core_main_thread(Irq::Pool &user_irq_pool, Cpu_pool &cpu_pool)
|
|||||||
|
|
||||||
affinity(_cpu_pool.primary_cpu());
|
affinity(_cpu_pool.primary_cpu());
|
||||||
_utcb = utcb;
|
_utcb = utcb;
|
||||||
Thread::_pd = &core_pd();
|
Thread::_pd = &core_pd;
|
||||||
_become_active();
|
_become_active();
|
||||||
}
|
}
|
||||||
|
@ -133,6 +133,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
|
|||||||
|
|
||||||
Irq::Pool &_user_irq_pool;
|
Irq::Pool &_user_irq_pool;
|
||||||
Cpu_pool &_cpu_pool;
|
Cpu_pool &_cpu_pool;
|
||||||
|
Pd &_core_pd;
|
||||||
void *_obj_id_ref_ptr[MAX_RCV_CAPS] { nullptr };
|
void *_obj_id_ref_ptr[MAX_RCV_CAPS] { nullptr };
|
||||||
Ipc_node _ipc_node;
|
Ipc_node _ipc_node;
|
||||||
capid_t _ipc_capid { cap_id_invalid() };
|
capid_t _ipc_capid { cap_id_invalid() };
|
||||||
@ -264,7 +265,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
|
|||||||
{
|
{
|
||||||
Genode::Kernel_object<T> & kobj =
|
Genode::Kernel_object<T> & kobj =
|
||||||
*(Genode::Kernel_object<T>*)user_arg_1();
|
*(Genode::Kernel_object<T>*)user_arg_1();
|
||||||
kobj.construct(args...);
|
kobj.construct(_core_pd, args...);
|
||||||
user_arg_0(kobj->core_capid());
|
user_arg_0(kobj->core_capid());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,6 +296,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
|
|||||||
*/
|
*/
|
||||||
Thread(Irq::Pool &user_irq_pool,
|
Thread(Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool,
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd,
|
||||||
unsigned const priority,
|
unsigned const priority,
|
||||||
unsigned const quota,
|
unsigned const quota,
|
||||||
char const *const label,
|
char const *const label,
|
||||||
@ -307,9 +309,11 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout
|
|||||||
*/
|
*/
|
||||||
Thread(Irq::Pool &user_irq_pool,
|
Thread(Irq::Pool &user_irq_pool,
|
||||||
Cpu_pool &cpu_pool,
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd,
|
||||||
char const *const label)
|
char const *const label)
|
||||||
:
|
:
|
||||||
Thread(user_irq_pool, cpu_pool, Cpu_priority::min(), 0, label, true)
|
Thread(user_irq_pool, cpu_pool, core_pd, Cpu_priority::min(), 0,
|
||||||
|
label, true)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
~Thread();
|
~Thread();
|
||||||
@ -443,7 +447,9 @@ class Kernel::Core_main_thread : public Core_object<Kernel::Thread>
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Core_main_thread(Irq::Pool &user_irq_pool, Cpu_pool &cpu_pool);
|
Core_main_thread(Irq::Pool &user_irq_pool,
|
||||||
|
Cpu_pool &cpu_pool,
|
||||||
|
Pd &core_pd);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _CORE__KERNEL__THREAD_H_ */
|
#endif /* _CORE__KERNEL__THREAD_H_ */
|
||||||
|
@ -18,7 +18,6 @@ namespace Genode { class Vm_state; }
|
|||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/cpu_context.h>
|
#include <kernel/cpu_context.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/pd.h>
|
#include <kernel/pd.h>
|
||||||
#include <kernel/signal_receiver.h>
|
#include <kernel/signal_receiver.h>
|
||||||
|
|
||||||
|
@ -271,23 +271,6 @@ Platform::Platform()
|
|||||||
** Support for core memory management **
|
** Support for core memory management **
|
||||||
****************************************/
|
****************************************/
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr,
|
bool Mapped_mem_allocator::_map_local(addr_t virt_addr, addr_t phys_addr,
|
||||||
unsigned size) {
|
unsigned size) {
|
||||||
return ::map_local(phys_addr, virt_addr, size / get_page_size()); }
|
return ::map_local(phys_addr, virt_addr, size / get_page_size()); }
|
||||||
|
@ -88,7 +88,7 @@ class Hw::Address_space : public Genode::Address_space
|
|||||||
Kernel_object<Kernel::Pd> _kobj;
|
Kernel_object<Kernel::Pd> _kobj;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Core-specific constructor
|
* Constructor used for the Core PD object
|
||||||
*
|
*
|
||||||
* \param tt reference to translation table
|
* \param tt reference to translation table
|
||||||
* \param tt_alloc reference to translation table allocator
|
* \param tt_alloc reference to translation table allocator
|
||||||
@ -101,7 +101,7 @@ class Hw::Address_space : public Genode::Address_space
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor used for objects other than the Core PD
|
||||||
*
|
*
|
||||||
* \param pd reference to platform pd object
|
* \param pd reference to platform pd object
|
||||||
*/
|
*/
|
||||||
@ -182,7 +182,7 @@ class Genode::Platform_pd : public Hw::Address_space,
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for core pd
|
* Constructor used for the Core PD object
|
||||||
*
|
*
|
||||||
* \param tt translation table address
|
* \param tt translation table address
|
||||||
* \param tt_alloc translation table allocator
|
* \param tt_alloc translation table allocator
|
||||||
@ -193,7 +193,7 @@ class Genode::Platform_pd : public Hw::Address_space,
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for non-core pd
|
* Constructor used for objects other than the Core PD
|
||||||
*
|
*
|
||||||
* \param label name of protection domain
|
* \param label name of protection domain
|
||||||
*/
|
*/
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
/* kernel includes */
|
/* kernel includes */
|
||||||
#include <kernel/pd.h>
|
#include <kernel/pd.h>
|
||||||
#include <kernel/kernel.h>
|
#include <kernel/main.h>
|
||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ void Platform_thread::quota(size_t const quota)
|
|||||||
Platform_thread::Platform_thread(Label const &label, Native_utcb &utcb)
|
Platform_thread::Platform_thread(Label const &label, Native_utcb &utcb)
|
||||||
:
|
:
|
||||||
_label(label),
|
_label(label),
|
||||||
_pd(&Kernel::core_pd().platform_pd()),
|
_pd(&_kernel_main_get_core_platform_pd()),
|
||||||
_pager(nullptr),
|
_pager(nullptr),
|
||||||
_utcb_core_addr(&utcb),
|
_utcb_core_addr(&utcb),
|
||||||
_utcb_pd_addr(&utcb),
|
_utcb_pd_addr(&utcb),
|
||||||
|
@ -93,6 +93,8 @@ class Genode::Platform_thread : Noncopyable
|
|||||||
virt_prio);
|
virt_prio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Platform_pd &_kernel_main_get_core_platform_pd();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
/* local includes */
|
/* local includes */
|
||||||
#include <kernel/interface_support.h>
|
#include <kernel/interface_support.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
#include <util.h>
|
#include <util.h>
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@
|
|||||||
* under the terms of the GNU Affero General Public License version 3.
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* base-hw Core includes */
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
|
|
||||||
|
|
||||||
void Kernel::panic(Genode::Cpu_state * state) {
|
void Kernel::panic(Genode::Cpu_state * state) {
|
||||||
|
@ -12,11 +12,12 @@
|
|||||||
* under the terms of the GNU Affero General Public License version 3.
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* base includes */
|
||||||
#include <cpu/memory_barrier.h>
|
#include <cpu/memory_barrier.h>
|
||||||
|
|
||||||
|
/* base-hw Core includes */
|
||||||
#include <platform_pd.h>
|
#include <platform_pd.h>
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/pd.h>
|
#include <kernel/pd.h>
|
||||||
#include <kernel/thread.h>
|
#include <kernel/thread.h>
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include <platform_pd.h>
|
#include <platform_pd.h>
|
||||||
|
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <kernel/pd.h>
|
#include <kernel/pd.h>
|
||||||
#include <kernel/thread.h>
|
#include <kernel/thread.h>
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <kernel/cpu.h>
|
#include <kernel/cpu.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
|
|
||||||
|
|
||||||
void Kernel::Cpu::_arch_init()
|
void Kernel::Cpu::_arch_init()
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
/* core includes */
|
/* core includes */
|
||||||
#include <map_local.h>
|
#include <map_local.h>
|
||||||
#include <kernel/kernel.h>
|
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <platform_thread.h>
|
#include <platform_thread.h>
|
||||||
#include <trace/source_registry.h>
|
#include <trace/source_registry.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user