Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / arch / sh / boot / compressed / head_32.S
1 /*
2  *  linux/arch/sh/boot/compressed/head.S
3  *
4  *  Copyright (C) 1999 Stuart Menefy
5  *  Copyright (C) 2003 SUGIOKA Toshinobu
6  */
7
8 .text
9
10 #include <asm/page.h>
11
12         .global startup
13 startup:
14         /* Load initial status register */
15         mov.l   init_sr, r1
16         ldc     r1, sr
17
18         /* Move myself to proper location if necessary */
19         mova    1f, r0
20         mov.l   1f, r2
21         cmp/eq  r2, r0
22         bt      clear_bss
23         sub     r0, r2
24         mov.l   bss_start_addr, r0
25         mov     #0xffffffe0, r1
26         and     r1, r0                  ! align cache line
27         mov.l   text_start_addr, r3
28         mov     r0, r1
29         sub     r2, r1
30 3:
31         mov.l   @r1, r4
32         mov.l   @(4,r1), r5
33         mov.l   @(8,r1), r6
34         mov.l   @(12,r1), r7
35         mov.l   @(16,r1), r8
36         mov.l   @(20,r1), r9
37         mov.l   @(24,r1), r10
38         mov.l   @(28,r1), r11
39         mov.l   r4, @r0
40         mov.l   r5, @(4,r0)
41         mov.l   r6, @(8,r0)
42         mov.l   r7, @(12,r0)
43         mov.l   r8, @(16,r0)
44         mov.l   r9, @(20,r0)
45         mov.l   r10, @(24,r0)
46         mov.l   r11, @(28,r0)
47 #ifdef CONFIG_CPU_SH4
48         ocbwb   @r0
49 #endif
50         cmp/hi  r3, r0
51         add     #-32, r0
52         bt/s    3b
53          add    #-32, r1
54         mov.l   2f, r0
55         jmp     @r0
56          nop
57
58         .align 2
59 1:      .long   1b
60 2:      .long   clear_bss
61 text_start_addr:
62         .long   startup
63
64         /* Clear BSS */
65 clear_bss:
66         mov.l   end_addr, r1
67         mov.l   bss_start_addr, r2
68         mov     #0, r0
69 l1:
70         mov.l   r0, @-r1
71         cmp/eq  r1,r2
72         bf      l1
73
74         /* Set the initial pointer. */
75         mov.l   init_stack_addr, r0
76         mov.l   @r0, r15
77
78         /* Decompress the kernel */
79         mov.l   decompress_kernel_addr, r0
80         jsr     @r0
81         nop
82
83         /* Jump to the start of the decompressed kernel */
84         mov.l   kernel_start_addr, r0
85         jmp     @r0
86         nop
87         
88         .align  2
89 bss_start_addr:
90         .long   __bss_start
91 end_addr:
92         .long   _end
93 init_sr:
94         .long   0x500000F0      /* Privileged mode, Bank=0, Block=1, IMASK=0xF */
95 kexec_magic:
96         .long   0x400000F0      /* magic used by kexec to parse zImage format */
97 init_stack_addr:
98         .long   stack_start
99 decompress_kernel_addr:
100         .long   decompress_kernel
101 kernel_start_addr:
102 #ifdef CONFIG_32BIT
103         .long   ___pa(_text+PAGE_SIZE)
104 #else
105         .long   _text+PAGE_SIZE
106 #endif
107
108         .align  9
109 fake_headers_as_bzImage:
110         .word   0
111         .ascii  "HdrS"          ! header signature
112         .word   0x0202          ! header version number (>= 0x0105)
113                                 ! or else old loadlin-1.5 will fail)
114         .word   0               ! default_switch
115         .word   0               ! SETUPSEG
116         .word   0x1000
117         .word   0               ! pointing to kernel version string
118         .byte   0               ! = 0, old one (LILO, Loadlin,
119                                 ! 0xTV: T=0 for LILO
120                                 !       V = version
121         .byte   1               ! Load flags bzImage=1
122         .word   0x8000          ! size to move, when setup is not
123         .long   0x100000        ! 0x100000 = default for big kernel
124         .long   0               ! address of loaded ramdisk image
125         .long   0               # its size in bytes