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 index 1a854ebd57..d26e41eb71 100644 --- a/repos/dde_linux/src/lib/lx_emul/spec/x86/start.c +++ b/repos/dde_linux/src/lib/lx_emul/spec/x86/start.c @@ -26,7 +26,6 @@ unsigned long long sched_clock(void) void time_init(void) { lx_emul_time_init(); /* replaces timer_probe() */ - lpj_fine = 1000000 / HZ; } diff --git a/repos/pc/lib/import/import-pc_lx_emul.mk b/repos/pc/lib/import/import-pc_lx_emul.mk index 9c02a30e74..4e298d8c84 100644 --- a/repos/pc/lib/import/import-pc_lx_emul.mk +++ b/repos/pc/lib/import/import-pc_lx_emul.mk @@ -47,6 +47,7 @@ SRC_C += lx_emul/sched_core.c SRC_C += lx_emul/slab_common.c SRC_C += lx_emul/softirq.c SRC_C += lx_emul/vmalloc.c +SRC_C += lx_emul/delay.c SRC_C += lx_emul/shadow/fs/libfs.c SRC_C += lx_emul/shadow/kernel/rcu/tiny.c diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list index b057680611..4defc3d70a 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list +++ b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_32/source.list @@ -1,4 +1,3 @@ -arch/x86/lib/delay.c arch/x86/lib/hweight.S arch/x86/pci/legacy.c arch/x86/platform/intel/iosf_mbi.c diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list index 6ed437274a..518849f5cb 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list +++ b/repos/pc/src/drivers/framebuffer/intel/pc/spec/x86_64/source.list @@ -1,4 +1,3 @@ -arch/x86/lib/delay.c arch/x86/lib/hweight.S arch/x86/lib/memcpy_64.S arch/x86/lib/memmove_64.S diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/target.inc b/repos/pc/src/drivers/framebuffer/intel/pc/target.inc index 01749e3561..04788d6894 100644 --- a/repos/pc/src/drivers/framebuffer/intel/pc/target.inc +++ b/repos/pc/src/drivers/framebuffer/intel/pc/target.inc @@ -11,6 +11,7 @@ INC_DIR += $(REL_PRG_DIR)/shadow SRC_CC += main.cc SRC_CC += misc.cc SRC_CC += emul.cc +SRC_CC += time.cc SRC_CC += opregion_io_mem.cc SRC_C += dummies.c SRC_C += lx_emul.c diff --git a/repos/pc/src/drivers/framebuffer/intel/pc/time.cc b/repos/pc/src/drivers/framebuffer/intel/pc/time.cc new file mode 100644 index 0000000000..0f8f40ad69 --- /dev/null +++ b/repos/pc/src/drivers/framebuffer/intel/pc/time.cc @@ -0,0 +1,25 @@ +/* + * \brief Lx_emul udelay function for very short delays + * \author Stefan Kalkowski + * \date 2021-07-10 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include + +extern "C" void lx_emul_time_udelay(unsigned long usec); +extern "C" void lx_emul_time_udelay(unsigned long usec) +{ + if (usec > 100) + Genode::error("Cannot delay that long ", usec, " microseconds"); + + unsigned long long start = Lx_kit::env().timer.curr_time().trunc_to_plain_us().value; + while (Lx_kit::env().timer.curr_time().trunc_to_plain_us().value < (start + usec)) { ; } +} diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list index 8ad8be19c4..cde37ec2aa 100644 --- a/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_32/source.list @@ -1,4 +1,3 @@ -arch/x86/lib/delay.c arch/x86/lib/hweight.S arch/x86/pci/legacy.c drivers/base/bus.c diff --git a/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list index 00b8d3e99a..d16cd6ae87 100644 --- a/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list +++ b/repos/pc/src/drivers/usb_host/pc/spec/x86_64/source.list @@ -1,4 +1,3 @@ -arch/x86/lib/delay.c arch/x86/lib/hweight.S arch/x86/pci/legacy.c drivers/base/bus.c diff --git a/repos/pc/src/drivers/usb_host/pc/target.inc b/repos/pc/src/drivers/usb_host/pc/target.inc index 30c05fc283..66dba2679f 100644 --- a/repos/pc/src/drivers/usb_host/pc/target.inc +++ b/repos/pc/src/drivers/usb_host/pc/target.inc @@ -8,6 +8,7 @@ LIBS := base pc_lx_emul jitterentropy INC_DIR += $(REL_PRG_DIR) SRC_CC += main.cc SRC_CC += misc.cc +SRC_CC += time.cc SRC_CC += lx_emul/shared_dma_buffer.cc SRC_C += dummies.c SRC_C += lx_emul.c diff --git a/repos/pc/src/drivers/usb_host/pc/time.cc b/repos/pc/src/drivers/usb_host/pc/time.cc new file mode 100644 index 0000000000..0f8f40ad69 --- /dev/null +++ b/repos/pc/src/drivers/usb_host/pc/time.cc @@ -0,0 +1,25 @@ +/* + * \brief Lx_emul udelay function for very short delays + * \author Stefan Kalkowski + * \date 2021-07-10 + */ + +/* + * Copyright (C) 2021 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include + +extern "C" void lx_emul_time_udelay(unsigned long usec); +extern "C" void lx_emul_time_udelay(unsigned long usec) +{ + if (usec > 100) + Genode::error("Cannot delay that long ", usec, " microseconds"); + + unsigned long long start = Lx_kit::env().timer.curr_time().trunc_to_plain_us().value; + while (Lx_kit::env().timer.curr_time().trunc_to_plain_us().value < (start + usec)) { ; } +} diff --git a/repos/pc/src/lib/pc/lx_emul/common_dummies.c b/repos/pc/src/lib/pc/lx_emul/common_dummies.c index 2d842b2439..a4086eccf5 100644 --- a/repos/pc/src/lib/pc/lx_emul/common_dummies.c +++ b/repos/pc/src/lib/pc/lx_emul/common_dummies.c @@ -47,11 +47,6 @@ const struct trace_print_flags pageflag_names[] = { {0,NULL}}; struct kernel_stat kstat; -#include - -/* support for arch/x86/lib/delay.c, normally defined in init/main.c */ -unsigned long loops_per_jiffy = (1<<12); - #include @@ -70,11 +65,6 @@ struct cpuinfo_x86 boot_cpu_data = unsigned long init_stack[THREAD_SIZE / sizeof(unsigned long)]; -#include - -unsigned long lpj_fine = 0; - - /* * Generate_dummies.c will otherwise pull in * that clashes with rcutiny.h. diff --git a/repos/pc/src/lib/pc/lx_emul/delay.c b/repos/pc/src/lib/pc/lx_emul/delay.c new file mode 100644 index 0000000000..05d9063b6c --- /dev/null +++ b/repos/pc/src/lib/pc/lx_emul/delay.c @@ -0,0 +1,34 @@ +/* + * \brief Supplement for emulation for linux/include/asm-generic/delay.h + * \author Josef Soentgen + * \date 2022-05-05 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + + +#include +#include + +#include + + +void __const_udelay(unsigned long xloops) +{ + unsigned long usecs = xloops / 0x10C7UL; + if (usecs < 100) + lx_emul_time_udelay(usecs); + else + usleep_range(usecs, usecs * 10); +} + + +void __udelay(unsigned long usecs) +{ + lx_emul_time_udelay(usecs); +} diff --git a/repos/pc/src/lib/wifi/lx_emul.c b/repos/pc/src/lib/wifi/lx_emul.c index 2821c69ac8..c2d6dc2a3c 100644 --- a/repos/pc/src/lib/wifi/lx_emul.c +++ b/repos/pc/src/lib/wifi/lx_emul.c @@ -18,20 +18,6 @@ #include #include - -#include -#include - -void __const_udelay(unsigned long xloops) -{ - unsigned long usecs = xloops / 0x10C7UL; - if (usecs < 100) - lx_emul_time_udelay(usecs); - else - usleep_range(usecs, usecs * 10); -} - - #include struct kmem_cache * kmem_cache_create_usercopy(const char * name,