1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/init.h>
17#include <linux/threads.h>
18
19#include <asm/addrspace.h>
20#include <asm/asm.h>
21#include <asm/asmmacro.h>
22#include <asm/irqflags.h>
23#include <asm/regdef.h>
24#include <asm/mipsregs.h>
25#include <asm/stackframe.h>
26
27#include <kernel-entry-init.h>
28
29
30
31
32
33
34
35 .macro setup_c0_status set clr
36 .set push
37 mfc0 t0, CP0_STATUS
38 or t0, ST0_KERNEL_CUMASK|\set|0x1f|\clr
39 xor t0, 0x1f|\clr
40 mtc0 t0, CP0_STATUS
41 .set noreorder
42 sll zero,3
43 .set pop
44 .endm
45
46 .macro setup_c0_status_pri
47#ifdef CONFIG_64BIT
48 setup_c0_status ST0_KX 0
49#else
50 setup_c0_status 0 0
51#endif
52 .endm
53
54 .macro setup_c0_status_sec
55#ifdef CONFIG_64BIT
56 setup_c0_status ST0_KX ST0_BEV
57#else
58 setup_c0_status 0 ST0_BEV
59#endif
60 .endm
61
62#ifndef CONFIG_NO_EXCEPT_FILL
63
64
65
66
67 .fill 0x400
68#endif
69
70EXPORT(_stext)
71
72#ifdef CONFIG_BOOT_RAW
73
74
75
76
77
78FEXPORT(__kernel_entry)
79 j kernel_entry
80#endif
81
82 __REF
83
84NESTED(kernel_entry, 16, sp)
85
86 kernel_entry_setup
87
88 setup_c0_status_pri
89
90
91
92 PTR_LA t0, 0f
93 jr t0
940:
95
96#ifdef CONFIG_USE_OF
97
98 defined(CONFIG_MIPS_ELF_APPENDED_DTB)
99
100 PTR_LA t2, __appended_dtb
101
102#ifdef CONFIG_CPU_BIG_ENDIAN
103 li t1, 0xd00dfeed
104#else
105 li t1, 0xedfe0dd0
106#endif
107 lw t0, (t2)
108 beq t0, t1, dtb_found
109#endif
110 li t1, -2
111 move t2, a1
112 beq a0, t1, dtb_found
113
114#ifdef CONFIG_BUILTIN_DTB
115 PTR_LA t2, __dtb_start
116 PTR_LA t1, __dtb_end
117 bne t1, t2, dtb_found
118#endif
119
120 li t2, 0
121dtb_found:
122#endif
123 PTR_LA t0, __bss_start
124 LONG_S zero, (t0)
125 PTR_LA t1, __bss_stop - LONGSIZE
1261:
127 PTR_ADDIU t0, LONGSIZE
128 LONG_S zero, (t0)
129 bne t0, t1, 1b
130
131 LONG_S a0, fw_arg0
132 LONG_S a1, fw_arg1
133 LONG_S a2, fw_arg2
134 LONG_S a3, fw_arg3
135
136#ifdef CONFIG_USE_OF
137 LONG_S t2, fw_passed_dtb
138#endif
139
140 MTC0 zero, CP0_CONTEXT
141#ifdef CONFIG_64BIT
142 MTC0 zero, CP0_XCONTEXT
143#endif
144 PTR_LA $28, init_thread_union
145
146 PTR_LI sp, _THREAD_SIZE - 32 - PT_SIZE
147 PTR_ADDU sp, $28
148 back_to_back_c0_hazard
149 set_saved_sp sp, t0, t1
150 PTR_SUBU sp, 4 * SZREG
151
152#ifdef CONFIG_RELOCATABLE
153
154 jal relocate_kernel
155
156
157 PTR_LI sp, _THREAD_SIZE - 32 - PT_SIZE
158 PTR_ADDU sp, $28
159 set_saved_sp sp, t0, t1
160 PTR_SUBU sp, 4 * SZREG
161
162
163
164
165
166
167
168
169 jr.hb v0
170#else
171 j start_kernel
172#endif
173 END(kernel_entry)
174
175#ifdef CONFIG_SMP
176
177
178
179
180NESTED(smp_bootstrap, 16, sp)
181 smp_slave_setup
182 setup_c0_status_sec
183 j start_secondary
184 END(smp_bootstrap)
185#endif
186