summaryrefslogtreecommitdiff
path: root/arch/mips
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-05-24 23:03:47 -0400
committerRich Felker <dalias@aerifal.cx>2015-05-24 23:03:47 -0400
commit9f26ebded188ed78c3571a4ca1477dd6351bc647 (patch)
tree18b0b0591589abf3dc7fccb9529ca64a21184b75 /arch/mips
parent63caf1d207d143fe405bbe0cda9aac8deca1171a (diff)
downloadmusl-9f26ebded188ed78c3571a4ca1477dd6351bc647.tar.gz
musl-9f26ebded188ed78c3571a4ca1477dd6351bc647.tar.bz2
musl-9f26ebded188ed78c3571a4ca1477dd6351bc647.tar.xz
musl-9f26ebded188ed78c3571a4ca1477dd6351bc647.zip
fix stack alignment code in mips crt_arch.h
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.
Diffstat (limited to 'arch/mips')
-rw-r--r--arch/mips/crt_arch.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/mips/crt_arch.h b/arch/mips/crt_arch.h
index 058de5c3..21e139b9 100644
--- a/arch/mips/crt_arch.h
+++ b/arch/mips/crt_arch.h
@@ -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"
);