linux/arch/sh/boot/compressed/head_32.S
Stuart Menefy fea966f756 sh: Remove implicit sign extension from assembler immediates
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>
2009-08-24 17:09:53 +09:00

120 lines
2.2 KiB
ArmAsm

/*
* linux/arch/sh/boot/compressed/head.S
*
* Copyright (C) 1999 Stuart Menefy
* Copyright (C) 2003 SUGIOKA Toshinobu
*/
.text
#include <asm/page.h>
.global startup
startup:
/* Load initial status register */
mov.l init_sr, r1
ldc r1, sr
/* Move myself to proper location if necessary */
mova 1f, r0
mov.l 1f, r2
cmp/eq r2, r0
bt clear_bss
sub r0, r2
mov.l bss_start_addr, r0
mov #0xffffffe0, r1
and r1, r0 ! align cache line
mov.l text_start_addr, r3
mov r0, r1
sub r2, r1
3:
mov.l @r1, r4
mov.l @(4,r1), r5
mov.l @(8,r1), r6
mov.l @(12,r1), r7
mov.l @(16,r1), r8
mov.l @(20,r1), r9
mov.l @(24,r1), r10
mov.l @(28,r1), r11
mov.l r4, @r0
mov.l r5, @(4,r0)
mov.l r6, @(8,r0)
mov.l r7, @(12,r0)
mov.l r8, @(16,r0)
mov.l r9, @(20,r0)
mov.l r10, @(24,r0)
mov.l r11, @(28,r0)
#ifdef CONFIG_CPU_SH4
ocbwb @r0
#endif
cmp/hi r3, r0
add #-32, r0
bt/s 3b
add #-32, r1
mov.l 2f, r0
jmp @r0
nop
.align 2
1: .long 1b
2: .long clear_bss
text_start_addr:
.long startup
/* Clear BSS */
clear_bss:
mov.l end_addr, r1
mov.l bss_start_addr, r2
mov #0, r0
l1:
mov.l r0, @-r1
cmp/eq r1,r2
bf l1
/* Set the initial pointer. */
mov.l init_stack_addr, r0
mov.l @r0, r15
/* Decompress the kernel */
mov.l decompress_kernel_addr, r0
jsr @r0
nop
/* Jump to the start of the decompressed kernel */
mov.l kernel_start_addr, r0
jmp @r0
nop
.align 2
bss_start_addr:
.long __bss_start
end_addr:
.long _end
init_sr:
.long 0x400000F0 /* Privileged mode, Bank=0, Block=0, IMASK=0xF */
init_stack_addr:
.long stack_start
decompress_kernel_addr:
.long decompress_kernel
kernel_start_addr:
.long _text+PAGE_SIZE
.align 9
fake_headers_as_bzImage:
.word 0
.ascii "HdrS" ! header signature
.word 0x0202 ! header version number (>= 0x0105)
! or else old loadlin-1.5 will fail)
.word 0 ! default_switch
.word 0 ! SETUPSEG
.word 0x1000
.word 0 ! pointing to kernel version string
.byte 0 ! = 0, old one (LILO, Loadlin,
! 0xTV: T=0 for LILO
! V = version
.byte 1 ! Load flags bzImage=1
.word 0x8000 ! size to move, when setup is not
.long 0x100000 ! 0x100000 = default for big kernel
.long 0 ! address of loaded ramdisk image
.long 0 # its size in bytes