From 755aed7cb2fce785d54c0f60573b7c08f8d761a5 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Mon, 8 Mar 2021 11:30:41 +0100 Subject: [PATCH] dde_linux: don't spin when panicking Issue #3997 --- repos/dde_linux/lib/mk/lxip.mk | 2 +- repos/dde_linux/lib/mk/wifi.inc | 2 +- .../src/drivers/framebuffer/imx8/target.mk | 1 + .../src/drivers/framebuffer/intel/target.mk | 1 + .../dde_linux/src/drivers/nic/fec/target.inc | 2 +- repos/dde_linux/src/drivers/usb/target.inc | 2 +- repos/dde_linux/src/drivers/usb_hid/target.mk | 2 +- .../dde_linux/src/drivers/usb_host/target.inc | 1 + .../dde_linux/src/drivers/usb_modem/target.mk | 2 +- repos/dde_linux/src/drivers/usb_net/target.mk | 2 +- repos/dde_linux/src/include/lx_emul/bug.h | 4 ++- repos/dde_linux/src/include/lx_emul/kernel.h | 5 +++- repos/dde_linux/src/lx_kit/bug.cc | 26 +++++++++++++++++++ 13 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 repos/dde_linux/src/lx_kit/bug.cc 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(); +}