1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <asm/asm-offsets.h>
16 #include <asm/psw.h>
17 #include <asm/pdc.h>
18
19 #include <asm/assembly.h>
20 #include <asm/pgtable.h>
21
22 #include <linux/linkage.h>
23 #include <linux/init.h>
24
25 .level PA_ASM_LEVEL
26
27 __INITDATA
28 ENTRY(boot_args)
29 .word 0
30 .word 0
31 .word 0
32 .word 0
33 END(boot_args)
34
35 __HEAD
36
37 .align 4
38 .import init_thread_union,data
39 .import fault_vector_20,code
40 #ifndef CONFIG_64BIT
41 .import fault_vector_11,code
42 .import $global$
43 #endif
44 ENTRY(parisc_kernel_start)
45 .proc
46 .callinfo
47
48
49 mtsp %r0,%sr4
50 mtsp %r0,%sr5
51 mtsp %r0,%sr6
52 mtsp %r0,%sr7
53
54
55
56 .import __bss_start,data
57 .import __bss_stop,data
58
59 load32 PA(__bss_start),%r3
60 load32 PA(__bss_stop),%r4
61 $bss_loop:
62 cmpb,<<,n %r3,%r4,$bss_loop
63 stw,ma %r0,4(%r3)
64
65
66 load32 PA(boot_args),%r1
67 stw,ma %arg0,4(%r1)
68 stw,ma %arg1,4(%r1)
69 stw,ma %arg2,4(%r1)
70 stw,ma %arg3,4(%r1)
71
72
73 load32 PA(swapper_pg_dir),%r4
74 mtctl %r4,%cr24
75 mtctl %r4,%cr25
76
77 #if CONFIG_PGTABLE_LEVELS == 3
78
79 load32 PA(pmd0),%r5
80 shrd %r5,PxD_VALUE_SHIFT,%r3
81 ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
82 stw %r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4)
83 ldo ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r4
84 #else
85
86 ldo ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
87 #endif
88
89
90 load32 PA(pg0),%r1
91 SHRREG %r1,PxD_VALUE_SHIFT,%r3
92 ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
93
94 ldi ASM_PT_INITIAL,%r1
95
96 1:
97 stw %r3,0(%r4)
98 ldo (PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
99 addib,> -1,%r1,1b
100 #if CONFIG_PGTABLE_LEVELS == 3
101 ldo ASM_PMD_ENTRY_SIZE(%r4),%r4
102 #else
103 ldo ASM_PGD_ENTRY_SIZE(%r4),%r4
104 #endif
105
106
107
108
109 ldo 0+_PAGE_KERNEL_RWX(%r0),%r3
110 load32 (1<<(KERNEL_INITIAL_ORDER-PAGE_SHIFT)),%r11
111 load32 PA(pg0),%r1
112
113 $pgt_fill_loop:
114 STREGM %r3,ASM_PTE_ENTRY_SIZE(%r1)
115 ldo (1<<PFN_PTE_SHIFT)(%r3),%r3
116 addib,> -1,%r11,$pgt_fill_loop
117 nop
118
119
120 copy %r0,%r2
121
122
123 load32 start_parisc,%r11
124
125
126 load32 init_thread_union,%r6
127 mtctl %r6,%cr30
128
129
130 ldo THREAD_SZ_ALGN(%r6),%sp
131
132 #if defined(CONFIG_64BIT) && defined(CONFIG_FUNCTION_TRACER)
133 .import _mcount,data
134
135
136 loadgp
137 load32 PA(_mcount), %r10
138 std %dp,0x18(%r10)
139 #endif
140
141 #ifdef CONFIG_64BIT
142
143 #define MEM_PDC_LO 0x388
144 #define MEM_PDC_HI 0x35C
145 ldw MEM_PDC_LO(%r0),%r3
146 ldw MEM_PDC_HI(%r0),%r10
147 depd %r10, 31, 32, %r3
148 #endif
149
150
151 #ifdef CONFIG_SMP
152
153
154
155
156
157 load32 PA(smp_slave_stext),%r10
158 stw %r10,0x10(%r0)
159 stw %r0,0x28(%r0)
160
161
162 .procend
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179 common_stext:
180 .proc
181 .callinfo
182 #else
183
184 stw %r0,0x10(%r0)
185 stw %r0,0x28(%r0)
186 #endif
187
188 #ifdef CONFIG_64BIT
189 tophys_r1 %sp
190
191
192 ldd TI_TASK-THREAD_SZ_ALGN(%sp), %r10
193 tophys_r1 %r10
194 std %r11, TASK_PT_GR11(%r10)
195
196
197
198 1: mfia %rp
199 ldo 2f-1b(%rp),%rp
200 depdi 0,31,32,%rp
201 bv (%rp)
202 ssm PSW_SM_W,%r0
203
204
205
206
207
208 2:
209 mfctl %cr30,%r6
210
211 ldo PDC_PSW(%r0),%arg0
212 ldo PDC_PSW_SET_DEFAULTS(%r0),%arg1
213 ldo PDC_PSW_WIDE_BIT(%r0),%arg2
214 load32 PA(stext_pdc_ret), %rp
215 bv (%r3)
216 copy %r0,%arg3
217
218 stext_pdc_ret:
219 mtctl %r6,%cr30
220
221
222 ldd TI_TASK-THREAD_SZ_ALGN(%sp), %r10
223 tophys_r1 %r10
224 ldd TASK_PT_GR11(%r10), %r11
225 tovirt_r1 %sp
226 #endif
227
228
229 mtsp %r0,%sr0
230 mtsp %r0,%sr1
231 mtsp %r0,%sr2
232 mtsp %r0,%sr3
233
234
235 mtctl %r0,%cr8
236 mtctl %r0,%cr9
237 mtctl %r0,%cr12
238 mtctl %r0,%cr13
239
240
241 loadgp
242
243
244
245
246
247
248
249 #ifndef CONFIG_64BIT
250 ldi 32,%r10
251 mtctl %r10,%cr11
252 .level 2.0
253 mfctl,w %cr11,%r10
254 .level 1.1
255 comib,<>,n 0,%r10,$is_pa20
256 ldil L%PA(fault_vector_11),%r10
257 b $install_iva
258 ldo R%PA(fault_vector_11)(%r10),%r10
259
260 $is_pa20:
261 .level PA_ASM_LEVEL
262 #endif
263 load32 PA(fault_vector_20),%r10
264
265 $install_iva:
266 mtctl %r10,%cr14
267
268 b aligned_rfi
269 nop
270
271 .align 128
272 aligned_rfi:
273 pcxt_ssm_bug
274
275 copy %r3, %arg0
276
277 rsm PSW_SM_QUIET,%r0
278
279
280 mtctl %r0,%cr17
281 mtctl %r0,%cr17
282
283
284 mtctl %r11,%cr18
285 ldo 4(%r11),%r11
286 mtctl %r11,%cr18
287
288 load32 KERNEL_PSW,%r10
289 mtctl %r10,%ipsw
290
291
292 rfi
293 nop
294
295 .procend
296
297 #ifdef CONFIG_SMP
298
299 .import smp_init_current_idle_task,data
300 .import smp_callin,code
301
302 #ifndef CONFIG_64BIT
303 smp_callin_rtn:
304 .proc
305 .callinfo
306 break 1,1
307 nop
308 nop
309 .procend
310 #endif
311
312
313
314
315
316
317
318
319
320 smp_slave_stext:
321 .proc
322 .callinfo
323
324
325
326
327 mtsp %r0,%sr4
328 mtsp %r0,%sr5
329 mtsp %r0,%sr6
330 mtsp %r0,%sr7
331
332 #ifdef CONFIG_64BIT
333
334
335
336
337 1: mfia %rp
338 ldo 2f-1b(%rp),%rp
339 depdi 0,31,32,%rp
340 bv (%rp)
341 ssm PSW_SM_W,%r0
342 2:
343 #endif
344
345
346 load32 PA(smp_init_current_idle_task),%sp
347 LDREG 0(%sp),%sp
348 tophys_r1 %sp
349 LDREG TASK_THREAD_INFO(%sp),%sp
350 mtctl %sp,%cr30
351 ldo THREAD_SZ_ALGN(%sp),%sp
352
353
354 load32 PA(swapper_pg_dir),%r4
355 mtctl %r4,%cr24
356 mtctl %r4,%cr25
357
358 #ifdef CONFIG_64BIT
359
360 copy %arg0,%r3
361 #else
362
363 load32 smp_callin_rtn,%r2
364 #endif
365
366
367 load32 smp_callin,%r11
368
369
370 b common_stext
371 nop
372
373 .procend
374 #endif
375
376 ENDPROC(parisc_kernel_start)
377
378 #ifndef CONFIG_64BIT
379 .section .data..ro_after_init
380
381 .align 4
382 .export $global$,data
383
384 .type $global$,@object
385 .size $global$,4
386 $global$:
387 .word 0
388 #endif