arm: Add ENTRY/ENDPROC to private libgcc functions
When CONFIG_SYS_THUMB_BUILD is defined these functions may be called from Thumb code. Add the required ENTRY and ENDPROC bracketing so that BLX is used to call these ARM functions, instead of plain BL, which will fail. Signed-off-by: Simon Glass <sjg@chromium.org> Reported-by: Pavel Machek <pavel@denx.de>
This commit is contained in:
parent
6f43ba70d1
commit
1251d51ca5
|
@ -4,6 +4,8 @@
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define al r1
|
#define al r1
|
||||||
#define ah r0
|
#define ah r0
|
||||||
|
@ -13,9 +15,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.globl __ashldi3
|
.globl __ashldi3
|
||||||
.globl __aeabi_llsl
|
|
||||||
__ashldi3:
|
__ashldi3:
|
||||||
__aeabi_llsl:
|
ENTRY(__aeabi_llsl)
|
||||||
|
|
||||||
subs r3, r2, #32
|
subs r3, r2, #32
|
||||||
rsb ip, r2, #32
|
rsb ip, r2, #32
|
||||||
|
@ -24,3 +25,4 @@ __aeabi_llsl:
|
||||||
orrmi ah, ah, al, lsr ip
|
orrmi ah, ah, al, lsr ip
|
||||||
mov al, al, lsl r2
|
mov al, al, lsl r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_llsl)
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define al r1
|
#define al r1
|
||||||
#define ah r0
|
#define ah r0
|
||||||
|
@ -13,9 +15,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.globl __ashrdi3
|
.globl __ashrdi3
|
||||||
.globl __aeabi_lasr
|
|
||||||
__ashrdi3:
|
__ashrdi3:
|
||||||
__aeabi_lasr:
|
ENTRY(__aeabi_lasr)
|
||||||
|
|
||||||
subs r3, r2, #32
|
subs r3, r2, #32
|
||||||
rsb ip, r2, #32
|
rsb ip, r2, #32
|
||||||
|
@ -24,3 +25,4 @@ __aeabi_lasr:
|
||||||
orrmi al, al, ah, lsl ip
|
orrmi al, al, ah, lsl ip
|
||||||
mov ah, ah, asr r2
|
mov ah, ah, asr r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_lasr)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
.macro ARM_DIV_BODY dividend, divisor, result, curbit
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 5
|
#if __LINUX_ARM_ARCH__ >= 5
|
||||||
|
@ -95,9 +97,8 @@
|
||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
.globl __divsi3
|
.globl __divsi3
|
||||||
.globl __aeabi_idiv
|
|
||||||
__divsi3:
|
__divsi3:
|
||||||
__aeabi_idiv:
|
ENTRY(__aeabi_idiv)
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
eor ip, r0, r1 @ save the sign of the result.
|
eor ip, r0, r1 @ save the sign of the result.
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
|
@ -139,3 +140,4 @@ Ldiv0:
|
||||||
bl __div0
|
bl __div0
|
||||||
mov r0, #0 @ About as wrong as it could be.
|
mov r0, #0 @ About as wrong as it could be.
|
||||||
ldr pc, [sp], #4
|
ldr pc, [sp], #4
|
||||||
|
ENDPROC(__aeabi_idiv)
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define al r1
|
#define al r1
|
||||||
#define ah r0
|
#define ah r0
|
||||||
|
@ -13,9 +15,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.globl __lshrdi3
|
.globl __lshrdi3
|
||||||
.globl __aeabi_llsr
|
|
||||||
__lshrdi3:
|
__lshrdi3:
|
||||||
__aeabi_llsr:
|
ENTRY(__aeabi_llsr)
|
||||||
|
|
||||||
subs r3, r2, #32
|
subs r3, r2, #32
|
||||||
rsb ip, r2, #32
|
rsb ip, r2, #32
|
||||||
|
@ -24,3 +25,4 @@ __aeabi_llsr:
|
||||||
orrmi al, al, ah, lsl ip
|
orrmi al, al, ah, lsl ip
|
||||||
mov ah, ah, lsr r2
|
mov ah, ah, lsr r2
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_llsr)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
.macro ARM_MOD_BODY dividend, divisor, order, spare
|
.macro ARM_MOD_BODY dividend, divisor, order, spare
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 5
|
#if __LINUX_ARM_ARCH__ >= 5
|
||||||
|
@ -69,8 +71,7 @@
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.align 5
|
.align 5
|
||||||
.globl __modsi3
|
ENTRY(__modsi3)
|
||||||
__modsi3:
|
|
||||||
cmp r1, #0
|
cmp r1, #0
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
rsbmi r1, r1, #0 @ loops below use unsigned.
|
rsbmi r1, r1, #0 @ loops below use unsigned.
|
||||||
|
@ -88,7 +89,7 @@ __modsi3:
|
||||||
10: cmp ip, #0
|
10: cmp ip, #0
|
||||||
rsbmi r0, r0, #0
|
rsbmi r0, r0, #0
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__modsi3)
|
||||||
|
|
||||||
Ldiv0:
|
Ldiv0:
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
/* # 1 "libgcc1.S" */
|
/* # 1 "libgcc1.S" */
|
||||||
@ libgcc1 routines for ARM cpu.
|
@ libgcc1 routines for ARM cpu.
|
||||||
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
||||||
|
@ -72,8 +74,7 @@ Ldiv0:
|
||||||
ldmia sp!, {pc}
|
ldmia sp!, {pc}
|
||||||
.size __udivsi3 , . - __udivsi3
|
.size __udivsi3 , . - __udivsi3
|
||||||
|
|
||||||
.globl __aeabi_uidivmod
|
ENTRY(__aeabi_uidivmod)
|
||||||
__aeabi_uidivmod:
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
stmfd sp!, {r0, r1, ip, lr}
|
||||||
bl __aeabi_uidiv
|
bl __aeabi_uidiv
|
||||||
|
@ -81,9 +82,9 @@ __aeabi_uidivmod:
|
||||||
mul r3, r0, r2
|
mul r3, r0, r2
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_uidivmod)
|
||||||
|
|
||||||
.globl __aeabi_idivmod
|
ENTRY(__aeabi_idivmod)
|
||||||
__aeabi_idivmod:
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r1, ip, lr}
|
stmfd sp!, {r0, r1, ip, lr}
|
||||||
bl __aeabi_idiv
|
bl __aeabi_idiv
|
||||||
|
@ -91,3 +92,4 @@ __aeabi_idivmod:
|
||||||
mul r3, r0, r2
|
mul r3, r0, r2
|
||||||
sub r1, r1, r3
|
sub r1, r1, r3
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
ENDPROC(__aeabi_idivmod)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
/* # 1 "libgcc1.S" */
|
/* # 1 "libgcc1.S" */
|
||||||
@ libgcc1 routines for ARM cpu.
|
@ libgcc1 routines for ARM cpu.
|
||||||
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk)
|
||||||
|
@ -11,10 +13,9 @@ curbit .req r3
|
||||||
/* lr .req r14 */
|
/* lr .req r14 */
|
||||||
/* pc .req r15 */
|
/* pc .req r15 */
|
||||||
.text
|
.text
|
||||||
.globl __umodsi3
|
|
||||||
.type __umodsi3 ,function
|
.type __umodsi3 ,function
|
||||||
.align 0
|
.align 0
|
||||||
__umodsi3 :
|
ENTRY(__umodsi3)
|
||||||
cmp divisor, #0
|
cmp divisor, #0
|
||||||
beq Ldiv0
|
beq Ldiv0
|
||||||
mov curbit, #1
|
mov curbit, #1
|
||||||
|
@ -86,3 +87,4 @@ Ldiv0:
|
||||||
/* # 456 "libgcc1.S" */
|
/* # 456 "libgcc1.S" */
|
||||||
/* # 500 "libgcc1.S" */
|
/* # 500 "libgcc1.S" */
|
||||||
/* # 580 "libgcc1.S" */
|
/* # 580 "libgcc1.S" */
|
||||||
|
ENDPROC(__umodsi3)
|
||||||
|
|
Loading…
Reference in New Issue