From patchwork Tue May 14 20:03:00 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Albert ARIBAUD X-Patchwork-Id: 243817 X-Patchwork-Delegate: albert.aribaud@free.fr Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id BD85F2C00A9 for ; Wed, 15 May 2013 06:03:59 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 7A2BB4A020; Tue, 14 May 2013 22:03:58 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iZxwMyKRk3Ny; Tue, 14 May 2013 22:03:58 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 368DD4A027; Tue, 14 May 2013 22:03:56 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D52194A027 for ; Tue, 14 May 2013 22:03:53 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pOrddHT62sRW for ; Tue, 14 May 2013 22:03:53 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from smtp1-g21.free.fr (smtp1-g21.free.fr [212.27.42.1]) by theia.denx.de (Postfix) with ESMTP id 71A4B4A040 for ; Tue, 14 May 2013 22:03:44 +0200 (CEST) Received: from localhost.localdomain (unknown [IPv6:2a01:e35:2eb9:20:9d7b:1f7:2f:c177]) (Authenticated sender: albert.aribaud) by smtp1-g21.free.fr (Postfix) with ESMTPSA id 0FDCF940144; Tue, 14 May 2013 22:03:36 +0200 (CEST) From: Albert ARIBAUD To: U-Boot Date: Tue, 14 May 2013 22:03:00 +0200 Message-Id: <1368561780-19104-6-git-send-email-albert.u.boot@aribaud.net> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1368561780-19104-5-git-send-email-albert.u.boot@aribaud.net> References: <1368561780-19104-1-git-send-email-albert.u.boot@aribaud.net> <1368561780-19104-2-git-send-email-albert.u.boot@aribaud.net> <1368561780-19104-3-git-send-email-albert.u.boot@aribaud.net> <1368561780-19104-4-git-send-email-albert.u.boot@aribaud.net> <1368561780-19104-5-git-send-email-albert.u.boot@aribaud.net> MIME-Version: 1.0 Subject: [U-Boot] [PATCH 5/5] arm: optimize relocate_code routine X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.11 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Use section symbols directly Drop support for R_ARM_ABS32 record types Eliminate unneeded intermediate registers Optimize relocation table iteration Signed-off-by: Albert ARIBAUD --- arch/arm/lib/relocate.S | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S index 818735c..75ee3b4 100644 --- a/arch/arm/lib/relocate.S +++ b/arch/arm/lib/relocate.S @@ -37,51 +37,36 @@ * This function relocates the monitor code. */ ENTRY(relocate_code) - mov r6, r0 /* save addr of destination */ - ldr r0, =__image_copy_start /* r0 <- source start address */ - subs r9, r6, r0 /* r9 <- relocation offset */ + ldr r1, =__image_copy_start /* r1 <- source start address */ + subs r9, r0, r1 /* r9 <- relocation offset */ beq relocate_done /* skip relocation */ - mov r1, r6 /* r1 <- scratch for copy loop */ ldr r2, =__image_copy_end /* r2 <- source end address */ copy_loop: - ldmia r0!, {r10-r11} /* copy from source address [r0] */ - stmia r1!, {r10-r11} /* copy to target address [r1] */ - cmp r0, r2 /* until source end address [r2] */ + ldmia r1!, {r10-r11} /* copy from source address [r1] */ + stmia r0!, {r10-r11} /* copy to target address [r0] */ + cmp r1, r2 /* until source end address [r2] */ blo copy_loop /* * fix .rel.dyn relocations */ - ldr r10, =__dynsym_start /* r10 <- sym table ofs */ ldr r2, =__rel_dyn_start /* r2 <- rel dyn start ofs */ ldr r3, =__rel_dyn_end /* r3 <- rel dyn end ofs */ fixloop: - ldr r0, [r2] /* r0 <- SRC location to fix up */ - add r0, r0, r9 /* r0 <- DST location to fix up */ - ldr r1, [r2, #4] - and r7, r1, #0xff - cmp r7, #23 /* relative fixup? */ - beq fixrel - cmp r7, #2 /* absolute fixup? */ - beq fixabs - /* ignore unknown type of fixup */ - b fixnext -fixabs: - /* absolute fix: set location to (offset) symbol value */ - mov r1, r1, LSR #4 /* r1 <- symbol index in .dynsym */ - add r1, r10, r1 /* r1 <- address of symbol in table */ - ldr r1, [r1, #4] /* r1 <- symbol value */ - add r1, r1, r9 /* r1 <- relocated sym addr */ - b fixnext -fixrel: + ldmia r2!, {r0-r1} /* (r0,r1) <- (SRC location,fixup) */ + and r1, r1, #0xff /* r1 <- fixup type */ + cmp r1, #23 /* relative fixup? */ + bne fixnext + /* relative fix: increase location by offset */ - ldr r1, [r0] - add r1, r1, r9 + add r0, r0, r9 /* r0 <- DST location to fix up */ + ldr r1, [r0] /* r1 <- content to fix up */ + add r1, r1, r9 /* fix up */ + str r1, [r0] /* write back fixed-up content */ + fixnext: - str r1, [r0] - add r2, r2, #8 /* each rel.dyn entry is 8 bytes */ cmp r2, r3 blo fixloop