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