summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2023-02-27 18:43:07 +0100
committerJan Janssen <medhefgo@web.de>2023-02-28 14:37:05 +0100
commitce7180b6804888698bea2656b7d8436c05872730 (patch)
tree3b933b7c5876c8034309492fa51ac3d28edcb840 /src
parentboot: Fix data model detection for ARM (diff)
downloadsystemd-ce7180b6804888698bea2656b7d8436c05872730.tar.xz
systemd-ce7180b6804888698bea2656b7d8436c05872730.zip
boot: Provide div0 handlers for ARM
This is a cleaner approach to 59833064742310bfccf028b0278811ba5cff8dcf.
Diffstat (limited to 'src')
-rw-r--r--src/boot/efi/log.c22
-rw-r--r--src/boot/efi/util.c6
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();
-}