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,