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