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();