From 54b7103af4a93369e99a5df80d05dd6f70f17c0b Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 29 Jan 2010 01:54:52 +0000 Subject: [PATCH] Fix microMIPS glibc by avoiding hardcoded instruction length assumptions. microMIPS is a variable-length encoding of the MIPS32 instruction set (plus some extra instructions). As it supports almost all of MIPS32, assembly sources in glibc do not generally need changes to work with microMIPS, but dl-trampoline.c contains some code with a hardcoded assumption that three instructions occupy twelve bytes. This patch fixes this code for microMIPS by using the difference between two labels to let the assembler calculate the relevant length. --- ChangeLog.mips | 6 ++++++ sysdeps/mips/dl-trampoline.c | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ChangeLog.mips b/ChangeLog.mips index 5795926d35..6d47986f68 100644 --- a/ChangeLog.mips +++ b/ChangeLog.mips @@ -1,3 +1,9 @@ +2010-01-28 Joseph Myers + + * sysdeps/mips/dl-trampoline.c (_dl_runtime_resolve, + _dl_runtime_pltresolve): Calculate offset from start of function + to .cpload instead of hardcoding instruction size. + 2010-01-11 Joseph Myers * sysdeps/unix/sysv/linux/mips/bits/stat.h: Fix double-inclusion diff --git a/sysdeps/mips/dl-trampoline.c b/sysdeps/mips/dl-trampoline.c index ff58b0d5e2..2c9414035c 100644 --- a/sysdeps/mips/dl-trampoline.c +++ b/sysdeps/mips/dl-trampoline.c @@ -278,13 +278,13 @@ _dl_runtime_resolve:\n\ .frame $29, " STRINGXP(ELF_DL_FRAME_SIZE) ", $31\n\ .set noreorder\n\ # Save GP.\n\ - move $3, $28\n\ +1: move $3, $28\n\ # Save arguments and sp value in stack.\n\ " STRINGXP(PTR_SUBIU) " $29, " STRINGXP(ELF_DL_FRAME_SIZE) "\n\ # Modify t9 ($25) so as to point .cpload instruction.\n\ - " IFABIO32(STRINGXP(PTR_ADDIU) " $25, 12\n") "\ + " IFABIO32(STRINGXP(PTR_ADDIU) " $25, (2f-1b)\n") "\ # Compute GP.\n\ - " STRINGXP(SETUP_GP) "\n\ +2: " STRINGXP(SETUP_GP) "\n\ " STRINGXV(SETUP_GP64 (0, _dl_runtime_resolve)) "\n\ .set reorder\n\ # Save slot call pc.\n\ @@ -334,13 +334,13 @@ _dl_runtime_pltresolve:\n\ .frame $29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) ", $31\n\ .set noreorder\n\ # Save arguments and sp value in stack.\n\ - " STRINGXP(PTR_SUBIU) " $29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\ +1: " STRINGXP(PTR_SUBIU) " $29, " STRINGXP(ELF_DL_PLT_FRAME_SIZE) "\n\ " IFABIO32(STRINGXP(PTR_L) " $13, " STRINGXP(PTRSIZE) "($28)") "\n\ " IFNEWABI(STRINGXP(PTR_L) " $13, " STRINGXP(PTRSIZE) "($14)") "\n\ # Modify t9 ($25) so as to point .cpload instruction.\n\ - " IFABIO32(STRINGXP(PTR_ADDIU) " $25, 12\n") "\ + " IFABIO32(STRINGXP(PTR_ADDIU) " $25, (2f-1b)\n") "\ # Compute GP.\n\ - " STRINGXP(SETUP_GP) "\n\ +2: " STRINGXP(SETUP_GP) "\n\ " STRINGXV(SETUP_GP64 (0, _dl_runtime_pltresolve)) "\n\ .set reorder\n\ " IFABIO32(STRINGXP(CPRESTORE(32))) "\n\