2019-05-29 07:12:41 -07:00
/* SPDX-License-Identifier: GPL-2.0-only */
2011-10-31 18:39:14 -05:00
/ *
* Event e n t r y / e x i t f o r H e x a g o n
*
2013-03-28 20:45:40 -05:00
* Copyright ( c ) 2 0 1 0 - 2 0 1 3 , T h e L i n u x F o u n d a t i o n . A l l r i g h t s r e s e r v e d .
2011-10-31 18:39:14 -05:00
* /
# include < a s m / a s m - o f f s e t s . h > / * a s s e m b l y - s a f e r v e r s i o n s o f C d e f i n e s * /
# include < a s m / m e m - l a y o u t . h > / * s i g h , e x c e p t f o r p a g e _ o f f s e t * /
# include < a s m / h e x a g o n _ v m . h >
# include < a s m / t h r e a d _ i n f o . h >
/ *
* Entry i n t o g u e s t - m o d e L i n u x u n d e r H e x a g o n V i r t u a l M a c h i n e .
* Stack p o i n t e r p o i n t s t o e v e n t r e c o r d - b u i l d p t _ r e g s o n t o p o f i t ,
* set u p a p l a u s i b l e C s t a c k f r a m e , a n d d i s p a t c h t o t h e C h a n d l e r .
* On r e t u r n , d o v m r t e v i r t u a l i n s t r u c t i o n w i t h S P w h e r e w e s t a r t e d .
*
* VM S p e c 0 . 5 u s e s a t r a p t o f e t c h H V M r e c o r d n o w .
* /
/ *
* Save f u l l r e g i s t e r s t a t e , w h i l e s e t t i n g u p t h r e a d _ i n f o s t r u c t
* pointer d e r i v e d f r o m k e r n e l s t a c k p o i n t e r i n T H R E A D I N F O _ R E G
* register, p u t t i n g p r i o r t h r e a d _ i n f o . r e g s p o i n t e r i n a c a l l e e - s a v e
* register ( R 2 4 , w h i c h h a d b e t t e r n o t e v e r b e a s s i g n e d t o T H R E A D I N F O _ R E G ) ,
* and u p d a t i n g t h r e a d _ i n f o . r e g s t o p o i n t t o c u r r e n t s t a c k f r a m e ,
* so a s t o s u p p o r t n e s t e d e v e n t s i n k e r n e l m o d e .
*
* As t h i s i s c o m m o n c o d e , w e s e t t h e p t _ r e g s s y s t e m c a l l n u m b e r
* to - 1 f o r a l l e v e n t s . I t w i l l b e r e p l a c e d w i t h t h e s y s t e m c a l l
* number i n t h e c a s e w h e r e w e d e c o d e a s y s t e m c a l l ( t r a p0 ( #1 ) ) .
* /
2012-03-27 17:38:09 -05:00
# if C O N F I G _ H E X A G O N _ A R C H _ V E R S I O N < 4
2011-10-31 18:39:14 -05:00
# define s a v e _ p t _ r e g s ( ) \
2012-03-27 17:38:09 -05:00
memd( R 0 + #_ P T _ R 3130 ) = R 3 1 : 3 0 ; \
{ memw( R 0 + #_ P T _ R 2928 ) = R 2 8 ; \
R3 1 = m e m w ( R 0 + #_ P T _ E R _ V M P S P ) ; } \
{ memw( R 0 + #( _ P T _ R 2928 + 4 ) ) = R 3 1 ; \
R3 1 = u g p ; } \
{ memd( R 0 + #_ P T _ R 2726 ) = R 2 7 : 2 6 ; \
R3 0 = g p ; } \
memd( R 0 + #_ P T _ R 2524 ) = R 2 5 : 2 4 ; \
memd( R 0 + #_ P T _ R 2322 ) = R 2 3 : 2 2 ; \
memd( R 0 + #_ P T _ R 2120 ) = R 2 1 : 2 0 ; \
memd( R 0 + #_ P T _ R 1918 ) = R 1 9 : 1 8 ; \
memd( R 0 + #_ P T _ R 1716 ) = R 1 7 : 1 6 ; \
memd( R 0 + #_ P T _ R 1514 ) = R 1 5 : 1 4 ; \
memd( R 0 + #_ P T _ R 1312 ) = R 1 3 : 1 2 ; \
{ memd( R 0 + #_ P T _ R 1110 ) = R 1 1 : 1 0 ; \
R1 5 = l c0 ; } \
{ memd( R 0 + #_ P T _ R 0908 ) = R 9 : 8 ; \
R1 4 = s a0 ; } \
{ memd( R 0 + #_ P T _ R 0706 ) = R 7 : 6 ; \
R1 3 = l c1 ; } \
{ memd( R 0 + #_ P T _ R 0504 ) = R 5 : 4 ; \
R1 2 = s a1 ; } \
{ memd( R 0 + #_ P T _ G P U G P ) = R 31 : 3 0 ; \
R1 1 = m 1 ; \
R2 . H = #H I ( _ T H R E A D _ S I Z E ) ; } \
{ memd( R 0 + #_ P T _ L C 0 S A 0 ) = R 1 5 : 1 4 ; \
R1 0 = m 0 ; \
R2 . L = #L O ( _ T H R E A D _ S I Z E ) ; } \
{ memd( R 0 + #_ P T _ L C 1 S A 1 ) = R 1 3 : 1 2 ; \
R1 5 = p3 : 0 ; \
R2 = n e g ( R 2 ) ; } \
{ memd( R 0 + #_ P T _ M 1 M 0 ) = R 1 1 : 1 0 ; \
R1 4 = u s r ; \
R2 = a n d ( R 0 ,R 2 ) ; } \
{ memd( R 0 + #_ P T _ P R E D S U S R ) = R 15 : 1 4 ; \
THREADINFO_ R E G = R 2 ; } \
{ r2 4 = m e m w ( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ P T _ R E G S ) ; \
memw( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ P T _ R E G S ) = R 0 ; \
R2 = #- 1 ; } \
{ memw( R 0 + #_ P T _ S Y S C A L L _ N R ) = R 2 ; \
R3 0 = #0 ; }
# else
/* V4+ */
/* the # ## # syntax inserts a literal ## */
# define s a v e _ p t _ r e g s ( ) \
{ memd( R 0 + #_ P T _ R 3130 ) = R 3 1 : 3 0 ; \
R3 0 = m e m w ( R 0 + #_ P T _ E R _ V M P S P ) ; } \
2011-10-31 18:39:14 -05:00
{ memw( R 0 + #_ P T _ R 2928 ) = R 2 8 ; \
2012-03-27 17:38:09 -05:00
memw( R 0 + #( _ P T _ R 2928 + 4 ) ) = R 3 0 ; }\
{ R31 : 3 0 = C11 : 1 0 ; \
memd( R 0 + #_ P T _ R 2726 ) = R 2 7 : 2 6 ; \
memd( R 0 + #_ P T _ R 2524 ) = R 2 5 : 2 4 ; }\
{ memd( R 0 + #_ P T _ R 2322 ) = R 2 3 : 2 2 ; \
memd( R 0 + #_ P T _ R 2120 ) = R 2 1 : 2 0 ; }\
{ memd( R 0 + #_ P T _ R 1918 ) = R 1 9 : 1 8 ; \
memd( R 0 + #_ P T _ R 1716 ) = R 1 7 : 1 6 ; }\
{ memd( R 0 + #_ P T _ R 1514 ) = R 1 5 : 1 4 ; \
memd( R 0 + #_ P T _ R 1312 ) = R 1 3 : 1 2 ; \
R17 : 1 6 = C13 : 1 2 ; }\
2011-10-31 18:39:14 -05:00
{ memd( R 0 + #_ P T _ R 1110 ) = R 1 1 : 1 0 ; \
2012-03-27 17:38:09 -05:00
memd( R 0 + #_ P T _ R 0908 ) = R 9 : 8 ; \
R15 : 1 4 = C1 : 0 ; } \
2011-10-31 18:39:14 -05:00
{ memd( R 0 + #_ P T _ R 0706 ) = R 7 : 6 ; \
2012-03-27 17:38:09 -05:00
memd( R 0 + #_ P T _ R 0504 ) = R 5 : 4 ; \
R13 : 1 2 = C3 : 2 ; } \
{ memd( R 0 + #_ P T _ G P U G P ) = R 31 : 3 0 ; \
memd( R 0 + #_ P T _ L C 0 S A 0 ) = R 1 5 : 1 4 ; \
R11 : 1 0 = C7 : 6 ; }\
{ THREADINFO_ R E G = a n d ( R 0 , # # # # - _ T H R E A D _ S I Z E ) ; \
memd( R 0 + #_ P T _ L C 1 S A 1 ) = R 1 3 : 1 2 ; \
R1 5 = p3 : 0 ; }\
2011-10-31 18:39:14 -05:00
{ memd( R 0 + #_ P T _ M 1 M 0 ) = R 1 1 : 1 0 ; \
2012-03-27 17:38:09 -05:00
memw( R 0 + #_ P T _ P R E D S U S R + 4 ) = R 1 5 ; }\
2011-10-31 18:39:14 -05:00
{ r2 4 = m e m w ( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ P T _ R E G S ) ; \
memw( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ P T _ R E G S ) = R 0 ; \
R2 = #- 1 ; } \
{ memw( R 0 + #_ P T _ S Y S C A L L _ N R ) = R 2 ; \
2012-03-27 17:38:09 -05:00
memd( R 0 + #_ P T _ C S 1 C S 0 ) = R 1 7 : 1 6 ; \
2011-10-31 18:39:14 -05:00
R3 0 = #0 ; }
2012-03-27 17:38:09 -05:00
# endif
2011-10-31 18:39:14 -05:00
/ *
* Restore r e g i s t e r s a n d t h r e a d _ i n f o . r e g s s t a t e . T H R E A D I N F O _ R E G
* is a s s u m e d t o s t i l l b e s a n e , a n d R 2 4 t o h a v e b e e n c o r r e c t l y
* preserved. D o n ' t r e s t o r e R 2 9 ( S P ) u n t i l l a t e r .
* /
2012-03-27 17:38:09 -05:00
# if C O N F I G _ H E X A G O N _ A R C H _ V E R S I O N < 4
2011-10-31 18:39:14 -05:00
# define r e s t o r e _ p t _ r e g s ( ) \
{ memw( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ P T _ R E G S ) = R 24 ; \
R15 : 1 4 = memd( R 0 + #_ P T _ P R E D S U S R ) ; } \
{ R11 : 1 0 = memd( R 0 + #_ P T _ M 1 M 0 ) ; \
p3 : 0 = R1 5 ; } \
{ R13 : 1 2 = memd( R 0 + #_ P T _ L C 1 S A 1 ) ; \
usr = R 1 4 ; } \
{ R15 : 1 4 = memd( R 0 + #_ P T _ L C 0 S A 0 ) ; \
m1 = R 1 1 ; } \
{ R3 : 2 = memd( R 0 + #_ P T _ R 0302 ) ; \
m0 = R 1 0 ; } \
{ R5 : 4 = memd( R 0 + #_ P T _ R 0504 ) ; \
lc1 = R 1 3 ; } \
{ R7 : 6 = memd( R 0 + #_ P T _ R 0706 ) ; \
sa1 = R 1 2 ; } \
{ R9 : 8 = memd( R 0 + #_ P T _ R 0908 ) ; \
lc0 = R 1 5 ; } \
{ R11 : 1 0 = memd( R 0 + #_ P T _ R 1110 ) ; \
sa0 = R 1 4 ; } \
{ R13 : 1 2 = memd( R 0 + #_ P T _ R 1312 ) ; \
R15 : 1 4 = memd( R 0 + #_ P T _ R 1514 ) ; } \
{ R17 : 1 6 = memd( R 0 + #_ P T _ R 1716 ) ; \
R19 : 1 8 = memd( R 0 + #_ P T _ R 1918 ) ; } \
{ R21 : 2 0 = memd( R 0 + #_ P T _ R 2120 ) ; \
R23 : 2 2 = memd( R 0 + #_ P T _ R 2322 ) ; } \
{ R25 : 2 4 = memd( R 0 + #_ P T _ R 2524 ) ; \
R27 : 2 6 = memd( R 0 + #_ P T _ R 2726 ) ; } \
2012-03-27 17:38:09 -05:00
R31 : 3 0 = memd( R 0 + #_ P T _ G P U G P ) ; \
2011-10-31 18:39:14 -05:00
{ R2 8 = m e m w ( R 0 + #_ P T _ R 2928 ) ; \
ugp = R 3 1 ; } \
{ R31 : 3 0 = memd( R 0 + #_ P T _ R 3130 ) ; \
gp = R 3 0 ; }
2012-03-27 17:38:09 -05:00
# else
/* V4+ */
# define r e s t o r e _ p t _ r e g s ( ) \
{ memw( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ P T _ R E G S ) = R 24 ; \
R15 : 1 4 = memd( R 0 + #_ P T _ P R E D S U S R ) ; } \
{ R11 : 1 0 = memd( R 0 + #_ P T _ M 1 M 0 ) ; \
R13 : 1 2 = memd( R 0 + #_ P T _ L C 1 S A 1 ) ; \
p3 : 0 = R1 5 ; } \
{ R15 : 1 4 = memd( R 0 + #_ P T _ L C 0 S A 0 ) ; \
R3 : 2 = memd( R 0 + #_ P T _ R 0302 ) ; \
usr = R 1 4 ; } \
{ R5 : 4 = memd( R 0 + #_ P T _ R 0504 ) ; \
R7 : 6 = memd( R 0 + #_ P T _ R 0706 ) ; \
C7 : 6 = R11 : 1 0 ; }\
{ R9 : 8 = memd( R 0 + #_ P T _ R 0908 ) ; \
R11 : 1 0 = memd( R 0 + #_ P T _ R 1110 ) ; \
C3 : 2 = R13 : 1 2 ; }\
{ R13 : 1 2 = memd( R 0 + #_ P T _ R 1312 ) ; \
R15 : 1 4 = memd( R 0 + #_ P T _ R 1514 ) ; \
C1 : 0 = R15 : 1 4 ; }\
{ R17 : 1 6 = memd( R 0 + #_ P T _ R 1716 ) ; \
R19 : 1 8 = memd( R 0 + #_ P T _ R 1918 ) ; } \
{ R21 : 2 0 = memd( R 0 + #_ P T _ R 2120 ) ; \
R23 : 2 2 = memd( R 0 + #_ P T _ R 2322 ) ; } \
{ R25 : 2 4 = memd( R 0 + #_ P T _ R 2524 ) ; \
R27 : 2 6 = memd( R 0 + #_ P T _ R 2726 ) ; } \
R31 : 3 0 = memd( R 0 + #_ P T _ C S 1 C S 0 ) ; \
{ C13 : 1 2 = R31 : 3 0 ; \
R31 : 3 0 = memd( R 0 + #_ P T _ G P U G P ) ; \
R2 8 = m e m w ( R 0 + #_ P T _ R 2928 ) ; }\
{ C11 : 1 0 = R31 : 3 0 ; \
R31 : 3 0 = memd( R 0 + #_ P T _ R 3130 ) ; }
# endif
2011-10-31 18:39:14 -05:00
/ *
* Clears o f f e n o u g h s p a c e f o r t h e r e s t o f p t _ r e g s ; evrec is a part
* of p t _ r e g s i n H V M m o d e . S a v e R 0 / R 1 , s e t h a n d l e r ' s a d d r e s s i n R 1 .
* R0 i s t h e a d d r e s s o f p t _ r e g s a n d i s t h e p a r a m e t e r t o s a v e _ p t _ r e g s .
* /
/ *
* Since t h e H V M i s n ' t a u t o m a g i c a l l y p u s h i n g t h e E V R E C o n t o t h e s t a c k a n y m o r e ,
* we' l l s u b r a c t t h e e n t i r e s i z e o u t a n d t h e n f i l l i t i n o u r s e l v e s .
* Need t o s a v e o f f R 0 , R 1 , R 2 , R 3 i m m e d i a t e l y .
* /
2012-03-27 17:38:09 -05:00
# if C O N F I G _ H E X A G O N _ A R C H _ V E R S I O N < 4
2011-10-31 18:39:14 -05:00
# define v m _ e v e n t _ e n t r y ( C H a n d l e r ) \
{ \
R2 9 = a d d ( R 2 9 , #- ( _ P T _ R E G S _ S I Z E ) ) ; \
memd( R 2 9 + #( _ P T _ R 0100 + - _ P T _ R E G S _ S I Z E ) ) = R 1 : 0 ; \
} \
{ \
memd( R 2 9 + #_ P T _ R 0302 ) = R 3 : 2 ; \
} \
trap1 ( #H V M _ T R A P 1 _ V M G E T R E G S ) ; \
{ \
memd( R 2 9 + #_ P T _ E R _ V M E L ) = R 1 : 0 ; \
R0 = R 2 9 ; \
R1 . L = #L O ( C H a n d l e r ) ; \
} \
{ \
memd( R 2 9 + #_ P T _ E R _ V M P S P ) = R 3 : 2 ; \
R1 . H = #H I ( C H a n d l e r ) ; \
jump e v e n t _ d i s p a t c h ; \
}
2012-03-27 17:38:09 -05:00
# else
/* V4+ */
/* turn on I$ prefetch early */
/* the # ## # syntax inserts a literal ## */
# define v m _ e v e n t _ e n t r y ( C H a n d l e r ) \
{ \
R2 9 = a d d ( R 2 9 , #- ( _ P T _ R E G S _ S I Z E ) ) ; \
memd( R 2 9 + #( _ P T _ R 0100 + - _ P T _ R E G S _ S I Z E ) ) = R 1 : 0 ; \
memd( R 2 9 + #( _ P T _ R 0302 + - _ P T _ R E G S _ S I Z E ) ) = R 3 : 2 ; \
R0 = u s r ; \
} \
{ \
memw( R 2 9 + #_ P T _ P R E D S U S R ) = R 0 ; \
R0 = s e t b i t ( R 0 , #16 ) ; \
} \
usr = R 0 ; \
R1 : 0 = G1 : 0 ; \
{ \
memd( R 2 9 + #_ P T _ E R _ V M E L ) = R 1 : 0 ; \
R1 = # # # # ( C H a n d l e r ) ; \
R3 : 2 = G3 : 2 ; \
} \
{ \
R0 = R 2 9 ; \
memd( R 2 9 + #_ P T _ E R _ V M P S P ) = R 3 : 2 ; \
jump e v e n t _ d i s p a t c h ; \
}
# endif
2011-10-31 18:39:14 -05:00
.text
/ *
* Do b u l k s a v e / r e s t o r e i n o n e p l a c e .
* Adds a j u m p t o d i s p a t c h l a t e n c y , b u t
* saves h u n d r e d s o f b y t e s .
* /
event_dispatch :
save_ p t _ r e g s ( )
callr r1
/ *
2012-05-29 17:23:14 -05:00
* Coming b a c k f r o m t h e C - w o r l d , o u r t h r e a d i n f o p o i n t e r
* should b e i n t h e d e s i g n a t e d r e g i s t e r ( u s u a l l y R 1 9 )
*
2011-10-31 18:39:14 -05:00
* If w e w e r e i n k e r n e l m o d e , w e d o n ' t n e e d t o c h e c k s c h e d u l e r
* or s i g n a l s i f C O N F I G _ P R E E M P T i s n o t s e t . I f s e t , t h e n i t h a s
* to j u m p t o a n e e d _ r e s c h e d k i n d o f b l o c k .
* BTW, C O N F I G _ P R E E M P T i s n o t s u p p o r t e d y e t .
* /
# ifdef C O N F I G _ P R E E M P T
R0 = #V M _ I N T _ D I S A B L E
trap1 ( #H V M _ T R A P 1 _ V M S E T I E )
# endif
/* "Nested control path" -- if the previous mode was kernel */
2012-03-27 17:38:09 -05:00
{
2012-05-29 17:23:14 -05:00
R0 = m e m w ( R 2 9 + #_ P T _ E R _ V M E S T ) ;
2013-05-03 17:04:46 -05:00
R2 6 . L = #L O ( d o _ w o r k _ p e n d i n g ) ;
2012-03-27 17:38:09 -05:00
}
2011-10-31 18:39:14 -05:00
{
2012-05-29 17:23:14 -05:00
P0 = t s t b i t ( R 0 , #H V M _ V M E S T _ U M _ S F T ) ;
if ( ! P 0 . n e w ) j u m p : n t r e s t o r e _ a l l ;
2013-05-03 17:04:46 -05:00
R2 6 . H = #H I ( d o _ w o r k _ p e n d i n g ) ;
2012-05-29 17:23:14 -05:00
R0 = #V M _ I N T _ D I S A B L E ;
2012-03-27 17:38:09 -05:00
}
2011-10-31 18:39:14 -05:00
/ *
2012-05-29 17:23:14 -05:00
* Check a l s o t h e r e t u r n f r o m f o r k / s y s t e m c a l l , n o r m a l l y c o m i n g b a c k f r o m
* user m o d e
*
2013-05-03 17:04:46 -05:00
* R2 6 n e e d s t o h a v e d o _ w o r k _ p e n d i n g , a n d R 0 s h o u l d h a v e V M _ I N T _ D I S A B L E
2011-10-31 18:39:14 -05:00
* /
2012-05-29 17:23:14 -05:00
check_work_pending :
/* Disable interrupts while checking TIF */
trap1 ( #H V M _ T R A P 1 _ V M S E T I E )
2011-10-31 18:39:14 -05:00
{
2012-05-29 17:23:14 -05:00
R0 = R 2 9 ; /* regs should still be at top of stack */
R1 = m e m w ( T H R E A D I N F O _ R E G + #_ T H R E A D _ I N F O _ F L A G S ) ;
2013-05-03 17:04:46 -05:00
callr R 2 6 ;
2011-10-31 18:39:14 -05:00
}
2012-03-27 17:38:09 -05:00
{
2012-05-29 17:23:14 -05:00
P0 = c m p . e q ( R 0 , #0 ) ; if (!P0.new) jump:nt check_work_pending;
R0 = #V M _ I N T _ D I S A B L E ;
2012-03-27 17:38:09 -05:00
}
2011-10-31 18:39:14 -05:00
restore_all :
2012-05-29 17:23:14 -05:00
/ *
* Disable i n t e r r u p t s , i f t h e y w e r e n ' t a l r e a d y , b e f o r e r e g r e s t o r e .
* R0 g e t s p r e l o a d e d w i t h #V M _ I N T _ D I S A B L E b e f o r e w e g e t h e r e .
* /
2011-10-31 18:39:14 -05:00
trap1 ( #H V M _ T R A P 1 _ V M S E T I E )
/* do the setregs here for VM 0.5 */
/* R29 here should already be pointing at pt_regs */
2012-03-27 17:38:09 -05:00
{
R1 : 0 = memd( R 2 9 + #_ P T _ E R _ V M E L ) ;
R3 : 2 = memd( R 2 9 + #_ P T _ E R _ V M P S P ) ;
}
# if C O N F I G _ H E X A G O N _ A R C H _ V E R S I O N < 4
2011-10-31 18:39:14 -05:00
trap1 ( #H V M _ T R A P 1 _ V M S E T R E G S ) ;
2012-03-27 17:38:09 -05:00
# else
G1 : 0 = R1 : 0 ;
G3 : 2 = R3 : 2 ;
# endif
2011-10-31 18:39:14 -05:00
R0 = R 2 9
restore_ p t _ r e g s ( )
2012-03-27 17:38:09 -05:00
{
R1 : 0 = memd( R 2 9 + #_ P T _ R 0100 ) ;
R2 9 = a d d ( R 2 9 , #_ P T _ R E G S _ S I Z E ) ;
}
2011-10-31 18:39:14 -05:00
trap1 ( #H V M _ T R A P 1 _ V M R T E )
/* Notreached */
2012-05-29 17:23:14 -05:00
2011-10-31 18:39:14 -05:00
.globl _K_enter_genex
_K_enter_genex :
vm_ e v e n t _ e n t r y ( d o _ g e n e x )
.globl _K_enter_interrupt
_K_enter_interrupt :
vm_ e v e n t _ e n t r y ( a r c h _ d o _ I R Q )
.globl _K_enter_trap0
_K_enter_trap0 :
vm_ e v e n t _ e n t r y ( d o _ t r a p0 )
.globl _K_enter_machcheck
_K_enter_machcheck :
vm_ e v e n t _ e n t r y ( d o _ m a c h c h e c k )
2013-03-07 12:03:10 -06:00
.globl _K_enter_debug
_K_enter_debug :
vm_ e v e n t _ e n t r y ( d o _ d e b u g _ e x c e p t i o n )
2011-10-31 18:39:14 -05:00
.globl ret_from_fork
ret_from_fork :
2012-05-29 17:23:14 -05:00
{
2012-10-23 18:26:01 -05:00
call s c h e d u l e _ t a i l
2013-05-03 17:04:46 -05:00
R2 6 . H = #H I ( d o _ w o r k _ p e n d i n g ) ;
2012-05-29 17:23:14 -05:00
}
{
2012-10-23 18:26:01 -05:00
P0 = c m p . e q ( R 2 4 , #0 ) ;
2013-05-03 17:04:46 -05:00
R2 6 . L = #L O ( d o _ w o r k _ p e n d i n g ) ;
2012-05-29 17:23:14 -05:00
R0 = #V M _ I N T _ D I S A B L E ;
2012-10-23 18:26:01 -05:00
}
if P 0 j u m p c h e c k _ w o r k _ p e n d i n g
{
R0 = R 2 5 ;
callr R 2 4
}
{
jump c h e c k _ w o r k _ p e n d i n g
R0 = #V M _ I N T _ D I S A B L E ;
2012-05-29 17:23:14 -05:00
}