![Stuart Menefy](/assets/img/avatar_default.png)
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>
123 lines
1.8 KiB
ArmAsm
123 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
|