diff --git a/repos/base-foc/src/core/ipc_pager.cc b/repos/base-foc/src/core/ipc_pager_common.cc
similarity index 100%
rename from repos/base-foc/src/core/ipc_pager.cc
rename to repos/base-foc/src/core/ipc_pager_common.cc
diff --git a/repos/base-hw/src/core/core_log_out.cc b/repos/base-hw/src/core/core_log_out.cc
index 965d07b20..60d356b68 100644
--- a/repos/base-hw/src/core/core_log_out.cc
+++ b/repos/base-hw/src/core/core_log_out.cc
@@ -17,7 +17,7 @@
#include
#include
-#include
+#include "kernel/log.h"
void Genode::Core_log::out(char const c) { Kernel::log(c); }
diff --git a/repos/base-hw/src/core/core_region_map.cc b/repos/base-hw/src/core/core_region_map.cc
index 1defc1368..68ca32d0a 100644
--- a/repos/base-hw/src/core/core_region_map.cc
+++ b/repos/base-hw/src/core/core_region_map.cc
@@ -17,7 +17,7 @@
/* core includes */
#include
#include
-#include
+#include "map_local.h"
#include
#include
diff --git a/repos/base-hw/src/core/cpu_session_support.cc b/repos/base-hw/src/core/cpu_session_support.cc
index d39cf864d..51b53497f 100644
--- a/repos/base-hw/src/core/cpu_session_support.cc
+++ b/repos/base-hw/src/core/cpu_session_support.cc
@@ -16,7 +16,7 @@
/* core includes */
#include
-#include
+#include "kernel/configuration.h"
using namespace Genode;
diff --git a/repos/base-hw/src/core/irq_session_component.cc b/repos/base-hw/src/core/irq_session_component.cc
index 0fadd987c..744e133c4 100644
--- a/repos/base-hw/src/core/irq_session_component.cc
+++ b/repos/base-hw/src/core/irq_session_component.cc
@@ -13,10 +13,10 @@
*/
/* base-hw includes */
-#include
+#include "kernel/core_interface.h"
/* core includes */
-#include
+#include "kernel/irq.h"
#include
#include
#include
diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc
index 52655a67d..2f4c56e82 100644
--- a/repos/base-hw/src/core/kernel/cpu.cc
+++ b/repos/base-hw/src/core/kernel/cpu.cc
@@ -13,11 +13,11 @@
*/
/* core includes */
-#include
-#include
-#include
-#include
-#include
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "irq.h"
+#include "pd.h"
#include
#include
#include
diff --git a/repos/base-hw/src/core/kernel/cpu.h b/repos/base-hw/src/core/kernel/cpu.h
index 4c298140d..067f3d849 100644
--- a/repos/base-hw/src/core/kernel/cpu.h
+++ b/repos/base-hw/src/core/kernel/cpu.h
@@ -19,10 +19,10 @@
/* core includes */
#include
-#include
-#include
-#include
-#include
+#include "cpu_context.h"
+#include "irq.h"
+#include "inter_processor_work.h"
+#include "thread.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/cpu_context.h b/repos/base-hw/src/core/kernel/cpu_context.h
index aaf5384a5..fd46b8628 100644
--- a/repos/base-hw/src/core/kernel/cpu_context.h
+++ b/repos/base-hw/src/core/kernel/cpu_context.h
@@ -16,8 +16,8 @@
#define _CORE__KERNEL__CPU_CONTEXT_H_
/* core includes */
-#include
-#include
+#include "cpu_scheduler.h"
+#include "timer.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/cpu_mp.cc b/repos/base-hw/src/core/kernel/cpu_mp.cc
index fa433e518..acedbe034 100644
--- a/repos/base-hw/src/core/kernel/cpu_mp.cc
+++ b/repos/base-hw/src/core/kernel/cpu_mp.cc
@@ -11,7 +11,7 @@
* under the terms of the GNU Affero General Public License version 3.
*/
-#include
+#include "cpu.h"
using namespace Kernel;
diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.cc b/repos/base-hw/src/core/kernel/cpu_scheduler.cc
index c8ef27c02..e35775653 100644
--- a/repos/base-hw/src/core/kernel/cpu_scheduler.cc
+++ b/repos/base-hw/src/core/kernel/cpu_scheduler.cc
@@ -13,7 +13,7 @@
#include
#include
-#include
+#include "cpu_scheduler.h"
using namespace Kernel;
diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.h b/repos/base-hw/src/core/kernel/cpu_scheduler.h
index d6ec38345..ff48cf313 100644
--- a/repos/base-hw/src/core/kernel/cpu_scheduler.h
+++ b/repos/base-hw/src/core/kernel/cpu_scheduler.h
@@ -17,8 +17,8 @@
/* core includes */
#include
#include
-#include
-#include
+#include "configuration.h"
+#include "double_list.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/cpu_up.cc b/repos/base-hw/src/core/kernel/cpu_up.cc
index 8c1d06d11..585c38e83 100644
--- a/repos/base-hw/src/core/kernel/cpu_up.cc
+++ b/repos/base-hw/src/core/kernel/cpu_up.cc
@@ -11,7 +11,7 @@
* under the terms of the GNU Affero General Public License version 3.
*/
-#include
+#include "cpu.h"
void Kernel::Cpu::Ipi::occurred() { }
diff --git a/repos/base-hw/src/core/kernel/double_list.cc b/repos/base-hw/src/core/kernel/double_list.cc
index 6b3af8cf9..b6fbf3b7a 100644
--- a/repos/base-hw/src/core/kernel/double_list.cc
+++ b/repos/base-hw/src/core/kernel/double_list.cc
@@ -12,7 +12,7 @@
*/
/* core includes */
-#include
+#include "double_list.h"
using namespace Kernel;
diff --git a/repos/base-hw/src/core/kernel/init.cc b/repos/base-hw/src/core/kernel/init.cc
index af1f7a5b9..07d00770c 100644
--- a/repos/base-hw/src/core/kernel/init.cc
+++ b/repos/base-hw/src/core/kernel/init.cc
@@ -13,10 +13,10 @@
*/
/* core includes */
-#include
-#include
-#include
-#include
+#include "pd.h"
+#include "cpu.h"
+#include "kernel.h"
+#include "lock.h"
#include
#include
#include
diff --git a/repos/base-hw/src/core/kernel/ipc_node.cc b/repos/base-hw/src/core/kernel/ipc_node.cc
index 59f59f6d4..a86b6793d 100644
--- a/repos/base-hw/src/core/kernel/ipc_node.cc
+++ b/repos/base-hw/src/core/kernel/ipc_node.cc
@@ -20,10 +20,10 @@
/* core includes */
#include
-#include
-#include
-#include
-#include
+#include "ipc_node.h"
+#include "pd.h"
+#include "kernel.h"
+#include "thread.h"
using namespace Kernel;
diff --git a/repos/base-hw/src/core/kernel/irq.cc b/repos/base-hw/src/core/kernel/irq.cc
index 87a6f7501..f8b3cd02e 100644
--- a/repos/base-hw/src/core/kernel/irq.cc
+++ b/repos/base-hw/src/core/kernel/irq.cc
@@ -12,9 +12,9 @@
*/
/* core includes */
-#include
-#include
-#include
+#include "kernel.h"
+#include "cpu.h"
+#include "irq.h"
void Kernel::Irq::disable() const {
diff --git a/repos/base-hw/src/core/kernel/irq.h b/repos/base-hw/src/core/kernel/irq.h
index 519db1024..2994bee90 100644
--- a/repos/base-hw/src/core/kernel/irq.h
+++ b/repos/base-hw/src/core/kernel/irq.h
@@ -23,7 +23,7 @@
#include
/* core includes */
-#include
+#include "signal_receiver.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/kernel.cc b/repos/base-hw/src/core/kernel/kernel.cc
index 43b22012f..7e1a71594 100644
--- a/repos/base-hw/src/core/kernel/kernel.cc
+++ b/repos/base-hw/src/core/kernel/kernel.cc
@@ -13,9 +13,9 @@
*/
/* core includes */
-#include
-#include
-#include
+#include "cpu.h"
+#include "lock.h"
+#include "kernel.h"
extern "C" void kernel()
diff --git a/repos/base-hw/src/core/kernel/lock.cc b/repos/base-hw/src/core/kernel/lock.cc
index 00a85a658..972115768 100644
--- a/repos/base-hw/src/core/kernel/lock.cc
+++ b/repos/base-hw/src/core/kernel/lock.cc
@@ -15,9 +15,9 @@
#include
#include
-#include
-#include
-#include
+#include "cpu.h"
+#include "lock.h"
+#include "kernel.h"
Kernel::Lock & Kernel::data_lock()
{
diff --git a/repos/base-hw/src/core/kernel/object.cc b/repos/base-hw/src/core/kernel/object.cc
index e4b380977..fc0ef9631 100644
--- a/repos/base-hw/src/core/kernel/object.cc
+++ b/repos/base-hw/src/core/kernel/object.cc
@@ -1,6 +1,6 @@
-#include
-#include
-#include
+#include "object.h"
+#include "pd.h"
+#include "kernel.h"
#include
diff --git a/repos/base-hw/src/core/kernel/object.h b/repos/base-hw/src/core/kernel/object.h
index d9fb825b6..d4ab101c5 100644
--- a/repos/base-hw/src/core/kernel/object.h
+++ b/repos/base-hw/src/core/kernel/object.h
@@ -21,7 +21,7 @@
/* core includes */
#include
-#include
+#include "kernel.h"
namespace Kernel
{
@@ -71,7 +71,7 @@ namespace Kernel
}
-class Kernel::Object
+struct Kernel::Object
{
Object_identity_list list { };
diff --git a/repos/base-hw/src/core/kernel/pd.h b/repos/base-hw/src/core/kernel/pd.h
index 3eb1754a4..941f720bd 100644
--- a/repos/base-hw/src/core/kernel/pd.h
+++ b/repos/base-hw/src/core/kernel/pd.h
@@ -18,8 +18,8 @@
/* core includes */
#include
#include
-#include
-#include
+#include "core_interface.h"
+#include "object.h"
#include
namespace Genode {
diff --git a/repos/base-hw/src/core/kernel/signal_receiver.cc b/repos/base-hw/src/core/kernel/signal_receiver.cc
index c2b6553cd..a1973c27e 100644
--- a/repos/base-hw/src/core/kernel/signal_receiver.cc
+++ b/repos/base-hw/src/core/kernel/signal_receiver.cc
@@ -12,7 +12,7 @@
*/
/* core includes */
-#include
+#include "signal_receiver.h"
using namespace Kernel;
diff --git a/repos/base-hw/src/core/kernel/signal_receiver.h b/repos/base-hw/src/core/kernel/signal_receiver.h
index f713cbaa2..a339db75a 100644
--- a/repos/base-hw/src/core/kernel/signal_receiver.h
+++ b/repos/base-hw/src/core/kernel/signal_receiver.h
@@ -17,8 +17,8 @@
/* Genode includes */
#include
-#include
-#include
+#include "core_interface.h"
+#include "object.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/thread.cc b/repos/base-hw/src/core/kernel/thread.cc
index 8e86e0b4e..7b51ec723 100644
--- a/repos/base-hw/src/core/kernel/thread.cc
+++ b/repos/base-hw/src/core/kernel/thread.cc
@@ -24,11 +24,11 @@
/* core includes */
#include
-#include
-#include
-#include
-#include
-#include
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "irq.h"
+#include "log.h"
#include
#include
diff --git a/repos/base-hw/src/core/kernel/thread.h b/repos/base-hw/src/core/kernel/thread.h
index 1a384fd3c..cdf848df3 100644
--- a/repos/base-hw/src/core/kernel/thread.h
+++ b/repos/base-hw/src/core/kernel/thread.h
@@ -19,11 +19,11 @@
/* core includes */
#include
-#include
-#include
-#include
-#include
-#include
+#include "cpu_context.h"
+#include "inter_processor_work.h"
+#include "signal_receiver.h"
+#include "ipc_node.h"
+#include "object.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/timer.cc b/repos/base-hw/src/core/kernel/timer.cc
index 6854135fe..37d4e49b0 100644
--- a/repos/base-hw/src/core/kernel/timer.cc
+++ b/repos/base-hw/src/core/kernel/timer.cc
@@ -12,9 +12,9 @@
*/
/* Core includes */
-#include
-#include
-#include
+#include "cpu.h"
+#include "timer.h"
+#include "configuration.h"
#include
using namespace Kernel;
diff --git a/repos/base-hw/src/core/kernel/timer.h b/repos/base-hw/src/core/kernel/timer.h
index f2c8efdc0..32e849e5e 100644
--- a/repos/base-hw/src/core/kernel/timer.h
+++ b/repos/base-hw/src/core/kernel/timer.h
@@ -16,7 +16,7 @@
/* base-hw includes */
#include
-#include
+#include "irq.h"
/* Genode includes */
#include
diff --git a/repos/base-hw/src/core/kernel/vm.h b/repos/base-hw/src/core/kernel/vm.h
index 7167a1484..041c541a4 100644
--- a/repos/base-hw/src/core/kernel/vm.h
+++ b/repos/base-hw/src/core/kernel/vm.h
@@ -17,10 +17,10 @@
namespace Genode { class Vm_state; }
/* core includes */
-#include
-#include
-#include
-#include
+#include "cpu_context.h"
+#include "kernel.h"
+#include "pd.h"
+#include "signal_receiver.h"
namespace Kernel
{
diff --git a/repos/base-hw/src/core/kernel/vm_thread_off.cc b/repos/base-hw/src/core/kernel/vm_thread_off.cc
index b3c136d17..0932feaa2 100644
--- a/repos/base-hw/src/core/kernel/vm_thread_off.cc
+++ b/repos/base-hw/src/core/kernel/vm_thread_off.cc
@@ -12,7 +12,7 @@
*/
/* core includes */
-#include
+#include "thread.h"
void Kernel::Thread::_call_new_vm() { user_arg_0(-1); }
void Kernel::Thread::_call_delete_vm() { user_arg_0(-1); }
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 dc178d4ed..8252c9ded 100644
--- a/repos/base-hw/src/core/kernel/vm_thread_on.cc
+++ b/repos/base-hw/src/core/kernel/vm_thread_on.cc
@@ -12,8 +12,8 @@
*/
/* core includes */
-#include
-#include
+#include "thread.h"
+#include "vm.h"
void Kernel::Thread::_call_new_vm()
{
diff --git a/repos/base-hw/src/core/kernel_log.cc b/repos/base-hw/src/core/kernel_log.cc
index 354fd5a67..13c21be4b 100644
--- a/repos/base-hw/src/core/kernel_log.cc
+++ b/repos/base-hw/src/core/kernel_log.cc
@@ -17,7 +17,7 @@
#include
#include
-#include
+#include "kernel/log.h"
void Kernel::log(char const c)
diff --git a/repos/base-hw/src/core/native_pd_component.cc b/repos/base-hw/src/core/native_pd_component.cc
index a8193b1e4..41323fe6b 100644
--- a/repos/base-hw/src/core/native_pd_component.cc
+++ b/repos/base-hw/src/core/native_pd_component.cc
@@ -12,7 +12,7 @@
*/
#include
-#include
+#include "native_pd_component.h"
using namespace Genode;
diff --git a/repos/base-hw/src/core/object.h b/repos/base-hw/src/core/object.h
index 7ca449ce2..7461a4dc0 100644
--- a/repos/base-hw/src/core/object.h
+++ b/repos/base-hw/src/core/object.h
@@ -22,7 +22,7 @@
/* base-hw includes */
#include
-#include
+#include "kernel/object.h"
namespace Genode {
/**
diff --git a/repos/base-hw/src/core/platform.cc b/repos/base-hw/src/core/platform.cc
index 46520f1f2..1d85cf104 100644
--- a/repos/base-hw/src/core/platform.cc
+++ b/repos/base-hw/src/core/platform.cc
@@ -19,14 +19,14 @@
#include
#include
#include
-#include
+#include "map_local.h"
#include
#include
#include
#include
-#include
+#include "kernel/kernel.h"
#include
-#include
+#include "kernel/cpu.h"
/* base-internal includes */
#include
diff --git a/repos/base-hw/src/core/platform_thread.cc b/repos/base-hw/src/core/platform_thread.cc
index d1f745bf1..a2169f4aa 100644
--- a/repos/base-hw/src/core/platform_thread.cc
+++ b/repos/base-hw/src/core/platform_thread.cc
@@ -17,15 +17,15 @@
#include
#include
#include
-#include
+#include "map_local.h"
/* base-internal includes */
#include
#include
/* kernel includes */
-#include
-#include
+#include "kernel/pd.h"
+#include "kernel/kernel.h"
using namespace Genode;
diff --git a/repos/base-hw/src/core/ram_dataspace_support.cc b/repos/base-hw/src/core/ram_dataspace_support.cc
index cabb03b98..d79575836 100644
--- a/repos/base-hw/src/core/ram_dataspace_support.cc
+++ b/repos/base-hw/src/core/ram_dataspace_support.cc
@@ -18,7 +18,7 @@
/* core includes */
#include
#include
-#include
+#include "map_local.h"
using namespace Genode;
diff --git a/repos/base-hw/src/core/spec/arm_v6/cpu_driver.h b/repos/base-hw/src/core/spec/arm_v6/cpu_driver.h
new file mode 100644
index 000000000..4a8cad82e
--- /dev/null
+++ b/repos/base-hw/src/core/spec/arm_v6/cpu_driver.h
@@ -0,0 +1,23 @@
+/*
+ * \brief CPU driver for core
+ * \author Norman Feske
+ * \author Martin stein
+ * \date 2012-08-30
+ */
+
+/*
+ * 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.
+ */
+
+#ifndef _CORE__SPEC__ARM_V6__CPU_H_
+#define _CORE__SPEC__ARM_V6__CPU_H_
+
+/* core includes */
+#include
+
+namespace Genode { using Cpu = Arm_cpu; }
+
+#endif /* _CORE__SPEC__ARM_V6__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/arm_v8/cpu_driver.h b/repos/base-hw/src/core/spec/arm_v8/cpu_driver.h
new file mode 100644
index 000000000..ed1284488
--- /dev/null
+++ b/repos/base-hw/src/core/spec/arm_v8/cpu_driver.h
@@ -0,0 +1,94 @@
+/*
+ * \brief CPU driver for core
+ * \author Stefan Kalkowski
+ * \date 2019-05-10
+ */
+
+/*
+ * Copyright (C) 2019 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__SPEC__ARM_V8__CPU_H_
+#define _CORE__SPEC__ARM_V8__CPU_H_
+
+/* Genode includes */
+#include
+#include
+#include
+#include
+
+namespace Kernel { struct Thread_fault; }
+
+namespace Genode {
+ struct Cpu;
+ using sizet_arithm_t = __uint128_t;
+ using uint128_t = __uint128_t;
+}
+
+struct Genode::Cpu : Hw::Arm_64_cpu
+{
+ enum Exception_entry {
+ SYNC_LEVEL_EL1 = 0x000,
+ IRQ_LEVEL_EL1 = 0x080,
+ FIQ_LEVEL_EL1 = 0x100,
+ SERR_LEVEL_EL1 = 0x180,
+ SYNC_LEVEL_EL1_EXC_MODE = 0x200,
+ IRQ_LEVEL_EL1_EXC_MODE = 0x280,
+ FIQ_LEVEL_EL1_EXC_MODE = 0x300,
+ SERR_LEVEL_EL1_EXC_MODE = 0x380,
+ SYNC_LEVEL_EL0 = 0x400,
+ IRQ_LEVEL_EL0 = 0x480,
+ FIQ_LEVEL_EL0 = 0x500,
+ SERR_LEVEL_EL0 = 0x580,
+ AARCH32_SYNC_LEVEL_EL0 = 0x600,
+ AARCH32_IRQ_LEVEL_EL0 = 0x680,
+ AARCH32_FIQ_LEVEL_EL0 = 0x700,
+ AARCH32_SERR_LEVEL_EL0 = 0x780,
+ RESET = 0x800
+ };
+
+ struct alignas(16) Fpu_state
+ {
+ Genode::uint128_t q[32];
+ Genode::uint32_t fpsr;
+ };
+
+ struct alignas(8) Context : Cpu_state
+ {
+ Genode::uint64_t pstate { };
+ Genode::uint64_t exception_type { RESET };
+ Fpu_state fpu_state { };
+
+ Context(bool privileged);
+ };
+
+ struct Mmu_context
+ {
+ Ttbr::access_t ttbr;
+
+ Mmu_context(addr_t page_table_base);
+ ~Mmu_context();
+
+ Genode::uint16_t id() {
+ return Ttbr::Asid::get(ttbr); }
+ };
+
+ void switch_to(Context&, Mmu_context &);
+
+ static void mmu_fault(Context &, Kernel::Thread_fault &);
+
+ /**
+ * Return kernel name of the executing CPU
+ */
+ static unsigned executing_id() { return 0; }
+
+
+ static void clean_data_cache_by_virt_region(addr_t, size_t);
+ static void clean_invalidate_data_cache_by_virt_region(addr_t, size_t);
+ static void invalidate_instr_cache_by_virt_region(addr_t, size_t);
+};
+
+#endif /* _CORE__SPEC__ARM_V8__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/cortex_a15/cpu_driver.h b/repos/base-hw/src/core/spec/cortex_a15/cpu_driver.h
new file mode 100644
index 000000000..75e329d70
--- /dev/null
+++ b/repos/base-hw/src/core/spec/cortex_a15/cpu_driver.h
@@ -0,0 +1,124 @@
+/*
+ * \brief CPU driver for core
+ * \author Martin stein
+ * \author Stefan Kalkowski
+ * \date 2011-11-03
+ */
+
+/*
+ * Copyright (C) 2011-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__SPEC__CORTEX_A15__CPU_H_
+#define _CORE__SPEC__CORTEX_A15__CPU_H_
+
+/* core includes */
+#include
+
+namespace Genode { class Cpu; }
+
+
+class Genode::Cpu : public Arm_v7_cpu
+{
+ public:
+
+ /*********************************
+ ** Virtualization extensions **
+ *********************************/
+
+ /**
+ * Hypervisor system trap register
+ */
+ struct Hstr : Register<32>
+ {
+ /* System coprocessor primary register access trap */
+ template
+ struct T : Bitfield {};
+
+ static access_t init()
+ {
+ /*
+ * allow cache (7), TLB (8) maintenance, and performance
+ * monitor (9), process/thread ID register (13) and timer (14)
+ * access.
+ */
+ access_t v = 0;
+ T<0>::set(v, 1);
+ T<1>::set(v, 1);
+ T<2>::set(v, 1);
+ T<3>::set(v, 1);
+ T<5>::set(v, 1);
+ T<6>::set(v, 1);
+ T<10>::set(v, 1);
+ T<11>::set(v, 1);
+ T<12>::set(v, 1);
+ T<15>::set(v, 1);
+ return v;
+ };
+ };
+
+ /**
+ * Hypervisor control register
+ */
+ struct Hcr : Register<32>
+ {
+ struct Vm : Bitfield<0, 1> {}; /* VT MMU enabled */
+ struct Fmo : Bitfield<3, 1> {}; /* FIQ cannot been masked */
+ struct Imo : Bitfield<4, 1> {}; /* IRQ cannot been masked */
+ struct Amo : Bitfield<5, 1> {}; /* A bit cannot been masked */
+ struct Twi : Bitfield<13, 1> {}; /* trap on WFI instruction */
+ struct Twe : Bitfield<14, 1> {}; /* trap on WFE instruction */
+ struct Tidcp : Bitfield<20, 1> {}; /* trap lockdown */
+ struct Tac : Bitfield<21, 1> {}; /* trap ACTLR accesses */
+ struct Tvm : Bitfield<26, 1> {}; /* trap virtual memory ctrls */
+
+ static access_t init()
+ {
+ access_t v = 0;
+ Vm::set(v, 1);
+ Fmo::set(v, 1);
+ Imo::set(v, 1);
+ Amo::set(v, 1);
+ Twi::set(v, 1);
+ Twe::set(v, 1);
+ Tidcp::set(v, 1);
+ Tac::set(v, 1);
+ Tvm::set(v, 1);
+ return v;
+ };
+ };
+
+
+ /**
+ * An usermode execution state
+ */
+ struct Mmu_context
+ {
+ Ttbr_64bit::access_t ttbr0;
+
+ Mmu_context(addr_t const table);
+ ~Mmu_context();
+
+ Genode::uint8_t id() const { return Ttbr_64bit::Asid::get(ttbr0); }
+ };
+
+ static void mmu_fault_status(Fsr::access_t fsr,
+ Kernel::Thread_fault & fault);
+
+ /**
+ * Return kernel name of the executing CPU
+ */
+ static unsigned executing_id() { return Mpidr::Aff_0::get(Mpidr::read()); }
+
+
+ void switch_to(Context &, Mmu_context & mmu_context)
+ {
+ if (mmu_context.id() && (Ttbr0_64bit::read() != mmu_context.ttbr0))
+ Ttbr0_64bit::write(mmu_context.ttbr0);
+ }
+};
+
+#endif /* _CORE__SPEC__CORTEX_A15__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/cortex_a8/cpu_driver.h b/repos/base-hw/src/core/spec/cortex_a8/cpu_driver.h
new file mode 100644
index 000000000..7631f5432
--- /dev/null
+++ b/repos/base-hw/src/core/spec/cortex_a8/cpu_driver.h
@@ -0,0 +1,35 @@
+/*
+ * \brief ARM Cortex A8 CPU driver for core
+ * \author Martin stein
+ * \author Stefan Kalkowski
+ * \date 2011-11-03
+ */
+
+/*
+ * Copyright (C) 2011-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__SPEC__CORTEX_A8__CPU_H_
+#define _CORE__SPEC__CORTEX_A8__CPU_H_
+
+/* core includes */
+#include
+
+namespace Genode { struct Cpu; }
+
+
+struct Genode::Cpu : Arm_v7_cpu
+{
+ /**
+ * Post processing after a translation was added to a translation table
+ *
+ * \param addr virtual address of the translation
+ * \param size size of the translation
+ */
+ static void translation_added(addr_t const addr, size_t const size);
+};
+
+#endif /* _CORE__SPEC__CORTEX_A8__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/cortex_a9/cpu_driver.h b/repos/base-hw/src/core/spec/cortex_a9/cpu_driver.h
new file mode 100644
index 000000000..4ac18546b
--- /dev/null
+++ b/repos/base-hw/src/core/spec/cortex_a9/cpu_driver.h
@@ -0,0 +1,40 @@
+/*
+ * \brief CPU driver for core
+ * \author Martin stein
+ * \author Stefan Kalkowski
+ * \date 2011-11-03
+ */
+
+/*
+ * Copyright (C) 2011-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__SPEC__CORTEX_A9__CPU_H_
+#define _CORE__SPEC__CORTEX_A9__CPU_H_
+
+/* core includes */
+#include
+#include
+
+namespace Genode { struct Cpu; }
+
+struct Genode::Cpu : Arm_v7_cpu
+{
+ /**
+ * Clean and invalidate data-cache for virtual region
+ * 'base' - 'base + size'
+ */
+ void clean_invalidate_data_cache_by_virt_region(addr_t base,
+ size_t const size)
+ {
+ Arm_cpu::clean_invalidate_data_cache_by_virt_region(base, size);
+ Board::l2_cache().clean_invalidate();
+ }
+
+ static unsigned executing_id() { return Mpidr::Aff_0::get(Mpidr::read()); }
+};
+
+#endif /* _CORE__SPEC__CORTEX_A9__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/riscv/cpu_driver.h b/repos/base-hw/src/core/spec/riscv/cpu_driver.h
new file mode 100644
index 000000000..98691a3c6
--- /dev/null
+++ b/repos/base-hw/src/core/spec/riscv/cpu_driver.h
@@ -0,0 +1,86 @@
+/*
+ * \brief CPU driver for core
+ * \author Sebastian Sumpf
+ * \date 2015-06-02
+ */
+
+/*
+ * 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.
+ */
+
+#ifndef _CORE__SPEC__RISCV__CPU_H_
+#define _CORE__SPEC__RISCV__CPU_H_
+
+/* Genode includes */
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+
+namespace Kernel { struct Thread_fault; }
+
+namespace Genode
+{
+ /**
+ * CPU driver for core
+ */
+ class Cpu;
+
+ typedef __uint128_t sizet_arithm_t;
+}
+
+namespace Kernel { class Pd; }
+
+class Genode::Cpu : public Hw::Riscv_cpu
+{
+ public:
+
+ struct alignas(8) Context : Cpu_state
+ {
+ Context(bool);
+ };
+
+ struct Mmu_context
+ {
+ Sptbr::access_t sptbr = 0;
+
+ Mmu_context(addr_t page_table_base);
+ ~Mmu_context();
+ };
+
+
+ /**
+ * From the manual
+ *
+ * The behavior of SFENCE.VM depends on the current value of the sasid
+ * register. If sasid is nonzero, SFENCE.VM takes effect only for address
+ * translations in the current address space. If sasid is zero, SFENCE.VM
+ * affects address translations for all address spaces. In this case, it
+ * also affects global mappings, which are described in Section 4.5.1.
+ *
+ * Right no we will flush anything
+ */
+ static void sfence()
+ {
+ /*
+ * Note: In core the address space id must be zero
+ */
+ asm volatile ("sfence.vm\n");
+ }
+
+ static void invalidate_tlb_by_pid(unsigned const /* pid */) { sfence(); }
+
+ void switch_to(Mmu_context & context);
+ static void mmu_fault(Context & c, Kernel::Thread_fault & f);
+
+ static unsigned executing_id() { return 0; }
+};
+
+#endif /* _CORE__SPEC__RISCV__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/x86_64/board.h b/repos/base-hw/src/core/spec/x86_64/board.h
index 26562c060..3dae77180 100644
--- a/repos/base-hw/src/core/spec/x86_64/board.h
+++ b/repos/base-hw/src/core/spec/x86_64/board.h
@@ -15,8 +15,8 @@
#define _CORE__SPEC__X86_64__BOARD_H_
#include
-#include
-#include
+#include "pic.h"
+#include "pit.h"
namespace Board {
using namespace Hw::Pc_board;
diff --git a/repos/base-hw/src/core/spec/x86_64/cpu.cc b/repos/base-hw/src/core/spec/x86_64/cpu.cc
index 54a2db435..97daee02f 100644
--- a/repos/base-hw/src/core/spec/x86_64/cpu.cc
+++ b/repos/base-hw/src/core/spec/x86_64/cpu.cc
@@ -13,8 +13,8 @@
/* core includes */
#include
-#include
-#include
+#include "../../kernel/thread.h"
+#include "../../kernel/pd.h"
extern int __idt;
extern int __idt_end;
diff --git a/repos/base-hw/src/core/spec/x86_64/cpu_driver.h b/repos/base-hw/src/core/spec/x86_64/cpu_driver.h
new file mode 100644
index 000000000..0cbc4bd13
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86_64/cpu_driver.h
@@ -0,0 +1,135 @@
+/*
+ * \brief x86_64 CPU driver for core
+ * \author Adrian-Ken Rueegsegger
+ * \author Martin stein
+ * \author Reto Buerki
+ * \author Stefan Kalkowski
+ * \date 2015-02-06
+ */
+
+/*
+ * 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.
+ */
+
+#ifndef _CORE__SPEC__X86_64__CPU_H_
+#define _CORE__SPEC__X86_64__CPU_H_
+
+/* Genode includes */
+#include
+#include
+#include
+
+#include "../../../include/hw/spec/x86_64/cpu_registers.h"
+
+/* base includes */
+#include
+#include
+
+/* core includes */
+#include
+
+namespace Kernel { struct Thread_fault; }
+
+namespace Genode {
+ class Cpu;
+ using sizet_arithm_t = __uint128_t;
+}
+
+
+class Genode::Cpu : public Hw::X86_64_cpu
+{
+ protected:
+
+ public:
+
+ /**
+ * Task State Segment (TSS)
+ *
+ * See Intel SDM Vol. 3A, section 7.7
+ */
+ struct alignas(8) Tss
+ {
+ uint32_t reserved0;
+ uint64_t rsp[3]; /* pl0-3 stack pointer */
+ uint64_t reserved1;
+ uint64_t ist[7]; /* irq stack pointer */
+ uint64_t reserved2;
+
+ static void init();
+ } __attribute__((packed)) tss { };
+
+
+ /**
+ * Interrupt Descriptor Table (IDT)
+ *
+ * See Intel SDM Vol. 3A, section 6.10
+ */
+ struct Idt { static void init(); };
+
+
+ /**
+ * Global Descriptor Table (GDT)
+ * See Intel SDM Vol. 3A, section 3.5.1
+ */
+ struct alignas(8) Gdt
+ {
+ uint64_t null_desc = 0;
+ uint64_t sys_cs_64bit_desc = 0x20980000000000;
+ uint64_t sys_ds_64bit_desc = 0x20930000000000;
+ uint64_t usr_cs_64bit_desc = 0x20f80000000000;
+ uint64_t usr_ds_64bit_desc = 0x20f30000000000;
+ uint64_t tss_desc[2];
+
+ void init(addr_t tss_addr);
+ } __attribute__((packed)) gdt { };
+
+
+ /**
+ * Extend basic CPU state by members relevant for 'base-hw' only
+ */
+ struct Kernel_stack { unsigned long kernel_stack { }; };
+
+ /* exception_vector.s depends on the position of the Kernel_stack */
+ struct alignas(16) Context : Cpu_state, Kernel_stack, Fpu_context
+ {
+ enum Eflags {
+ EFLAGS_IF_SET = 1 << 9,
+ EFLAGS_IOPL_3 = 3 << 12,
+ };
+
+ Context(bool privileged);
+ } __attribute__((packed));
+
+
+ struct Mmu_context
+ {
+ addr_t cr3;
+
+ Mmu_context(addr_t page_table_base);
+ };
+
+ /**
+ * Return kernel name of the executing CPU
+ */
+ static unsigned executing_id();
+
+ /**
+ * Switch to new context
+ *
+ * \param context next CPU context
+ */
+ void switch_to(Context & context, Mmu_context &mmu_context);
+
+ static void mmu_fault(Context & regs, Kernel::Thread_fault & fault);
+
+ /**
+ * Invalidate the whole TLB
+ */
+ static void invalidate_tlb() {
+ Genode::Cpu::Cr3::write(Genode::Cpu::Cr3::read()); }
+};
+
+#endif /* _CORE__SPEC__X86_64__CPU_H_ */
diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc b/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc
index 3a0fc5fda..4a075fb04 100644
--- a/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc
+++ b/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc
@@ -13,8 +13,8 @@
*/
/* core includes */
-#include
-#include
+#include "../../kernel/cpu.h"
+#include "../../kernel/kernel.h"
void Kernel::Cpu::_arch_init()
{
diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/pd.cc b/repos/base-hw/src/core/spec/x86_64/kernel/pd.cc
index e3a97b1f3..1b8a38315 100644
--- a/repos/base-hw/src/core/spec/x86_64/kernel/pd.cc
+++ b/repos/base-hw/src/core/spec/x86_64/kernel/pd.cc
@@ -11,8 +11,8 @@
* under the terms of the GNU Affero General Public License version 3.
*/
-#include
-#include
+#include "../../kernel/cpu.h"
+#include "../../kernel/pd.h"
bool Kernel::Pd::invalidate_tlb(Cpu & cpu, addr_t, size_t)
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 27084e78c..efd97e625 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
@@ -14,9 +14,9 @@
*/
/* core includes */
-#include
-#include
-#include
+#include "../../kernel/cpu.h"
+#include "../../kernel/thread.h"
+#include "../../kernel/pd.h"
void Kernel::Thread::Tlb_invalidation::execute()
{
diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc
index aedb2320a..c6ea12e98 100644
--- a/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc
+++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc
@@ -14,8 +14,8 @@
*/
/* core includes */
-#include
-#include
+#include "../../kernel/cpu.h"
+#include "../../kernel/thread.h"
using namespace Kernel;
diff --git a/repos/base-hw/src/core/spec/x86_64/pit.cc b/repos/base-hw/src/core/spec/x86_64/pit.cc
index a3efcad19..da9ad8452 100644
--- a/repos/base-hw/src/core/spec/x86_64/pit.cc
+++ b/repos/base-hw/src/core/spec/x86_64/pit.cc
@@ -19,7 +19,7 @@
#include
/* core includes */
-#include
+#include "../../kernel/timer.h"
#include
using namespace Genode;
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 7f5e805c2..96e0becce 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
@@ -13,7 +13,7 @@
#include
#include
-#include
+#include "../../kernel/cpu.h"
#include
using namespace Genode;
diff --git a/repos/base-hw/src/core/thread_start.cc b/repos/base-hw/src/core/thread_start.cc
index cf7cc38c6..6551ed3db 100644
--- a/repos/base-hw/src/core/thread_start.cc
+++ b/repos/base-hw/src/core/thread_start.cc
@@ -22,8 +22,8 @@
#include
/* core includes */
-#include
-#include
+#include "map_local.h"
+#include "kernel/kernel.h"
#include
#include
diff --git a/repos/base-hw/src/core/irq_session_component.h b/repos/base-hw/src/include/irq_session_component.h
similarity index 96%
rename from repos/base-hw/src/core/irq_session_component.h
rename to repos/base-hw/src/include/irq_session_component.h
index 911322e7d..8eaf93ad3 100644
--- a/repos/base-hw/src/core/irq_session_component.h
+++ b/repos/base-hw/src/include/irq_session_component.h
@@ -16,10 +16,11 @@
/* Genode includes */
#include
+#include
#include
#include
-#include
+#include "../core/kernel/irq.h"
namespace Genode { class Irq_session_component; }
diff --git a/repos/base-hw/src/core/map_local.h b/repos/base-hw/src/include/map_local.h
similarity index 100%
rename from repos/base-hw/src/core/map_local.h
rename to repos/base-hw/src/include/map_local.h
diff --git a/repos/base-hw/src/core/native_pd_component.h b/repos/base-hw/src/include/native_pd_component.h
similarity index 100%
rename from repos/base-hw/src/core/native_pd_component.h
rename to repos/base-hw/src/include/native_pd_component.h
diff --git a/repos/base-hw/src/core/pager.h b/repos/base-hw/src/include/pager.h
similarity index 97%
rename from repos/base-hw/src/core/pager.h
rename to repos/base-hw/src/include/pager.h
index 6b10efdf3..6bebe2a6f 100644
--- a/repos/base-hw/src/core/pager.h
+++ b/repos/base-hw/src/include/pager.h
@@ -25,10 +25,11 @@
#include
/* core-local includes */
-#include
#include
-#include
-#include
+#include "rpc_cap_factory.h"
+#include "../core/kernel/signal_receiver.h"
+#include "../core/kernel/object.h"
+#include "../core/kernel/thread.h"
namespace Genode
{
diff --git a/repos/base-hw/src/core/platform.h b/repos/base-hw/src/include/platform.h
similarity index 97%
rename from repos/base-hw/src/core/platform.h
rename to repos/base-hw/src/include/platform.h
index b299bdae3..4136b8d33 100644
--- a/repos/base-hw/src/core/platform.h
+++ b/repos/base-hw/src/include/platform.h
@@ -24,9 +24,9 @@
/* base-hw includes */
#include
#include
-#include
-#include
-#include
+#include "../core/kernel/configuration.h"
+#include "../core/kernel/core_interface.h"
+#include "../core/kernel/pd.h"
/* core includes */
#include
diff --git a/repos/base-hw/src/core/platform_pd.h b/repos/base-hw/src/include/platform_pd.h
similarity index 96%
rename from repos/base-hw/src/core/platform_pd.h
rename to repos/base-hw/src/include/platform_pd.h
index 1f6b5f638..21eda53d3 100644
--- a/repos/base-hw/src/core/platform_pd.h
+++ b/repos/base-hw/src/include/platform_pd.h
@@ -17,13 +17,13 @@
/* Core includes */
#include
-#include
#include
#include
-#include
-#include
-#include
-#include
+#include "platform.h"
+#include "../core/object.h"
+#include "../core/kernel/configuration.h"
+#include "../core/kernel/object.h"
+#include "../core/kernel/pd.h"
namespace Hw
{
diff --git a/repos/base-hw/src/core/platform_thread.h b/repos/base-hw/src/include/platform_thread.h
similarity index 98%
rename from repos/base-hw/src/core/platform_thread.h
rename to repos/base-hw/src/include/platform_thread.h
index fad02d30b..0be960c9e 100644
--- a/repos/base-hw/src/core/platform_thread.h
+++ b/repos/base-hw/src/include/platform_thread.h
@@ -25,11 +25,11 @@
/* core includes */
#include
-#include
+#include "../core/object.h"
/* kernel includes */
-#include
-#include
+#include "../core/kernel/core_interface.h"
+#include "../core/kernel/thread.h"
namespace Genode {
diff --git a/repos/base-hw/src/core/rpc_cap_factory.h b/repos/base-hw/src/include/rpc_cap_factory.h
similarity index 97%
rename from repos/base-hw/src/core/rpc_cap_factory.h
rename to repos/base-hw/src/include/rpc_cap_factory.h
index d98e9d18d..957e56e49 100644
--- a/repos/base-hw/src/core/rpc_cap_factory.h
+++ b/repos/base-hw/src/include/rpc_cap_factory.h
@@ -23,8 +23,8 @@
#include
/* core-local includes */
-#include
-#include
+#include "../core/object.h"
+#include "../core/kernel/thread.h"
/* base-internal includes */
#include
diff --git a/repos/base-hw/src/core/util.h b/repos/base-hw/src/include/util.h
similarity index 100%
rename from repos/base-hw/src/core/util.h
rename to repos/base-hw/src/include/util.h
diff --git a/repos/base-hw/src/lib/base/arm/kernel/interface.cc b/repos/base-hw/src/lib/base-common/arm/kernel/interface.cc
similarity index 100%
rename from repos/base-hw/src/lib/base/arm/kernel/interface.cc
rename to repos/base-hw/src/lib/base-common/arm/kernel/interface.cc
diff --git a/repos/base-hw/src/lib/base/arm_64/kernel/interface.cc b/repos/base-hw/src/lib/base-common/arm_64/kernel/interface.cc
similarity index 100%
rename from repos/base-hw/src/lib/base/arm_64/kernel/interface.cc
rename to repos/base-hw/src/lib/base-common/arm_64/kernel/interface.cc
diff --git a/repos/base-hw/src/lib/base/ipc.cc b/repos/base-hw/src/lib/base-common/ipc.cc
similarity index 100%
rename from repos/base-hw/src/lib/base/ipc.cc
rename to repos/base-hw/src/lib/base-common/ipc.cc
diff --git a/repos/base-hw/src/lib/base/riscv/kernel/interface.cc b/repos/base-hw/src/lib/base-common/riscv/kernel/interface.cc
similarity index 100%
rename from repos/base-hw/src/lib/base/riscv/kernel/interface.cc
rename to repos/base-hw/src/lib/base-common/riscv/kernel/interface.cc
diff --git a/repos/base-hw/src/lib/base/thread_bootstrap.cc b/repos/base-hw/src/lib/base-common/thread_bootstrap.cc
similarity index 100%
rename from repos/base-hw/src/lib/base/thread_bootstrap.cc
rename to repos/base-hw/src/lib/base-common/thread_bootstrap.cc
diff --git a/repos/base-hw/src/lib/base/x86_64/kernel/interface.cc b/repos/base-hw/src/lib/base-common/x86_64/kernel/interface.cc
similarity index 100%
rename from repos/base-hw/src/lib/base/x86_64/kernel/interface.cc
rename to repos/base-hw/src/lib/base-common/x86_64/kernel/interface.cc
diff --git a/repos/base-linux/src/Tuprules.tup b/repos/base-linux/src/Tuprules.tup
new file mode 100644
index 000000000..ebf767be4
--- /dev/null
+++ b/repos/base-linux/src/Tuprules.tup
@@ -0,0 +1,7 @@
+ifndef LINUX_HEADERS
+error CONFIG_LINUX_HEADERS not defined
+endif
+
+INCLUDES += -I$(TUP_CWD)/include
+INCLUDES += -I$(BASE_DIR)/src/include
+INCLUDES += -I@(LINUX_HEADERS)
diff --git a/repos/base-linux/src/lib/syscall/linux_syscalls.h b/repos/base-linux/src/include/linux_syscalls.h
similarity index 100%
rename from repos/base-linux/src/lib/syscall/linux_syscalls.h
rename to repos/base-linux/src/include/linux_syscalls.h
diff --git a/repos/base-linux/src/lib/base/capability_raw.cc b/repos/base-linux/src/lib/base-common/capability_raw.cc
similarity index 100%
rename from repos/base-linux/src/lib/base/capability_raw.cc
rename to repos/base-linux/src/lib/base-common/capability_raw.cc
diff --git a/repos/base-linux/src/lib/base/debug.cc b/repos/base-linux/src/lib/base-common/debug.cc
similarity index 100%
rename from repos/base-linux/src/lib/base/debug.cc
rename to repos/base-linux/src/lib/base-common/debug.cc
diff --git a/repos/base-linux/src/lib/base/env_reinit.cc b/repos/base-linux/src/lib/base-common/env_reinit.cc
similarity index 100%
rename from repos/base-linux/src/lib/base/env_reinit.cc
rename to repos/base-linux/src/lib/base-common/env_reinit.cc
diff --git a/repos/base-linux/src/lib/base/ipc.cc b/repos/base-linux/src/lib/base-common/ipc.cc
similarity index 100%
rename from repos/base-linux/src/lib/base/ipc.cc
rename to repos/base-linux/src/lib/base-common/ipc.cc
diff --git a/repos/base-linux/src/lib/base/region_map_mmap.cc b/repos/base-linux/src/lib/base-common/region_map_mmap.cc
similarity index 100%
rename from repos/base-linux/src/lib/base/region_map_mmap.cc
rename to repos/base-linux/src/lib/base-common/region_map_mmap.cc
diff --git a/repos/base-linux/src/lib/base/thread_env.cc b/repos/base-linux/src/lib/base-common/thread_env.cc
similarity index 100%
rename from repos/base-linux/src/lib/base/thread_env.cc
rename to repos/base-linux/src/lib/base-common/thread_env.cc
diff --git a/repos/base-nova/src/Tuprules.tup b/repos/base-nova/src/Tuprules.tup
index 099a50f28..b3cb0d6c0 100644
--- a/repos/base-nova/src/Tuprules.tup
+++ b/repos/base-nova/src/Tuprules.tup
@@ -1 +1 @@
-INCLUDES += -I$(REP_DIR)/src/include
+INCLUDES = -I$(TUP_CWD)/include -I$(BASE_DIR)/src/include $(INCLUDES)
diff --git a/repos/base-nova/src/core/Tupfile b/repos/base-nova/src/core/Tupfile
index b4c356b88..4e609e9dc 100644
--- a/repos/base-nova/src/core/Tupfile
+++ b/repos/base-nova/src/core/Tupfile
@@ -2,11 +2,10 @@ include_rules
GEN_CORE_DIR = $(BASE_DIR)/src/core
INCLUDES += \
- -I$(REP_DIR)/src/core/include \
- -I$(REP_DIR)/src/include \
- -I$(BASE_DIR)/src/include \
+ -I$(TUP_CWD)/include \
-I$(GEN_CORE_DIR)/include \
- -I$(BASE_DIR)/include \
+
+SRC_CC += *.cc
ifeq (@(TUP_ARCH),i386)
SRC_CC += spec/x86_32/*.cc
@@ -17,7 +16,6 @@ SRC_CC += spec/x86_64/*.cc
endif
SRC_CC += \
- *.cc \
$(GEN_CORE_DIR)/core_log.cc \
$(GEN_CORE_DIR)/core_mem_alloc.cc \
$(GEN_CORE_DIR)/cpu_session_component.cc \
@@ -47,9 +45,31 @@ CXXFLAGS_$(GEN_CORE_DIR)/version.cc += -DGENODE_VERSION=\"`git describe`\"
: foreach $(SRC_CC) |> !cxx |> {link-items}
-: {link-items} |> !ar |> core-nova.lib.a
+: {link-items} |> !ar |> {archive}
-: core-nova.lib.a | $(REP_DIR)/ $(BASE_DIR)/ \
- |> $(LD) $(LD_MARCH) -u _start --whole-archive -r \
- % % %f -o %o \
- |> core-nova.o $(REP_DIR)/
+STATIC_LIBS += -L$(LIB_DIR) `$(PKG_CONFIG) --libs cxx startup`
+
+ifndef LIBUNWIND_BAREMETAL
+error CONFIG_LIBUNWIND_BAREMETAL not defined
+@(LIBUNWIND_BAREMETAL)
+endif
+
+EH_SYMBOLS = \
+ _Unwind_Resume \
+ _Unwind_Complete \
+ _Unwind_DeleteException \
+
+REDEF_SYMBOLS = `echo $(EH_SYMBOLS) | awk -v RS=' ' '{ print "--redefine-sym "$1"=_cxx_"$1 }'`
+
+export OBJCOPY
+: |> $OBJCOPY $(LOCAL_SYMBOLS) $(REDEF_SYMBOLS) @(LIBUNWIND_BAREMETAL) %o |> libunwind.a {archive}
+
+: {archive} | \
+ $(DEV_DIR)/ \
+ $(GENODE_DIR)/ \
+ $(BASE_DIR)/ \
+ $(BASE_DIR)/ \
+ $(REP_DIR)/ \
+|> $(LD) -u _start --whole-archive -r \
+ % % % %f $(STATIC_LIBS) -o %o \
+|> core.o $(REP_DIR)/
diff --git a/repos/base-nova/src/lib/base-common/Tupfile b/repos/base-nova/src/lib/base-common/Tupfile
new file mode 100644
index 000000000..8d4531af6
--- /dev/null
+++ b/repos/base-nova/src/lib/base-common/Tupfile
@@ -0,0 +1,38 @@
+include_rules
+
+GENERIC_DIR = $(BASE_DIR)/src/lib/base
+
+GENERIC_SRC_CC += \
+ $(GENERIC_DIR)/allocator_avl.cc \
+ $(GENERIC_DIR)/avl_tree.cc \
+ $(GENERIC_DIR)/child.cc \
+ $(GENERIC_DIR)/child_process.cc \
+ $(GENERIC_DIR)/component.cc \
+ $(GENERIC_DIR)/console.cc \
+ $(GENERIC_DIR)/elf_binary.cc \
+ $(GENERIC_DIR)/entrypoint.cc \
+ $(GENERIC_DIR)/env_session_id_space.cc \
+ $(GENERIC_DIR)/heap.cc \
+ $(GENERIC_DIR)/lock.cc \
+ $(GENERIC_DIR)/log.cc \
+ $(GENERIC_DIR)/output.cc \
+ $(GENERIC_DIR)/raw_output.cc \
+ $(GENERIC_DIR)/region_map_client.cc \
+ $(GENERIC_DIR)/registry.cc \
+ $(GENERIC_DIR)/rm_session_client.cc \
+ $(GENERIC_DIR)/root_proxy.cc \
+ $(GENERIC_DIR)/session_state.cc \
+ $(GENERIC_DIR)/signal_common.cc \
+ $(GENERIC_DIR)/slab.cc \
+ $(GENERIC_DIR)/sleep.cc \
+ $(GENERIC_DIR)/sliced_heap.cc \
+ $(GENERIC_DIR)/stack_allocator.cc \
+ $(GENERIC_DIR)/stack_protector.cc \
+ $(GENERIC_DIR)/thread.cc \
+ $(GENERIC_DIR)/thread_myself.cc \
+ $(GENERIC_DIR)/trace.cc \
+ $(GENERIC_DIR)/vm_session.cc \
+
+: foreach $(GENERIC_SRC_CC) |> !cxx |> %B.base.o {obj}
+: foreach *.cc |> !cxx |> %B.nova.o {obj}
+: {obj} |> !ar |> | $(REP_DIR)/
diff --git a/repos/base-nova/src/lib/base/cap_map.cc b/repos/base-nova/src/lib/base-common/cap_map.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/cap_map.cc
rename to repos/base-nova/src/lib/base-common/cap_map.cc
diff --git a/repos/base-nova/src/lib/base/capability.cc b/repos/base-nova/src/lib/base-common/capability.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/capability.cc
rename to repos/base-nova/src/lib/base-common/capability.cc
diff --git a/repos/base-nova/src/lib/base/ipc.cc b/repos/base-nova/src/lib/base-common/ipc.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/ipc.cc
rename to repos/base-nova/src/lib/base-common/ipc.cc
diff --git a/repos/base-nova/src/lib/base/rpc_entrypoint.cc b/repos/base-nova/src/lib/base-common/rpc_entrypoint.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/rpc_entrypoint.cc
rename to repos/base-nova/src/lib/base-common/rpc_entrypoint.cc
diff --git a/repos/base-nova/src/lib/base/signal_transmitter.cc b/repos/base-nova/src/lib/base-common/signal_transmitter.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/signal_transmitter.cc
rename to repos/base-nova/src/lib/base-common/signal_transmitter.cc
diff --git a/repos/base-nova/src/lib/base/stack.cc b/repos/base-nova/src/lib/base-common/stack.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/stack.cc
rename to repos/base-nova/src/lib/base-common/stack.cc
diff --git a/repos/base-nova/src/lib/base/stack_area_addr.cc b/repos/base-nova/src/lib/base-common/stack_area_addr.cc
similarity index 100%
rename from repos/base-nova/src/lib/base/stack_area_addr.cc
rename to repos/base-nova/src/lib/base-common/stack_area_addr.cc
diff --git a/repos/base-nova/src/lib/base/Tupfile b/repos/base-nova/src/lib/base/Tupfile
index ffa7c67b3..711231d20 100644
--- a/repos/base-nova/src/lib/base/Tupfile
+++ b/repos/base-nova/src/lib/base/Tupfile
@@ -1,30 +1,7 @@
include_rules
-INCLUDES += -I$(BASE_DIR)/src/include
BASE_LIB_DIR = $(BASE_DIR)/src/lib/base
-include $(BASE_DIR)/src/lib/base/common.tup
-
-COMMON_SRC_CC += \
- $(BASE_DIR)/src/lib/base/child_process.cc \
- $(BASE_DIR)/src/lib/base/thread.cc \
- $(BASE_DIR)/src/lib/base/thread_myself.cc \
- $(BASE_DIR)/src/lib/base/trace.cc \
- capability.cc \
- cap_map.cc \
- ipc.cc \
- region_map_client.cc \
- rpc_entrypoint.cc \
- signal_transmitter.cc \
- sleep.cc \
- stack_area_addr.cc \
- stack.cc \
- vm_session.cc \
-
-: foreach $(COMMON_SRC_CC) |> !cxx |> nova-%B.o {base-common-obj}
-
-: {base-common-obj} |> !ar |> base-nova-common.lib.a $(REP_DIR)/
-
SRC_CC += \
rpc_cap_alloc.cc \
thread_start.cc \
diff --git a/repos/base-nova/src/lib/ld/Tupfile b/repos/base-nova/src/lib/ld/Tupfile
index f77dee361..6425acd46 100644
--- a/repos/base-nova/src/lib/ld/Tupfile
+++ b/repos/base-nova/src/lib/ld/Tupfile
@@ -38,19 +38,18 @@ LDFLAGS += -gc-sections -z max-page-size=0x1000
LDFLAGS += -T$(BASE_DIR)/src/ld/genode_rel.ld \
BASE_LIBS += \
- $(REP_DIR)/src/lib/base/base-nova-common.lib.a \
$(REP_DIR)/src/lib/base/base-nova.lib.a \
BASE_PKGS += alarm cxx ldso-startup startup timeout
LDFLAGS += `pkg-config --static --libs $(BASE_PKGS)`
-: $(BASE_LIBS) {obj} | symbol.map \
+: $(BASE_LIBS) {obj} | symbol.map $(REP_DIR)/ \
|> \
$(LD) -o %o \
$(LD_MARCH) $(LDFLAGS) \
--whole-archive --start-group \
- %f \
+ % %f \
--end-group --no-whole-archive \
$(LIBGCC) \
|> ld.lib.so $(REP_DIR)/ {bin}
diff --git a/repos/base/src/lib/base/allocator_avl.cc b/repos/base/src/lib/base-common/allocator_avl.cc
similarity index 100%
rename from repos/base/src/lib/base/allocator_avl.cc
rename to repos/base/src/lib/base-common/allocator_avl.cc
diff --git a/repos/base/src/lib/base/avl_tree.cc b/repos/base/src/lib/base-common/avl_tree.cc
similarity index 100%
rename from repos/base/src/lib/base/avl_tree.cc
rename to repos/base/src/lib/base-common/avl_tree.cc
diff --git a/repos/base/src/lib/base/capability.cc b/repos/base/src/lib/base-common/capability.cc
similarity index 100%
rename from repos/base/src/lib/base/capability.cc
rename to repos/base/src/lib/base-common/capability.cc
diff --git a/repos/base/src/lib/base/child.cc b/repos/base/src/lib/base-common/child.cc
similarity index 100%
rename from repos/base/src/lib/base/child.cc
rename to repos/base/src/lib/base-common/child.cc
diff --git a/repos/base/src/lib/base/child_process.cc b/repos/base/src/lib/base-common/child_process.cc
similarity index 100%
rename from repos/base/src/lib/base/child_process.cc
rename to repos/base/src/lib/base-common/child_process.cc
diff --git a/repos/base/src/lib/base/component.cc b/repos/base/src/lib/base-common/component.cc
similarity index 100%
rename from repos/base/src/lib/base/component.cc
rename to repos/base/src/lib/base-common/component.cc
diff --git a/repos/base/src/lib/base/console.cc b/repos/base/src/lib/base-common/console.cc
similarity index 100%
rename from repos/base/src/lib/base/console.cc
rename to repos/base/src/lib/base-common/console.cc
diff --git a/repos/base/src/lib/base/elf_binary.cc b/repos/base/src/lib/base-common/elf_binary.cc
similarity index 100%
rename from repos/base/src/lib/base/elf_binary.cc
rename to repos/base/src/lib/base-common/elf_binary.cc
diff --git a/repos/base/src/lib/base/entrypoint.cc b/repos/base/src/lib/base-common/entrypoint.cc
similarity index 100%
rename from repos/base/src/lib/base/entrypoint.cc
rename to repos/base/src/lib/base-common/entrypoint.cc
diff --git a/repos/base/src/lib/base/env_session_id_space.cc b/repos/base/src/lib/base-common/env_session_id_space.cc
similarity index 100%
rename from repos/base/src/lib/base/env_session_id_space.cc
rename to repos/base/src/lib/base-common/env_session_id_space.cc
diff --git a/repos/base/src/lib/base/heap.cc b/repos/base/src/lib/base-common/heap.cc
similarity index 100%
rename from repos/base/src/lib/base/heap.cc
rename to repos/base/src/lib/base-common/heap.cc
diff --git a/repos/base/src/lib/base/lock.cc b/repos/base/src/lib/base-common/lock.cc
similarity index 100%
rename from repos/base/src/lib/base/lock.cc
rename to repos/base/src/lib/base-common/lock.cc
diff --git a/repos/base/src/lib/base/log.cc b/repos/base/src/lib/base-common/log.cc
similarity index 100%
rename from repos/base/src/lib/base/log.cc
rename to repos/base/src/lib/base-common/log.cc
diff --git a/repos/base/src/lib/base/output.cc b/repos/base/src/lib/base-common/output.cc
similarity index 100%
rename from repos/base/src/lib/base/output.cc
rename to repos/base/src/lib/base-common/output.cc
diff --git a/repos/base/src/lib/base/raw_output.cc b/repos/base/src/lib/base-common/raw_output.cc
similarity index 100%
rename from repos/base/src/lib/base/raw_output.cc
rename to repos/base/src/lib/base-common/raw_output.cc
diff --git a/repos/base/src/lib/base/region_map_client.cc b/repos/base/src/lib/base-common/region_map_client.cc
similarity index 100%
rename from repos/base/src/lib/base/region_map_client.cc
rename to repos/base/src/lib/base-common/region_map_client.cc
diff --git a/repos/base/src/lib/base/registry.cc b/repos/base/src/lib/base-common/registry.cc
similarity index 100%
rename from repos/base/src/lib/base/registry.cc
rename to repos/base/src/lib/base-common/registry.cc
diff --git a/repos/base/src/lib/base/rm_session_client.cc b/repos/base/src/lib/base-common/rm_session_client.cc
similarity index 100%
rename from repos/base/src/lib/base/rm_session_client.cc
rename to repos/base/src/lib/base-common/rm_session_client.cc
diff --git a/repos/base/src/lib/base/root_proxy.cc b/repos/base/src/lib/base-common/root_proxy.cc
similarity index 100%
rename from repos/base/src/lib/base/root_proxy.cc
rename to repos/base/src/lib/base-common/root_proxy.cc
diff --git a/repos/base/src/lib/base/rpc_dispatch_loop.cc b/repos/base/src/lib/base-common/rpc_dispatch_loop.cc
similarity index 100%
rename from repos/base/src/lib/base/rpc_dispatch_loop.cc
rename to repos/base/src/lib/base-common/rpc_dispatch_loop.cc
diff --git a/repos/base/src/lib/base/rpc_entrypoint.cc b/repos/base/src/lib/base-common/rpc_entrypoint.cc
similarity index 100%
rename from repos/base/src/lib/base/rpc_entrypoint.cc
rename to repos/base/src/lib/base-common/rpc_entrypoint.cc
diff --git a/repos/base/src/lib/base/session_state.cc b/repos/base/src/lib/base-common/session_state.cc
similarity index 100%
rename from repos/base/src/lib/base/session_state.cc
rename to repos/base/src/lib/base-common/session_state.cc
diff --git a/repos/base/src/lib/base/signal_common.cc b/repos/base/src/lib/base-common/signal_common.cc
similarity index 100%
rename from repos/base/src/lib/base/signal_common.cc
rename to repos/base/src/lib/base-common/signal_common.cc
diff --git a/repos/base/src/lib/base/slab.cc b/repos/base/src/lib/base-common/slab.cc
similarity index 100%
rename from repos/base/src/lib/base/slab.cc
rename to repos/base/src/lib/base-common/slab.cc
diff --git a/repos/base/src/lib/base/sleep.cc b/repos/base/src/lib/base-common/sleep.cc
similarity index 100%
rename from repos/base/src/lib/base/sleep.cc
rename to repos/base/src/lib/base-common/sleep.cc
diff --git a/repos/base/src/lib/base/sliced_heap.cc b/repos/base/src/lib/base-common/sliced_heap.cc
similarity index 100%
rename from repos/base/src/lib/base/sliced_heap.cc
rename to repos/base/src/lib/base-common/sliced_heap.cc
diff --git a/repos/base/src/lib/base/stack_allocator.cc b/repos/base/src/lib/base-common/stack_allocator.cc
similarity index 100%
rename from repos/base/src/lib/base/stack_allocator.cc
rename to repos/base/src/lib/base-common/stack_allocator.cc
diff --git a/repos/base/src/lib/base/stack_protector.cc b/repos/base/src/lib/base-common/stack_protector.cc
similarity index 100%
rename from repos/base/src/lib/base/stack_protector.cc
rename to repos/base/src/lib/base-common/stack_protector.cc
diff --git a/repos/base/src/lib/base/thread.cc b/repos/base/src/lib/base-common/thread.cc
similarity index 100%
rename from repos/base/src/lib/base/thread.cc
rename to repos/base/src/lib/base-common/thread.cc
diff --git a/repos/base/src/lib/base/thread_myself.cc b/repos/base/src/lib/base-common/thread_myself.cc
similarity index 100%
rename from repos/base/src/lib/base/thread_myself.cc
rename to repos/base/src/lib/base-common/thread_myself.cc
diff --git a/repos/base/src/lib/base/trace.cc b/repos/base/src/lib/base-common/trace.cc
similarity index 100%
rename from repos/base/src/lib/base/trace.cc
rename to repos/base/src/lib/base-common/trace.cc
diff --git a/repos/base/src/lib/base/vm_session.cc b/repos/base/src/lib/base-common/vm_session.cc
similarity index 100%
rename from repos/base/src/lib/base/vm_session.cc
rename to repos/base/src/lib/base-common/vm_session.cc