@ -21,6 +21,7 @@
# include < a s m / m e m o r y . h >
# include < a s m / t h r e a d _ i n f o . h >
# include < a s m / s y s t e m . h >
# include < a s m / p g t a b l e . h >
# ifdef C O N F I G _ D E B U G _ L L
# include < m a c h / d e b u g - m a c r o . S >
@ -38,11 +39,14 @@
# error K E R N E L _ R A M _ V A D D R m u s t s t a r t a t 0 x X X X X 8 0 0 0
# endif
# define P G _ D I R _ S I Z E 0 x40 0 0
# define P M D _ O R D E R 2
.globl swapper_pg_dir
.equ swapper_ p g _ d i r , K E R N E L _ R A M _ V A D D R - 0 x40 0 0
.equ swapper_ p g _ d i r , K E R N E L _ R A M _ V A D D R - P G _ D I R _ S I Z E
.macro pgtbl, r d , p h y s
add \ r d , \ p h y s , #T E X T _ O F F S E T - 0x4000
add \ r d , \ p h y s , #T E X T _ O F F S E T - P G _ D I R _ S I Z E
.endm
# ifdef C O N F I G _ X I P _ K E R N E L
@ -148,11 +152,11 @@ __create_page_tables:
pgtbl r4 , r8 @ page table address
/ *
* Clear t h e 1 6 K l e v e l 1 s w a p p e r p a g e t a b l e
* Clear t h e s w a p p e r p a g e t a b l e
* /
mov r0 , r4
mov r3 , #0
add r6 , r0 , #0x4000
add r6 , r0 , #P G _ D I R _ S I Z E
1 : str r3 , [ r0 ] , #4
str r3 , [ r0 ] , #4
str r3 , [ r0 ] , #4
@ -171,30 +175,30 @@ __create_page_tables:
sub r0 , r0 , r3 @ virt->phys offset
add r5 , r5 , r0 @ phys __enable_mmu
add r6 , r6 , r0 @ phys __enable_mmu_end
mov r5 , r5 , l s r #20
mov r6 , r6 , l s r #20
mov r5 , r5 , l s r #S E C T I O N _ S H I F T
mov r6 , r6 , l s r #S E C T I O N _ S H I F T
1 : orr r3 , r7 , r5 , l s l #20 @ flags + kernel base
str r3 , [ r4 , r5 , l s l #2 ] @ identity mapping
teq r5 , r6
addne r5 , r5 , #1 @ next section
bne 1 b
1 : orr r3 , r7 , r5 , l s l #S E C T I O N _ S H I F T @ f l a g s + k e r n e l b a s e
str r3 , [ r4 , r5 , l s l #P M D _ O R D E R ] @ i d e n t i t y m a p p i n g
cmp r5 , r6
addlo r5 , r5 , #1 @ next section
blo 1 b
/ *
* Now s e t u p t h e p a g e t a b l e s f o r o u r k e r n e l d i r e c t
* mapped r e g i o n .
* /
mov r3 , p c
mov r3 , r3 , l s r #20
orr r3 , r7 , r3 , l s l #20
add r0 , r4 , #( K E R N E L _ S T A R T & 0xff000000 ) > > 1 8
str r3 , [ r0 , #( K E R N E L _ S T A R T & 0x00f00000 ) > > 1 8 ] !
mov r3 , r3 , l s r #S E C T I O N _ S H I F T
orr r3 , r7 , r3 , l s l #S E C T I O N _ S H I F T
add r0 , r4 , #( K E R N E L _ S T A R T & 0xff000000 ) > > ( S E C T I O N _ S H I F T - P M D _ O R D E R )
str r3 , [ r0 , #( ( K E R N E L _ S T A R T & 0x00f00000 ) > > S E C T I O N _ S H I F T ) < < P M D _ O R D E R ] !
ldr r6 , = ( K E R N E L _ E N D - 1 )
add r0 , r0 , #4
add r6 , r4 , r6 , l s r #18
add r0 , r0 , #1 < < P M D _ O R D E R
add r6 , r4 , r6 , l s r #( S E C T I O N _ S H I F T - P M D _ O R D E R )
1 : cmp r0 , r6
add r3 , r3 , #1 < < 2 0
strls r3 , [ r0 ] , #4
add r3 , r3 , #1 < < S E C T I O N _ S H I F T
strls r3 , [ r0 ] , #1 < < P M D _ O R D E R
bls 1 b
# ifdef C O N F I G _ X I P _ K E R N E L
@ -203,11 +207,11 @@ __create_page_tables:
* /
add r3 , r8 , #T E X T _ O F F S E T
orr r3 , r3 , r7
add r0 , r4 , #( K E R N E L _ R A M _ V A D D R & 0xff000000 ) > > 1 8
str r3 , [ r0 , #( K E R N E L _ R A M _ V A D D R & 0x00f00000 ) > > 1 8 ] !
add r0 , r4 , #( K E R N E L _ R A M _ V A D D R & 0xff000000 ) > > ( S E C T I O N _ S H I F T - P M D _ O R D E R )
str r3 , [ r0 , #( K E R N E L _ R A M _ V A D D R & 0x00f00000 ) > > ( S E C T I O N _ S H I F T - P M D _ O R D E R ) ] !
ldr r6 , = ( _ e n d - 1 )
add r0 , r0 , #4
add r6 , r4 , r6 , l s r #18
add r6 , r4 , r6 , l s r #( S E C T I O N _ S H I F T - P M D _ O R D E R )
1 : cmp r0 , r6
add r3 , r3 , #1 < < 2 0
strls r3 , [ r0 ] , #4
@ -218,12 +222,12 @@ __create_page_tables:
* Then m a p b o o t p a r a m s a d d r e s s i n r2 o r
* the f i r s t 1 M B o f r a m i f b o o t p a r a m s a d d r e s s i s n o t s p e c i f i e d .
* /
mov r0 , r2 , l s r #20
movs r0 , r0 , l s l #20
mov r0 , r2 , l s r #S E C T I O N _ S H I F T
movs r0 , r0 , l s l #S E C T I O N _ S H I F T
moveq r0 , r8
sub r3 , r0 , r8
add r3 , r3 , #P A G E _ O F F S E T
add r3 , r4 , r3 , l s r #18
add r3 , r4 , r3 , l s r #( S E C T I O N _ S H I F T - P M D _ O R D E R )
orr r6 , r7 , r0
str r6 , [ r3 ]
@ -236,21 +240,21 @@ __create_page_tables:
* /
addruart r7 , r3
mov r3 , r3 , l s r #20
mov r3 , r3 , l s l #2
mov r3 , r3 , l s r #S E C T I O N _ S H I F T
mov r3 , r3 , l s l #P M D _ O R D E R
add r0 , r4 , r3
rsb r3 , r3 , #0x4000 @ PTRS_PER_PGD*sizeof(long)
cmp r3 , #0x0800 @ limit to 512MB
movhi r3 , #0x0800
add r6 , r0 , r3
mov r3 , r7 , l s r #20
mov r3 , r7 , l s r #S E C T I O N _ S H I F T
ldr r7 , [ r10 , #P R O C I N F O _ I O _ M M U F L A G S ] @ i o _ m m u f l a g s
orr r3 , r7 , r3 , l s l #20
orr r3 , r7 , r3 , l s l #S E C T I O N _ S H I F T
1 : str r3 , [ r0 ] , #4
add r3 , r3 , #1 < < 2 0
teq r0 , r6
bne 1 b
add r3 , r3 , #1 < < S E C T I O N _ S H I F T
cmp r0 , r6
blo 1 b
# else / * C O N F I G _ D E B U G _ I C E D C C * /
/* we don't need any serial debugging mappings for ICEDCC */
@ -262,7 +266,7 @@ __create_page_tables:
* If w e ' r e u s i n g t h e N e t W i n d e r o r C A T S , w e a l s o n e e d t o m a p
* in t h e 1 6 5 5 0 - t y p e s e r i a l p o r t f o r t h e d e b u g m e s s a g e s
* /
add r0 , r4 , #0xff000000 > > 1 8
add r0 , r4 , #0xff000000 > > ( S E C T I O N _ S H I F T - P M D _ O R D E R )
orr r3 , r7 , #0x7c000000
str r3 , [ r0 ]
# endif
@ -272,10 +276,10 @@ __create_page_tables:
* Similar r e a s o n s h e r e - f o r d e b u g . T h i s i s
* only f o r A c o r n R i s c P C a r c h i t e c t u r e s .
* /
add r0 , r4 , #0x02000000 > > 1 8
add r0 , r4 , #0x02000000 > > ( S E C T I O N _ S H I F T - P M D _ O R D E R )
orr r3 , r7 , #0x02000000
str r3 , [ r0 ]
add r0 , r4 , #0xd8000000 > > 1 8
add r0 , r4 , #0xd8000000 > > ( S E C T I O N _ S H I F T - P M D _ O R D E R )
str r3 , [ r0 ]
# endif
# endif