@ -57,61 +57,91 @@ __secondary_start_page:
lis r3 ,t o r e s e t ( _ _ s p i n _ t a b l e ) @h
lis r3 ,t o r e s e t ( _ _ s p i n _ t a b l e ) @h
ori r3 ,r3 ,t o r e s e t ( _ _ s p i n _ t a b l e ) @l
ori r3 ,r3 ,t o r e s e t ( _ _ s p i n _ t a b l e ) @l
/* r9 has the base address for the entry */
/* r10 has the base address for the entry */
mfspr r0 ,S P R N _ P I R
mfspr r0 ,S P R N _ P I R
mr r4 ,r0
mr r4 ,r0
slwi r8 ,r4 ,4
slwi r8 ,r4 ,5
slwi r9 ,r4 ,3
add r10 ,r3 ,r8
add r8 ,r8 ,r9
add r9 ,r3 ,r8
# define E P A P R _ M A G I C ( 0 x45 5 0 4 1 5 0 )
# define E N T R Y _ A D D R _ U P P E R 0
# define E P A P R _ M A G I C ( 0 x65 5 0 4 1 5 0 )
# define E N T R Y _ A D D R _ L O W E R 4
# define E N T R Y _ A D D R 0
# define E N T R Y _ R 3 _ U P P E R 8
# define E N T R Y _ P I R 4
# define E N T R Y _ R 3 _ L O W E R 1 2
# define E N T R Y _ R 3 8
# define E N T R Y _ R E S V 1 6
# define E N T R Y _ R 4 1 2
# define E N T R Y _ P I R 2 0
# define E N T R Y _ R 6 1 6
# define E N T R Y _ R 6 _ U P P E R 2 4
# define E N T R Y _ R 7 2 0
# define E N T R Y _ R 6 _ L O W E R 2 8
# define E N T R Y _ S I Z E 3 2
/* setup the entry */
/* setup the entry */
li r4 ,0
li r3 ,0
li r8 ,1
li r8 ,1
lis r6 ,E P A P R _ M A G I C @h
stw r0 ,E N T R Y _ P I R ( r10 )
ori r6 ,r6 ,E P A P R _ M A G I C @l
stw r3 ,E N T R Y _ A D D R _ U P P E R ( r10 )
stw r0 ,E N T R Y _ P I R ( r9 )
stw r8 ,E N T R Y _ A D D R _ L O W E R ( r10 )
stw r8 ,E N T R Y _ A D D R ( r9 )
stw r3 ,E N T R Y _ R 3 _ U P P E R ( r10 )
stw r4 ,E N T R Y _ R 3 ( r9 )
stw r4 ,E N T R Y _ R 3 _ L O W E R ( r10 )
stw r4 ,E N T R Y _ R 4 ( r9 )
stw r3 ,E N T R Y _ R 6 _ U P P E R ( r10 )
stw r6 ,E N T R Y _ R 6 ( r9 )
stw r3 ,E N T R Y _ R 6 _ L O W E R ( r10 )
stw r4 ,E N T R Y _ R 7 ( r9 )
/* setup mapping for AS = 1, and jump there */
lis r11 ,( M A S 0 _ T L B S E L ( 1 ) | M A S 0 _ E S E L ( 1 ) ) @h
mtspr S P R N _ M A S 0 ,r11
lis r11 ,( M A S 1 _ V A L I D | M A S 1 _ I P R O T ) @h
ori r11 ,r11 ,( M A S 1 _ T S | M A S 1 _ T S I Z E ( B O O K E _ P A G E S Z _ 4 K ) ) @l
mtspr S P R N _ M A S 1 ,r11
lis r11 ,( 0 x f f f f f00 0 | M A S 2 _ I ) @h
ori r11 ,r11 ,( 0 x f f f f f00 0 | M A S 2 _ I ) @l
mtspr S P R N _ M A S 2 ,r11
lis r11 ,( 0 x f f f f f00 0 | M A S 3 _ S X | M A S 3 _ S W | M A S 3 _ S R ) @h
ori r11 ,r11 ,( 0 x f f f f f00 0 | M A S 3 _ S X | M A S 3 _ S W | M A S 3 _ S R ) @l
mtspr S P R N _ M A S 3 ,r11
tlbwe
bl 1 f
1 : mflr r11
addi r11 ,r11 ,2 8
mfmsr r13
ori r12 ,r13 ,M S R _ I S | M S R _ D S @l
mtspr S P R N _ S R R 0 ,r11
mtspr S P R N _ S R R 1 ,r12
rfi
/* spin waiting for addr */
/* spin waiting for addr */
1 : lwz r4 ,E N T R Y _ A D D R ( r9 )
2 :
lwz r4 ,E N T R Y _ A D D R _ L O W E R ( r10 )
andi. r11 ,r4 ,1
andi. r11 ,r4 ,1
bne 1 b
bne 2 b
/* get the upper bits of the addr */
lwz r11 ,E N T R Y _ A D D R _ U P P E R ( r10 )
/* setup branch addr */
/* setup branch addr */
mtctr r4
mtspr S P R N _ S R R 0 , r4
/* mark the entry as released */
/* mark the entry as released */
li r8 ,3
li r8 ,3
stw r8 ,E N T R Y _ A D D R ( r9 )
stw r8 ,E N T R Y _ A D D R _ L O W E R ( r10 )
/* mask by ~64M to setup our tlb we will jump to */
/* mask by ~64M to setup our tlb we will jump to */
rlwinm r8 ,r4 ,0 ,0 ,5
rlwinm r12 ,r4 ,0 ,0 ,5
/* setup r3, r5, r6, r7 */
/* setup r3, r4, r 5, r6, r7, r8, r9 */
lwz r3 ,E N T R Y _ R 3 ( r9 )
lwz r3 ,E N T R Y _ R 3 _ L O W E R ( r10 )
lwz r4 ,E N T R Y _ R 4 ( r9 )
li r4 ,0
li r5 ,0
li r5 ,0
lwz r6 ,E N T R Y _ R 6 ( r9 )
lwz r6 ,E N T R Y _ R 6 _ L O W E R ( r10 )
lwz r7 ,E N T R Y _ R 7 ( r9 )
lis r7 ,( 6 4 * 1 0 2 4 * 1 0 2 4 ) @h
li r8 ,0
li r9 ,0
/* load up the pir */
/* load up the pir */
lwz r0 ,E N T R Y _ P I R ( r9 )
lwz r0 ,E N T R Y _ P I R ( r10 )
mtspr S P R N _ P I R ,r0
mtspr S P R N _ P I R ,r0
mfspr r0 ,S P R N _ P I R
mfspr r0 ,S P R N _ P I R
stw r0 ,E N T R Y _ P I R ( r9 )
stw r0 ,E N T R Y _ P I R ( r10 )
/ *
/ *
* Coming h e r e , w e k n o w t h e c p u h a s o n e T L B m a p p i n g i n T L B 1 [ 0 ]
* Coming h e r e , w e k n o w t h e c p u h a s o n e T L B m a p p i n g i n T L B 1 [ 0 ]
@ -119,26 +149,30 @@ __secondary_start_page:
* second m a p p i n g t h a t m a p s a d d r 1 : 1 f o r 6 4 M , a n d t h e n w e j u m p t o
* second m a p p i n g t h a t m a p s a d d r 1 : 1 f o r 6 4 M , a n d t h e n w e j u m p t o
* addr
* addr
* /
* /
lis r9 ,( M A S 0 _ T L B S E L ( 1 ) | M A S 0 _ E S E L ( 1 ) ) @h
lis r10 ,( M A S 0 _ T L B S E L ( 1 ) | M A S 0 _ E S E L ( 0 ) ) @h
mtspr S P R N _ M A S 0 ,r9
mtspr S P R N _ M A S 0 ,r10
lis r9 ,( M A S 1 _ V A L I D | M A S 1 _ I P R O T ) @h
lis r10 ,( M A S 1 _ V A L I D | M A S 1 _ I P R O T ) @h
ori r9 ,r9 ,( M A S 1 _ T S I Z E ( B O O K E _ P A G E S Z _ 6 4 M ) ) @l
ori r10 ,r10 ,( M A S 1 _ T S I Z E ( B O O K E _ P A G E S Z _ 6 4 M ) ) @l
mtspr S P R N _ M A S 1 ,r9
mtspr S P R N _ M A S 1 ,r10
/* WIMGE = 0b00000 for now */
/* WIMGE = 0b00000 for now */
mtspr S P R N _ M A S 2 ,r8
mtspr S P R N _ M A S 2 ,r12
ori r8 ,r8 ,( M A S 3 _ S X | M A S 3 _ S W | M A S 3 _ S R )
ori r12 ,r12 ,( M A S 3 _ S X | M A S 3 _ S W | M A S 3 _ S R )
mtspr S P R N _ M A S 3 ,r8
mtspr S P R N _ M A S 3 ,r12
# ifdef C O N F I G _ E N A B L E _ 3 6 B I T _ P H Y S
mtspr S P R N _ M A S 7 ,r11
# endif
tlbwe
tlbwe
/ * Now w e h a v e a n o t h e r m a p p i n g f o r t h i s p a g e , s o w e j u m p t o t h a t
/ * Now w e h a v e a n o t h e r m a p p i n g f o r t h i s p a g e , s o w e j u m p t o t h a t
* mapping
* mapping
* /
* /
bctr
mtspr S P R N _ S R R 1 ,r13
rfi
.align 3
.align 3
.globl __spin_table
.globl __spin_table
__spin_table :
__spin_table :
.space CONFIG_ N R _ C P U S * 2 4
.space CONFIG_ N R _ C P U S * E N T R Y _ S I Z E
/ * Fill i n t h e e m p t y s p a c e . T h e a c t u a l r e s e t v e c t o r i s
/ * Fill i n t h e e m p t y s p a c e . T h e a c t u a l r e s e t v e c t o r i s
* the l a s t w o r d o f t h e p a g e * /
* the l a s t w o r d o f t h e p a g e * /