 fea966f756
			
		
	
	
	fea966f756
	
	
	
		
			
			The SH instruction set has several instructions which accept an 8 bit immediate operand. For logical instructions this operand is zero extended, for arithmetic instructions the operand is sign extended. After adding an option to the assembler to check this, it was found that several pieces of assembly code were assuming this behaviour, and in one case getting it wrong. So this patch explicitly sign extends any immediate operands, which makes it obvious what is happening, and fixes the one case which got it wrong. Signed-off-by: Stuart Menefy <stuart.menefy@st.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
		
			
				
	
	
		
			122 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			1.8 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| ! entry.S macro define
 | |
| 	
 | |
| 	.macro	cli
 | |
| 	stc	sr, r0
 | |
| 	or	#0xf0, r0
 | |
| 	ldc	r0, sr
 | |
| 	.endm
 | |
| 
 | |
| 	.macro	sti
 | |
| 	mov	#0xfffffff0, r11
 | |
| 	extu.b	r11, r11
 | |
| 	not	r11, r11
 | |
| 	stc	sr, r10
 | |
| 	and	r11, r10
 | |
| #ifdef CONFIG_CPU_HAS_SR_RB
 | |
| 	stc	k_g_imask, r11
 | |
| 	or	r11, r10
 | |
| #endif
 | |
| 	ldc	r10, sr
 | |
| 	.endm
 | |
| 
 | |
| 	.macro	get_current_thread_info, ti, tmp
 | |
| #ifdef CONFIG_CPU_HAS_SR_RB
 | |
| 	stc	r7_bank, \ti
 | |
| #else
 | |
| 	mov	#((THREAD_SIZE - 1) >> 10) ^ 0xff, \tmp
 | |
| 	shll8	\tmp
 | |
| 	shll2	\tmp
 | |
| 	mov	r15, \ti
 | |
| 	and	\tmp, \ti
 | |
| #endif	
 | |
| 	.endm
 | |
| 
 | |
| #ifdef CONFIG_TRACE_IRQFLAGS
 | |
| 
 | |
| 	.macro	TRACE_IRQS_ON
 | |
| 	mov.l	r0, @-r15
 | |
| 	mov.l	r1, @-r15
 | |
| 	mov.l	r2, @-r15
 | |
| 	mov.l	r3, @-r15
 | |
| 	mov.l	r4, @-r15
 | |
| 	mov.l	r5, @-r15
 | |
| 	mov.l	r6, @-r15
 | |
| 	mov.l	r7, @-r15
 | |
| 
 | |
| 	mov.l   7834f, r0
 | |
| 	jsr	@r0
 | |
| 	 nop
 | |
| 
 | |
| 	mov.l	@r15+, r7
 | |
| 	mov.l	@r15+, r6
 | |
| 	mov.l	@r15+, r5
 | |
| 	mov.l	@r15+, r4
 | |
| 	mov.l	@r15+, r3
 | |
| 	mov.l	@r15+, r2
 | |
| 	mov.l	@r15+, r1
 | |
| 	mov.l	@r15+, r0
 | |
| 	mov.l	7834f, r0
 | |
| 
 | |
| 	bra	7835f
 | |
| 	 nop
 | |
| 	.balign	4
 | |
| 7834:	.long	trace_hardirqs_on
 | |
| 7835:
 | |
| 	.endm
 | |
| 	.macro	TRACE_IRQS_OFF
 | |
| 
 | |
| 	mov.l	r0, @-r15
 | |
| 	mov.l	r1, @-r15
 | |
| 	mov.l	r2, @-r15
 | |
| 	mov.l	r3, @-r15
 | |
| 	mov.l	r4, @-r15
 | |
| 	mov.l	r5, @-r15
 | |
| 	mov.l	r6, @-r15
 | |
| 	mov.l	r7, @-r15
 | |
| 
 | |
| 	mov.l	7834f, r0
 | |
| 	jsr	@r0
 | |
| 	 nop
 | |
| 
 | |
| 	mov.l	@r15+, r7
 | |
| 	mov.l	@r15+, r6
 | |
| 	mov.l	@r15+, r5
 | |
| 	mov.l	@r15+, r4
 | |
| 	mov.l	@r15+, r3
 | |
| 	mov.l	@r15+, r2
 | |
| 	mov.l	@r15+, r1
 | |
| 	mov.l	@r15+, r0
 | |
| 	mov.l	7834f, r0
 | |
| 
 | |
| 	bra	7835f
 | |
| 	 nop
 | |
| 	.balign	4
 | |
| 7834:	.long	trace_hardirqs_off
 | |
| 7835:
 | |
| 	.endm
 | |
| 
 | |
| #else
 | |
| 	.macro	TRACE_IRQS_ON
 | |
| 	.endm
 | |
| 
 | |
| 	.macro	TRACE_IRQS_OFF
 | |
| 	.endm
 | |
| #endif
 | |
| 
 | |
| #if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH4)
 | |
| # define PREF(x)	pref	@x
 | |
| #else
 | |
| # define PREF(x)	nop
 | |
| #endif
 | |
| 
 | |
| 	/*
 | |
| 	 * Macro for use within assembly. Because the DWARF unwinder
 | |
| 	 * needs to use the frame register to unwind the stack, we
 | |
| 	 * need to setup r14 with the value of the stack pointer as
 | |
| 	 * the return address is usually on the stack somewhere.
 | |
| 	 */
 | |
| 	.macro	setup_frame_reg
 | |
| #ifdef CONFIG_DWARF_UNWINDER
 | |
| 	mov	r15, r14
 | |
| #endif
 | |
| 	.endm
 |