2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2015-04-04 16:58:38 +01:00
/ *
* Copyright ( C ) 2 0 1 5 R u s s e l l K i n g
*
* This a s s e m b l y i s r e q u i r e d t o s a f e l y r e m a p t h e p h y s i c a l a d d r e s s s p a c e
* for K e y s t o n e 2
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / c p15 . h >
# include < a s m / m e m o r y . h >
# include < a s m / p g t a b l e . h >
.section " .idmap .text " , " ax"
# define L 1 _ O R D E R 3
# define L 2 _ O R D E R 3
ENTRY( l p a e _ p g t a b l e s _ r e m a p _ a s m )
stmfd s p ! , { r4 - r8 , l r }
mrc p15 , 0 , r8 , c1 , c0 , 0 @ read control reg
bic i p , r8 , #C R _ M @ d i s a b l e c a c h e s a n d M M U
mcr p15 , 0 , i p , c1 , c0 , 0
dsb
isb
/* Update level 2 entries covering the kernel */
ldr r6 , = ( _ e n d - 1 )
add r7 , r2 , #0x1000
add r6 , r7 , r6 , l s r #S E C T I O N _ S H I F T - L 2 _ O R D E R
add r7 , r7 , #P A G E _ O F F S E T > > ( S E C T I O N _ S H I F T - L 2 _ O R D E R )
2018-11-09 04:26:39 +01:00
1 : ldrd r4 , r5 , [ r7 ]
2015-04-04 16:58:38 +01:00
adds r4 , r4 , r0
adc r5 , r5 , r1
2018-11-09 04:26:39 +01:00
strd r4 , r5 , [ r7 ] , #1 < < L 2 _ O R D E R
2015-04-04 16:58:38 +01:00
cmp r7 , r6
bls 1 b
/* Update level 2 entries for the boot data */
add r7 , r2 , #0x1000
add r7 , r7 , r3 , l s r #S E C T I O N _ S H I F T - L 2 _ O R D E R
bic r7 , r7 , #( 1 < < L 2 _ O R D E R ) - 1
2018-11-09 04:26:39 +01:00
ldrd r4 , r5 , [ r7 ]
2015-04-04 16:58:38 +01:00
adds r4 , r4 , r0
adc r5 , r5 , r1
2018-11-09 04:26:39 +01:00
strd r4 , r5 , [ r7 ] , #1 < < L 2 _ O R D E R
ldrd r4 , r5 , [ r7 ]
2015-04-04 16:58:38 +01:00
adds r4 , r4 , r0
adc r5 , r5 , r1
2018-11-09 04:26:39 +01:00
strd r4 , r5 , [ r7 ]
2015-04-04 16:58:38 +01:00
/* Update level 1 entries */
mov r6 , #4
mov r7 , r2
2018-11-09 04:26:39 +01:00
2 : ldrd r4 , r5 , [ r7 ]
2015-04-04 16:58:38 +01:00
adds r4 , r4 , r0
adc r5 , r5 , r1
2018-11-09 04:26:39 +01:00
strd r4 , r5 , [ r7 ] , #1 < < L 1 _ O R D E R
2015-04-04 16:58:38 +01:00
subs r6 , r6 , #1
bne 2 b
mrrc p15 , 0 , r4 , r5 , c2 @ read TTBR0
adds r4 , r4 , r0 @ update physical address
adc r5 , r5 , r1
mcrr p15 , 0 , r4 , r5 , c2 @ write back TTBR0
mrrc p15 , 1 , r4 , r5 , c2 @ read TTBR1
adds r4 , r4 , r0 @ update physical address
adc r5 , r5 , r1
mcrr p15 , 1 , r4 , r5 , c2 @ write back TTBR1
dsb
mov i p , #0
mcr p15 , 0 , i p , c7 , c5 , 0 @ I+BTB cache invalidate
mcr p15 , 0 , i p , c8 , c7 , 0 @ local_flush_tlb_all()
dsb
isb
mcr p15 , 0 , r8 , c1 , c0 , 0 @ re-enable MMU
dsb
isb
ldmfd s p ! , { r4 - r8 , p c }
ENDPROC( l p a e _ p g t a b l e s _ r e m a p _ a s m )