diff --git a/repos/dde_linux/src/include/lx_emul/init.h b/repos/dde_linux/src/include/lx_emul/init.h
index 9dfe76b220..9dd2faaedd 100644
--- a/repos/dde_linux/src/include/lx_emul/init.h
+++ b/repos/dde_linux/src/include/lx_emul/init.h
@@ -24,6 +24,8 @@ void lx_emul_register_initcall(int (*initcall)(void), const char * name);
void lx_emul_start_kernel(void * dtb);
+void lx_emul_setup_arch(void * dtb);
+
int lx_emul_init_task_function(void * dtb);
extern void * lx_emul_init_task_struct;
diff --git a/repos/dde_linux/src/include/lx_emul/shadow/linux/pgtable.h b/repos/dde_linux/src/include/lx_emul/shadow/linux/pgtable.h
index c4a32cd84b..0b097da5c7 100644
--- a/repos/dde_linux/src/include/lx_emul/shadow/linux/pgtable.h
+++ b/repos/dde_linux/src/include/lx_emul/shadow/linux/pgtable.h
@@ -23,7 +23,25 @@ int pmd_swp_soft_dirty(pmd_t pmd);
void __init pgtable_cache_init(void);
+#ifndef pgprot_decrypted
#define pgprot_decrypted(prot) (prot)
+#endif
+
+#ifndef mm_pud_folded
+#define mm_pud_folded(mm) __is_defined(__PAGETABLE_PUD_FOLDED)
+#endif
+
+#ifndef mm_pmd_folded
+#define mm_pmd_folded(mm) __is_defined(__PAGETABLE_PMD_FOLDED)
+#endif
+
+#ifndef pud_offset
+static inline pud_t *pud_offset(p4d_t *p4d, unsigned long address)
+{
+ return 0;
+}
+#define pud_offset pud_offset
+#endif
pte_t pte_swp_clear_uffd_wp(pte_t pte);
pte_t pte_swp_clear_soft_dirty(pte_t pte);
diff --git a/repos/dde_linux/src/include/lx_kit/env.h b/repos/dde_linux/src/include/lx_kit/env.h
index c8b3416ee4..643ec8fad5 100644
--- a/repos/dde_linux/src/include/lx_kit/env.h
+++ b/repos/dde_linux/src/include/lx_kit/env.h
@@ -15,7 +15,6 @@
#define _LX_KIT__ENV_H_
#include
-#include
#include
#include
#include
diff --git a/repos/dde_linux/src/include/lx_kit/memory.h b/repos/dde_linux/src/include/lx_kit/memory.h
index df794b81e8..9a264b5ff2 100644
--- a/repos/dde_linux/src/include/lx_kit/memory.h
+++ b/repos/dde_linux/src/include/lx_kit/memory.h
@@ -15,6 +15,7 @@
#define _LX_KIT__MEMORY_H_
#include
+#include
#include
#include
#include
diff --git a/repos/dde_linux/src/include/lx_emul/shadow/asm/memory.h b/repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/asm/memory.h
similarity index 100%
rename from repos/dde_linux/src/include/lx_emul/shadow/asm/memory.h
rename to repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/asm/memory.h
diff --git a/repos/dde_linux/src/include/lx_emul/shadow/asm/page.h b/repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/asm/page.h
similarity index 100%
rename from repos/dde_linux/src/include/lx_emul/shadow/asm/page.h
rename to repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/asm/page.h
diff --git a/repos/dde_linux/src/include/lx_emul/shadow/asm/pgtable.h b/repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/asm/pgtable.h
similarity index 100%
rename from repos/dde_linux/src/include/lx_emul/shadow/asm/pgtable.h
rename to repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/asm/pgtable.h
diff --git a/repos/dde_linux/src/include/lx_emul/shadow/linux/compiler-gcc.h b/repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/linux/compiler-gcc.h
similarity index 100%
rename from repos/dde_linux/src/include/lx_emul/shadow/linux/compiler-gcc.h
rename to repos/dde_linux/src/include/spec/arm_64/lx_emul/shadow/linux/compiler-gcc.h
diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c
index a2ba1120fa..32d11c0ebb 100644
--- a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c
+++ b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/dma/mapping.c
@@ -24,10 +24,12 @@ void * dma_alloc_attrs(struct device * dev,
{
void * addr;
+#ifdef CONFIG_ARM
if (dev && dev->dma_mem) {
printk("We do not support device DMA memory yet!\n");
lx_emul_trace_and_stop(__func__);
}
+#endif
addr = lx_emul_mem_alloc_aligned_uncached(size, PAGE_SIZE);
*dma_handle = lx_emul_mem_dma_addr(addr);
diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c
index ca0ab2eafe..4eaedfdd86 100644
--- a/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c
+++ b/repos/dde_linux/src/lib/lx_emul/shadow/kernel/fork.c
@@ -58,7 +58,9 @@ pid_t kernel_thread(int (* fn)(void *),void * arg,unsigned long flags)
.signal = {{0}}
}};
+#ifndef CONFIG_X86
task->thread_info.preempt_count = 0;
+#endif
lx_emul_task_create(task, "kthread", task->pid, fn, arg);
return task->pid;
diff --git a/repos/dde_linux/src/lib/lx_emul/spec/arm/start.c b/repos/dde_linux/src/lib/lx_emul/spec/arm/start.c
new file mode 100644
index 0000000000..d0f0bedb6a
--- /dev/null
+++ b/repos/dde_linux/src/lib/lx_emul/spec/arm/start.c
@@ -0,0 +1,38 @@
+/*
+ * \brief Linux Kernel initialization
+ * \author Stefan Kalkowski
+ * \date 2021-03-16
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+
+void time_init(void)
+{
+ /* arch/arm64/kernel/time.c */
+ lx_emul_time_init(); /* replaces timer_probe() */
+ tick_setup_hrtimer_broadcast();
+ lpj_fine = 1000000 / HZ;
+}
+
+
+void lx_emul_setup_arch(void *dtb)
+{
+ /* calls from setup_arch of arch/arm64/kernel/setup.c */
+ early_init_dt_scan(dtb);
+ unflatten_device_tree();
+}
diff --git a/repos/dde_linux/src/lib/lx_emul/spec/x86/start.c b/repos/dde_linux/src/lib/lx_emul/spec/x86/start.c
new file mode 100644
index 0000000000..1566ae7878
--- /dev/null
+++ b/repos/dde_linux/src/lib/lx_emul/spec/x86/start.c
@@ -0,0 +1,33 @@
+/*
+ * \brief Linux Kernel initialization
+ * \author Stefan Kalkowski
+ * \date 2022-01-08
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+#include
+#include
+
+#include
+#include
+
+unsigned long long sched_clock(void)
+{
+ return lx_emul_time_counter() * 1000;
+}
+
+
+void time_init(void)
+{
+ lx_emul_time_init(); /* replaces timer_probe() */
+ lpj_fine = 1000000 / HZ;
+}
+
+
+void lx_emul_setup_arch(void *dtb) { }
diff --git a/repos/dde_linux/src/lib/lx_emul/start.c b/repos/dde_linux/src/lib/lx_emul/start.c
index fbde19c2d2..00aaee530c 100644
--- a/repos/dde_linux/src/lib/lx_emul/start.c
+++ b/repos/dde_linux/src/lib/lx_emul/start.c
@@ -36,6 +36,9 @@ extern int buses_init(void);
extern int classes_init(void);
extern int platform_bus_init(void);
+/* definition from kernel/main.c implemented architecture specific */
+extern void time_init(void);
+
enum system_states system_state;
static __initdata DECLARE_COMPLETION(kthreadd_done);
@@ -92,9 +95,7 @@ int lx_emul_init_task_function(void * dtb)
* Here we do the minimum normally done start_kernel() of init/main.c
*/
- /* calls from setup_arch of arch/arm64/kernel/setup.c */
- early_init_dt_scan(dtb);
- unflatten_device_tree();
+ lx_emul_setup_arch(dtb);
jump_label_init();
kmem_cache_init();
@@ -110,11 +111,7 @@ int lx_emul_init_task_function(void * dtb)
softirq_init();
timekeeping_init();
- /* arch/arm64/kernel/time.c */
- lx_emul_time_init(); /* replaces timer_probe() */
- tick_setup_hrtimer_broadcast();
- lpj_fine = 1000000 / HZ;
- /* arch/arm64/kernel/time.c end */
+ time_init();
sched_clock_init();