From: Jan Janssen Date: Mon, 27 Feb 2023 17:43:07 +0000 (+0100) Subject: boot: Provide div0 handlers for ARM X-Git-Tag: v254-rc1~1144^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F26608%2Fhead;p=thirdparty%2Fsystemd.git boot: Provide div0 handlers for ARM This is a cleaner approach to 59833064742310bfccf028b0278811ba5cff8dcf. --- 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(); -}