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 6fbec06..8728c04 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-11-21 David Kozub <zub....@gmail.com> + + * grub-core/kern/arm/misc.S: fix unaligned 64bit local variable + in __aeabi_uidivmod + Fixes Savannah bug #43632. + 2014-11-20 Andrei Borzenkov <arvidj...@gmail.com> * tests/util/grub-fs-tester.in: Consistently print output diff --git a/grub-core/kern/arm/misc.S b/grub-core/kern/arm/misc.S index 8943cc3..16b6f8e 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 -- 2.1.1 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel