76
76
* 2. The kernel is entered at __start
77
77
*/
78
78
79
+ /*
80
+ * boot_from_prom and prom_init run at the physical address. Everything
81
+ * after prom and kexec entry run at the virtual address (PAGE_OFFSET).
82
+ * Secondaries run at the virtual address from generic_secondary_common_init
83
+ * onward.
84
+ */
85
+
79
86
OPEN_FIXED_SECTION(first_256B, 0x0 , 0x100 )
80
87
USE_FIXED_SECTION(first_256B)
81
88
/*
@@ -303,13 +310,11 @@ _GLOBAL(fsl_secondary_thread_init)
303
310
/* turn on 64-bit mode */
304
311
bl enable_64b_mode
305
312
306
- /* get a valid TOC pointer, wherever we're mapped at */
307
- bl relative_toc
308
- tovirt(r2,r2)
309
-
310
313
/* Book3E initialization */
311
314
mr r3,r24
312
315
bl book3e_secondary_thread_init
316
+ bl relative_toc
317
+
313
318
b generic_secondary_common_init
314
319
315
320
#endif /* CONFIG_PPC_BOOK3E_64 */
@@ -331,16 +336,12 @@ _GLOBAL(generic_secondary_smp_init)
331
336
/* turn on 64-bit mode */
332
337
bl enable_64b_mode
333
338
334
- /* get a valid TOC pointer, wherever we're mapped at */
335
- bl relative_toc
336
- tovirt(r2,r2)
337
-
338
339
#ifdef CONFIG_PPC_BOOK3E_64
339
340
/* Book3E initialization */
340
341
mr r3,r24
341
342
mr r4,r25
342
343
bl book3e_secondary_core_init
343
-
344
+ /* Now NIA and r2 are relocated to PAGE_OFFSET if not already */
344
345
/*
345
346
* After common core init has finished, check if the current thread is the
346
347
* one we wanted to boot. If not, start the specified thread and stop the
@@ -378,6 +379,16 @@ _GLOBAL(generic_secondary_smp_init)
378
379
10:
379
380
b 10b
380
381
20:
382
+ #else
383
+ /* Now the MMU is off, can branch to our PAGE_OFFSET address */
384
+ bcl 20 ,31 ,$+4
385
+ 1: mflr r11
386
+ addi r11,r11,(2f - 1b)
387
+ tovirt(r11, r11)
388
+ mtctr r11
389
+ bctr
390
+ 2:
391
+ bl relative_toc
381
392
#endif
382
393
383
394
generic_secondary_common_init:
@@ -492,6 +503,8 @@ SYM_FUNC_START_LOCAL(start_initialization_book3s)
492
503
/* Switch off MMU if not already off */
493
504
bl __mmu_off
494
505
506
+ /* Now the MMU is off, can return to our PAGE_OFFSET address */
507
+ tovirt(r25,r25)
495
508
mtlr r25
496
509
blr
497
510
SYM_FUNC_END(start_initialization_book3s)
@@ -534,16 +547,19 @@ __start_initialization_multiplatform:
534
547
/* Get TOC pointer (current runtime address) */
535
548
bl relative_toc
536
549
550
+ /* These functions return to the virtual (PAGE_OFFSET) address */
537
551
#ifdef CONFIG_PPC_BOOK3E_64
538
552
bl start_initialization_book3e
539
553
#else
540
554
bl start_initialization_book3s
541
555
#endif /* CONFIG_PPC_BOOK3E_64 */
542
556
543
- /* Get TOC pointer */
557
+ /* Get TOC pointer, virtual */
544
558
bl relative_toc
545
559
546
560
/* find out where we are now */
561
+
562
+ /* OPAL doesn't pass base address in r4, have to derive it. */
547
563
bcl 20 ,31 ,$+4
548
564
0: mflr r26 /* r26 = runtime addr here */
549
565
addis r26,r26,(_stext - 0b)@ha
@@ -554,7 +570,7 @@ __start_initialization_multiplatform:
554
570
__REF
555
571
__boot_from_prom:
556
572
#ifdef CONFIG_PPC_OF_BOOT_TRAMPOLINE
557
- /* Get TOC pointer */
573
+ /* Get TOC pointer, non-virtual */
558
574
bl relative_toc
559
575
560
576
/* find out where we are now */
@@ -603,18 +619,11 @@ __boot_from_prom:
603
619
__after_prom_start:
604
620
#ifdef CONFIG_RELOCATABLE
605
621
/* process relocations for the final address of the kernel */
606
- lis r25,PAGE_OFFSET@highest /* compute virtual base of kernel */
607
- sldi r25,r25,32
608
- #if defined(CONFIG_PPC_BOOK3E_64)
609
- tovirt(r26,r26) /* on booke, we already run at PAGE_OFFSET */
610
- #endif
611
622
lwz r7,(FIXED_SYMBOL_ABS_ADDR(__run_at_load))(r26)
612
- #if defined(CONFIG_PPC_BOOK3E_64)
613
- tophys(r26,r26)
614
- #endif
615
623
cmplwi cr0,r7,1 /* flagged to stay where we are ? */
616
- bne 1f
617
- add r25,r25,r26
624
+ mr r25,r26 /* then use current kernel base */
625
+ beq 1f
626
+ LOAD_REG_IMMEDIATE(r25, PAGE_OFFSET) /* else use static kernel base */
618
627
1: mr r3,r25
619
628
bl relocate
620
629
#if defined(CONFIG_PPC_BOOK3E_64)
@@ -630,14 +639,8 @@ __after_prom_start:
630
639
*
631
640
* Note: This process overwrites the OF exception vectors.
632
641
*/
633
- li r3,0 /* target addr */
634
- #ifdef CONFIG_PPC_BOOK3E_64
635
- tovirt(r3,r3) /* on booke, we already run at PAGE_OFFSET */
636
- #endif
642
+ LOAD_REG_IMMEDIATE(r3, PAGE_OFFSET)
637
643
mr. r4,r26 /* In some cases the loader may */
638
- #if defined(CONFIG_PPC_BOOK3E_64)
639
- tovirt(r4,r4)
640
- #endif
641
644
beq 9f /* have already put us at zero */
642
645
li r6,0x100 /* Start offset, the first 0x100 */
643
646
/* bytes were copied earlier. */
@@ -648,9 +651,6 @@ __after_prom_start:
648
651
* variable __run_at_load, if it is set the kernel is treated as relocatable
649
652
* kernel, otherwise it will be moved to PHYSICAL_START
650
653
*/
651
- #if defined(CONFIG_PPC_BOOK3E_64)
652
- tovirt(r26,r26) /* on booke, we already run at PAGE_OFFSET */
653
- #endif
654
654
lwz r7,(FIXED_SYMBOL_ABS_ADDR(__run_at_load))(r26)
655
655
cmplwi cr0,r7,1
656
656
bne 3f
@@ -769,9 +769,15 @@ _GLOBAL(pmac_secondary_start)
769
769
sync
770
770
slbia
771
771
772
- /* get TOC pointer (real address) */
772
+ /* Branch to our PAGE_OFFSET address */
773
+ bcl 20 ,31 ,$+4
774
+ 1: mflr r11
775
+ addi r11,r11,(2f - 1b)
776
+ tovirt(r11, r11)
777
+ mtctr r11
778
+ bctr
779
+ 2:
773
780
bl relative_toc
774
- tovirt(r2,r2)
775
781
776
782
/* Copy some CPU settings from CPU 0 */
777
783
bl __restore_cpu_ppc970
@@ -910,8 +916,9 @@ SYM_FUNC_END(enable_64b_mode)
910
916
* TOC in -mcmodel=medium mode. After we relocate to 0 but before
911
917
* the MMU is on we need our TOC to be a virtual address otherwise
912
918
* these pointers will be real addresses which may get stored and
913
- * accessed later with the MMU on. We use tovirt() at the call
914
- * sites to handle this.
919
+ * accessed later with the MMU on. We branch to the virtual address
920
+ * while still in real mode then call relative_toc again to handle
921
+ * this.
915
922
*/
916
923
_GLOBAL(relative_toc)
917
924
mflr r0
@@ -930,9 +937,8 @@ p_toc: .8byte .TOC. - 0b
930
937
*/
931
938
__REF
932
939
start_here_multiplatform:
933
- /* set up the TOC */
934
- bl relative_toc
935
- tovirt(r2,r2)
940
+ /* Adjust TOC for moved kernel. Could adjust when moving it instead. */
941
+ bl relative_toc
936
942
937
943
/* Clear out the BSS. It may have been done in prom_init,
938
944
* already but that's irrelevant since prom_init will soon
0 commit comments