From 17328db3b33d67f2e5365fcb123d41aacc7ab16b Mon Sep 17 00:00:00 2001 From: David Kozub Date: Thu, 20 Nov 2014 21:53:14 +0100 Subject: [PATCH] grub-core/kern/arm/misc.S: fix unaligned grub_uint64_t local variable The unaligned local in __aeabi_uidivmod leads to a store to a 64bit value at an address that is not divisible by 8 (in grub_divmod64). The compiler most likely generates a STRD instruction to store it and this causes an exception. Fixes Savannah bug #43632. This includes improvements done by Leif Lindholm. --- ChangeLog | 6 ++++++ grub-core/kern/arm/misc.S | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6f2924e41..4150810a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-12-07 David Kozub + + * grub-core/kern/arm/misc.S: fix unaligned 64bit local variable + in __aeabi_uidivmod + Fixes Savannah bug #43632. + 2014-12-07 Peter Nelson * grub-core/fs/ext2.c (grub_ext2_read_block): Support large sparse diff --git a/grub-core/kern/arm/misc.S b/grub-core/kern/arm/misc.S index 8943cc302..16b6f8e60 100644 --- a/grub-core/kern/arm/misc.S +++ b/grub-core/kern/arm/misc.S @@ -60,17 +60,17 @@ FUNCTION(__aeabi_lmul) .macro division parent - stmfd sp!, {lr} - sub sp, sp, #12 + sub sp, sp, #8 @ Allocate naturally aligned 64-bit space + stmfd sp!, {r3,lr} @ Dummy r3 to maintain stack alignment + add r3, sp, #8 @ Set r3 to address of 64-bit space + str r3, [sp] @ Stack parameter, pointer to 64-bit space mov r2, r1 - add r1, sp, #4 - str r1, [sp, #0] mov r1, #0 mov r3, #0 bl \parent - ldr r1, [sp, #4] - add sp, sp, #12 - ldmfd sp!, {lr} + ldr r1, [sp, #8] @ Extract remainder + ldmfd sp!, {r3,lr} @ Pop into an unused arg/scratch register + add sp, sp, #8 bx lr .endm