2015-10-25 08:01:56 +00:00
/ *
* Copyright ( C ) 2 0 1 5 - A R M L t d
* Author : Marc Z y n g i e r < m a r c . z y n g i e r @arm.com>
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or modify
* it u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e v e r s i o n 2 a s
* published b y t h e F r e e S o f t w a r e F o u n d a t i o n .
*
* This p r o g r a m i s d i s t r i b u t e d i n t h e h o p e t h a t i t w i l l b e u s e f u l ,
* but W I T H O U T A N Y W A R R A N T Y ; without even the implied warranty of
* MERCHANTABILITY o r F I T N E S S F O R A P A R T I C U L A R P U R P O S E . S e e t h e
* GNU G e n e r a l P u b l i c L i c e n s e f o r m o r e d e t a i l s .
*
* You s h o u l d h a v e r e c e i v e d a c o p y o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* along w i t h t h i s p r o g r a m . I f n o t , s e e < h t t p : / / w w w . g n u . o r g / l i c e n s e s / > .
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / a l t e r n a t i v e . h >
# include < a s m / a s s e m b l e r . h >
# include < a s m / a s m - o f f s e t s . h >
# include < a s m / c p u f e a t u r e . h >
# include < a s m / k v m _ a r m . h >
# include < a s m / k v m _ a s m . h >
# include < a s m / k v m _ m m u . h >
.text
.pushsection .hyp .text , " ax"
.macro save_x0_to_x3
stp x0 , x1 , [ s p , #- 16 ] !
stp x2 , x3 , [ s p , #- 16 ] !
.endm
.macro restore_x0_to_x3
ldp x2 , x3 , [ s p ] , #16
ldp x0 , x1 , [ s p ] , #16
.endm
el1_sync : / / Guest t r a p p e d i n t o E L 2
save_ x0 _ t o _ x3
mrs x1 , e s r _ e l 2
lsr x2 , x1 , #E S R _ E L x _ E C _ S H I F T
cmp x2 , #E S R _ E L x _ E C _ H V C 64
b. n e e l 1 _ t r a p
mrs x3 , v t t b r _ e l 2 / / I f v t t b r i s v a l i d , t h e 6 4 b i t g u e s t
cbnz x3 , e l 1 _ t r a p / / c a l l e d H V C
/* Here, we're pretty sure the host called HVC. */
restore_ x0 _ t o _ x3
/* Check for __hyp_get_vectors */
cbnz x0 , 1 f
mrs x0 , v b a r _ e l 2
b 2 f
1 : stp l r , x z r , [ s p , #- 16 ] !
/ *
* Compute t h e f u n c t i o n a d d r e s s i n E L 2 , a n d s h u f f l e t h e p a r a m e t e r s .
* /
kern_ h y p _ v a x0
mov l r , x0
mov x0 , x1
mov x1 , x2
mov x2 , x3
blr l r
ldp l r , x z r , [ s p ] , #16
2 : eret
el1_trap :
/ *
* x1 : ESR
* x2 : ESR_ E C
* /
/* Guest accessed VFP/SIMD registers, save host, restore Guest */
cmp x2 , #E S R _ E L x _ E C _ F P _ A S I M D
b. e q _ _ f p s i m d _ g u e s t _ r e s t o r e
cmp x2 , #E S R _ E L x _ E C _ D A B T _ L O W
mov x0 , #E S R _ E L x _ E C _ I A B T _ L O W
ccmp x2 , x0 , #4 , n e
b. n e 1 f / / N o t a n a b o r t w e c a r e a b o u t
/* This is an abort. Check for permission fault */
alternative_ i f _ n o t A R M 6 4 _ W O R K A R O U N D _ 8 3 4 2 2 0
and x2 , x1 , #E S R _ E L x _ F S C _ T Y P E
cmp x2 , #F S C _ P E R M
b. n e 1 f / / N o t a p e r m i s s i o n f a u l t
alternative_ e l s e
nop / / U s e t h e p e r m i s s i o n f a u l t p a t h t o
nop / / c h e c k f o r a v a l i d S 1 t r a n s l a t i o n ,
nop / / r e g a r d l e s s o f t h e E S R v a l u e .
alternative_ e n d i f
/ *
* Check f o r S t a g e - 1 p a g e t a b l e w a l k , w h i c h i s g u a r a n t e e d
* to g i v e a v a l i d H P F A R _ E L 2 .
* /
tbnz x1 , #7 , 1 f / / S 1 P T W i s s e t
/* Preserve PAR_EL1 */
mrs x3 , p a r _ e l 1
stp x3 , x z r , [ s p , #- 16 ] !
/ *
* Permission f a u l t , H P F A R _ E L 2 i s i n v a l i d .
* Resolve t h e I P A t h e h a r d w a y u s i n g t h e g u e s t V A .
* Stage- 1 t r a n s l a t i o n a l r e a d y v a l i d a t e d t h e m e m o r y a c c e s s r i g h t s .
* As s u c h , w e c a n u s e t h e E L 1 t r a n s l a t i o n r e g i m e , a n d d o n ' t h a v e
* to d i s t i n g u i s h b e t w e e n E L 0 a n d E L 1 a c c e s s .
* /
mrs x2 , f a r _ e l 2
at s1 e 1 r , x2
isb
/* Read result */
mrs x3 , p a r _ e l 1
ldp x0 , x z r , [ s p ] , #16 / / R e s t o r e P A R _ E L 1 f r o m t h e s t a c k
msr p a r _ e l 1 , x0
tbnz x3 , #0 , 3 f / / B a i l o u t i f w e f a i l e d t h e t r a n s l a t i o n
ubfx x3 , x3 , #12 , #36 / / E x t r a c t I P A
lsl x3 , x3 , #4 / / a n d p r e s e n t i t l i k e H P F A R
b 2 f
1 : mrs x3 , h p f a r _ e l 2
mrs x2 , f a r _ e l 2
2 : mrs x0 , t p i d r _ e l 2
str w1 , [ x0 , #V C P U _ E S R _ E L 2 ]
str x2 , [ x0 , #V C P U _ F A R _ E L 2 ]
str x3 , [ x0 , #V C P U _ H P F A R _ E L 2 ]
mov x1 , #A R M _ E X C E P T I O N _ T R A P
b _ _ g u e s t _ e x i t
/ *
* Translation f a i l e d . J u s t r e t u r n t o t h e g u e s t a n d
* let i t f a u l t a g a i n . A n o t h e r C P U i s p r o b a b l y p l a y i n g
* behind o u r b a c k .
* /
3 : restore_ x0 _ t o _ x3
eret
el1_irq :
save_ x0 _ t o _ x3
mrs x0 , t p i d r _ e l 2
mov x1 , #A R M _ E X C E P T I O N _ I R Q
b _ _ g u e s t _ e x i t
2015-10-25 15:21:52 +00:00
ENTRY( _ _ h y p _ d o _ p a n i c )
mov l r , #( P S R _ F _ B I T | P S R _ I _ B I T | P S R _ A _ B I T | P S R _ D _ B I T | \
PSR_ M O D E _ E L 1 h )
msr s p s r _ e l 2 , l r
ldr l r , =panic
msr e l r _ e l 2 , l r
eret
ENDPROC( _ _ h y p _ d o _ p a n i c )
.macro invalid_vector label, t a r g e t = _ _ h y p _ p a n i c
2015-10-25 08:01:56 +00:00
.align 2
\ label :
b \ t a r g e t
ENDPROC( \ l a b e l )
.endm
/* None of these should ever happen */
invalid_ v e c t o r e l 2 t _ s y n c _ i n v a l i d
invalid_ v e c t o r e l 2 t _ i r q _ i n v a l i d
invalid_ v e c t o r e l 2 t _ f i q _ i n v a l i d
invalid_ v e c t o r e l 2 t _ e r r o r _ i n v a l i d
invalid_ v e c t o r e l 2 h _ s y n c _ i n v a l i d
invalid_ v e c t o r e l 2 h _ i r q _ i n v a l i d
invalid_ v e c t o r e l 2 h _ f i q _ i n v a l i d
invalid_ v e c t o r e l 2 h _ e r r o r _ i n v a l i d
invalid_ v e c t o r e l 1 _ s y n c _ i n v a l i d
invalid_ v e c t o r e l 1 _ i r q _ i n v a l i d
invalid_ v e c t o r e l 1 _ f i q _ i n v a l i d
invalid_ v e c t o r e l 1 _ e r r o r _ i n v a l i d
.ltorg
.align 11
2015-10-25 13:58:00 +00:00
ENTRY( _ _ k v m _ h y p _ v e c t o r )
2015-10-25 08:01:56 +00:00
ventry e l 2 t _ s y n c _ i n v a l i d / / S y n c h r o n o u s E L 2 t
ventry e l 2 t _ i r q _ i n v a l i d / / I R Q E L 2 t
ventry e l 2 t _ f i q _ i n v a l i d / / F I Q E L 2 t
ventry e l 2 t _ e r r o r _ i n v a l i d / / E r r o r E L 2 t
ventry e l 2 h _ s y n c _ i n v a l i d / / S y n c h r o n o u s E L 2 h
ventry e l 2 h _ i r q _ i n v a l i d / / I R Q E L 2 h
ventry e l 2 h _ f i q _ i n v a l i d / / F I Q E L 2 h
ventry e l 2 h _ e r r o r _ i n v a l i d / / E r r o r E L 2 h
ventry e l 1 _ s y n c / / S y n c h r o n o u s 6 4 - b i t E L 1
ventry e l 1 _ i r q / / I R Q 6 4 - b i t E L 1
ventry e l 1 _ f i q _ i n v a l i d / / F I Q 6 4 - b i t E L 1
ventry e l 1 _ e r r o r _ i n v a l i d / / E r r o r 6 4 - b i t E L 1
ventry e l 1 _ s y n c / / S y n c h r o n o u s 3 2 - b i t E L 1
ventry e l 1 _ i r q / / I R Q 3 2 - b i t E L 1
ventry e l 1 _ f i q _ i n v a l i d / / F I Q 3 2 - b i t E L 1
ventry e l 1 _ e r r o r _ i n v a l i d / / E r r o r 3 2 - b i t E L 1
2015-10-25 13:58:00 +00:00
ENDPROC( _ _ k v m _ h y p _ v e c t o r )