From ce7180b6804888698bea2656b7d8436c05872730 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Feb 2023 18:43:07 +0100 Subject: [PATCH] boot: Provide div0 handlers for ARM This is a cleaner approach to 59833064742310bfccf028b0278811ba5cff8dcf. --- src/boot/efi/log.c | 22 ++++++++++++++++++++-- src/boot/efi/util.c | 6 ------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/boot/efi/log.c b/src/boot/efi/log.c index 4d8ad937168..9cbbb3a9337 100644 --- a/src/boot/efi/log.c +++ b/src/boot/efi/log.c @@ -5,12 +5,16 @@ static unsigned log_count = 0; -void efi_assert(const char *expr, const char *file, unsigned line, const char *function) { - log_error("systemd-boot assertion '%s' failed at %s:%u@%s. Halting.", expr, file, line, function); +_noreturn_ static void freeze(void) { for (;;) BS->Stall(60 * 1000 * 1000); } +void efi_assert(const char *expr, const char *file, unsigned line, const char *function) { + log_error("systemd-boot assertion '%s' failed at %s:%u@%s. Halting.", expr, file, line, function); + freeze(); +} + EFI_STATUS log_internal(EFI_STATUS status, const char *format, ...) { assert(format); @@ -39,3 +43,17 @@ void log_wait(void) { BS->Stall(MIN(4u, log_count) * 2500 * 1000); log_count = 0; } + +#if defined(__ARM_EABI__) +/* These override the (weak) div0 handlers from libgcc as they would otherwise call raise() instead. */ + +_used_ _noreturn_ int __aeabi_idiv0(int return_value) { + log_error("Division by zero."); + freeze(); +} + +_used_ _noreturn_ long long __aeabi_ldiv0(long long return_value) { + log_error("Division by zero."); + freeze(); +} +#endif diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index 19c4788b8f0..588d60dd061 100644 --- a/src/boot/efi/util.c +++ b/src/boot/efi/util.c @@ -629,9 +629,3 @@ void *find_configuration_table(const EFI_GUID *guid) { return NULL; } - -/* libgcc's __aeabi_ldiv0 intrinsic will call raise() on division by zero, so we - * need to provide one ourselves for now. */ -_used_ _noreturn_ int raise(int sig) { - assert_not_reached(); -} -- 2.47.3