summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/boot/efi/efi-string.h2
-rw-r--r--src/boot/efi/log.c22
-rw-r--r--src/boot/efi/util.c6
3 files changed, 21 insertions, 9 deletions
diff --git a/src/boot/efi/efi-string.h b/src/boot/efi/efi-string.h
index 410bfd8ef5..4df37a8505 100644
--- a/src/boot/efi/efi-string.h
+++ b/src/boot/efi/efi-string.h
@@ -126,7 +126,7 @@ _gnu_printf_(2, 0) _warn_unused_result_ char16_t *xvasprintf_status(EFI_STATUS s
/* inttypes.h is provided by libc instead of the compiler and is not supposed to be used in freestanding
* environments. We could use clang __*_FMT*__ constants for this, bug gcc does not have them. :( */
-# if defined(__ILP32__)
+# if defined(__ILP32__) || defined(__arm__)
# define PRI64_PREFIX "ll"
# elif defined(__LP64__)
# define PRI64_PREFIX "l"
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();
-}