diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot/efi/log.c | 22 | ||||
-rw-r--r-- | 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 4d8ad93716..9cbbb3a933 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 19c4788b8f..588d60dd06 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(); -} |