fix stack alignment code in mips crt_arch.h
authorRich Felker <dalias@aerifal.cx>
Mon, 25 May 2015 03:03:47 +0000 (23:03 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 25 May 2015 03:03:47 +0000 (23:03 -0400)
the instruction used to align the stack, "and $sp, $sp, -8", does not
actually exist; it's expanded to 2 instructions using the 'at'
(assembler temporary) register, and thus cannot be used in a branch
delay slot. since alignment mod 16 commutes with subtracting 8, simply
swapping these two operations fixes the problem.

crt1.o was not affected because it's still being generated from a
dedicated asm source file. dlstart.lo was not affected because the
stack pointer it receives is already aligned by the kernel. but
Scrt1.o was affected in cases where the dynamic linker gave it a
misaligned stack pointer.

arch/mips/crt_arch.h

index 058de5c3173c50e017ae9ae044f3ad165ee22c9a..21e139b9310c9beb53221de61b6b4a367051bab5 100644 (file)
@@ -22,8 +22,8 @@ __asm__(
 "      addu $5, $5, $gp \n"
 "      lw $25, 4($ra) \n"
 "      addu $25, $25, $gp \n"
-"      subu $sp, $sp, 16 \n"
+"      and $sp, $sp, -8 \n"
 "      jalr $25 \n"
-"       and $sp, $sp, -8 \n"
+"       subu $sp, $sp, 16 \n"
 ".set pop \n"
 );