diff --git a/repos/base-hw/include/x86_64/kernel/interface_support.h b/repos/base-hw/include/x86_64/kernel/interface_support.h
new file mode 100644
index 000000000..1c56c41d1
--- /dev/null
+++ b/repos/base-hw/include/x86_64/kernel/interface_support.h
@@ -0,0 +1,50 @@
+/*
+ * \brief Interface between kernel and userland
+ * \author Martin Stein
+ * \date 2011-11-30
+ */
+
+/*
+ * Copyright (C) 2011-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _KERNEL__INTERFACE_SUPPORT_H_
+#define _KERNEL__INTERFACE_SUPPORT_H_
+
+/* Genode includes */
+#include
+
+namespace Kernel
+{
+ typedef Genode::uint64_t Call_arg;
+ typedef Genode::uint64_t Call_ret;
+
+ /**
+ * Registers that are provided by a kernel thread-object for user access
+ */
+ struct Thread_reg_id
+ {
+ enum {
+ SP = 13, /* XXX numbers are arbitrary, taken from ARM version */
+ IP = 15,
+ FAULT_TLB = 18,
+ FAULT_ADDR = 19,
+ FAULT_WRITES = 20,
+ FAULT_SIGNAL = 21,
+ };
+ };
+
+ /**
+ * Events that are provided by a kernel thread-object for user handling
+ */
+ struct Thread_event_id
+ {
+ enum { FAULT = 0 };
+ };
+}
+
+#endif /* _KERNEL__INTERFACE_SUPPORT_H_ */
+
diff --git a/repos/base-hw/lib/mk/x86/core.inc b/repos/base-hw/lib/mk/x86/core.inc
new file mode 100644
index 000000000..79a1d7ce9
--- /dev/null
+++ b/repos/base-hw/lib/mk/x86/core.inc
@@ -0,0 +1,19 @@
+#
+# \brief Build config for Genodes core process
+# \author Stefan Kalkowski
+# \author Martin Stein
+# \date 2012-10-04
+#
+
+# add include paths
+INC_DIR += $(REP_DIR)/src/core/include/spec/x86
+
+# add C++ sources
+SRC_CC += platform_services.cc
+SRC_CC += spec/x86/platform_support.cc
+SRC_CC += spec/x86/kernel/thread.cc
+SRC_CC += spec/x86/kernel/cpu.cc
+SRC_CC += kernel/vm_thread.cc
+
+# include less specific configuration
+include $(REP_DIR)/lib/mk/core.inc
diff --git a/repos/base-hw/lib/mk/x86_64/base-common.mk b/repos/base-hw/lib/mk/x86_64/base-common.mk
new file mode 100644
index 000000000..ee9596107
--- /dev/null
+++ b/repos/base-hw/lib/mk/x86_64/base-common.mk
@@ -0,0 +1,3 @@
+include $(REP_DIR)/lib/mk/base-common.inc
+
+vpath kernel/interface.cc $(REP_DIR)/src/base/x86_64
diff --git a/repos/base-hw/lib/mk/x86_64/core.mk b/repos/base-hw/lib/mk/x86_64/core.mk
new file mode 100644
index 000000000..cde4cb00b
--- /dev/null
+++ b/repos/base-hw/lib/mk/x86_64/core.mk
@@ -0,0 +1,20 @@
+#
+# \brief Build config for Genodes core process
+# \author Stefan Kalkowski
+# \author Martin Stein
+# \date 2012-10-04
+#
+
+# add include paths
+INC_DIR += $(REP_DIR)/src/core/include/spec/x86_64
+
+# add assembly sources
+SRC_S += spec/x86_64/mode_transition.s
+SRC_S += spec/x86_64/kernel/crt0.s
+SRC_S += spec/x86_64/crt0.s
+
+# add C++ sources
+SRC_CC += spec/x86_64/kernel/thread_base.cc
+
+# include less specific configuration
+include $(REP_DIR)/lib/mk/x86/core.inc
diff --git a/repos/base-hw/mk/spec-hw_x86_64.mk b/repos/base-hw/mk/spec-hw_x86_64.mk
new file mode 100644
index 000000000..9bb1a8b43
--- /dev/null
+++ b/repos/base-hw/mk/spec-hw_x86_64.mk
@@ -0,0 +1,18 @@
+#
+# \brief Offer build configurations that are specific to base-hw and x86_64
+# \author Martin Stein
+# \date 2011-12-20
+#
+
+# denote wich specs are also fullfilled by this spec
+SPECS += hw x86_64
+
+# configure multiprocessor mode
+NR_OF_CPUS = 1
+
+# set address where to link text segment at
+LD_TEXT_ADDR ?= 0x200000
+
+# include implied specs
+include $(call select_from_repositories,mk/spec-hw.mk)
+include $(call select_from_repositories,mk/spec-x86_64.mk)
diff --git a/repos/base-hw/src/base/x86_64/kernel/interface.cc b/repos/base-hw/src/base/x86_64/kernel/interface.cc
new file mode 100644
index 000000000..1e9d79c52
--- /dev/null
+++ b/repos/base-hw/src/base/x86_64/kernel/interface.cc
@@ -0,0 +1,85 @@
+/*
+ * \brief Interface between kernel and userland
+ * \author Martin Stein
+ * \date 2011-11-30
+ */
+
+/*
+ * Copyright (C) 2011-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* Genode includes */
+#include
+#include
+
+using namespace Kernel;
+
+
+/******************
+ ** Kernel calls **
+ ******************/
+
+Call_ret Kernel::call(Call_arg arg_0)
+{
+ PDBG("syscall binding not implemented");
+ for (;;);
+ return 0;
+}
+
+
+Call_ret Kernel::call(Call_arg arg_0,
+ Call_arg arg_1)
+{
+ PDBG("syscall binding not implemented");
+ for (;;);
+ return 0;
+}
+
+
+Call_ret Kernel::call(Call_arg arg_0,
+ Call_arg arg_1,
+ Call_arg arg_2)
+{
+ PDBG("syscall binding not implemented");
+ for (;;);
+ return 0;
+}
+
+
+Call_ret Kernel::call(Call_arg arg_0,
+ Call_arg arg_1,
+ Call_arg arg_2,
+ Call_arg arg_3)
+{
+ PDBG("syscall binding not implemented");
+ for (;;);
+ return 0;
+}
+
+
+Call_ret Kernel::call(Call_arg arg_0,
+ Call_arg arg_1,
+ Call_arg arg_2,
+ Call_arg arg_3,
+ Call_arg arg_4)
+{
+ PDBG("syscall binding not implemented");
+ for (;;);
+ return 0;
+}
+
+
+Call_ret Kernel::call(Call_arg arg_0,
+ Call_arg arg_1,
+ Call_arg arg_2,
+ Call_arg arg_3,
+ Call_arg arg_4,
+ Call_arg arg_5)
+{
+ PDBG("syscall binding not implemented");
+ for (;;);
+ return 0;
+}
diff --git a/repos/base-hw/src/core/include/spec/x86/cpu.h b/repos/base-hw/src/core/include/spec/x86/cpu.h
new file mode 100644
index 000000000..cc65380a2
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/cpu.h
@@ -0,0 +1,233 @@
+/*
+ * \brief CPU driver for core
+ * \author Martin stein
+ * \date 2011-11-03
+ */
+
+/*
+ * Copyright (C) 2011-2012 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _CPU_H_
+#define _CPU_H_
+
+#include
+#include
+#include
+
+namespace Genode
+{
+ /**
+ * Part of CPU state that is not switched on every mode transition
+ */
+ class Cpu_lazy_state { };
+
+ /**
+ * CPU driver for core
+ */
+ class Cpu;
+}
+
+namespace Kernel { using Genode::Cpu_lazy_state; }
+
+class Genode::Cpu
+{
+ public:
+
+ static constexpr addr_t exception_entry = 0x0; /* XXX */
+ static constexpr addr_t mtc_size = 1 << 13;
+
+ /**
+ * Extend basic CPU state by members relevant for 'base-hw' only
+ */
+ struct Context : Cpu_state
+ {
+ /**
+ * Return base of assigned translation table
+ */
+ addr_t translation_table() const { return 0UL; }
+
+ /**
+ * Assign translation-table base 'table'
+ */
+ void translation_table(addr_t const table) { }
+
+ /**
+ * Assign protection domain
+ */
+ void protection_domain(unsigned const id) { }
+ };
+
+ /**
+ * An usermode execution state
+ */
+ struct User_context : Context
+ {
+ /**
+ * Constructor
+ */
+ User_context();
+
+ /**
+ * Support for kernel calls
+ */
+ void user_arg_0(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_1(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_2(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_3(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_4(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_5(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_6(Kernel::Call_arg const arg) { /* XXX */ }
+ void user_arg_7(Kernel::Call_arg const arg) { /* XXX */ }
+ Kernel::Call_arg user_arg_0() const { return 0UL; }
+ Kernel::Call_arg user_arg_1() const { return 0UL; }
+ Kernel::Call_arg user_arg_2() const { return 0UL; }
+ Kernel::Call_arg user_arg_3() const { return 0UL; }
+ Kernel::Call_arg user_arg_4() const { return 0UL; }
+ Kernel::Call_arg user_arg_5() const { return 0UL; }
+ Kernel::Call_arg user_arg_6() const { return 0UL; }
+ Kernel::Call_arg user_arg_7() const { return 0UL; }
+
+ /**
+ * Initialize thread context
+ *
+ * \param table physical base of appropriate translation table
+ * \param pd_id kernel name of appropriate protection domain
+ */
+ void init_thread(addr_t const table, unsigned const pd_id)
+ {
+ protection_domain(pd_id);
+ translation_table(table);
+ }
+ };
+
+ /**
+ * Returns true if current execution context is running in user mode
+ */
+ static bool is_user()
+ {
+ PDBG("not implemented");
+ return false;
+ }
+
+ /**
+ * Invalidate all entries of all instruction caches
+ */
+ __attribute__((always_inline)) static void invalidate_instr_caches() { }
+
+ /**
+ * Flush all entries of all data caches
+ */
+ inline static void flush_data_caches() { }
+
+ /**
+ * Invalidate all entries of all data caches
+ */
+ inline static void invalidate_data_caches() { }
+
+ /**
+ * Flush all caches
+ */
+ static void flush_caches()
+ {
+ flush_data_caches();
+ invalidate_instr_caches();
+ }
+
+ /**
+ * Invalidate all TLB entries of the address space named 'pid'
+ */
+ static void flush_tlb_by_pid(unsigned const pid)
+ {
+ flush_caches();
+ }
+
+ /**
+ * Invalidate all TLB entries
+ */
+ static void flush_tlb()
+ {
+ flush_caches();
+ }
+
+ /**
+ * Flush data-cache entries for virtual region ['base', 'base + size')
+ */
+ static void
+ flush_data_caches_by_virt_region(addr_t base, size_t const size)
+ { }
+
+ /**
+ * Bin instr.-cache entries for virtual region ['base', 'base + size')
+ */
+ static void
+ invalidate_instr_caches_by_virt_region(addr_t base, size_t const size)
+ { }
+
+ static void inval_branch_predicts() { };
+
+ /**
+ * Switch to the virtual mode in kernel
+ *
+ * \param table base of targeted translation table
+ * \param process_id process ID of the kernel address-space
+ */
+ static void
+ init_virt_kernel(addr_t const table, unsigned const process_id)
+ { }
+
+ inline static void finish_init_phys_kernel()
+ { }
+
+ /**
+ * Configure this module appropriately for the first kernel run
+ */
+ static void init_phys_kernel()
+ { }
+
+ /**
+ * Finish all previous data transfers
+ */
+ static void data_synchronization_barrier()
+ { }
+
+ /**
+ * Enable secondary CPUs with instr. pointer 'ip'
+ */
+ static void start_secondary_cpus(void * const ip)
+ { }
+
+ /**
+ * Wait for the next interrupt as cheap as possible
+ */
+ static void wait_for_interrupt() { }
+
+ /**
+ * Return wether to retry an undefined user instruction after this call
+ */
+ bool retry_undefined_instr(Cpu_lazy_state *) { return false; }
+
+ /**
+ * Return kernel name of the executing CPU
+ */
+ static unsigned executing_id() { return 0; }
+
+ /**
+ * Return kernel name of the primary CPU
+ */
+ static unsigned primary_id() { return 0; }
+
+ /*************
+ ** Dummies **
+ *************/
+
+ static void tlb_insertions() { inval_branch_predicts(); }
+ static void translation_added(addr_t, size_t) { }
+ static void prepare_proceeding(Cpu_lazy_state *, Cpu_lazy_state *) { }
+
+};
+
+#endif /* _CPU_H_ */
diff --git a/repos/base-hw/src/core/include/spec/x86/kernel/thread_base.h b/repos/base-hw/src/core/include/spec/x86/kernel/thread_base.h
new file mode 100644
index 000000000..55ccb4954
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/kernel/thread_base.h
@@ -0,0 +1,46 @@
+/*
+ * \brief Hardware specific base of kernel thread-objects
+ * \author Martin Stein
+ * \date 2013-11-13
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _KERNEL__THREAD_BASE_H_
+#define _KERNEL__THREAD_BASE_H_
+
+/* core includes */
+#include
+
+namespace Kernel
+{
+ /**
+ * Hardware specific base of kernel thread-objects
+ */
+ class Thread_base;
+}
+
+class Kernel::Thread_base
+{
+ protected:
+
+ Thread_event _fault;
+ addr_t _fault_pd;
+ addr_t _fault_addr;
+ addr_t _fault_writes;
+ addr_t _fault_signal;
+
+ /**
+ * Constructor
+ *
+ * \param t generic part of kernel thread-object
+ */
+ Thread_base(Thread * const t);
+};
+
+#endif /* _KERNEL__THREAD_BASE_H_ */
diff --git a/repos/base-hw/src/core/include/spec/x86/kernel/vm_state.h b/repos/base-hw/src/core/include/spec/x86/kernel/vm_state.h
new file mode 100644
index 000000000..d440dc20e
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/kernel/vm_state.h
@@ -0,0 +1,25 @@
+/*
+ * \brief CPU context of a virtual machine
+ * \author Martin Stein
+ * \date 2013-10-30
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _KERNEL__VM_STATE_H_
+#define _KERNEL__VM_STATE_H_
+
+namespace Kernel
+{
+ /**
+ * Dummy
+ */
+ struct Vm_state { };
+}
+
+#endif /* _KERNEL__VM_STATE_H_ */
\ No newline at end of file
diff --git a/repos/base-hw/src/core/include/spec/x86/macros.s b/repos/base-hw/src/core/include/spec/x86/macros.s
new file mode 100644
index 000000000..b59314cbe
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/macros.s
@@ -0,0 +1,16 @@
+/*
+ * \brief Macros that are used by multiple assembly files
+ * \author Martin Stein
+ * \date 2014-01-13
+ */
+
+/*
+ * Copyright (C) 2014 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* core includes */
+.include "spec/x86/macros_support.s"
+
diff --git a/repos/base-hw/src/core/include/spec/x86/macros_support.s b/repos/base-hw/src/core/include/spec/x86/macros_support.s
new file mode 100644
index 000000000..e38926f77
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/macros_support.s
@@ -0,0 +1,20 @@
+/*
+ * \brief Macros that are used by multiple assembly files
+ * \author Martin Stein
+ * \date 2014-01-13
+ */
+
+/*
+ * Copyright (C) 2014 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/***************************************************
+ ** Constant values that are pretty commonly used **
+ ***************************************************/
+
+/* alignment constraints */
+.set MIN_PAGE_SIZE_LOG2, 12
+.set DATA_ACCESS_ALIGNM_LOG2, 2
diff --git a/repos/base-hw/src/core/include/spec/x86/pic.h b/repos/base-hw/src/core/include/spec/x86/pic.h
new file mode 100644
index 000000000..d9ec4af98
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/pic.h
@@ -0,0 +1,67 @@
+/*
+ * \brief Programmable interrupt controller for core
+ * \author Norman Feske
+ * \date 2013-04-05
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _PIC_H_
+#define _PIC_H_
+
+
+namespace Genode
+{
+ /**
+ * Programmable interrupt controller for core
+ */
+ class Pic;
+}
+
+
+class Genode::Pic
+{
+ public:
+
+ enum {
+ /*
+ * FIXME: dummy ipi value on non-SMP platform, should be removed
+ * when SMP is an aspect of CPUs only compiled where necessary
+ */
+ IPI = 255,
+ NR_OF_IRQ = 256,
+ };
+
+ /**
+ * Constructor
+ */
+ Pic() { }
+
+ void init_cpu_local() { }
+
+ bool take_request(unsigned &irq) { return false; }
+
+ void finish_request() { }
+
+ void mask() { }
+
+ void unmask(unsigned const i, unsigned) { }
+
+ void mask(unsigned const i) { }
+
+ /*
+ * Dummies
+ */
+
+ bool is_ip_interrupt(unsigned, unsigned) { return false; }
+ void trigger_ip_interrupt(unsigned) { }
+};
+
+namespace Kernel { class Pic : public Genode::Pic { }; }
+
+#endif /* _PIC_H_ */
diff --git a/repos/base-hw/src/core/include/spec/x86/serial.h b/repos/base-hw/src/core/include/spec/x86/serial.h
new file mode 100644
index 000000000..48a1db18d
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/serial.h
@@ -0,0 +1,148 @@
+/*
+ * \brief Serial output driver for core
+ * \author Stefan Kalkowski
+ * \date 2012-10-24
+ */
+
+/*
+ * Copyright (C) 2012-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _SERIAL_H_
+#define _SERIAL_H_
+
+/* Genode includes */
+#include
+
+/**
+ * Read byte from I/O port
+ */
+inline Genode::uint8_t inb(Genode::uint16_t port)
+{
+ Genode::uint8_t res;
+ asm volatile ("inb %%dx, %0" :"=a"(res) :"Nd"(port));
+ return res;
+}
+
+
+/**
+ * Write byte to I/O port
+ */
+inline void outb(Genode::uint16_t port, Genode::uint8_t val)
+{
+ asm volatile ("outb %b0, %w1" : : "a" (val), "Nd" (port));
+}
+
+
+/**
+ * Definitions of PC serial ports
+ */
+enum {
+ COMPORT_DATA_OFFSET = 0,
+ COMPORT_STATUS_OFFSET = 5,
+
+ STATUS_THR_EMPTY = 0x20, /* transmitter hold register empty */
+ STATUS_DHR_EMPTY = 0x40, /* data hold register empty
+ - data completely sent */
+};
+
+
+/**
+ * Initialize serial port
+ *
+ * Based on 'init_serial' of L4ka::Pistachio's 'kdb/platform/pc99/io.cc'
+ */
+static void init_comport(Genode::uint16_t port, unsigned baud)
+{
+ if (!port)
+ return;
+
+ const unsigned
+ IER = port + 1,
+ EIR = port + 2,
+ LCR = port + 3,
+ MCR = port + 4,
+ LSR = port + 5,
+ MSR = port + 6,
+ DLLO = port + 0,
+ DLHI = port + 1;
+
+ outb(LCR, 0x80); /* select bank 1 */
+// for (volatile int i = 10000000; i--; );
+ outb(DLLO, (115200/baud) >> 0);
+ outb(DLHI, (115200/baud) >> 8);
+ outb(LCR, 0x03); /* set 8,N,1 */
+ outb(IER, 0x00); /* disable interrupts */
+ outb(EIR, 0x07); /* enable FIFOs */
+ outb(MCR, 0x0b); /* force data terminal ready */
+ outb(IER, 0x01); /* enable RX interrupts */
+ inb(IER);
+ inb(EIR);
+ inb(LCR);
+ inb(MCR);
+ inb(LSR);
+ inb(MSR);
+}
+
+
+/**
+ * Output character to serial port
+ */
+inline void serial_out_char(Genode::uint16_t comport, Genode::uint8_t c)
+{
+ /* wait until serial port is ready */
+ Genode::uint8_t ready = STATUS_THR_EMPTY;
+ while ((inb(comport + COMPORT_STATUS_OFFSET) & ready) != ready);
+
+ /* output character */
+ outb(comport + COMPORT_DATA_OFFSET, c);
+}
+
+
+namespace Genode {
+
+ /**
+ * Serial output driver for core
+ */
+ class Serial
+ {
+ private:
+
+ uint16_t _comport;
+
+ public:
+
+ void put_char(char c)
+ {
+ if (!_comport)
+ return;
+
+ if (c == '\n')
+ serial_out_char(_comport, '\r');
+ serial_out_char(_comport, c);
+ }
+
+ /**
+ * Constructor
+ *
+ * XXX: The 'baud_rate' argument is ignored for now.
+ */
+ Serial(unsigned) : _comport(0x3f8)
+ {
+ init_comport(_comport, 115200);
+ }
+
+ Serial(const char *s) : _comport(0x3f8)
+ {
+ init_comport(_comport, 115200);
+
+ while (*s)
+ put_char(*s++);
+ }
+ };
+}
+
+#endif /* _SERIAL_H_ */
diff --git a/repos/base-hw/src/core/include/spec/x86/timer.h b/repos/base-hw/src/core/include/spec/x86/timer.h
new file mode 100644
index 000000000..6bcc3e515
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86/timer.h
@@ -0,0 +1,63 @@
+/*
+ * \brief Timer driver for core
+ * \author Norman Feske
+ * \date 2013-04-05
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _TIMER_H_
+#define _TIMER_H_
+
+#include
+#include
+
+
+namespace Genode
+{
+ /**
+ * Timer driver for core
+ *
+ * Timer channel 0 apparently doesn't work on the RPI, so we use channel 1
+ */
+ class Timer;
+}
+
+class Genode::Timer
+{
+ public:
+
+ Timer() { }
+
+ static unsigned interrupt_id(int)
+ {
+ PDBG("not implemented");
+ return 0;
+ }
+
+ inline void start_one_shot(uint32_t const tics, unsigned)
+ {
+ PDBG("not implemented");
+ }
+
+ static uint32_t ms_to_tics(unsigned const ms)
+ {
+ PDBG("not implemented");
+ return 0;
+ }
+
+ unsigned value(unsigned)
+ {
+ PDBG("not implemented");
+ return 0;
+ }
+};
+
+namespace Kernel { class Timer : public Genode::Timer { }; }
+
+#endif /* _TIMER_H_ */
diff --git a/repos/base-hw/src/core/include/spec/x86_64/translation_table.h b/repos/base-hw/src/core/include/spec/x86_64/translation_table.h
new file mode 100644
index 000000000..7b0705ea6
--- /dev/null
+++ b/repos/base-hw/src/core/include/spec/x86_64/translation_table.h
@@ -0,0 +1,85 @@
+/*
+ * \brief x86_64 translation table definitions for core
+ * \author Martin Stein
+ * \author Stefan Kalkowski
+ * \date 2012-02-22
+ */
+
+/*
+ * Copyright (C) 2012-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+#ifndef _TRANSLATION_TABLE_H_
+#define _TRANSLATION_TABLE_H_
+
+#include
+#include
+#include
+
+namespace Genode
+{
+ /**
+ * First level translation table
+ */
+ class Translation_table;
+}
+
+
+class Genode::Translation_table
+{
+ public:
+
+ enum {
+ ALIGNM_LOG2 = 12,
+ MIN_PAGE_SIZE_LOG2 = 12,
+ MAX_COSTS_PER_TRANSLATION = 4*4096
+ };
+
+ void * operator new (size_t, void * p) { return p; }
+
+ /**
+ * Constructor
+ */
+ Translation_table() { }
+
+ /**
+ * Maximum virtual offset that can be translated by this table
+ */
+ static addr_t max_virt_offset()
+ {
+ PDBG("not implemented");
+ return 0;
+ }
+
+ /**
+ * Insert translations into this table
+ *
+ * \param vo offset of virt. transl. region in virt. table region
+ * \param pa base of physical backing store
+ * \param size size of translated region
+ * \param f mapping flags
+ * \param s second level page slab allocator
+ */
+ void insert_translation(addr_t vo, addr_t pa, size_t size,
+ Page_flags const & f, Page_slab * const s)
+ {
+ PDBG("not implemented");
+ }
+
+ /**
+ * Remove translations that overlap with a given virtual region
+ *
+ * \param vo region offset within the tables virtual region
+ * \param size region size
+ * \param slab second level page slab allocator
+ */
+ void remove_translation(addr_t vo, size_t size, Page_slab * slab)
+ {
+ PDBG("not implemented");
+ }
+};
+
+#endif /* _TRANSLATION_TABLE_H_ */
diff --git a/repos/base-hw/src/core/spec/x86/kernel/cpu.cc b/repos/base-hw/src/core/spec/x86/kernel/cpu.cc
new file mode 100644
index 000000000..11e97ac3a
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86/kernel/cpu.cc
@@ -0,0 +1,26 @@
+/*
+ * \brief Class for kernel data that is needed to manage a specific CPU
+ * \author Martin Stein
+ * \author Stefan Kalkowski
+ * \date 2014-01-14
+ */
+
+/*
+ * Copyright (C) 2014 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* core includes */
+#include
+
+using namespace Kernel;
+
+
+Cpu_idle::Cpu_idle(Cpu * const cpu) : Cpu_job(Cpu_priority::min, 0) {
+ PDBG("not implemented"); }
+
+
+void Cpu_idle::exception(unsigned const cpu) {
+ PDBG("not implemented"); }
diff --git a/repos/base-hw/src/core/spec/x86/kernel/thread.cc b/repos/base-hw/src/core/spec/x86/kernel/thread.cc
new file mode 100644
index 000000000..e4ff7ca09
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86/kernel/thread.cc
@@ -0,0 +1,30 @@
+/*
+ * \brief Kernel backend for execution contexts in userland
+ * \author Martin Stein
+ * \author Stefan Kalkowski
+ * \date 2014-01-14
+ */
+
+/*
+ * Copyright (C) 2014 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* core includes */
+#include
+
+using namespace Kernel;
+
+
+Thread::Thread(unsigned const priority, unsigned const quota,
+ char const * const label)
+:
+ Thread_base(this), Cpu_job(priority, quota), _state(AWAITS_START), _pd(0),
+ _utcb_phys(0), _signal_receiver(0), _label(label)
+{ PDBG("not implemented"); }
+
+
+void Thread::exception(unsigned const cpu) {
+ PDBG("not implemented"); }
diff --git a/repos/base-hw/src/core/spec/x86/kernel/vm.cc b/repos/base-hw/src/core/spec/x86/kernel/vm.cc
new file mode 100644
index 000000000..6c0e41c48
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86/kernel/vm.cc
@@ -0,0 +1,22 @@
+/*
+ * \brief Kernel backend for virtual machines
+ * \author Martin Stein
+ * \date 2013-10-30
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* core includes */
+#include
+
+using namespace Kernel;
+
+
+void Vm::exception(unsigned const cpu) {
+ PDBG("not implemented"); }
+
diff --git a/repos/base-hw/src/core/spec/x86/platform_support.cc b/repos/base-hw/src/core/spec/x86/platform_support.cc
new file mode 100644
index 000000000..08e92dbbe
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86/platform_support.cc
@@ -0,0 +1,50 @@
+/*
+ * \brief Platform implementations specific for base-hw and Raspberry Pi
+ * \author Norman Feske
+ * \date 2013-04-05
+ *
+ * XXX dimension allocators according to the available physical memory
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* core includes */
+#include
+#include
+
+using namespace Genode;
+
+Native_region * Platform::_ram_regions(unsigned const i)
+{
+ static Native_region _regions[] =
+ {
+ { 2*1024*1024, 1024*1024*254 }
+ };
+ return i < sizeof(_regions)/sizeof(_regions[0]) ? &_regions[i] : 0;
+}
+
+
+Native_region * Platform::_mmio_regions(unsigned const i)
+{
+ static Native_region _regions[] =
+ {
+ };
+ return i < sizeof(_regions)/sizeof(_regions[0]) ? &_regions[i] : 0;
+}
+
+
+Native_region * Platform::_core_only_mmio_regions(unsigned const i)
+{
+ static Native_region _regions[] =
+ {
+ };
+ return i < sizeof(_regions)/sizeof(_regions[0]) ? &_regions[i] : 0;
+}
+
+
+Cpu::User_context::User_context() { }
diff --git a/repos/base-hw/src/core/spec/x86_64/crt0.s b/repos/base-hw/src/core/spec/x86_64/crt0.s
new file mode 100644
index 000000000..38a592e9a
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86_64/crt0.s
@@ -0,0 +1,45 @@
+/**
+ * \brief Startup code for Genode 64Bit applications
+ * \author Sebastian Sumpf
+ * \author Martin Stein
+ * \date 2011-05-11
+ */
+
+/*
+ * Copyright (C) 2011-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/**************************
+ ** .text (program code) **
+ **************************/
+
+.section ".text"
+
+ /* program entry-point */
+ .global _core_start
+ _core_start:
+
+ /* initialize GLOBAL OFFSET TABLE */
+ leaq _GLOBAL_OFFSET_TABLE_(%rip), %r15
+
+ /* create proper environment for the main thread */
+ call init_main_thread
+
+ /* apply environment that was created by init_main_thread */
+ movq init_main_thread_result@GOTPCREL(%rip), %rax
+ movq (%rax), %rsp
+
+ /* clear the base pointer in order that stack backtraces will work */
+ xorq %rbp, %rbp
+
+ /*
+ * We jump into initial C code instead of calling it as it should never
+ * return on the one hand and because the alignment of the stack pointer
+ * that init_main_thread returned expects a jump at the other hand. The
+ * latter matters because GCC expects the initial stack pointer to be
+ * aligned to 16 byte for at least the handling of floating points.
+ */
+ jmp _main
diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/crt0.s b/repos/base-hw/src/core/spec/x86_64/kernel/crt0.s
new file mode 100644
index 000000000..2e5e5483a
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86_64/kernel/crt0.s
@@ -0,0 +1,66 @@
+/*
+ * \brief Startup code for core
+ * \author Martin Stein
+ * \author Stefan Kalkowski
+ * \date 2011-10-01
+ */
+
+/*
+ * Copyright (C) 2011-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+.section ".text.crt0"
+
+ /* magic multi-boot header to make GRUB happy */
+ .long 0x1badb002
+ .long 0x0
+ .long 0xe4524ffe
+
+ /**********************************
+ ** Startup code for primary CPU **
+ **********************************/
+
+.code32
+ .global _start
+ _start:
+
+ /*
+ * Install initial temporary environment that is replaced later by the
+ * environment that init_main_thread creates.
+ */
+ leaq _stack_high@GOTPCREL(%rip),%rax
+ movq (%rax), %rsp
+
+ /* uniprocessor kernel-initialization which activates multiprocessor */
+ call init_kernel_up
+
+ /*********************************************
+ ** Startup code that is common to all CPUs **
+ *********************************************/
+
+ .global _start_secondary_cpus
+ _start_secondary_cpus:
+
+ /* do multiprocessor kernel-initialization */
+ call init_kernel_mp
+
+ /* call the kernel main-routine */
+ call kernel
+
+ /* catch erroneous return of the kernel main-routine */
+ 1: jmp 1b
+
+
+/*********************************
+ ** .bss (non-initialized data) **
+ *********************************/
+
+.bss
+
+ /* stack of the temporary initial environment */
+ .p2align 8
+ .space 32 * 1024
+ _stack_high:
diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc
new file mode 100644
index 000000000..21bfa72d5
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread_base.cc
@@ -0,0 +1,83 @@
+/*
+ * \brief CPU specific implementations of core
+ * \author Martin Stein
+ * \author Stefan Kalkowski
+ * \date 2013-11-11
+ */
+
+/*
+ * Copyright (C) 2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+/* core includes */
+#include
+#include
+#include
+
+using namespace Kernel;
+
+
+/*************************
+ ** Kernel::Thread_base **
+ *************************/
+
+Thread_base::Thread_base(Thread * const t)
+:
+ _fault(t),
+ _fault_pd(0),
+ _fault_addr(0),
+ _fault_writes(0),
+ _fault_signal(0)
+{ }
+
+
+/********************
+ ** Kernel::Thread **
+ ********************/
+
+addr_t Thread::* Thread::_reg(addr_t const id) const
+{
+ PDBG("not implemented");
+ return 0UL;
+}
+
+
+Thread_event Thread::* Thread::_event(unsigned const id) const
+{
+ PDBG("not implemented");
+ return nullptr;
+}
+
+
+void Thread::_mmu_exception()
+{
+ PDBG("not implemented");
+}
+
+
+/*************************
+ ** Kernel::Cpu_context **
+ *************************/
+
+void Kernel::Cpu_context::_init(size_t const stack_size, addr_t const table)
+{ }
+
+
+/*************************
+ ** CPU-state utilities **
+ *************************/
+
+typedef Thread_reg_id Reg_id;
+
+static addr_t const _cpu_state_regs[] = { };
+
+addr_t const * cpu_state_regs() { return _cpu_state_regs; }
+
+
+size_t cpu_state_regs_length()
+{
+ return sizeof(_cpu_state_regs)/sizeof(_cpu_state_regs[0]);
+}
diff --git a/repos/base-hw/src/core/spec/x86_64/mode_transition.s b/repos/base-hw/src/core/spec/x86_64/mode_transition.s
new file mode 100644
index 000000000..741d85585
--- /dev/null
+++ b/repos/base-hw/src/core/spec/x86_64/mode_transition.s
@@ -0,0 +1,68 @@
+/*
+ * \brief Transition between kernel/userland, and secure/non-secure world
+ * \author Martin Stein
+ * \author Stefan Kalkowski
+ * \date 2011-11-15
+ */
+
+/*
+ * Copyright (C) 2011-2013 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU General Public License version 2.
+ */
+
+.include "macros.s"
+
+.section .text
+
+ /*
+ * Page aligned base of mode transition code.
+ *
+ * This position independent code switches between a kernel context and a
+ * user context and thereby between their address spaces. Due to the latter
+ * it must be mapped executable to the same region in every address space.
+ * To enable such switching, the kernel context must be stored within this
+ * region, thus one should map it solely accessable for privileged modes.
+ */
+ .p2align MIN_PAGE_SIZE_LOG2
+ .global _mt_begin
+ _mt_begin:
+
+ /* space for a copy of the kernel context */
+ .p2align 2
+ .global _mt_master_context_begin
+ _mt_master_context_begin:
+
+ /* space must be at least as large as 'Cpu_state' */
+ .space 32*4
+
+ .global _mt_master_context_end
+ _mt_master_context_end:
+
+ /* space for a client context-pointer per CPU */
+ .p2align 2
+ .global _mt_client_context_ptr
+ _mt_client_context_ptr:
+
+ /* a globally mapped buffer per CPU */
+ .p2align 2
+ .global _mt_buffer
+ _mt_buffer:
+
+ /*
+ * On user exceptions the CPU has to jump to one of the following
+ * seven entry vectors to switch to a kernel context.
+ */
+ .global _mt_kernel_entry_pic
+ _mt_kernel_entry_pic:
+ 1: jmp 1b
+
+ .global _mt_user_entry_pic
+ _mt_user_entry_pic:
+ 1: jmp 1b
+
+ /* end of the mode transition code */
+ .global _mt_end
+ _mt_end:
+ 1: jmp 1b
diff --git a/tool/run/boot_dir/hw b/tool/run/boot_dir/hw
index 67e71b919..c8e0278b6 100644
--- a/tool/run/boot_dir/hw
+++ b/tool/run/boot_dir/hw
@@ -139,9 +139,14 @@ proc run_boot_dir {binaries {core_type core}} {
# offer ELF image
set elf_img "[run_dir]/image.elf"
- #exec cp -L bin/$core_bin $elf_img
- exec [cross_dev_prefix]objcopy -O elf32-i386 bin/$core_bin $elf_img
- #exec [cross_dev_prefix]strip $elf_img
+ if {[have_spec "x86_64"]} {
+ # as startup is done in 32 bit mode, GRUB expects a 32 bit image
+ exec [cross_dev_prefix]objcopy -O elf32-i386 bin/$core_bin $elf_img
+ }
+ if {[expr [have_spec "arm"] || [have_spec "x86_32"]]} {
+ exec cp -L bin/$core_bin $elf_img
+ }
+ exec [cross_dev_prefix]strip $elf_img
if {[have_include "image/iso"] || [have_include "image/disk"]} {
#