@ -47,7 +47,6 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
_ TIF_ M C C K _ P E N D I N G )
_ TIF_ T R A C E = ( _ T I F _ S Y S C A L L _ T R A C E | _ T I F _ S Y S C A L L _ A U D I T | _ T I F _ S E C C O M P | \
_ TIF_ S Y S C A L L _ T R A C E P O I N T )
_ TIF_ E X I T _ S I E = ( _ T I F _ S I G P E N D I N G | _ T I F _ N E E D _ R E S C H E D | _ T I F _ M C C K _ P E N D I N G )
# define B A S E D ( n a m e ) n a m e - s y s t e m _ c a l l ( % r13 )
@ -81,25 +80,27 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
# endif
.endm
.macro HANDLE_SIE_INTERCEPT scratch,p g m c h e c k
.macro HANDLE_SIE_INTERCEPT scratch,r e a s o n
# if d e f i n e d ( C O N F I G _ K V M ) | | d e f i n e d ( C O N F I G _ K V M _ M O D U L E )
tmhh % r8 ,0 x00 0 1 # i n t e r r u p t i n g f r o m u s e r ?
jnz . + 5 2
jnz . + 6 2
lgr \ s c r a t c h ,% r9
slg \ s c r a t c h ,B A S E D ( . L s i e _ l o o p )
clg \ s c r a t c h ,B A S E D ( . L s i e _ l e n g t h )
.if \ pgmcheck
slg \ s c r a t c h ,B A S E D ( . L s i e _ c r i t i c a l )
clg \ s c r a t c h ,B A S E D ( . L s i e _ c r i t i c a l _ l e n g t h )
.if \ reason= =1
# Some p r o g r a m i n t e r r u p t s a r e s u p p r e s s i n g ( e . g . p r o t e c t i o n ) .
# We m u s t a l s o c h e c k t h e i n s t r u c t i o n a f t e r S I E i n t h a t c a s e .
# do_ p r o t e c t i o n _ e x c e p t i o n w i l l r e w i n d t o r e w i n d _ p a d
jh . + 3 2
jh . + 4 2
.else
jhe . + 3 2
jhe . + 4 2
.endif
lg % r9 ,B A S E D ( . L s i e _ l o o p )
LPP B A S E D ( . L h o s t _ i d ) # s e t h o s t i d
lg % r14 ,_ _ S F _ E M P T Y ( % r15 ) # g e t c o n t r o l b l o c k p o i n t e r
lg % r14 ,_ _ S F _ E M P T Y ( % r15 ) # g e t c o n t r o l b l o c k p o i n t e r
LPP _ _ S F _ E M P T Y + 1 6 ( % r15 ) # s e t h o s t i d
ni _ _ S I E _ P R O G 0 C + 3 ( % r14 ) ,0 x f e # n o l o n g e r i n S I E
lctlg % c1 ,% c1 ,_ _ L C _ U S E R _ A S C E # l o a d p r i m a r y a s c e
larl % r9 ,s i e _ e x i t # s k i p f o r w a r d t o s i e _ e x i t
mvi _ _ S F _ E M P T Y + 3 1 ( % r15 ) ,\ r e a s o n # s e t e x i t r e a s o n
# endif
.endm
@ -452,7 +453,7 @@ ENTRY(io_int_handler)
lg % r12 ,_ _ L C _ T H R E A D _ I N F O
larl % r13 ,s y s t e m _ c a l l
lmg % r8 ,% r9 ,_ _ L C _ I O _ O L D _ P S W
HANDLE_ S I E _ I N T E R C E P T % r14 ,0
HANDLE_ S I E _ I N T E R C E P T % r14 ,2
SWITCH_ A S Y N C _ _ L C _ S A V E _ A R E A _ A S Y N C ,_ _ L C _ A S Y N C _ S T A C K ,S T A C K _ S H I F T
tmhh % r8 ,0 x00 0 1 # i n t e r r u p t i n g f r o m u s e r ?
jz i o _ s k i p
@ -597,7 +598,7 @@ ENTRY(ext_int_handler)
lg % r12 ,_ _ L C _ T H R E A D _ I N F O
larl % r13 ,s y s t e m _ c a l l
lmg % r8 ,% r9 ,_ _ L C _ E X T _ O L D _ P S W
HANDLE_ S I E _ I N T E R C E P T % r14 ,0
HANDLE_ S I E _ I N T E R C E P T % r14 ,3
SWITCH_ A S Y N C _ _ L C _ S A V E _ A R E A _ A S Y N C ,_ _ L C _ A S Y N C _ S T A C K ,S T A C K _ S H I F T
tmhh % r8 ,0 x00 0 1 # i n t e r r u p t i n g f r o m u s e r ?
jz e x t _ s k i p
@ -645,7 +646,7 @@ ENTRY(mcck_int_handler)
lg % r12 ,_ _ L C _ T H R E A D _ I N F O
larl % r13 ,s y s t e m _ c a l l
lmg % r8 ,% r9 ,_ _ L C _ M C K _ O L D _ P S W
HANDLE_ S I E _ I N T E R C E P T % r14 ,0
HANDLE_ S I E _ I N T E R C E P T % r14 ,4
tm _ _ L C _ M C C K _ C O D E ,0 x80 # s y s t e m d a m a g e ?
jo m c c k _ p a n i c # y e s - > r e s t o f m c c k c o d e i n v a l i d
lghi % r14 ,_ _ L C _ C P U _ T I M E R _ S A V E _ A R E A
@ -939,19 +940,8 @@ ENTRY(sie64a)
stmg % r6 ,% r14 ,_ _ S F _ G P R S ( % r15 ) # s a v e k e r n e l r e g i s t e r s
stg % r2 ,_ _ S F _ E M P T Y ( % r15 ) # s a v e c o n t r o l b l o c k p o i n t e r
stg % r3 ,_ _ S F _ E M P T Y + 8 ( % r15 ) # s a v e g u e s t r e g i s t e r s a v e a r e a
xc _ _ S F _ E M P T Y + 1 6 ( 8 ,% r15 ) ,_ _ S F _ E M P T Y + 1 6 ( % r15 ) # h o s t i d = = 0
xc _ _ S F _ E M P T Y + 1 6 ( 1 6 ,% r15 ) ,_ _ S F _ E M P T Y + 1 6 ( % r15 ) # h o s t i d & r e a s o n
lmg % r0 ,% r13 ,0 ( % r3 ) # l o a d g u e s t g p r s 0 - 1 3
# some p r o g r a m c h e c k s a r e s u p p r e s s i n g . C c o d e ( e . g . d o _ p r o t e c t i o n _ e x c e p t i o n )
# will r e w i n d t h e P S W b y t h e I L C , w h i c h i s 4 b y t e s i n c a s e o f S I E . O t h e r
# instructions i n t h e s i e _ l o o p s h o u l d n o t c a u s e p r o g r a m i n t e r r u p t s . S o
# lets u s e a n o p ( 4 7 0 0 0 0 0 0 ) a s a l a n d i n g p a d .
# See a l s o H A N D L E _ S I E _ I N T E R C E P T
rewind_pad :
nop 0
sie_loop :
lg % r14 ,_ _ L C _ T H R E A D _ I N F O # p o i n t e r t h r e a d _ i n f o s t r u c t
tm _ _ T I _ f l a g s + 7 ( % r14 ) ,_ T I F _ E X I T _ S I E
jnz s i e _ e x i t
lg % r14 ,_ _ L C _ G M A P # g e t g m a p p o i n t e r
ltgr % r14 ,% r14
jz s i e _ g m a p
@ -966,33 +956,33 @@ sie_gmap:
sie_done :
LPP _ _ S F _ E M P T Y + 1 6 ( % r15 ) # s e t h o s t i d
ni _ _ S I E _ P R O G 0 C + 3 ( % r14 ) ,0 x f e # n o l o n g e r i n S I E
lg % r14 ,_ _ L C _ T H R E A D _ I N F O # p o i n t e r t h r e a d _ i n f o s t r u c t
sie_exit :
lctlg % c1 ,% c1 ,_ _ L C _ U S E R _ A S C E # l o a d p r i m a r y a s c e
# some p r o g r a m c h e c k s a r e s u p p r e s s i n g . C c o d e ( e . g . d o _ p r o t e c t i o n _ e x c e p t i o n )
# will r e w i n d t h e P S W b y t h e I L C , w h i c h i s 4 b y t e s i n c a s e o f S I E . O t h e r
# instructions b e w e e n s i e 6 4 a a n d s i e _ d o n e s h o u l d n o t c a u s e p r o g r a m
# interrupts. S o l e t s u s e a n o p ( 4 7 0 0 0 0 0 0 ) a s a l a n d i n g p a d .
# See a l s o H A N D L E _ S I E _ I N T E R C E P T
rewind_pad :
nop 0
sie_exit :
lg % r14 ,_ _ S F _ E M P T Y + 8 ( % r15 ) # l o a d g u e s t r e g i s t e r s a v e a r e a
stmg % r0 ,% r13 ,0 ( % r14 ) # s a v e g u e s t g p r s 0 - 1 3
lmg % r6 ,% r14 ,_ _ S F _ G P R S ( % r15 ) # r e s t o r e k e r n e l r e g i s t e r s
lghi % r2 ,0
lg % r2 ,_ _ S F _ E M P T Y + 2 4 ( % r15 ) # r e t u r n e x i t r e a s o n c o d e
br % r14
sie_fault :
lctlg % c1 ,% c1 ,_ _ L C _ U S E R _ A S C E # l o a d p r i m a r y a s c e
lg % r14 ,_ _ L C _ T H R E A D _ I N F O # p o i n t e r t h r e a d _ i n f o s t r u c t
lg % r14 ,_ _ S F _ E M P T Y + 8 ( % r15 ) # l o a d g u e s t r e g i s t e r s a v e a r e a
stmg % r0 ,% r13 ,0 ( % r14 ) # s a v e g u e s t g p r s 0 - 1 3
lmg % r6 ,% r14 ,_ _ S F _ G P R S ( % r15 ) # r e s t o r e k e r n e l r e g i s t e r s
lghi % r2 ,- E F A U L T
br % r14
lghi % r14 ,- E F A U L T
stg % r14 ,_ _ S F _ E M P T Y + 2 4 ( % r15 ) # s e t e x i t r e a s o n c o d e
j s i e _ e x i t
.align 8
.Lsie_loop :
.quad sie_loop
.Lsie_length :
.quad sie_done - sie_ l o o p
.Lhost_id :
.quad 0
.Lsie_critical :
.quad sie_gmap
.Lsie_critical_length :
.quad sie_done - sie_ g m a p
EX_ T A B L E ( r e w i n d _ p a d ,s i e _ f a u l t )
EX_ T A B L E ( s i e _ l o o p ,s i e _ f a u l t )
EX_ T A B L E ( s i e _ e x i t ,s i e _ f a u l t )
# endif
.section .rodata , " a"