diff --git a/repos/dde_linux/lib/mk/lxip.mk b/repos/dde_linux/lib/mk/lxip.mk
index b457926e41..e972a17627 100644
--- a/repos/dde_linux/lib/mk/lxip.mk
+++ b/repos/dde_linux/lib/mk/lxip.mk
@@ -28,7 +28,7 @@ CC_CXX_OPT = -fpermissive
SRC_CC = dummies.cc lxcc_emul.cc nic_handler.cc \
timer_handler.cc random.cc
-SRC_CC += malloc.cc printf.cc env.cc
+SRC_CC += malloc.cc printf.cc bug.cc env.cc
SRC_C += driver.c dummies_c.c lxc_emul.c
diff --git a/repos/dde_linux/lib/mk/wifi.inc b/repos/dde_linux/lib/mk/wifi.inc
index 18922c6dbc..cc7337386e 100644
--- a/repos/dde_linux/lib/mk/wifi.inc
+++ b/repos/dde_linux/lib/mk/wifi.inc
@@ -20,7 +20,7 @@ SRC_CC += dummies.cc init.cc lxcc_emul.cc nic.cc socket_call.cc random.cc \
# lx_kit
SRC_CC += mapped_io_mem_range.cc irq.cc pci.cc malloc.cc scheduler.cc \
- work.cc timer.cc printf.cc env.cc
+ work.cc timer.cc printf.cc bug.cc env.cc
SRC_C += lxc_emul.c dummies_new.c
diff --git a/repos/dde_linux/src/drivers/framebuffer/imx8/target.mk b/repos/dde_linux/src/drivers/framebuffer/imx8/target.mk
index 4a11df4787..2f4706bc5e 100644
--- a/repos/dde_linux/src/drivers/framebuffer/imx8/target.mk
+++ b/repos/dde_linux/src/drivers/framebuffer/imx8/target.mk
@@ -7,6 +7,7 @@ SRC_C = dummies.c lx_emul_c.c
# lx_kit
SRC_CC += printf.cc \
+ bug.cc \
env.cc \
irq.cc \
malloc.cc \
diff --git a/repos/dde_linux/src/drivers/framebuffer/intel/target.mk b/repos/dde_linux/src/drivers/framebuffer/intel/target.mk
index 911138fbc9..debb7d3165 100644
--- a/repos/dde_linux/src/drivers/framebuffer/intel/target.mk
+++ b/repos/dde_linux/src/drivers/framebuffer/intel/target.mk
@@ -11,6 +11,7 @@ SRC_CC += irq.cc \
mapped_io_mem_range.cc \
pci.cc \
printf.cc \
+ bug.cc \
scheduler.cc \
timer.cc \
work.cc \
diff --git a/repos/dde_linux/src/drivers/nic/fec/target.inc b/repos/dde_linux/src/drivers/nic/fec/target.inc
index 22bfc7ef3a..7d4d7b8480 100644
--- a/repos/dde_linux/src/drivers/nic/fec/target.inc
+++ b/repos/dde_linux/src/drivers/nic/fec/target.inc
@@ -7,7 +7,7 @@ INC_DIR += $(PRG_DIR)/../..
INC_DIR += $(REP_DIR)/src/drivers/nic
# lx_kit
-SRC_CC += env.cc irq.cc malloc.cc scheduler.cc timer.cc work.cc printf.cc
+SRC_CC += env.cc irq.cc malloc.cc scheduler.cc timer.cc work.cc printf.cc bug.cc
INC_DIR += $(REP_DIR)/src/include
# contrib code
diff --git a/repos/dde_linux/src/drivers/usb/target.inc b/repos/dde_linux/src/drivers/usb/target.inc
index c6b4f5cedf..eeee8fb9bb 100644
--- a/repos/dde_linux/src/drivers/usb/target.inc
+++ b/repos/dde_linux/src/drivers/usb/target.inc
@@ -43,7 +43,7 @@ MOD_SUFFIX =
CC_OPT += -DMOD_SUFFIX=$(MOD_SUFFIX)
# lx_kit
-SRC_CC += printf.cc work.cc timer.cc scheduler.cc irq.cc malloc.cc env.cc
+SRC_CC += printf.cc bug.cc work.cc timer.cc scheduler.cc irq.cc malloc.cc env.cc
# common lib
SRC_C += lib/ctype.c
diff --git a/repos/dde_linux/src/drivers/usb_hid/target.mk b/repos/dde_linux/src/drivers/usb_hid/target.mk
index 82dea7c2ea..330d129401 100644
--- a/repos/dde_linux/src/drivers/usb_hid/target.mk
+++ b/repos/dde_linux/src/drivers/usb_hid/target.mk
@@ -1,7 +1,7 @@
TARGET := usb_hid_drv
SRC_C := dummies.c
SRC_CC := main.cc lx_emul.cc evdev.cc
-SRC_CC += printf.cc timer.cc scheduler.cc env.cc work.cc
+SRC_CC += printf.cc bug.cc timer.cc scheduler.cc env.cc work.cc
LIBS := base usb_hid_include lx_kit_setjmp
diff --git a/repos/dde_linux/src/drivers/usb_host/target.inc b/repos/dde_linux/src/drivers/usb_host/target.inc
index a3f061915c..8eeeeceabe 100644
--- a/repos/dde_linux/src/drivers/usb_host/target.inc
+++ b/repos/dde_linux/src/drivers/usb_host/target.inc
@@ -10,6 +10,7 @@ INC_DIR += $(REP_DIR)/src/include
# lx_kit
SRC_CC += lx_kit/printf.cc
+SRC_CC += lx_kit/bug.cc
SRC_CC += lx_kit/work.cc
SRC_CC += lx_kit/timer.cc
SRC_CC += lx_kit/scheduler.cc
diff --git a/repos/dde_linux/src/drivers/usb_modem/target.mk b/repos/dde_linux/src/drivers/usb_modem/target.mk
index 5f7fb1562e..2a18f6ab91 100644
--- a/repos/dde_linux/src/drivers/usb_modem/target.mk
+++ b/repos/dde_linux/src/drivers/usb_modem/target.mk
@@ -1,7 +1,7 @@
TARGET := usb_modem_drv
SRC_C := dummies.c lxc.c
SRC_CC := main.cc lx_emul.cc component.cc terminal.cc fec_nic.cc
-SRC_CC += printf.cc timer.cc scheduler.cc malloc.cc env.cc work.cc
+SRC_CC += printf.cc bug.cc timer.cc scheduler.cc malloc.cc env.cc work.cc
SRC_CC += uplink_client.cc
LIBS := base usb_modem_include lx_kit_setjmp nic_driver
diff --git a/repos/dde_linux/src/drivers/usb_net/target.mk b/repos/dde_linux/src/drivers/usb_net/target.mk
index a2a50c4f51..98152ebc91 100644
--- a/repos/dde_linux/src/drivers/usb_net/target.mk
+++ b/repos/dde_linux/src/drivers/usb_net/target.mk
@@ -1,7 +1,7 @@
TARGET := usb_net_drv
SRC_C := dummies.c lxc.c
SRC_CC := main.cc lx_emul.cc component.cc linux_network_session_base.cc
-SRC_CC += printf.cc timer.cc scheduler.cc malloc.cc env.cc work.cc
+SRC_CC += printf.cc bug.cc timer.cc scheduler.cc malloc.cc env.cc work.cc
SRC_CC += uplink_client.cc
LIBS := base usb_net_include lx_kit_setjmp nic_driver
diff --git a/repos/dde_linux/src/include/lx_emul/bug.h b/repos/dde_linux/src/include/lx_emul/bug.h
index 921a2624f5..f114f065b9 100644
--- a/repos/dde_linux/src/include/lx_emul/bug.h
+++ b/repos/dde_linux/src/include/lx_emul/bug.h
@@ -19,6 +19,8 @@
** asm/bug.h **
***************/
+extern void lx_sleep_forever() __attribute__((noreturn));
+
#define WARN_ON(condition) ({ \
int ret = !!(condition); \
if (ret) lx_printf("[%s] WARN_ON(%s) \n", __func__, #condition); \
@@ -31,7 +33,7 @@
#define BUG() do { \
lx_printf("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
- while (1); \
+ lx_sleep_forever(); \
} while (0)
#define WARN_ON_ONCE WARN_ON
diff --git a/repos/dde_linux/src/include/lx_emul/kernel.h b/repos/dde_linux/src/include/lx_emul/kernel.h
index 39ea0268f6..b6b1ede547 100644
--- a/repos/dde_linux/src/include/lx_emul/kernel.h
+++ b/repos/dde_linux/src/include/lx_emul/kernel.h
@@ -71,6 +71,9 @@ static inline int _printk(const char *fmt, ...)
#define vprintk(...)
#endif
+extern void lx_sleep_forever() __attribute__((noreturn));
+
+
static inline __printf(1, 2) void panic(const char *fmt, ...) __noreturn;
static inline void panic(const char *fmt, ...)
{
@@ -79,7 +82,7 @@ static inline void panic(const char *fmt, ...)
lx_vprintf(fmt, args);
va_end(args);
lx_printf("\npanic()\n");
- while (1) ;
+ lx_sleep_forever();
}
/*
diff --git a/repos/dde_linux/src/lx_kit/bug.cc b/repos/dde_linux/src/lx_kit/bug.cc
new file mode 100644
index 0000000000..f08bd6436c
--- /dev/null
+++ b/repos/dde_linux/src/lx_kit/bug.cc
@@ -0,0 +1,26 @@
+/*
+ * \brief C ABI for panicking / blocking forever
+ * \author Norman Feske
+ * \date 2021-03-08
+ */
+
+/*
+ * Copyright (C) 2021 Genode Labs GmbH
+ *
+ * This file is distributed under the terms of the GNU General Public License
+ * version 2.
+ */
+
+/* Genode includes */
+#include
+
+/* Linux emulation environment includes */
+#include
+#include
+#include
+
+
+extern "C" void lx_sleep_forever()
+{
+ Genode::sleep_forever();
+}