From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B88B7C00140 for ; Sun, 21 Aug 2022 13:40:02 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 15B2E84133; Sun, 21 Aug 2022 15:40:00 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="CKEFvS1s"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id F0C6084109; Sun, 21 Aug 2022 15:39:57 +0200 (CEST) Received: from mail-lj1-x231.google.com (mail-lj1-x231.google.com [IPv6:2a00:1450:4864:20::231]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0851E84117 for ; Sun, 21 Aug 2022 15:39:55 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=saproj@gmail.com Received: by mail-lj1-x231.google.com with SMTP id l19so5292703ljg.8 for ; Sun, 21 Aug 2022 06:39:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc; bh=vEf4Oy+6SWkANUKDABi3cIrtnVacXjErOdhasFE+ZhQ=; b=CKEFvS1say8VyxE/+xoGDzlBbHBTbuD+d4vpqCoaRQV+1A3aEwKQB174X5N+WZ0UMG YJPJ943TAPn2MH+829JCM9y8gh9A2kfbIruioH43o1CnDpEE848PGm1bvjMM8wu+Wogg mIpZIg3ii53vUZiFOfA+w85KVyJU1S5IHpz7eYctoe/BSi5N7sArcgfJZQ2yvoR++WDI uUN9Is2trEMGgUq3m1m3sV0Ya8EVgh/Grkvwk5YVbb+bLRFVIu4jaePrp5NroxfaDdgn AFdVIiUjJzecDxMYDT8UBcVFTHkebUJHL5Hu1/twps5EVctWcYV2i2RAStRGhZFDRhqT 5tdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc; bh=vEf4Oy+6SWkANUKDABi3cIrtnVacXjErOdhasFE+ZhQ=; b=F6/yHTPqhBnAHaPBT9ngLaehLLjgr9XByIEmWXI2w1swqxWrewQBlFBlY3JgqFEUEE JZ5yUVjaf4LJK1OR+EV0AAA9UHEd8K5zooZykPjgfV2FF645X0js9WM+ZWmgwo1nbqt2 kICgFzkbRatxH8klWUEOVpZMUqz6MccZk5tIIClwqWgtd11ah9u6K/wjzfuOTNQf0HGx 7Jng4HF8k05xqOVM0/1pH789jtcL7oUk1gRWK/AE/e4oyjwmGRMsPoDh4zJWczFRH5EG Rudm6CFrV47gFpMIokXD2vXV7ffETuVsYPG4ZweVO2LjrXgoUF8FgVqlyNf1EEwXU24/ 3MZA== X-Gm-Message-State: ACgBeo3vmwITxCROKeadlx/KlttEE0HFOooMDi9qDTl2skAjYjhsSUt9 ClzDduZycU6MgiakbemDFveXm6Bzq9Tws1uy X-Google-Smtp-Source: AA6agR7fqJlYuY480sgC3glAsi2TQZrvJ9yzhTRWPXIEDbVlXuOBCErLJxNU2qvPFaNsaZR9NdcZyQ== X-Received: by 2002:a2e:a552:0:b0:25e:6fa1:a6c4 with SMTP id e18-20020a2ea552000000b0025e6fa1a6c4mr4380183ljn.90.1661089194221; Sun, 21 Aug 2022 06:39:54 -0700 (PDT) Received: from saproj-Latitude-5501.yandex.net ([2a02:6b8:0:40c:f471:b808:d2b7:787d]) by smtp.gmail.com with ESMTPSA id 3-20020ac25f03000000b00492c5ec6f84sm1273950lfq.249.2022.08.21.06.39.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 21 Aug 2022 06:39:53 -0700 (PDT) From: Sergei Antonov To: u-boot@lists.denx.de Cc: Sergei Antonov , Samuel Holland , Ye Li , Simon Glass , Andre Przywara , Marek Vasut , Sean Anderson , Tom Rini Subject: [PATCH v2] arm: ARMv4 assembly compatibility Date: Sun, 21 Aug 2022 16:34:20 +0300 Message-Id: <20220821133420.418232-1-saproj@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean There is currently a problem that U-Boot can not work on ARMv4 because assembly imlementations of memcpy() and some other functions use "bx lr" instruction that is not available on ARMv4 ("mov pc, lr" should be used instead). A working preprocessor-based solution to this problem is found in arch/arm/lib/relocate.S. Move it to the "ret" macro in arch/arm/include/asm/assembler.h and change all "bx lr" code to "ret lr" in functions that may run on ARMv4. Linux source code deals with this problem in the same manner. v1 -> v2: Comment update. Pointed out by Andre Przywara. Signed-off-by: Sergei Antonov CC: Samuel Holland CC: Ye Li CC: Simon Glass CC: Andre Przywara CC: Marek Vasut CC: Sean Anderson CC: Tom Rini --- arch/arm/include/asm/assembler.h | 10 ++++++++-- arch/arm/lib/lib1funcs.S | 8 ++++---- arch/arm/lib/memcpy.S | 6 +++--- arch/arm/lib/relocate.S | 10 ++-------- arch/arm/lib/setjmp.S | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index b14691858601..8d42ef4823e9 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h @@ -58,16 +58,22 @@ #endif /* - * We only support cores that support at least Thumb-1 and thus we use - * 'bx lr' + * Use 'bx lr' everywhere except ARMv4 (without 'T') where only 'mov pc, lr' + * works */ .irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo .macro ret\c, reg + + /* ARMv4- don't know bx lr but the assembler fails to see that */ +#ifdef __ARM_ARCH_4__ + mov\c pc, \reg +#else .ifeqs "\reg", "lr" bx\c \reg .else mov\c pc, \reg .endif +#endif .endm .endr diff --git a/arch/arm/lib/lib1funcs.S b/arch/arm/lib/lib1funcs.S index 700eee5fbbe0..7ff4446dd644 100644 --- a/arch/arm/lib/lib1funcs.S +++ b/arch/arm/lib/lib1funcs.S @@ -377,7 +377,7 @@ ENTRY(__gnu_thumb1_case_sqi) lsls r1, r1, #1 add lr, lr, r1 pop {r1} - bx lr + ret lr ENDPROC(__gnu_thumb1_case_sqi) .popsection @@ -391,7 +391,7 @@ ENTRY(__gnu_thumb1_case_uqi) lsls r1, r1, #1 add lr, lr, r1 pop {r1} - bx lr + ret lr ENDPROC(__gnu_thumb1_case_uqi) .popsection @@ -406,7 +406,7 @@ ENTRY(__gnu_thumb1_case_shi) lsls r1, r1, #1 add lr, lr, r1 pop {r0, r1} - bx lr + ret lr ENDPROC(__gnu_thumb1_case_shi) .popsection @@ -421,7 +421,7 @@ ENTRY(__gnu_thumb1_case_uhi) lsls r1, r1, #1 add lr, lr, r1 pop {r0, r1} - bx lr + ret lr ENDPROC(__gnu_thumb1_case_uhi) .popsection #endif diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S index eee7a219ce36..a1c996f94ef2 100644 --- a/arch/arm/lib/memcpy.S +++ b/arch/arm/lib/memcpy.S @@ -59,7 +59,7 @@ #endif ENTRY(memcpy) cmp r0, r1 - bxeq lr + reteq lr enter r4, lr @@ -148,7 +148,7 @@ ENTRY(memcpy) str1b r0, ip, cs, abort=21f exit r4, lr - bx lr + ret lr 9: rsb ip, ip, #4 cmp ip, #2 @@ -258,7 +258,7 @@ ENTRY(memcpy) .macro copy_abort_end ldmfd sp!, {r4, lr} - bx lr + ret lr .endm ENDPROC(memcpy) diff --git a/arch/arm/lib/relocate.S b/arch/arm/lib/relocate.S index 5102bfabde4a..dd6f2e3bd5e0 100644 --- a/arch/arm/lib/relocate.S +++ b/arch/arm/lib/relocate.S @@ -61,7 +61,7 @@ ENTRY(relocate_vectors) stmia r1!, {r2-r8,r10} #endif #endif - bx lr + ret lr ENDPROC(relocate_vectors) @@ -127,13 +127,7 @@ relocate_done: mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */ #endif - /* ARMv4- don't know bx lr but the assembler fails to see that */ - -#ifdef __ARM_ARCH_4__ - mov pc, lr -#else - bx lr -#endif + ret lr ENDPROC(relocate_code) diff --git a/arch/arm/lib/setjmp.S b/arch/arm/lib/setjmp.S index 176a1d5315bf..2f041aeef01c 100644 --- a/arch/arm/lib/setjmp.S +++ b/arch/arm/lib/setjmp.S @@ -17,7 +17,7 @@ ENTRY(setjmp) mov ip, sp stm a1, {v1-v8, ip, lr} mov a1, #0 - bx lr + ret lr ENDPROC(setjmp) .popsection @@ -31,6 +31,6 @@ ENTRY(longjmp) bne 1f mov a1, #1 1: - bx lr + ret lr ENDPROC(longjmp) .popsection -- 2.34.1