Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b592783 authored by Catalin Marinas's avatar Catalin Marinas
Browse files

Thumb-2: Implement the unified arch/arm/lib functions



This patch adds the ARM/Thumb-2 unified support for the arch/arm/lib/*
files.

Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>

parent 347c8b70
Loading
Loading
Loading
Loading
+73 −0
Original line number Original line Diff line number Diff line
@@ -138,3 +138,76 @@
	msr	cpsr_c, #\mode
	msr	cpsr_c, #\mode
	.endm
	.endm
#endif
#endif

/*
 * STRT/LDRT access macros with ARM and Thumb-2 variants
 */
#ifdef CONFIG_THUMB2_KERNEL

	.macro	usraccoff, instr, reg, ptr, inc, off, cond, abort
9999:
	.if	\inc == 1
	\instr\cond\()bt \reg, [\ptr, #\off]
	.elseif	\inc == 4
	\instr\cond\()t \reg, [\ptr, #\off]
	.else
	.error	"Unsupported inc macro argument"
	.endif

	.section __ex_table,"a"
	.align	3
	.long	9999b, \abort
	.previous
	.endm

	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort
	@ explicit IT instruction needed because of the label
	@ introduced by the USER macro
	.ifnc	\cond,al
	.if	\rept == 1
	itt	\cond
	.elseif	\rept == 2
	ittt	\cond
	.else
	.error	"Unsupported rept macro argument"
	.endif
	.endif

	@ Slightly optimised to avoid incrementing the pointer twice
	usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort
	.if	\rept == 2
	usraccoff \instr, \reg, \ptr, \inc, 4, \cond, \abort
	.endif

	add\cond \ptr, #\rept * \inc
	.endm

#else	/* !CONFIG_THUMB2_KERNEL */

	.macro	usracc, instr, reg, ptr, inc, cond, rept, abort
	.rept	\rept
9999:
	.if	\inc == 1
	\instr\cond\()bt \reg, [\ptr], #\inc
	.elseif	\inc == 4
	\instr\cond\()t \reg, [\ptr], #\inc
	.else
	.error	"Unsupported inc macro argument"
	.endif

	.section __ex_table,"a"
	.align	3
	.long	9999b, \abort
	.previous
	.endr
	.endm

#endif	/* CONFIG_THUMB2_KERNEL */

	.macro	strusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
	usracc	str, \reg, \ptr, \inc, \cond, \rept, \abort
	.endm

	.macro	ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
	usracc	ldr, \reg, \ptr, \inc, \cond, \rept, \abort
	.endm
+5 −2
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
#include <asm/memory.h>
#include <asm/memory.h>
#include <asm/domain.h>
#include <asm/domain.h>
#include <asm/system.h>
#include <asm/system.h>
#include <asm/unified.h>


#define VERIFY_READ 0
#define VERIFY_READ 0
#define VERIFY_WRITE 1
#define VERIFY_WRITE 1
@@ -365,8 +366,10 @@ do { \


#define __put_user_asm_dword(x,__pu_addr,err)			\
#define __put_user_asm_dword(x,__pu_addr,err)			\
	__asm__ __volatile__(					\
	__asm__ __volatile__(					\
	"1:	strt	" __reg_oper1 ", [%1], #4\n"		\
 ARM(	"1:	strt	" __reg_oper1 ", [%1], #4\n"	)	\
	"2:	strt	" __reg_oper0 ", [%1]\n"		\
 ARM(	"2:	strt	" __reg_oper0 ", [%1]\n"	)	\
 THUMB(	"1:	strt	" __reg_oper1 ", [%1]\n"	)	\
 THUMB(	"2:	strt	" __reg_oper0 ", [%1, #4]\n"	)	\
	"3:\n"							\
	"3:\n"							\
	"	.section .fixup,\"ax\"\n"			\
	"	.section .fixup,\"ax\"\n"			\
	"	.align	2\n"					\
	"	.align	2\n"					\
+3 −1
Original line number Original line Diff line number Diff line
@@ -43,7 +43,9 @@ ENTRY(__aeabi_llsl)
	rsb	ip, r2, #32
	rsb	ip, r2, #32
	movmi	ah, ah, lsl r2
	movmi	ah, ah, lsl r2
	movpl	ah, al, lsl r3
	movpl	ah, al, lsl r3
	orrmi	ah, ah, al, lsr ip
 ARM(	orrmi	ah, ah, al, lsr ip	)
 THUMB(	lsrmi	r3, al, ip		)
 THUMB(	orrmi	ah, ah, r3		)
	mov	al, al, lsl r2
	mov	al, al, lsl r2
	mov	pc, lr
	mov	pc, lr


+3 −1
Original line number Original line Diff line number Diff line
@@ -43,7 +43,9 @@ ENTRY(__aeabi_lasr)
	rsb	ip, r2, #32
	rsb	ip, r2, #32
	movmi	al, al, lsr r2
	movmi	al, al, lsr r2
	movpl	al, ah, asr r3
	movpl	al, ah, asr r3
	orrmi	al, al, ah, lsl ip
 ARM(	orrmi	al, al, ah, lsl ip	)
 THUMB(	lslmi	r3, ah, ip		)
 THUMB(	orrmi	al, al, r3		)
	mov	ah, ah, asr r2
	mov	ah, ah, asr r2
	mov	pc, lr
	mov	pc, lr


+6 −2
Original line number Original line Diff line number Diff line
@@ -38,7 +38,9 @@ ENDPROC(c_backtrace)
		beq	no_frame		@ we have no stack frames
		beq	no_frame		@ we have no stack frames


		tst	r1, #0x10		@ 26 or 32-bit mode?
		tst	r1, #0x10		@ 26 or 32-bit mode?
		moveq	mask, #0xfc000003	@ mask for 26-bit
 ARM(		moveq	mask, #0xfc000003	)
 THUMB(		moveq	mask, #0xfc000000	)
 THUMB(		orreq	mask, #0x03		)
		movne	mask, #0		@ mask for 32-bit
		movne	mask, #0		@ mask for 32-bit


1:		stmfd	sp!, {pc}		@ calculate offset of PC stored
1:		stmfd	sp!, {pc}		@ calculate offset of PC stored
@@ -126,7 +128,9 @@ ENDPROC(c_backtrace)
		mov	reg, #10
		mov	reg, #10
		mov	r7, #0
		mov	r7, #0
1:		mov	r3, #1
1:		mov	r3, #1
		tst	instr, r3, lsl reg
 ARM(		tst	instr, r3, lsl reg	)
 THUMB(		lsl	r3, reg			)
 THUMB(		tst	instr, r3		)
		beq	2f
		beq	2f
		add	r7, r7, #1
		add	r7, r7, #1
		teq	r7, #6
		teq	r7, #6
Loading