]> git.karo-electronics.de Git - mv-sheeva.git/blob - arch/powerpc/kernel/head_64.S
powerpc: Remove legacy iSeries bits from assembly files
[mv-sheeva.git] / arch / powerpc / kernel / head_64.S
1 /*
2  *  PowerPC version
3  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
4  *
5  *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
6  *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
7  *  Adapted for Power Macintosh by Paul Mackerras.
8  *  Low-level exception handlers and MMU support
9  *  rewritten by Paul Mackerras.
10  *    Copyright (C) 1996 Paul Mackerras.
11  *
12  *  Adapted for 64bit PowerPC by Dave Engebretsen, Peter Bergner, and
13  *    Mike Corrigan {engebret|bergner|mikejc}@us.ibm.com
14  *
15  *  This file contains the entry point for the 64-bit kernel along
16  *  with some early initialization code common to all 64-bit powerpc
17  *  variants.
18  *
19  *  This program is free software; you can redistribute it and/or
20  *  modify it under the terms of the GNU General Public License
21  *  as published by the Free Software Foundation; either version
22  *  2 of the License, or (at your option) any later version.
23  */
24
25 #include <linux/threads.h>
26 #include <asm/reg.h>
27 #include <asm/page.h>
28 #include <asm/mmu.h>
29 #include <asm/ppc_asm.h>
30 #include <asm/asm-offsets.h>
31 #include <asm/bug.h>
32 #include <asm/cputable.h>
33 #include <asm/setup.h>
34 #include <asm/hvcall.h>
35 #include <asm/thread_info.h>
36 #include <asm/firmware.h>
37 #include <asm/page_64.h>
38 #include <asm/irqflags.h>
39 #include <asm/kvm_book3s_asm.h>
40 #include <asm/ptrace.h>
41
42 /* The physical memory is laid out such that the secondary processor
43  * spin code sits at 0x0000...0x00ff. On server, the vectors follow
44  * using the layout described in exceptions-64s.S
45  */
46
47 /*
48  * Entering into this code we make the following assumptions:
49  *
50  *  For pSeries or server processors:
51  *   1. The MMU is off & open firmware is running in real mode.
52  *   2. The kernel is entered at __start
53  * -or- For OPAL entry:
54  *   1. The MMU is off, processor in HV mode, primary CPU enters at 0
55  *      with device-tree in gpr3. We also get OPAL base in r8 and
56  *      entry in r9 for debugging purposes
57  *   2. Secondary processors enter at 0x60 with PIR in gpr3
58  *
59  *  For Book3E processors:
60  *   1. The MMU is on running in AS0 in a state defined in ePAPR
61  *   2. The kernel is entered at __start
62  */
63
64         .text
65         .globl  _stext
66 _stext:
67 _GLOBAL(__start)
68         /* NOP this out unconditionally */
69 BEGIN_FTR_SECTION
70         b       .__start_initialization_multiplatform
71 END_FTR_SECTION(0, 1)
72
73         /* Catch branch to 0 in real mode */
74         trap
75
76         /* Secondary processors spin on this value until it becomes nonzero.
77          * When it does it contains the real address of the descriptor
78          * of the function that the cpu should jump to to continue
79          * initialization.
80          */
81         .globl  __secondary_hold_spinloop
82 __secondary_hold_spinloop:
83         .llong  0x0
84
85         /* Secondary processors write this value with their cpu # */
86         /* after they enter the spin loop immediately below.      */
87         .globl  __secondary_hold_acknowledge
88 __secondary_hold_acknowledge:
89         .llong  0x0
90
91 #ifdef CONFIG_RELOCATABLE
92         /* This flag is set to 1 by a loader if the kernel should run
93          * at the loaded address instead of the linked address.  This
94          * is used by kexec-tools to keep the the kdump kernel in the
95          * crash_kernel region.  The loader is responsible for
96          * observing the alignment requirement.
97          */
98         /* Do not move this variable as kexec-tools knows about it. */
99         . = 0x5c
100         .globl  __run_at_load
101 __run_at_load:
102         .long   0x72756e30      /* "run0" -- relocate to 0 by default */
103 #endif
104
105         . = 0x60
106 /*
107  * The following code is used to hold secondary processors
108  * in a spin loop after they have entered the kernel, but
109  * before the bulk of the kernel has been relocated.  This code
110  * is relocated to physical address 0x60 before prom_init is run.
111  * All of it must fit below the first exception vector at 0x100.
112  * Use .globl here not _GLOBAL because we want __secondary_hold
113  * to be the actual text address, not a descriptor.
114  */
115         .globl  __secondary_hold
116 __secondary_hold:
117 #ifndef CONFIG_PPC_BOOK3E
118         mfmsr   r24
119         ori     r24,r24,MSR_RI
120         mtmsrd  r24                     /* RI on */
121 #endif
122         /* Grab our physical cpu number */
123         mr      r24,r3
124
125         /* Tell the master cpu we're here */
126         /* Relocation is off & we are located at an address less */
127         /* than 0x100, so only need to grab low order offset.    */
128         std     r24,__secondary_hold_acknowledge-_stext(0)
129         sync
130
131         /* All secondary cpus wait here until told to start. */
132 100:    ld      r4,__secondary_hold_spinloop-_stext(0)
133         cmpdi   0,r4,0
134         beq     100b
135
136 #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
137         ld      r4,0(r4)                /* deref function descriptor */
138         mtctr   r4
139         mr      r3,r24
140         li      r4,0
141         /* Make sure that patched code is visible */
142         isync
143         bctr
144 #else
145         BUG_OPCODE
146 #endif
147
148 /* This value is used to mark exception frames on the stack. */
149         .section ".toc","aw"
150 exception_marker:
151         .tc     ID_72656773_68657265[TC],0x7265677368657265
152         .text
153
154 /*
155  * On server, we include the exception vectors code here as it
156  * relies on absolute addressing which is only possible within
157  * this compilation unit
158  */
159 #ifdef CONFIG_PPC_BOOK3S
160 #include "exceptions-64s.S"
161 #endif
162
163 _GLOBAL(generic_secondary_thread_init)
164         mr      r24,r3
165
166         /* turn on 64-bit mode */
167         bl      .enable_64b_mode
168
169         /* get a valid TOC pointer, wherever we're mapped at */
170         bl      .relative_toc
171
172 #ifdef CONFIG_PPC_BOOK3E
173         /* Book3E initialization */
174         mr      r3,r24
175         bl      .book3e_secondary_thread_init
176 #endif
177         b       generic_secondary_common_init
178
179 /*
180  * On pSeries and most other platforms, secondary processors spin
181  * in the following code.
182  * At entry, r3 = this processor's number (physical cpu id)
183  *
184  * On Book3E, r4 = 1 to indicate that the initial TLB entry for
185  * this core already exists (setup via some other mechanism such
186  * as SCOM before entry).
187  */
188 _GLOBAL(generic_secondary_smp_init)
189         mr      r24,r3
190         mr      r25,r4
191
192         /* turn on 64-bit mode */
193         bl      .enable_64b_mode
194
195         /* get a valid TOC pointer, wherever we're mapped at */
196         bl      .relative_toc
197
198 #ifdef CONFIG_PPC_BOOK3E
199         /* Book3E initialization */
200         mr      r3,r24
201         mr      r4,r25
202         bl      .book3e_secondary_core_init
203 #endif
204
205 generic_secondary_common_init:
206         /* Set up a paca value for this processor. Since we have the
207          * physical cpu id in r24, we need to search the pacas to find
208          * which logical id maps to our physical one.
209          */
210         LOAD_REG_ADDR(r13, paca)        /* Load paca pointer             */
211         ld      r13,0(r13)              /* Get base vaddr of paca array  */
212 #ifndef CONFIG_SMP
213         addi    r13,r13,PACA_SIZE       /* know r13 if used accidentally */
214         b       .kexec_wait             /* wait for next kernel if !SMP  */
215 #else
216         LOAD_REG_ADDR(r7, nr_cpu_ids)   /* Load nr_cpu_ids address       */
217         lwz     r7,0(r7)                /* also the max paca allocated   */
218         li      r5,0                    /* logical cpu id                */
219 1:      lhz     r6,PACAHWCPUID(r13)     /* Load HW procid from paca      */
220         cmpw    r6,r24                  /* Compare to our id             */
221         beq     2f
222         addi    r13,r13,PACA_SIZE       /* Loop to next PACA on miss     */
223         addi    r5,r5,1
224         cmpw    r5,r7                   /* Check if more pacas exist     */
225         blt     1b
226
227         mr      r3,r24                  /* not found, copy phys to r3    */
228         b       .kexec_wait             /* next kernel might do better   */
229
230 2:      SET_PACA(r13)
231 #ifdef CONFIG_PPC_BOOK3E
232         addi    r12,r13,PACA_EXTLB      /* and TLB exc frame in another  */
233         mtspr   SPRN_SPRG_TLB_EXFRAME,r12
234 #endif
235
236         /* From now on, r24 is expected to be logical cpuid */
237         mr      r24,r5
238
239         /* See if we need to call a cpu state restore handler */
240         LOAD_REG_ADDR(r23, cur_cpu_spec)
241         ld      r23,0(r23)
242         ld      r23,CPU_SPEC_RESTORE(r23)
243         cmpdi   0,r23,0
244         beq     3f
245         ld      r23,0(r23)
246         mtctr   r23
247         bctrl
248
249 3:      LOAD_REG_ADDR(r3, spinning_secondaries) /* Decrement spinning_secondaries */
250         lwarx   r4,0,r3
251         subi    r4,r4,1
252         stwcx.  r4,0,r3
253         bne     3b
254         isync
255
256 4:      HMT_LOW
257         lbz     r23,PACAPROCSTART(r13)  /* Test if this processor should */
258                                         /* start.                        */
259         cmpwi   0,r23,0
260         beq     4b                      /* Loop until told to go         */
261
262         sync                            /* order paca.run and cur_cpu_spec */
263         isync                           /* In case code patching happened */
264
265         /* Create a temp kernel stack for use before relocation is on.  */
266         ld      r1,PACAEMERGSP(r13)
267         subi    r1,r1,STACK_FRAME_OVERHEAD
268
269         b       __secondary_start
270 #endif /* SMP */
271
272 /*
273  * Turn the MMU off.
274  * Assumes we're mapped EA == RA if the MMU is on.
275  */
276 #ifdef CONFIG_PPC_BOOK3S
277 _STATIC(__mmu_off)
278         mfmsr   r3
279         andi.   r0,r3,MSR_IR|MSR_DR
280         beqlr
281         mflr    r4
282         andc    r3,r3,r0
283         mtspr   SPRN_SRR0,r4
284         mtspr   SPRN_SRR1,r3
285         sync
286         rfid
287         b       .       /* prevent speculative execution */
288 #endif
289
290
291 /*
292  * Here is our main kernel entry point. We support currently 2 kind of entries
293  * depending on the value of r5.
294  *
295  *   r5 != NULL -> OF entry, we go to prom_init, "legacy" parameter content
296  *                 in r3...r7
297  *   
298  *   r5 == NULL -> kexec style entry. r3 is a physical pointer to the
299  *                 DT block, r4 is a physical pointer to the kernel itself
300  *
301  */
302 _GLOBAL(__start_initialization_multiplatform)
303         /* Make sure we are running in 64 bits mode */
304         bl      .enable_64b_mode
305
306         /* Get TOC pointer (current runtime address) */
307         bl      .relative_toc
308
309         /* find out where we are now */
310         bcl     20,31,$+4
311 0:      mflr    r26                     /* r26 = runtime addr here */
312         addis   r26,r26,(_stext - 0b)@ha
313         addi    r26,r26,(_stext - 0b)@l /* current runtime base addr */
314
315         /*
316          * Are we booted from a PROM Of-type client-interface ?
317          */
318         cmpldi  cr0,r5,0
319         beq     1f
320         b       .__boot_from_prom               /* yes -> prom */
321 1:
322         /* Save parameters */
323         mr      r31,r3
324         mr      r30,r4
325 #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
326         /* Save OPAL entry */
327         mr      r28,r8
328         mr      r29,r9
329 #endif
330
331 #ifdef CONFIG_PPC_BOOK3E
332         bl      .start_initialization_book3e
333         b       .__after_prom_start
334 #else
335         /* Setup some critical 970 SPRs before switching MMU off */
336         mfspr   r0,SPRN_PVR
337         srwi    r0,r0,16
338         cmpwi   r0,0x39         /* 970 */
339         beq     1f
340         cmpwi   r0,0x3c         /* 970FX */
341         beq     1f
342         cmpwi   r0,0x44         /* 970MP */
343         beq     1f
344         cmpwi   r0,0x45         /* 970GX */
345         bne     2f
346 1:      bl      .__cpu_preinit_ppc970
347 2:
348
349         /* Switch off MMU if not already off */
350         bl      .__mmu_off
351         b       .__after_prom_start
352 #endif /* CONFIG_PPC_BOOK3E */
353
354 _INIT_STATIC(__boot_from_prom)
355 #ifdef CONFIG_PPC_OF_BOOT_TRAMPOLINE
356         /* Save parameters */
357         mr      r31,r3
358         mr      r30,r4
359         mr      r29,r5
360         mr      r28,r6
361         mr      r27,r7
362
363         /*
364          * Align the stack to 16-byte boundary
365          * Depending on the size and layout of the ELF sections in the initial
366          * boot binary, the stack pointer may be unaligned on PowerMac
367          */
368         rldicr  r1,r1,0,59
369
370 #ifdef CONFIG_RELOCATABLE
371         /* Relocate code for where we are now */
372         mr      r3,r26
373         bl      .relocate
374 #endif
375
376         /* Restore parameters */
377         mr      r3,r31
378         mr      r4,r30
379         mr      r5,r29
380         mr      r6,r28
381         mr      r7,r27
382
383         /* Do all of the interaction with OF client interface */
384         mr      r8,r26
385         bl      .prom_init
386 #endif /* #CONFIG_PPC_OF_BOOT_TRAMPOLINE */
387
388         /* We never return. We also hit that trap if trying to boot
389          * from OF while CONFIG_PPC_OF_BOOT_TRAMPOLINE isn't selected */
390         trap
391
392 _STATIC(__after_prom_start)
393 #ifdef CONFIG_RELOCATABLE
394         /* process relocations for the final address of the kernel */
395         lis     r25,PAGE_OFFSET@highest /* compute virtual base of kernel */
396         sldi    r25,r25,32
397         lwz     r7,__run_at_load-_stext(r26)
398         cmplwi  cr0,r7,1        /* flagged to stay where we are ? */
399         bne     1f
400         add     r25,r25,r26
401 1:      mr      r3,r25
402         bl      .relocate
403 #endif
404
405 /*
406  * We need to run with _stext at physical address PHYSICAL_START.
407  * This will leave some code in the first 256B of
408  * real memory, which are reserved for software use.
409  *
410  * Note: This process overwrites the OF exception vectors.
411  */
412         li      r3,0                    /* target addr */
413 #ifdef CONFIG_PPC_BOOK3E
414         tovirt(r3,r3)                   /* on booke, we already run at PAGE_OFFSET */
415 #endif
416         mr.     r4,r26                  /* In some cases the loader may  */
417         beq     9f                      /* have already put us at zero */
418         li      r6,0x100                /* Start offset, the first 0x100 */
419                                         /* bytes were copied earlier.    */
420 #ifdef CONFIG_PPC_BOOK3E
421         tovirt(r6,r6)                   /* on booke, we already run at PAGE_OFFSET */
422 #endif
423
424 #ifdef CONFIG_CRASH_DUMP
425 /*
426  * Check if the kernel has to be running as relocatable kernel based on the
427  * variable __run_at_load, if it is set the kernel is treated as relocatable
428  * kernel, otherwise it will be moved to PHYSICAL_START
429  */
430         lwz     r7,__run_at_load-_stext(r26)
431         cmplwi  cr0,r7,1
432         bne     3f
433
434         li      r5,__end_interrupts - _stext    /* just copy interrupts */
435         b       5f
436 3:
437 #endif
438         lis     r5,(copy_to_here - _stext)@ha
439         addi    r5,r5,(copy_to_here - _stext)@l /* # bytes of memory to copy */
440
441         bl      .copy_and_flush         /* copy the first n bytes        */
442                                         /* this includes the code being  */
443                                         /* executed here.                */
444         addis   r8,r3,(4f - _stext)@ha  /* Jump to the copy of this code */
445         addi    r8,r8,(4f - _stext)@l   /* that we just made */
446         mtctr   r8
447         bctr
448
449 p_end:  .llong  _end - _stext
450
451 4:      /* Now copy the rest of the kernel up to _end */
452         addis   r5,r26,(p_end - _stext)@ha
453         ld      r5,(p_end - _stext)@l(r5)       /* get _end */
454 5:      bl      .copy_and_flush         /* copy the rest */
455
456 9:      b       .start_here_multiplatform
457
458 /*
459  * Copy routine used to copy the kernel to start at physical address 0
460  * and flush and invalidate the caches as needed.
461  * r3 = dest addr, r4 = source addr, r5 = copy limit, r6 = start offset
462  * on exit, r3, r4, r5 are unchanged, r6 is updated to be >= r5.
463  *
464  * Note: this routine *only* clobbers r0, r6 and lr
465  */
466 _GLOBAL(copy_and_flush)
467         addi    r5,r5,-8
468         addi    r6,r6,-8
469 4:      li      r0,8                    /* Use the smallest common      */
470                                         /* denominator cache line       */
471                                         /* size.  This results in       */
472                                         /* extra cache line flushes     */
473                                         /* but operation is correct.    */
474                                         /* Can't get cache line size    */
475                                         /* from NACA as it is being     */
476                                         /* moved too.                   */
477
478         mtctr   r0                      /* put # words/line in ctr      */
479 3:      addi    r6,r6,8                 /* copy a cache line            */
480         ldx     r0,r6,r4
481         stdx    r0,r6,r3
482         bdnz    3b
483         dcbst   r6,r3                   /* write it to memory           */
484         sync
485         icbi    r6,r3                   /* flush the icache line        */
486         cmpld   0,r6,r5
487         blt     4b
488         sync
489         addi    r5,r5,8
490         addi    r6,r6,8
491         blr
492
493 .align 8
494 copy_to_here:
495
496 #ifdef CONFIG_SMP
497 #ifdef CONFIG_PPC_PMAC
498 /*
499  * On PowerMac, secondary processors starts from the reset vector, which
500  * is temporarily turned into a call to one of the functions below.
501  */
502         .section ".text";
503         .align 2 ;
504
505         .globl  __secondary_start_pmac_0
506 __secondary_start_pmac_0:
507         /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */
508         li      r24,0
509         b       1f
510         li      r24,1
511         b       1f
512         li      r24,2
513         b       1f
514         li      r24,3
515 1:
516         
517 _GLOBAL(pmac_secondary_start)
518         /* turn on 64-bit mode */
519         bl      .enable_64b_mode
520
521         li      r0,0
522         mfspr   r3,SPRN_HID4
523         rldimi  r3,r0,40,23     /* clear bit 23 (rm_ci) */
524         sync
525         mtspr   SPRN_HID4,r3
526         isync
527         sync
528         slbia
529
530         /* get TOC pointer (real address) */
531         bl      .relative_toc
532
533         /* Copy some CPU settings from CPU 0 */
534         bl      .__restore_cpu_ppc970
535
536         /* pSeries do that early though I don't think we really need it */
537         mfmsr   r3
538         ori     r3,r3,MSR_RI
539         mtmsrd  r3                      /* RI on */
540
541         /* Set up a paca value for this processor. */
542         LOAD_REG_ADDR(r4,paca)          /* Load paca pointer            */
543         ld      r4,0(r4)                /* Get base vaddr of paca array */
544         mulli   r13,r24,PACA_SIZE       /* Calculate vaddr of right paca */
545         add     r13,r13,r4              /* for this processor.          */
546         SET_PACA(r13)                   /* Save vaddr of paca in an SPRG*/
547
548         /* Mark interrupts soft and hard disabled (they might be enabled
549          * in the PACA when doing hotplug)
550          */
551         li      r0,0
552         stb     r0,PACASOFTIRQEN(r13)
553         stb     r0,PACAHARDIRQEN(r13)
554
555         /* Create a temp kernel stack for use before relocation is on.  */
556         ld      r1,PACAEMERGSP(r13)
557         subi    r1,r1,STACK_FRAME_OVERHEAD
558
559         b       __secondary_start
560
561 #endif /* CONFIG_PPC_PMAC */
562
563 /*
564  * This function is called after the master CPU has released the
565  * secondary processors.  The execution environment is relocation off.
566  * The paca for this processor has the following fields initialized at
567  * this point:
568  *   1. Processor number
569  *   2. Segment table pointer (virtual address)
570  * On entry the following are set:
571  *   r1        = stack pointer (real addr of temp stack)
572  *   r24       = cpu# (in Linux terms)
573  *   r13       = paca virtual address
574  *   SPRG_PACA = paca virtual address
575  */
576         .section ".text";
577         .align 2 ;
578
579         .globl  __secondary_start
580 __secondary_start:
581         /* Set thread priority to MEDIUM */
582         HMT_MEDIUM
583
584         /* Initialize the kernel stack */
585         LOAD_REG_ADDR(r3, current_set)
586         sldi    r28,r24,3               /* get current_set[cpu#]         */
587         ldx     r14,r3,r28
588         addi    r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
589         std     r14,PACAKSAVE(r13)
590
591         /* Do early setup for that CPU (stab, slb, hash table pointer) */
592         bl      .early_setup_secondary
593
594         /*
595          * setup the new stack pointer, but *don't* use this until
596          * translation is on.
597          */
598         mr      r1, r14
599
600         /* Clear backchain so we get nice backtraces */
601         li      r7,0
602         mtlr    r7
603
604         /* Mark interrupts both hard and soft disabled */
605         stb     r7,PACAHARDIRQEN(r13)
606         stb     r7,PACASOFTIRQEN(r13)
607
608         /* enable MMU and jump to start_secondary */
609         LOAD_REG_ADDR(r3, .start_secondary_prolog)
610         LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
611
612         mtspr   SPRN_SRR0,r3
613         mtspr   SPRN_SRR1,r4
614         RFI
615         b       .       /* prevent speculative execution */
616
617 /* 
618  * Running with relocation on at this point.  All we want to do is
619  * zero the stack back-chain pointer and get the TOC virtual address
620  * before going into C code.
621  */
622 _GLOBAL(start_secondary_prolog)
623         ld      r2,PACATOC(r13)
624         li      r3,0
625         std     r3,0(r1)                /* Zero the stack frame pointer */
626         bl      .start_secondary
627         b       .
628 /*
629  * Reset stack pointer and call start_secondary
630  * to continue with online operation when woken up
631  * from cede in cpu offline.
632  */
633 _GLOBAL(start_secondary_resume)
634         ld      r1,PACAKSAVE(r13)       /* Reload kernel stack pointer */
635         li      r3,0
636         std     r3,0(r1)                /* Zero the stack frame pointer */
637         bl      .start_secondary
638         b       .
639 #endif
640
641 /*
642  * This subroutine clobbers r11 and r12
643  */
644 _GLOBAL(enable_64b_mode)
645         mfmsr   r11                     /* grab the current MSR */
646 #ifdef CONFIG_PPC_BOOK3E
647         oris    r11,r11,0x8000          /* CM bit set, we'll set ICM later */
648         mtmsr   r11
649 #else /* CONFIG_PPC_BOOK3E */
650         li      r12,(MSR_64BIT | MSR_ISF)@highest
651         sldi    r12,r12,48
652         or      r11,r11,r12
653         mtmsrd  r11
654         isync
655 #endif
656         blr
657
658 /*
659  * This puts the TOC pointer into r2, offset by 0x8000 (as expected
660  * by the toolchain).  It computes the correct value for wherever we
661  * are running at the moment, using position-independent code.
662  */
663 _GLOBAL(relative_toc)
664         mflr    r0
665         bcl     20,31,$+4
666 0:      mflr    r11
667         ld      r2,(p_toc - 0b)(r11)
668         add     r2,r2,r11
669         mtlr    r0
670         blr
671
672 p_toc:  .llong  __toc_start + 0x8000 - 0b
673
674 /*
675  * This is where the main kernel code starts.
676  */
677 _INIT_STATIC(start_here_multiplatform)
678         /* set up the TOC (real address) */
679         bl      .relative_toc
680
681         /* Clear out the BSS. It may have been done in prom_init,
682          * already but that's irrelevant since prom_init will soon
683          * be detached from the kernel completely. Besides, we need
684          * to clear it now for kexec-style entry.
685          */
686         LOAD_REG_ADDR(r11,__bss_stop)
687         LOAD_REG_ADDR(r8,__bss_start)
688         sub     r11,r11,r8              /* bss size                     */
689         addi    r11,r11,7               /* round up to an even double word */
690         srdi.   r11,r11,3               /* shift right by 3             */
691         beq     4f
692         addi    r8,r8,-8
693         li      r0,0
694         mtctr   r11                     /* zero this many doublewords   */
695 3:      stdu    r0,8(r8)
696         bdnz    3b
697 4:
698
699 #ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
700         /* Setup OPAL entry */
701         std     r28,0(r11);
702         std     r29,8(r11);
703 #endif
704
705 #ifndef CONFIG_PPC_BOOK3E
706         mfmsr   r6
707         ori     r6,r6,MSR_RI
708         mtmsrd  r6                      /* RI on */
709 #endif
710
711 #ifdef CONFIG_RELOCATABLE
712         /* Save the physical address we're running at in kernstart_addr */
713         LOAD_REG_ADDR(r4, kernstart_addr)
714         clrldi  r0,r25,2
715         std     r0,0(r4)
716 #endif
717
718         /* The following gets the stack set up with the regs */
719         /* pointing to the real addr of the kernel stack.  This is   */
720         /* all done to support the C function call below which sets  */
721         /* up the htab.  This is done because we have relocated the  */
722         /* kernel but are still running in real mode. */
723
724         LOAD_REG_ADDR(r3,init_thread_union)
725
726         /* set up a stack pointer */
727         addi    r1,r3,THREAD_SIZE
728         li      r0,0
729         stdu    r0,-STACK_FRAME_OVERHEAD(r1)
730
731         /* Do very early kernel initializations, including initial hash table,
732          * stab and slb setup before we turn on relocation.     */
733
734         /* Restore parameters passed from prom_init/kexec */
735         mr      r3,r31
736         bl      .early_setup            /* also sets r13 and SPRG_PACA */
737
738         LOAD_REG_ADDR(r3, .start_here_common)
739         ld      r4,PACAKMSR(r13)
740         mtspr   SPRN_SRR0,r3
741         mtspr   SPRN_SRR1,r4
742         RFI
743         b       .       /* prevent speculative execution */
744         
745         /* This is where all platforms converge execution */
746 _INIT_GLOBAL(start_here_common)
747         /* relocation is on at this point */
748         std     r1,PACAKSAVE(r13)
749
750         /* Load the TOC (virtual address) */
751         ld      r2,PACATOC(r13)
752
753         bl      .setup_system
754
755         /* Load up the kernel context */
756 5:      li      r5,0
757         stb     r5,PACASOFTIRQEN(r13)   /* Soft Disabled */
758         stb     r5,PACAHARDIRQEN(r13)   /* Hard Disabled on others */
759
760         bl      .start_kernel
761
762         /* Not reached */
763         BUG_OPCODE
764
765 /*
766  * We put a few things here that have to be page-aligned.
767  * This stuff goes at the beginning of the bss, which is page-aligned.
768  */
769         .section ".bss"
770
771         .align  PAGE_SHIFT
772
773         .globl  empty_zero_page
774 empty_zero_page:
775         .space  PAGE_SIZE
776
777         .globl  swapper_pg_dir
778 swapper_pg_dir:
779         .space  PGD_TABLE_SIZE