2005-04-17 02:20:36 +04:00
/ * $ Id : entry. S ,v 1 . 1 4 4 2 0 0 2 / 0 2 / 0 9 1 9 : 4 9 : 3 0 d a v e m E x p $
* arch/ s p a r c64 / k e r n e l / e n t r y . S : S p a r c64 t r a p l o w - l e v e l e n t r y p o i n t s .
*
* Copyright ( C ) 1 9 9 5 ,1 9 9 7 D a v i d S . M i l l e r ( d a v e m @caip.rutgers.edu)
* Copyright ( C ) 1 9 9 6 E d d i e C . D o s t ( e c d @skynet.be)
* Copyright ( C ) 1 9 9 6 M i g u e l d e I c a z a ( m i g u e l @nuclecu.unam.mx)
* Copyright ( C ) 1 9 9 6 ,9 8 ,9 9 J a k u b J e l i n e k ( j j @sunsite.mff.cuni.cz)
* /
# include < l i n u x / c o n f i g . h >
# include < l i n u x / e r r n o . h >
# include < a s m / h e a d . h >
# include < a s m / a s i . h >
# include < a s m / s m p . h >
# include < a s m / p t r a c e . h >
# include < a s m / p a g e . h >
# include < a s m / s i g n a l . h >
# include < a s m / p g t a b l e . h >
# include < a s m / p r o c e s s o r . h >
# include < a s m / v i s a s m . h >
# include < a s m / e s t a t e . h >
# include < a s m / a u x i o . h >
2005-08-29 23:45:11 +04:00
# include < a s m / s f a f s r . h >
2005-04-17 02:20:36 +04:00
# define c u r p t r g 6
2006-02-08 05:11:24 +03:00
# define N R _ S Y S C A L L S 3 0 0 / * E a c h O S i s d i f f e r e n t . . . * /
2005-04-17 02:20:36 +04:00
.text
.align 32
/* This is trivial with the new code... */
.globl do_fpdis
do_fpdis :
2005-10-08 00:30:49 +04:00
sethi % h i ( T S T A T E _ P E F ) , % g 4
2005-04-17 02:20:36 +04:00
rdpr % t s t a t e , % g 5
andcc % g 5 , % g 4 , % g 0
be,p t % x c c , 1 f
nop
rd % f p r s , % g 5
andcc % g 5 , F P R S _ F E F , % g 0
be,p t % x c c , 1 f
nop
/* Legal state when DCR_IFPOE is set in Cheetah %dcr. */
sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
add % g 0 , % g 0 , % g 0
ba,a ,p t % x c c , r t r a p _ c l r _ l 6
2006-02-03 08:55:10 +03:00
1 : TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2006-02-27 10:24:22 +03:00
ldub [ % g 6 + T I _ F P S A V E D ] , % g 5
2005-10-08 00:30:49 +04:00
wr % g 0 , F P R S _ F E F , % f p r s
andcc % g 5 , F P R S _ F E F , % g 0
be,a ,p t % i c c , 1 f
clr % g 7
ldx [ % g 6 + T I _ G S R ] , % g 7
1 : andcc % g 5 , F P R S _ D L , % g 0
bne,p n % i c c , 2 f
fzero % f0
andcc % g 5 , F P R S _ D U , % g 0
bne,p n % i c c , 1 f
fzero % f2
2005-04-17 02:20:36 +04:00
faddd % f0 , % f2 , % f4
fmuld % f0 , % f2 , % f6
faddd % f0 , % f2 , % f8
fmuld % f0 , % f2 , % f10
faddd % f0 , % f2 , % f12
fmuld % f0 , % f2 , % f14
faddd % f0 , % f2 , % f16
fmuld % f0 , % f2 , % f18
faddd % f0 , % f2 , % f20
fmuld % f0 , % f2 , % f22
faddd % f0 , % f2 , % f24
fmuld % f0 , % f2 , % f26
faddd % f0 , % f2 , % f28
fmuld % f0 , % f2 , % f30
faddd % f0 , % f2 , % f32
fmuld % f0 , % f2 , % f34
faddd % f0 , % f2 , % f36
fmuld % f0 , % f2 , % f38
faddd % f0 , % f2 , % f40
fmuld % f0 , % f2 , % f42
faddd % f0 , % f2 , % f44
fmuld % f0 , % f2 , % f46
faddd % f0 , % f2 , % f48
fmuld % f0 , % f2 , % f50
faddd % f0 , % f2 , % f52
fmuld % f0 , % f2 , % f54
faddd % f0 , % f2 , % f56
fmuld % f0 , % f2 , % f58
b,p t % x c c , f p d i s _ e x i t 2
faddd % f0 , % f2 , % f60
1 : mov S E C O N D A R Y _ C O N T E X T , % g 3
add % g 6 , T I _ F P R E G S + 0 x80 , % g 1
faddd % f0 , % f2 , % f4
fmuld % f0 , % f2 , % f6
ldxa [ % g 3 ] A S I _ D M M U , % g 5
2005-10-05 02:23:20 +04:00
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
2005-04-17 02:20:36 +04:00
stxa % g 2 , [ % g 3 ] A S I _ D M M U
membar #S y n c
add % g 6 , T I _ F P R E G S + 0 x c0 , % g 2
faddd % f0 , % f2 , % f8
fmuld % f0 , % f2 , % f10
2005-10-08 00:30:49 +04:00
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f32
2005-04-17 02:20:36 +04:00
ldda [ % g 2 ] A S I _ B L K _ S , % f48
2005-10-08 00:30:49 +04:00
membar #S y n c
2005-04-17 02:20:36 +04:00
faddd % f0 , % f2 , % f12
fmuld % f0 , % f2 , % f14
faddd % f0 , % f2 , % f16
fmuld % f0 , % f2 , % f18
faddd % f0 , % f2 , % f20
fmuld % f0 , % f2 , % f22
faddd % f0 , % f2 , % f24
fmuld % f0 , % f2 , % f26
faddd % f0 , % f2 , % f28
fmuld % f0 , % f2 , % f30
b,p t % x c c , f p d i s _ e x i t
[SPARC64]: Avoid membar instructions in delay slots.
In particular, avoid membar instructions in the delay
slot of a jmpl instruction.
UltraSPARC-I, II, IIi, and IIe have a bug, documented in
the UltraSPARC-IIi User's Manual, Appendix K, Erratum 51
The long and short of it is that if the IMU unit misses
on a branch or jmpl, and there is a store buffer synchronizing
membar in the delay slot, the chip can stop fetching instructions.
If interrupts are enabled or some other trap is enabled, the
chip will unwedge itself, but performance will suffer.
We already had a workaround for this bug in a few spots, but
it's better to have the entire tree sanitized for this rule.
Signed-off-by: David S. Miller <davem@davemloft.net>
2005-06-28 02:42:04 +04:00
nop
2005-04-17 02:20:36 +04:00
2 : andcc % g 5 , F P R S _ D U , % g 0
bne,p t % i c c , 3 f
fzero % f32
mov S E C O N D A R Y _ C O N T E X T , % g 3
fzero % f34
ldxa [ % g 3 ] A S I _ D M M U , % g 5
add % g 6 , T I _ F P R E G S , % g 1
2005-10-05 02:23:20 +04:00
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
2005-04-17 02:20:36 +04:00
stxa % g 2 , [ % g 3 ] A S I _ D M M U
membar #S y n c
add % g 6 , T I _ F P R E G S + 0 x40 , % g 2
faddd % f32 , % f34 , % f36
fmuld % f32 , % f34 , % f38
2005-10-08 00:30:49 +04:00
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f0
2005-04-17 02:20:36 +04:00
ldda [ % g 2 ] A S I _ B L K _ S , % f16
2005-10-08 00:30:49 +04:00
membar #S y n c
2005-04-17 02:20:36 +04:00
faddd % f32 , % f34 , % f40
fmuld % f32 , % f34 , % f42
faddd % f32 , % f34 , % f44
fmuld % f32 , % f34 , % f46
faddd % f32 , % f34 , % f48
fmuld % f32 , % f34 , % f50
faddd % f32 , % f34 , % f52
fmuld % f32 , % f34 , % f54
faddd % f32 , % f34 , % f56
fmuld % f32 , % f34 , % f58
faddd % f32 , % f34 , % f60
fmuld % f32 , % f34 , % f62
ba,p t % x c c , f p d i s _ e x i t
[SPARC64]: Avoid membar instructions in delay slots.
In particular, avoid membar instructions in the delay
slot of a jmpl instruction.
UltraSPARC-I, II, IIi, and IIe have a bug, documented in
the UltraSPARC-IIi User's Manual, Appendix K, Erratum 51
The long and short of it is that if the IMU unit misses
on a branch or jmpl, and there is a store buffer synchronizing
membar in the delay slot, the chip can stop fetching instructions.
If interrupts are enabled or some other trap is enabled, the
chip will unwedge itself, but performance will suffer.
We already had a workaround for this bug in a few spots, but
it's better to have the entire tree sanitized for this rule.
Signed-off-by: David S. Miller <davem@davemloft.net>
2005-06-28 02:42:04 +04:00
nop
2005-04-17 02:20:36 +04:00
3 : mov S E C O N D A R Y _ C O N T E X T , % g 3
add % g 6 , T I _ F P R E G S , % g 1
ldxa [ % g 3 ] A S I _ D M M U , % g 5
2005-10-05 02:23:20 +04:00
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
2005-04-17 02:20:36 +04:00
stxa % g 2 , [ % g 3 ] A S I _ D M M U
membar #S y n c
mov 0 x40 , % g 2
2005-10-08 00:30:49 +04:00
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f0
2005-04-17 02:20:36 +04:00
ldda [ % g 1 + % g 2 ] A S I _ B L K _ S , % f16
add % g 1 , 0 x80 , % g 1
ldda [ % g 1 ] A S I _ B L K _ S , % f32
ldda [ % g 1 + % g 2 ] A S I _ B L K _ S , % f48
membar #S y n c
fpdis_exit :
stxa % g 5 , [ % g 3 ] A S I _ D M M U
membar #S y n c
fpdis_exit2 :
wr % g 7 , 0 , % g s r
ldx [ % g 6 + T I _ X F S R ] , % f s r
rdpr % t s t a t e , % g 3
or % g 3 , % g 4 , % g 3 ! a n a l . . .
wrpr % g 3 , % t s t a t e
wr % g 0 , F P R S _ F E F , % f p r s ! c l e a n D U / D L b i t s
retry
.align 32
fp_other_bounce :
call d o _ f p o t h e r
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
.globl do_fpother_check_fitos
.align 32
do_fpother_check_fitos :
2006-02-03 08:55:10 +03:00
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2005-04-17 02:20:36 +04:00
sethi % h i ( f p _ o t h e r _ b o u n c e - 4 ) , % g 7
or % g 7 , % l o ( f p _ o t h e r _ b o u n c e - 4 ) , % g 7
/ * NOTE : Need t o p r e s e r v e % g 7 u n t i l w e f u l l y c o m m i t
* to t h e f i t o s f i x u p .
* /
stx % f s r , [ % g 6 + T I _ X F S R ]
rdpr % t s t a t e , % g 3
andcc % g 3 , T S T A T E _ P R I V , % g 0
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
nop
ldx [ % g 6 + T I _ X F S R ] , % g 3
srlx % g 3 , 1 4 , % g 1
and % g 1 , 7 , % g 1
cmp % g 1 , 2 ! U n f i n i s h e d F P - O P
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
sethi % h i ( 1 < < 2 3 ) , % g 1 ! I n e x a c t
andcc % g 3 , % g 1 , % g 0
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
rdpr % t p c , % g 1
lduwa [ % g 1 ] A S I _ A I U P , % g 3 ! T h i s c a n n o t e v e r f a i l
# define F I T O S _ M A S K 0 x c1 f83 f e 0
# define F I T O S _ C O M P A R E 0 x81 a01 8 8 0
sethi % h i ( F I T O S _ M A S K ) , % g 1
or % g 1 , % l o ( F I T O S _ M A S K ) , % g 1
and % g 3 , % g 1 , % g 1
sethi % h i ( F I T O S _ C O M P A R E ) , % g 2
or % g 2 , % l o ( F I T O S _ C O M P A R E ) , % g 2
cmp % g 1 , % g 2
bne,p n % x c c , d o _ f p t r a p _ a f t e r _ f s r
nop
std % f62 , [ % g 6 + T I _ F P R E G S + ( 6 2 * 4 ) ]
sethi % h i ( f i t o s _ t a b l e _ 1 ) , % g 1
and % g 3 , 0 x1 f , % g 2
or % g 1 , % l o ( f i t o s _ t a b l e _ 1 ) , % g 1
sllx % g 2 , 2 , % g 2
jmpl % g 1 + % g 2 , % g 0
ba,p t % x c c , f i t o s _ e m u l _ c o n t i n u e
fitos_table_1 :
fitod % f0 , % f62
fitod % f1 , % f62
fitod % f2 , % f62
fitod % f3 , % f62
fitod % f4 , % f62
fitod % f5 , % f62
fitod % f6 , % f62
fitod % f7 , % f62
fitod % f8 , % f62
fitod % f9 , % f62
fitod % f10 , % f62
fitod % f11 , % f62
fitod % f12 , % f62
fitod % f13 , % f62
fitod % f14 , % f62
fitod % f15 , % f62
fitod % f16 , % f62
fitod % f17 , % f62
fitod % f18 , % f62
fitod % f19 , % f62
fitod % f20 , % f62
fitod % f21 , % f62
fitod % f22 , % f62
fitod % f23 , % f62
fitod % f24 , % f62
fitod % f25 , % f62
fitod % f26 , % f62
fitod % f27 , % f62
fitod % f28 , % f62
fitod % f29 , % f62
fitod % f30 , % f62
fitod % f31 , % f62
fitos_emul_continue :
sethi % h i ( f i t o s _ t a b l e _ 2 ) , % g 1
srl % g 3 , 2 5 , % g 2
or % g 1 , % l o ( f i t o s _ t a b l e _ 2 ) , % g 1
and % g 2 , 0 x1 f , % g 2
sllx % g 2 , 2 , % g 2
jmpl % g 1 + % g 2 , % g 0
ba,p t % x c c , f i t o s _ e m u l _ f i n i
fitos_table_2 :
fdtos % f62 , % f0
fdtos % f62 , % f1
fdtos % f62 , % f2
fdtos % f62 , % f3
fdtos % f62 , % f4
fdtos % f62 , % f5
fdtos % f62 , % f6
fdtos % f62 , % f7
fdtos % f62 , % f8
fdtos % f62 , % f9
fdtos % f62 , % f10
fdtos % f62 , % f11
fdtos % f62 , % f12
fdtos % f62 , % f13
fdtos % f62 , % f14
fdtos % f62 , % f15
fdtos % f62 , % f16
fdtos % f62 , % f17
fdtos % f62 , % f18
fdtos % f62 , % f19
fdtos % f62 , % f20
fdtos % f62 , % f21
fdtos % f62 , % f22
fdtos % f62 , % f23
fdtos % f62 , % f24
fdtos % f62 , % f25
fdtos % f62 , % f26
fdtos % f62 , % f27
fdtos % f62 , % f28
fdtos % f62 , % f29
fdtos % f62 , % f30
fdtos % f62 , % f31
fitos_emul_fini :
ldd [ % g 6 + T I _ F P R E G S + ( 6 2 * 4 ) ] , % f62
done
.globl do_fptrap
.align 32
do_fptrap :
stx % f s r , [ % g 6 + T I _ X F S R ]
do_fptrap_after_fsr :
ldub [ % g 6 + T I _ F P S A V E D ] , % g 3
rd % f p r s , % g 1
or % g 3 , % g 1 , % g 3
stb % g 3 , [ % g 6 + T I _ F P S A V E D ]
rd % g s r , % g 3
stx % g 3 , [ % g 6 + T I _ G S R ]
mov S E C O N D A R Y _ C O N T E X T , % g 3
ldxa [ % g 3 ] A S I _ D M M U , % g 5
2005-10-05 02:23:20 +04:00
sethi % h i ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) , % g 2
ldx [ % g 2 + % l o ( s p a r c64 _ k e r n _ s e c _ c o n t e x t ) ] , % g 2
2005-04-17 02:20:36 +04:00
stxa % g 2 , [ % g 3 ] A S I _ D M M U
membar #S y n c
add % g 6 , T I _ F P R E G S , % g 2
andcc % g 1 , F P R S _ D L , % g 0
be,p n % i c c , 4 f
mov 0 x40 , % g 3
stda % f0 , [ % g 2 ] A S I _ B L K _ S
stda % f16 , [ % g 2 + % g 3 ] A S I _ B L K _ S
andcc % g 1 , F P R S _ D U , % g 0
be,p n % i c c , 5 f
4 : add % g 2 , 1 2 8 , % g 2
stda % f32 , [ % g 2 ] A S I _ B L K _ S
stda % f48 , [ % g 2 + % g 3 ] A S I _ B L K _ S
5 : mov S E C O N D A R Y _ C O N T E X T , % g 1
membar #S y n c
stxa % g 5 , [ % g 1 ] A S I _ D M M U
membar #S y n c
ba,p t % x c c , e t r a p
wr % g 0 , 0 , % f p r s
/ * The r e g i s t e r s f o r c r o s s c a l l s w i l l b e :
*
* DATA 0 : [ l o w 3 2 - b i t s ] A d d r e s s o f f u n c t i o n t o c a l l , j m p t o t h i s
* [ high 3 2 - b i t s ] M M U C o n t e x t A r g u m e n t 0 , p l a c e i n % g 5
2005-09-26 11:32:17 +04:00
* DATA 1 : A d d r e s s A r g u m e n t 1 , p l a c e i n % g 1
2005-04-17 02:20:36 +04:00
* DATA 2 : A d d r e s s A r g u m e n t 2 , p l a c e i n % g 7
*
* With t h i s m e t h o d w e c a n d o m o s t o f t h e c r o s s - c a l l t l b / c a c h e
* flushing v e r y q u i c k l y .
* /
.text
.align 32
.globl do_ivec
do_ivec :
mov 0 x40 , % g 3
ldxa [ % g 3 + % g 0 ] A S I _ I N T R _ R , % g 3
sethi % h i ( K E R N B A S E ) , % g 4
cmp % g 3 , % g 4
bgeu,p n % x c c , d o _ i v e c _ x c a l l
srlx % g 3 , 3 2 , % g 5
stxa % g 0 , [ % g 0 ] A S I _ I N T R _ R E C E I V E
membar #S y n c
sethi % h i ( i v e c t o r _ t a b l e ) , % g 2
sllx % g 3 , 5 , % g 3
or % g 2 , % l o ( i v e c t o r _ t a b l e ) , % g 2
add % g 2 , % g 3 , % g 3
ldub [ % g 3 + 0 x04 ] , % g 4 / * p i l * /
2005-07-05 00:24:38 +04:00
mov 1 , % g 2
2005-04-17 02:20:36 +04:00
sllx % g 2 , % g 4 , % g 2
sllx % g 4 , 2 , % g 4
2005-07-05 00:24:38 +04:00
2006-02-03 08:55:10 +03:00
TRAP_ L O A D _ I R Q _ W O R K ( % g 6 , % g 1 )
2006-02-27 10:24:22 +03:00
2005-04-17 02:20:36 +04:00
lduw [ % g 6 + % g 4 ] , % g 5 / * g 5 = i r q _ w o r k ( c p u , p i l ) * /
stw % g 5 , [ % g 3 + 0 x00 ] / * b u c k e t - > i r q _ c h a i n = g 5 * /
stw % g 3 , [ % g 6 + % g 4 ] / * i r q _ w o r k ( c p u , p i l ) = b u c k e t * /
wr % g 2 , 0 x0 , % s e t _ s o f t i n t
retry
do_ivec_xcall :
mov 0 x50 , % g 1
ldxa [ % g 1 + % g 0 ] A S I _ I N T R _ R , % g 1
srl % g 3 , 0 , % g 3
2005-07-05 00:24:38 +04:00
2005-04-17 02:20:36 +04:00
mov 0 x60 , % g 7
ldxa [ % g 7 + % g 0 ] A S I _ I N T R _ R , % g 7
stxa % g 0 , [ % g 0 ] A S I _ I N T R _ R E C E I V E
membar #S y n c
ba,p t % x c c , 1 f
nop
.align 32
1 : jmpl % g 3 , % g 0
nop
.globl getcc, s e t c c
getcc :
ldx [ % o 0 + P T _ V 9 _ T S T A T E ] , % o 1
srlx % o 1 , 3 2 , % o 1
and % o 1 , 0 x f , % o 1
retl
stx % o 1 , [ % o 0 + P T _ V 9 _ G 1 ]
setcc :
ldx [ % o 0 + P T _ V 9 _ T S T A T E ] , % o 1
ldx [ % o 0 + P T _ V 9 _ G 1 ] , % o 2
or % g 0 , % u l o ( T S T A T E _ I C C ) , % o 3
sllx % o 3 , 3 2 , % o 3
andn % o 1 , % o 3 , % o 1
sllx % o 2 , 3 2 , % o 2
and % o 2 , % o 3 , % o 2
or % o 1 , % o 2 , % o 1
retl
stx % o 1 , [ % o 0 + P T _ V 9 _ T S T A T E ]
2006-02-27 10:24:22 +03:00
.globl utrap_trap
utrap_trap : /* %g3=handler,%g4=level */
2006-02-03 08:55:10 +03:00
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2006-02-27 10:24:22 +03:00
ldx [ % g 6 + T I _ U T R A P S ] , % g 1
brnz,p t % g 1 , i n v o k e _ u t r a p
2005-04-17 02:20:36 +04:00
nop
2006-02-27 10:24:22 +03:00
ba,p t % x c c , e t r a p
rd % p c , % g 7
mov % l 4 , % o 1
call b a d _ t r a p
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
invoke_utrap :
sllx % g 3 , 3 , % g 3
ldx [ % g 1 + % g 3 ] , % g 1
2005-04-17 02:20:36 +04:00
save % s p , - 1 2 8 , % s p
rdpr % t s t a t e , % l 6
rdpr % c w p , % l 7
andn % l 6 , T S T A T E _ C W P , % l 6
wrpr % l 6 , % l 7 , % t s t a t e
rdpr % t p c , % l 6
rdpr % t n p c , % l 7
wrpr % g 1 , 0 , % t n p c
done
2005-08-29 23:45:11 +04:00
/ * We n e e d t o c a r e f u l l y r e a d t h e e r r o r s t a t u s , A C K
* the e r r o r s , p r e v e n t r e c u r s i v e t r a p s , a n d p a s s t h e
* information o n t o C c o d e f o r l o g g i n g .
*
* We p a s s t h e A F A R i n a s - i s , a n d w e e n c o d e t h e s t a t u s
* information a s d e s c r i b e d i n a s m - s p a r c64 / s f a f s r . h
* /
.globl __spitfire_access_error
__spitfire_access_error :
/ * Disable E S T A T E e r r o r r e p o r t i n g s o t h a t w e d o n o t
* take r e c u r s i v e t r a p s a n d R E D s t a t e t h e p r o c e s s o r .
* /
stxa % g 0 , [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N
membar #S y n c
mov U D B E _ U E , % g 1
ldxa [ % g 0 ] A S I _ A F S R , % g 4 ! G e t A F S R
/ * _ _ spitfire_ c e e _ t r a p b r a n c h e s h e r e w i t h A F S R i n % g 4 a n d
* UDBE_ C E i n % g 1 . I t o n l y c l e a r s E S T A T E _ E R R _ C E i n t h e
* ESTATE E r r o r E n a b l e r e g i s t e r .
* /
__spitfire_cee_trap_continue :
ldxa [ % g 0 ] A S I _ A F A R , % g 5 ! G e t A F A R
rdpr % t t , % g 3
and % g 3 , 0 x1 f f , % g 3 ! P a r a n o i a
sllx % g 3 , S F S T A T _ T R A P _ T Y P E _ S H I F T , % g 3
or % g 4 , % g 3 , % g 4
rdpr % t l , % g 3
cmp % g 3 , 1
mov 1 , % g 3
bleu % x c c , 1 f
sllx % g 3 , S F S T A T _ T L _ G T _ O N E _ S H I F T , % g 3
or % g 4 , % g 3 , % g 4
/ * Read i n t h e U D B e r r o r r e g i s t e r s t a t e , c l e a r i n g t h e
* sticky e r r o r b i t s a s - n e e d e d . W e o n l y c l e a r t h e m i f
* the U E b i t i s s e t . L i k e w i s e , _ _ s p i t f i r e _ c e e _ t r a p
* below w i l l o n l y d o s o i f t h e C E b i t i s s e t .
*
* NOTE : UltraSparc- I / I I h a v e h i g h a n d l o w U D B e r r o r
* registers, c o r r e s p o n d i n g t o t h e t w o U D B u n i t s
* present o n t h o s e c h i p s . U l t r a S p a r c - I I i o n l y
* has a s i n g l e U D B , c a l l e d " S D B " i n t h e m a n u a l .
* For I I i t h e u p p e r U D B r e g i s t e r a l w a y s r e a d s
* as z e r o s o f o r o u r p u r p o s e s t h i n g s w i l l j u s t
* work w i t h t h e c h e c k s b e l o w .
* /
1 : ldxa [ % g 0 ] A S I _ U D B H _ E R R O R _ R , % g 3
and % g 3 , 0 x3 f f , % g 7 ! P a r a n o i a
sllx % g 7 , S F S T A T _ U D B H _ S H I F T , % g 7
or % g 4 , % g 7 , % g 4
andcc % g 3 , % g 1 , % g 3 ! U D B E _ U E o r U D B E _ C E
be,p n % x c c , 1 f
nop
stxa % g 3 , [ % g 0 ] A S I _ U D B _ E R R O R _ W
membar #S y n c
1 : mov 0 x18 , % g 3
ldxa [ % g 3 ] A S I _ U D B L _ E R R O R _ R , % g 3
and % g 3 , 0 x3 f f , % g 7 ! P a r a n o i a
sllx % g 7 , S F S T A T _ U D B L _ S H I F T , % g 7
or % g 4 , % g 7 , % g 4
andcc % g 3 , % g 1 , % g 3 ! U D B E _ U E o r U D B E _ C E
be,p n % x c c , 1 f
nop
mov 0 x18 , % g 7
stxa % g 3 , [ % g 7 ] A S I _ U D B _ E R R O R _ W
membar #S y n c
1 : / * Ok, n o w t h a t w e ' v e l a t c h e d t h e e r r o r s t a t e ,
* clear t h e s t i c k y b i t s i n t h e A F S R .
* /
stxa % g 4 , [ % g 0 ] A S I _ A F S R
membar #S y n c
rdpr % t l , % g 2
cmp % g 2 , 1
rdpr % p i l , % g 2
bleu,p t % x c c , 1 f
wrpr % g 0 , 1 5 , % p i l
ba,p t % x c c , e t r a p t l 1
rd % p c , % g 7
ba,p t % x c c , 2 f
nop
1 : ba,p t % x c c , e t r a p _ i r q
rd % p c , % g 7
2 : mov % l 4 , % o 1
mov % l 5 , % o 2
call s p i t f i r e _ a c c e s s _ e r r o r
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
/ * This i s t h e t r a p h a n d l e r e n t r y p o i n t f o r E C C c o r r e c t a b l e
* errors. T h e y a r e c o r r e c t e d , b u t w e l i s t e n f o r t h e t r a p
* so t h a t t h e e v e n t c a n b e l o g g e d .
*
* Disrupting e r r o r s a r e e i t h e r :
* 1 ) single- b i t E C C e r r o r s d u r i n g U D B r e a d s t o s y s t e m
* memory
* 2 ) data p a r i t y e r r o r s d u r i n g w r i t e - b a c k e v e n t s
*
* As f a r a s I c a n m a k e o u t f r o m t h e m a n u a l , t h e C E E t r a p
* is o n l y f o r c o r r e c t a b l e e r r o r s d u r i n g m e m o r y r e a d
* accesses b y t h e f r o n t - e n d o f t h e p r o c e s s o r .
*
* The c o d e b e l o w i s o n l y f o r t r a p l e v e l 1 C E E e v e n t s ,
* as i t i s t h e o n l y s i t u a t i o n w h e r e w e c a n s a f e l y r e c o r d
* and l o g . F o r t r a p l e v e l > 1 w e j u s t c l e a r t h e C E b i t
* in t h e A F S R a n d r e t u r n .
*
* This i s j u s t l i k e _ _ s p i f t i r e _ a c c e s s _ e r r o r a b o v e , b u t i t
* specifically h a n d l e s c o r r e c t a b l e e r r o r s . I f a n
* uncorrectable e r r o r i s i n d i c a t e d i n t h e A F S R w e
* will b r a n c h d i r e c t l y a b o v e t o _ _ s p i t f i r e _ a c c e s s _ e r r o r
* to h a n d l e i t i n s t e a d . U n c o r r e c t a b l e t h e r e f o r e t a k e s
* priority o v e r c o r r e c t a b l e , a n d t h e e r r o r l o g g i n g
* C c o d e w i l l n o t i c e t h i s c a s e b y i n s p e c t i n g t h e
* trap t y p e .
* /
.globl __spitfire_cee_trap
__spitfire_cee_trap :
ldxa [ % g 0 ] A S I _ A F S R , % g 4 ! G e t A F S R
mov 1 , % g 3
sllx % g 3 , S F A F S R _ U E _ S H I F T , % g 3
andcc % g 4 , % g 3 , % g 0 ! C h e c k f o r U E
bne,p n % x c c , _ _ s p i t f i r e _ a c c e s s _ e r r o r
nop
/ * Ok, i n t h i s c a s e w e o n l y h a v e a c o r r e c t a b l e e r r o r .
* Indicate w e o n l y w i s h t o c a p t u r e t h a t s t a t e i n r e g i s t e r
* % g1 , a n d w e o n l y d i s a b l e C E e r r o r r e p o r t i n g u n l i k e U E
* handling w h i c h d i s a b l e s a l l e r r o r s .
* /
ldxa [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N , % g 3
andn % g 3 , E S T A T E _ E R R _ C E , % g 3
stxa % g 3 , [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N
membar #S y n c
/* Preserve AFSR in %g4, indicate UDB state to capture in %g1 */
ba,p t % x c c , _ _ s p i t f i r e _ c e e _ t r a p _ c o n t i n u e
mov U D B E _ C E , % g 1
.globl __spitfire_data_access_exception
.globl __spitfire_data_access_exception_tl1
__spitfire_data_access_exception_tl1 :
2005-04-17 02:20:36 +04:00
rdpr % p s t a t e , % g 4
wrpr % g 4 , P S T A T E _ M G | P S T A T E _ A G , % p s t a t e
mov T L B _ S F S R , % g 3
mov D M M U _ S F A R , % g 5
ldxa [ % g 3 ] A S I _ D M M U , % g 4 ! G e t S F S R
ldxa [ % g 5 ] A S I _ D M M U , % g 5 ! G e t S F A R
stxa % g 0 , [ % g 3 ] A S I _ D M M U ! C l e a r S F S R . F a u l t V a l i d b i t
membar #S y n c
2005-08-29 23:44:57 +04:00
rdpr % t t , % g 3
cmp % g 3 , 0 x80 ! f i r s t w i n s p i l l / f i l l t r a p
blu,p n % x c c , 1 f
cmp % g 3 , 0 x f f ! l a s t w i n s p i l l / f i l l t r a p
bgu,p n % x c c , 1 f
nop
2005-04-17 02:20:36 +04:00
ba,p t % x c c , w i n f i x _ d a x
rdpr % t p c , % g 3
2005-08-29 23:44:57 +04:00
1 : sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p t l 1
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
2005-08-29 23:45:11 +04:00
call s p i t f i r e _ d a t a _ a c c e s s _ e x c e p t i o n _ t l 1
2005-08-29 23:44:57 +04:00
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
2005-08-29 23:45:11 +04:00
__spitfire_data_access_exception :
2005-04-17 02:20:36 +04:00
rdpr % p s t a t e , % g 4
wrpr % g 4 , P S T A T E _ M G | P S T A T E _ A G , % p s t a t e
mov T L B _ S F S R , % g 3
mov D M M U _ S F A R , % g 5
ldxa [ % g 3 ] A S I _ D M M U , % g 4 ! G e t S F S R
ldxa [ % g 5 ] A S I _ D M M U , % g 5 ! G e t S F A R
stxa % g 0 , [ % g 3 ] A S I _ D M M U ! C l e a r S F S R . F a u l t V a l i d b i t
membar #S y n c
sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
2005-08-29 23:45:11 +04:00
call s p i t f i r e _ d a t a _ a c c e s s _ e x c e p t i o n
2005-04-17 02:20:36 +04:00
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
2005-08-29 23:45:11 +04:00
.globl __spitfire_insn_access_exception
.globl __spitfire_insn_access_exception_tl1
__spitfire_insn_access_exception_tl1 :
2005-04-17 02:20:36 +04:00
rdpr % p s t a t e , % g 4
wrpr % g 4 , P S T A T E _ M G | P S T A T E _ A G , % p s t a t e
mov T L B _ S F S R , % g 3
2005-08-29 23:44:40 +04:00
ldxa [ % g 3 ] A S I _ I M M U , % g 4 ! G e t S F S R
rdpr % t p c , % g 5 ! I M M U h a s n o S F A R , u s e T P C
2005-04-17 02:20:36 +04:00
stxa % g 0 , [ % g 3 ] A S I _ I M M U ! C l e a r F a u l t V a l i d b i t
membar #S y n c
sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p t l 1
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
2005-08-29 23:45:11 +04:00
call s p i t f i r e _ i n s n _ a c c e s s _ e x c e p t i o n _ t l 1
2005-04-17 02:20:36 +04:00
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
2005-08-29 23:45:11 +04:00
__spitfire_insn_access_exception :
2005-04-17 02:20:36 +04:00
rdpr % p s t a t e , % g 4
wrpr % g 4 , P S T A T E _ M G | P S T A T E _ A G , % p s t a t e
mov T L B _ S F S R , % g 3
2005-08-29 23:44:40 +04:00
ldxa [ % g 3 ] A S I _ I M M U , % g 4 ! G e t S F S R
rdpr % t p c , % g 5 ! I M M U h a s n o S F A R , u s e T P C
2005-04-17 02:20:36 +04:00
stxa % g 0 , [ % g 3 ] A S I _ I M M U ! C l e a r F a u l t V a l i d b i t
membar #S y n c
sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
2005-08-29 23:45:11 +04:00
call s p i t f i r e _ i n s n _ a c c e s s _ e x c e p t i o n
2005-04-17 02:20:36 +04:00
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
/ * These g e t p a t c h e d i n t o t h e t r a p t a b l e a t b o o t t i m e
* once w e k n o w w e h a v e a c h e e t a h p r o c e s s o r .
* /
.globl cheetah_ f e c c _ t r a p _ v e c t o r , c h e e t a h _ f e c c _ t r a p _ v e c t o r _ t l 1
cheetah_fecc_trap_vector :
membar #S y n c
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1
andn % g 1 , D C U _ D C | D C U _ I C , % g 1
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G
membar #S y n c
sethi % h i ( c h e e t a h _ f a s t _ e c c ) , % g 2
jmpl % g 2 + % l o ( c h e e t a h _ f a s t _ e c c ) , % g 0
mov 0 , % g 1
cheetah_fecc_trap_vector_tl1 :
membar #S y n c
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1
andn % g 1 , D C U _ D C | D C U _ I C , % g 1
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G
membar #S y n c
sethi % h i ( c h e e t a h _ f a s t _ e c c ) , % g 2
jmpl % g 2 + % l o ( c h e e t a h _ f a s t _ e c c ) , % g 0
mov 1 , % g 1
.globl cheetah_ c e e _ t r a p _ v e c t o r , c h e e t a h _ c e e _ t r a p _ v e c t o r _ t l 1
cheetah_cee_trap_vector :
membar #S y n c
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1
andn % g 1 , D C U _ I C , % g 1
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G
membar #S y n c
sethi % h i ( c h e e t a h _ c e e ) , % g 2
jmpl % g 2 + % l o ( c h e e t a h _ c e e ) , % g 0
mov 0 , % g 1
cheetah_cee_trap_vector_tl1 :
membar #S y n c
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1
andn % g 1 , D C U _ I C , % g 1
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G
membar #S y n c
sethi % h i ( c h e e t a h _ c e e ) , % g 2
jmpl % g 2 + % l o ( c h e e t a h _ c e e ) , % g 0
mov 1 , % g 1
.globl cheetah_ d e f e r r e d _ t r a p _ v e c t o r , c h e e t a h _ d e f e r r e d _ t r a p _ v e c t o r _ t l 1
cheetah_deferred_trap_vector :
membar #S y n c
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1 ;
andn % g 1 , D C U _ D C | D C U _ I C , % g 1 ;
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G ;
membar #S y n c ;
sethi % h i ( c h e e t a h _ d e f e r r e d _ t r a p ) , % g 2
jmpl % g 2 + % l o ( c h e e t a h _ d e f e r r e d _ t r a p ) , % g 0
mov 0 , % g 1
cheetah_deferred_trap_vector_tl1 :
membar #S y n c ;
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1 ;
andn % g 1 , D C U _ D C | D C U _ I C , % g 1 ;
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G ;
membar #S y n c ;
sethi % h i ( c h e e t a h _ d e f e r r e d _ t r a p ) , % g 2
jmpl % g 2 + % l o ( c h e e t a h _ d e f e r r e d _ t r a p ) , % g 0
mov 1 , % g 1
/ * Cheetah+ s p e c i f i c t r a p s . T h e s e a r e f o r t h e n e w I / D c a c h e p a r i t y
* error t r a p s . T h e f i r s t a r g u m e n t t o c h e e t a h _ p l u s _ p a r i t y _ h a n d l e r
* is e n c o d e d a s f o l l o w s :
*
* Bit0 : 0 = dcache,1 =icache
* Bit1 : 0 = recoverable,1 =unrecoverable
* /
.globl cheetah_ p l u s _ d c p e _ t r a p _ v e c t o r , c h e e t a h _ p l u s _ d c p e _ t r a p _ v e c t o r _ t l 1
cheetah_plus_dcpe_trap_vector :
membar #S y n c
sethi % h i ( d o _ c h e e t a h _ p l u s _ d a t a _ p a r i t y ) , % g 7
jmpl % g 7 + % l o ( d o _ c h e e t a h _ p l u s _ d a t a _ p a r i t y ) , % g 0
nop
nop
nop
nop
nop
do_cheetah_plus_data_parity :
2005-09-26 11:32:17 +04:00
rdpr % p i l , % g 2
wrpr % g 0 , 1 5 , % p i l
ba,p t % x c c , e t r a p _ i r q
2005-04-17 02:20:36 +04:00
rd % p c , % g 7
mov 0 x0 , % o 0
call c h e e t a h _ p l u s _ p a r i t y _ e r r o r
add % s p , P T R E G S _ O F F , % o 1
2005-09-26 11:32:17 +04:00
ba,a ,p t % x c c , r t r a p _ i r q
2005-04-17 02:20:36 +04:00
cheetah_plus_dcpe_trap_vector_tl1 :
membar #S y n c
wrpr P S T A T E _ I G | P S T A T E _ P E F | P S T A T E _ P R I V , % p s t a t e
sethi % h i ( d o _ d c p e _ t l 1 ) , % g 3
jmpl % g 3 + % l o ( d o _ d c p e _ t l 1 ) , % g 0
nop
nop
nop
nop
.globl cheetah_ p l u s _ i c p e _ t r a p _ v e c t o r , c h e e t a h _ p l u s _ i c p e _ t r a p _ v e c t o r _ t l 1
cheetah_plus_icpe_trap_vector :
membar #S y n c
sethi % h i ( d o _ c h e e t a h _ p l u s _ i n s n _ p a r i t y ) , % g 7
jmpl % g 7 + % l o ( d o _ c h e e t a h _ p l u s _ i n s n _ p a r i t y ) , % g 0
nop
nop
nop
nop
nop
do_cheetah_plus_insn_parity :
2005-09-26 11:32:17 +04:00
rdpr % p i l , % g 2
wrpr % g 0 , 1 5 , % p i l
ba,p t % x c c , e t r a p _ i r q
2005-04-17 02:20:36 +04:00
rd % p c , % g 7
mov 0 x1 , % o 0
call c h e e t a h _ p l u s _ p a r i t y _ e r r o r
add % s p , P T R E G S _ O F F , % o 1
2005-09-26 11:32:17 +04:00
ba,a ,p t % x c c , r t r a p _ i r q
2005-04-17 02:20:36 +04:00
cheetah_plus_icpe_trap_vector_tl1 :
membar #S y n c
wrpr P S T A T E _ I G | P S T A T E _ P E F | P S T A T E _ P R I V , % p s t a t e
sethi % h i ( d o _ i c p e _ t l 1 ) , % g 3
jmpl % g 3 + % l o ( d o _ i c p e _ t l 1 ) , % g 0
nop
nop
nop
nop
/ * If w e t a k e o n e o f t h e s e t r a p s w h e n t l > = 1 , t h e n w e
* jump t o i n t e r r u p t g l o b a l s . I f s o m e t r a p l e v e l a b o v e u s
* was a l s o u s i n g i n t e r r u p t g l o b a l s , w e c a n n o t r e c o v e r .
* We m a y u s e a l l i n t e r r u p t g l o b a l r e g i s t e r s e x c e p t % g 6 .
* /
.globl do_ d c p e _ t l 1 , d o _ i c p e _ t l 1
do_dcpe_tl1 :
rdpr % t l , % g 1 ! S a v e o r i g i n a l t r a p l e v e l
mov 1 , % g 2 ! S e t u p T S T A T E c h e c k i n g l o o p
sethi % h i ( T S T A T E _ I G ) , % g 3 ! T S T A T E m a s k b i t
1 : wrpr % g 2 , % t l ! S e t t r a p l e v e l t o c h e c k
rdpr % t s t a t e , % g 4 ! R e a d T S T A T E f o r t h i s l e v e l
andcc % g 4 , % g 3 , % g 0 ! I n t e r r u p t g l o b a l s i n u s e ?
bne,a ,p n % x c c , d o _ d c p e _ t l 1 _ f a t a l ! Y e p , i r r e c o v e r a b l e
wrpr % g 1 , % t l ! R e s t o r e o r i g i n a l t r a p l e v e l
add % g 2 , 1 , % g 2 ! N e x t t r a p l e v e l
cmp % g 2 , % g 1 ! H i t t h e m a l l y e t ?
ble,p t % i c c , 1 b ! N o t y e t
nop
wrpr % g 1 , % t l ! R e s t o r e o r i g i n a l t r a p l e v e l
do_dcpe_tl1_nonfatal : /* Ok we may use interrupt globals safely. */
2005-09-26 11:32:17 +04:00
sethi % h i ( d c a c h e _ p a r i t y _ t l 1 _ o c c u r r e d ) , % g 2
lduw [ % g 2 + % l o ( d c a c h e _ p a r i t y _ t l 1 _ o c c u r r e d ) ] , % g 1
add % g 1 , 1 , % g 1
stw % g 1 , [ % g 2 + % l o ( d c a c h e _ p a r i t y _ t l 1 _ o c c u r r e d ) ]
2005-04-17 02:20:36 +04:00
/* Reset D-cache parity */
sethi % h i ( 1 < < 1 6 ) , % g 1 ! D - c a c h e s i z e
mov ( 1 < < 5 ) , % g 2 ! D - c a c h e l i n e s i z e
sub % g 1 , % g 2 , % g 1 ! M o v e d o w n 1 c a c h e l i n e
1 : srl % g 1 , 1 4 , % g 3 ! C o m p u t e U T A G
membar #S y n c
stxa % g 3 , [ % g 1 ] A S I _ D C A C H E _ U T A G
membar #S y n c
sub % g 2 , 8 , % g 3 ! 6 4 - b i t d a t a w o r d w i t h i n l i n e
2 : membar #S y n c
stxa % g 0 , [ % g 1 + % g 3 ] A S I _ D C A C H E _ D A T A
membar #S y n c
subcc % g 3 , 8 , % g 3 ! N e x t 6 4 - b i t d a t a w o r d
bge,p t % i c c , 2 b
nop
subcc % g 1 , % g 2 , % g 1 ! N e x t c a c h e l i n e
bge,p t % i c c , 1 b
nop
ba,p t % x c c , d c p e _ i c p e _ t l 1 _ c o m m o n
nop
do_dcpe_tl1_fatal :
sethi % h i ( 1 f ) , % g 7
ba,p t % x c c , e t r a p t l 1
1 : or % g 7 , % l o ( 1 b ) , % g 7
mov 0 x2 , % o 0
call c h e e t a h _ p l u s _ p a r i t y _ e r r o r
add % s p , P T R E G S _ O F F , % o 1
ba,p t % x c c , r t r a p
clr % l 6
do_icpe_tl1 :
rdpr % t l , % g 1 ! S a v e o r i g i n a l t r a p l e v e l
mov 1 , % g 2 ! S e t u p T S T A T E c h e c k i n g l o o p
sethi % h i ( T S T A T E _ I G ) , % g 3 ! T S T A T E m a s k b i t
1 : wrpr % g 2 , % t l ! S e t t r a p l e v e l t o c h e c k
rdpr % t s t a t e , % g 4 ! R e a d T S T A T E f o r t h i s l e v e l
andcc % g 4 , % g 3 , % g 0 ! I n t e r r u p t g l o b a l s i n u s e ?
bne,a ,p n % x c c , d o _ i c p e _ t l 1 _ f a t a l ! Y e p , i r r e c o v e r a b l e
wrpr % g 1 , % t l ! R e s t o r e o r i g i n a l t r a p l e v e l
add % g 2 , 1 , % g 2 ! N e x t t r a p l e v e l
cmp % g 2 , % g 1 ! H i t t h e m a l l y e t ?
ble,p t % i c c , 1 b ! N o t y e t
nop
wrpr % g 1 , % t l ! R e s t o r e o r i g i n a l t r a p l e v e l
do_icpe_tl1_nonfatal : /* Ok we may use interrupt globals safely. */
2005-09-26 11:32:17 +04:00
sethi % h i ( i c a c h e _ p a r i t y _ t l 1 _ o c c u r r e d ) , % g 2
lduw [ % g 2 + % l o ( i c a c h e _ p a r i t y _ t l 1 _ o c c u r r e d ) ] , % g 1
add % g 1 , 1 , % g 1
stw % g 1 , [ % g 2 + % l o ( i c a c h e _ p a r i t y _ t l 1 _ o c c u r r e d ) ]
2005-04-17 02:20:36 +04:00
/* Flush I-cache */
sethi % h i ( 1 < < 1 5 ) , % g 1 ! I - c a c h e s i z e
mov ( 1 < < 5 ) , % g 2 ! I - c a c h e l i n e s i z e
sub % g 1 , % g 2 , % g 1
1 : or % g 1 , ( 2 < < 3 ) , % g 3
stxa % g 0 , [ % g 3 ] A S I _ I C _ T A G
membar #S y n c
subcc % g 1 , % g 2 , % g 1
bge,p t % i c c , 1 b
nop
ba,p t % x c c , d c p e _ i c p e _ t l 1 _ c o m m o n
nop
do_icpe_tl1_fatal :
sethi % h i ( 1 f ) , % g 7
ba,p t % x c c , e t r a p t l 1
1 : or % g 7 , % l o ( 1 b ) , % g 7
mov 0 x3 , % o 0
call c h e e t a h _ p l u s _ p a r i t y _ e r r o r
add % s p , P T R E G S _ O F F , % o 1
ba,p t % x c c , r t r a p
clr % l 6
dcpe_icpe_tl1_common :
/ * Flush D - c a c h e , r e - e n a b l e D / I c a c h e s i n D C U a n d f i n a l l y
* retry t h e t r a p p i n g i n s t r u c t i o n .
* /
sethi % h i ( 1 < < 1 6 ) , % g 1 ! D - c a c h e s i z e
mov ( 1 < < 5 ) , % g 2 ! D - c a c h e l i n e s i z e
sub % g 1 , % g 2 , % g 1
1 : stxa % g 0 , [ % g 1 ] A S I _ D C A C H E _ T A G
membar #S y n c
subcc % g 1 , % g 2 , % g 1
bge,p t % i c c , 1 b
nop
ldxa [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G , % g 1
or % g 1 , ( D C U _ D C | D C U _ I C ) , % g 1
stxa % g 1 , [ % g 0 ] A S I _ D C U _ C O N T R O L _ R E G
membar #S y n c
retry
2005-08-31 02:11:52 +04:00
/ * Capture I / D / E - c a c h e s t a t e i n t o p e r - c p u e r r o r s c o r e b o a r d .
*
* % g1 : ( TL> =0 ) ? 1 : 0
* % g2 : scratch
* % g3 : scratch
* % g4 : AFSR
* % g5 : AFAR
2006-02-27 10:24:22 +03:00
* % g6 : unused, w i l l h a v e c u r r e n t t h r e a d p t r a f t e r e t r a p
2005-08-31 02:11:52 +04:00
* % g7 : scratch
* /
__cheetah_log_error :
/* Put "TL1" software bit into AFSR. */
and % g 1 , 0 x1 , % g 1
sllx % g 1 , 6 3 , % g 2
or % g 4 , % g 2 , % g 4
/* Get log entry pointer for this cpu at this trap level. */
BRANCH_ I F _ J A L A P E N O ( g 2 ,g 3 ,5 0 f )
ldxa [ % g 0 ] A S I _ S A F A R I _ C O N F I G , % g 2
srlx % g 2 , 1 7 , % g 2
ba,p t % x c c , 6 0 f
and % g 2 , 0 x3 f f , % g 2
50 : ldxa [ % g 0 ] A S I _ J B U S _ C O N F I G , % g 2
srlx % g 2 , 1 7 , % g 2
and % g 2 , 0 x1 f , % g 2
60 : sllx % g 2 , 9 , % g 2
sethi % h i ( c h e e t a h _ e r r o r _ l o g ) , % g 3
ldx [ % g 3 + % l o ( c h e e t a h _ e r r o r _ l o g ) ] , % g 3
brz,p n % g 3 , 8 0 f
nop
add % g 3 , % g 2 , % g 3
sllx % g 1 , 8 , % g 1
add % g 3 , % g 1 , % g 1
/* %g1 holds pointer to the top of the logging scoreboard */
ldx [ % g 1 + 0 x0 ] , % g 7
cmp % g 7 , - 1
bne,p n % x c c , 8 0 f
nop
stx % g 4 , [ % g 1 + 0 x0 ]
stx % g 5 , [ % g 1 + 0 x8 ]
add % g 1 , 0 x10 , % g 1
/* %g1 now points to D-cache logging area */
set 0 x3 f f8 , % g 2 / * D C _ a d d r m a s k * /
and % g 5 , % g 2 , % g 2 / * D C _ a d d r b i t s o f A F A R * /
srlx % g 5 , 1 2 , % g 3
or % g 3 , 1 , % g 3 / * P H Y S t a g + v a l i d * /
10 : ldxa [ % g 2 ] A S I _ D C A C H E _ T A G , % g 7
cmp % g 3 , % g 7 / * T A G m a t c h ? * /
bne,p t % x c c , 1 3 f
nop
/* Yep, what we want, capture state. */
stx % g 2 , [ % g 1 + 0 x20 ]
stx % g 7 , [ % g 1 + 0 x28 ]
/* A membar Sync is required before and after utag access. */
membar #S y n c
ldxa [ % g 2 ] A S I _ D C A C H E _ U T A G , % g 7
membar #S y n c
stx % g 7 , [ % g 1 + 0 x30 ]
ldxa [ % g 2 ] A S I _ D C A C H E _ S N O O P _ T A G , % g 7
stx % g 7 , [ % g 1 + 0 x38 ]
clr % g 3
12 : ldxa [ % g 2 + % g 3 ] A S I _ D C A C H E _ D A T A , % g 7
stx % g 7 , [ % g 1 ]
add % g 3 , ( 1 < < 5 ) , % g 3
cmp % g 3 , ( 4 < < 5 )
bl,p t % x c c , 1 2 b
add % g 1 , 0 x8 , % g 1
ba,p t % x c c , 2 0 f
add % g 1 , 0 x20 , % g 1
13 : sethi % h i ( 1 < < 1 4 ) , % g 7
add % g 2 , % g 7 , % g 2
srlx % g 2 , 1 4 , % g 7
cmp % g 7 , 4
bl,p t % x c c , 1 0 b
nop
add % g 1 , 0 x40 , % g 1
/* %g1 now points to I-cache logging area */
20 : set 0 x1 f e 0 , % g 2 / * I C _ a d d r m a s k * /
and % g 5 , % g 2 , % g 2 / * I C _ a d d r b i t s o f A F A R * /
sllx % g 2 , 1 , % g 2 / * I C _ a d d r [ 1 3 : 6 ] = =VA [ 1 2 : 5 ] * /
srlx % g 5 , ( 1 3 - 8 ) , % g 3 / * M a k e P T A G * /
andn % g 3 , 0 x f f , % g 3 / * M a s k o f f u n d e f i n e d b i t s * /
21 : ldxa [ % g 2 ] A S I _ I C _ T A G , % g 7
andn % g 7 , 0 x f f , % g 7
cmp % g 3 , % g 7
bne,p t % x c c , 2 3 f
nop
/* Yep, what we want, capture state. */
stx % g 2 , [ % g 1 + 0 x40 ]
stx % g 7 , [ % g 1 + 0 x48 ]
add % g 2 , ( 1 < < 3 ) , % g 2
ldxa [ % g 2 ] A S I _ I C _ T A G , % g 7
add % g 2 , ( 1 < < 3 ) , % g 2
stx % g 7 , [ % g 1 + 0 x50 ]
ldxa [ % g 2 ] A S I _ I C _ T A G , % g 7
add % g 2 , ( 1 < < 3 ) , % g 2
stx % g 7 , [ % g 1 + 0 x60 ]
ldxa [ % g 2 ] A S I _ I C _ T A G , % g 7
stx % g 7 , [ % g 1 + 0 x68 ]
sub % g 2 , ( 3 < < 3 ) , % g 2
ldxa [ % g 2 ] A S I _ I C _ S T A G , % g 7
stx % g 7 , [ % g 1 + 0 x58 ]
clr % g 3
srlx % g 2 , 2 , % g 2
22 : ldxa [ % g 2 + % g 3 ] A S I _ I C _ I N S T R , % g 7
stx % g 7 , [ % g 1 ]
add % g 3 , ( 1 < < 3 ) , % g 3
cmp % g 3 , ( 8 < < 3 )
bl,p t % x c c , 2 2 b
add % g 1 , 0 x8 , % g 1
ba,p t % x c c , 3 0 f
add % g 1 , 0 x30 , % g 1
23 : sethi % h i ( 1 < < 1 4 ) , % g 7
add % g 2 , % g 7 , % g 2
srlx % g 2 , 1 4 , % g 7
cmp % g 7 , 4
bl,p t % x c c , 2 1 b
nop
add % g 1 , 0 x70 , % g 1
/* %g1 now points to E-cache logging area */
30 : andn % g 5 , ( 3 2 - 1 ) , % g 2
stx % g 2 , [ % g 1 + 0 x20 ]
ldxa [ % g 2 ] A S I _ E C _ T A G _ D A T A , % g 7
stx % g 7 , [ % g 1 + 0 x28 ]
ldxa [ % g 2 ] A S I _ E C _ R , % g 0
clr % g 3
31 : ldxa [ % g 3 ] A S I _ E C _ D A T A , % g 7
stx % g 7 , [ % g 1 + % g 3 ]
add % g 3 , 0 x8 , % g 3
cmp % g 3 , 0 x20
bl,p t % x c c , 3 1 b
nop
80 :
rdpr % t t , % g 2
cmp % g 2 , 0 x70
be c _ f a s t _ e c c
cmp % g 2 , 0 x63
be c _ c e e
nop
ba,p t % x c c , c _ d e f e r r e d
2005-04-17 02:20:36 +04:00
/ * Cheetah F E C C t r a p h a n d l i n g , w e g e t h e r e f r o m t l { 0 ,1 } _ f e c c
* in t h e t r a p t a b l e . T h a t c o d e h a s d o n e a m e m o r y b a r r i e r
* and h a s d i s a b l e d b o t h t h e I - c a c h e a n d D - c a c h e i n t h e D C U
* control r e g i s t e r . T h e I - c a c h e i s d i s a b l e d s o t h a t w e m a y
* capture t h e c o r r u p t e d c a c h e l i n e , a n d t h e D - c a c h e i s d i s a b l e d
* because c o r r u p t d a t a m a y h a v e b e e n p l a c e d t h e r e a n d w e d o n ' t
* want t o r e f e r e n c e i t .
*
* % g1 i s o n e i f t h i s t r a p o c c u r r e d a t % t l > = 1 .
*
* Next, w e t u r n o f f e r r o r r e p o r t i n g s o t h a t w e d o n ' t r e c u r s e .
* /
.globl cheetah_fast_ecc
cheetah_fast_ecc :
ldxa [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N , % g 2
andn % g 2 , E S T A T E _ E R R O R _ N C E E N | E S T A T E _ E R R O R _ C E E N , % g 2
stxa % g 2 , [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N
membar #S y n c
/* Fetch and clear AFSR/AFAR */
ldxa [ % g 0 ] A S I _ A F S R , % g 4
ldxa [ % g 0 ] A S I _ A F A R , % g 5
stxa % g 4 , [ % g 0 ] A S I _ A F S R
membar #S y n c
2005-08-31 02:11:52 +04:00
ba,p t % x c c , _ _ c h e e t a h _ l o g _ e r r o r
nop
2005-04-17 02:20:36 +04:00
2005-08-31 02:11:52 +04:00
c_fast_ecc :
2005-04-17 02:20:36 +04:00
rdpr % p i l , % g 2
wrpr % g 0 , 1 5 , % p i l
ba,p t % x c c , e t r a p _ i r q
rd % p c , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
call c h e e t a h _ f e c c _ h a n d l e r
add % s p , P T R E G S _ O F F , % o 0
ba,a ,p t % x c c , r t r a p _ i r q
/* Our caller has disabled I-cache and performed membar Sync. */
.globl cheetah_cee
cheetah_cee :
ldxa [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N , % g 2
andn % g 2 , E S T A T E _ E R R O R _ C E E N , % g 2
stxa % g 2 , [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N
membar #S y n c
/* Fetch and clear AFSR/AFAR */
ldxa [ % g 0 ] A S I _ A F S R , % g 4
ldxa [ % g 0 ] A S I _ A F A R , % g 5
stxa % g 4 , [ % g 0 ] A S I _ A F S R
membar #S y n c
2005-08-31 02:11:52 +04:00
ba,p t % x c c , _ _ c h e e t a h _ l o g _ e r r o r
nop
2005-04-17 02:20:36 +04:00
2005-08-31 02:11:52 +04:00
c_cee :
2005-04-17 02:20:36 +04:00
rdpr % p i l , % g 2
wrpr % g 0 , 1 5 , % p i l
ba,p t % x c c , e t r a p _ i r q
rd % p c , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
call c h e e t a h _ c e e _ h a n d l e r
add % s p , P T R E G S _ O F F , % o 0
ba,a ,p t % x c c , r t r a p _ i r q
/* Our caller has disabled I-cache+D-cache and performed membar Sync. */
.globl cheetah_deferred_trap
cheetah_deferred_trap :
ldxa [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N , % g 2
andn % g 2 , E S T A T E _ E R R O R _ N C E E N | E S T A T E _ E R R O R _ C E E N , % g 2
stxa % g 2 , [ % g 0 ] A S I _ E S T A T E _ E R R O R _ E N
membar #S y n c
/* Fetch and clear AFSR/AFAR */
ldxa [ % g 0 ] A S I _ A F S R , % g 4
ldxa [ % g 0 ] A S I _ A F A R , % g 5
stxa % g 4 , [ % g 0 ] A S I _ A F S R
membar #S y n c
2005-08-31 02:11:52 +04:00
ba,p t % x c c , _ _ c h e e t a h _ l o g _ e r r o r
nop
2005-04-17 02:20:36 +04:00
2005-08-31 02:11:52 +04:00
c_deferred :
2005-04-17 02:20:36 +04:00
rdpr % p i l , % g 2
wrpr % g 0 , 1 5 , % p i l
ba,p t % x c c , e t r a p _ i r q
rd % p c , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
call c h e e t a h _ d e f e r r e d _ h a n d l e r
add % s p , P T R E G S _ O F F , % o 0
ba,a ,p t % x c c , r t r a p _ i r q
.globl __do_privact
__do_privact :
mov T L B _ S F S R , % g 3
stxa % g 0 , [ % g 3 ] A S I _ D M M U ! C l e a r F a u l t V a l i d b i t
membar #S y n c
sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
call d o _ p r i v a c t
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
.globl do_mna
do_mna :
rdpr % t l , % g 3
cmp % g 3 , 1
/ * Setup % g 4 / % g 5 n o w a s t h e y a r e u s e d i n t h e
* winfixup c o d e .
* /
mov T L B _ S F S R , % g 3
mov D M M U _ S F A R , % g 4
ldxa [ % g 4 ] A S I _ D M M U , % g 4
ldxa [ % g 3 ] A S I _ D M M U , % g 5
stxa % g 0 , [ % g 3 ] A S I _ D M M U ! C l e a r F a u l t V a l i d b i t
membar #S y n c
bgu,p n % i c c , w i n f i x _ m n a
rdpr % t p c , % g 3
1 : sethi % h i ( 1 0 9 f ) , % g 7
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
call m e m _ a d d r e s s _ u n a l i g n e d
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
.globl do_lddfmna
do_lddfmna :
sethi % h i ( 1 0 9 f ) , % g 7
mov T L B _ S F S R , % g 4
ldxa [ % g 4 ] A S I _ D M M U , % g 5
stxa % g 0 , [ % g 4 ] A S I _ D M M U ! C l e a r F a u l t V a l i d b i t
membar #S y n c
mov D M M U _ S F A R , % g 4
ldxa [ % g 4 ] A S I _ D M M U , % g 4
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
call h a n d l e _ l d d f m n a
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
.globl do_stdfmna
do_stdfmna :
sethi % h i ( 1 0 9 f ) , % g 7
mov T L B _ S F S R , % g 4
ldxa [ % g 4 ] A S I _ D M M U , % g 5
stxa % g 0 , [ % g 4 ] A S I _ D M M U ! C l e a r F a u l t V a l i d b i t
membar #S y n c
mov D M M U _ S F A R , % g 4
ldxa [ % g 4 ] A S I _ D M M U , % g 4
ba,p t % x c c , e t r a p
109 : or % g 7 , % l o ( 1 0 9 b ) , % g 7
mov % l 4 , % o 1
mov % l 5 , % o 2
call h a n d l e _ s t d f m n a
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
clr % l 6
.globl breakpoint_trap
breakpoint_trap :
call s p a r c _ b r e a k p o i n t
add % s p , P T R E G S _ O F F , % o 0
ba,p t % x c c , r t r a p
nop
# if d e f i n e d ( C O N F I G _ S U N O S _ E M U L ) | | d e f i n e d ( C O N F I G _ S O L A R I S _ E M U L ) | | \
defined( C O N F I G _ S O L A R I S _ E M U L _ M O D U L E )
/ * SunOS u s e s s y s c a l l z e r o a s t h e ' i n d i r e c t s y s c a l l ' i t l o o k s
* like i n d i r _ s y s c a l l ( s c a l l _ n u m , a r g 0 , a r g 1 , a r g 2 . . . ) ; etc.
* This i s c o m p l e t e b r a i n d a m a g e .
* /
.globl sunos_indir
sunos_indir :
srl % o 0 , 0 , % o 0
mov % o 7 , % l 4
cmp % o 0 , N R _ S Y S C A L L S
blu,a ,p t % i c c , 1 f
sll % o 0 , 0 x2 , % o 0
sethi % h i ( s u n o s _ n o s y s ) , % l 6
b,p t % x c c , 2 f
or % l 6 , % l o ( s u n o s _ n o s y s ) , % l 6
1 : sethi % h i ( s u n o s _ s y s _ t a b l e ) , % l 7
or % l 7 , % l o ( s u n o s _ s y s _ t a b l e ) , % l 7
lduw [ % l 7 + % o 0 ] , % l 6
2 : mov % o 1 , % o 0
mov % o 2 , % o 1
mov % o 3 , % o 2
mov % o 4 , % o 3
mov % o 5 , % o 4
call % l 6
mov % l 4 , % o 7
.globl sunos_getpid
sunos_getpid :
call s y s _ g e t p p i d
nop
call s y s _ g e t p i d
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 1 ]
b,p t % x c c , r e t _ s y s _ c a l l
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 0 ]
/* SunOS getuid() returns uid in %o0 and euid in %o1 */
.globl sunos_getuid
sunos_getuid :
call s y s32 _ g e t e u i d16
nop
call s y s32 _ g e t u i d16
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 1 ]
b,p t % x c c , r e t _ s y s _ c a l l
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 0 ]
/* SunOS getgid() returns gid in %o0 and egid in %o1 */
.globl sunos_getgid
sunos_getgid :
call s y s32 _ g e t e g i d16
nop
call s y s32 _ g e t g i d16
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 1 ]
b,p t % x c c , r e t _ s y s _ c a l l
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 0 ]
# endif
/ * SunOS' s e x e c v ( ) c a l l o n l y s p e c i f i e s t h e a r g v a r g u m e n t , t h e
* environment s e t t i n g s a r e t h e s a m e a s t h e c a l l i n g p r o c e s s e s .
* /
.globl sunos_execv
sys_execve :
sethi % h i ( s p a r c _ e x e c v e ) , % g 1
ba,p t % x c c , e x e c v e _ m e r g e
or % g 1 , % l o ( s p a r c _ e x e c v e ) , % g 1
# ifdef C O N F I G _ C O M P A T
.globl sys_execve
sunos_execv :
stx % g 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 2 ]
.globl sys32_execve
sys32_execve :
sethi % h i ( s p a r c32 _ e x e c v e ) , % g 1
or % g 1 , % l o ( s p a r c32 _ e x e c v e ) , % g 1
# endif
execve_merge :
flushw
jmpl % g 1 , % g 0
add % s p , P T R E G S _ O F F , % o 0
.globl sys_ p i p e , s y s _ s i g p a u s e , s y s _ n i s _ s y s c a l l
.globl sys_rt_sigreturn
.globl sys_ptrace
.globl sys_sigaltstack
.align 32
sys_pipe : ba,p t % x c c , s p a r c _ p i p e
add % s p , P T R E G S _ O F F , % o 0
sys_nis_syscall : ba,p t % x c c , c _ s y s _ n i s _ s y s c a l l
add % s p , P T R E G S _ O F F , % o 0
sys_memory_ordering :
ba,p t % x c c , s p a r c _ m e m o r y _ o r d e r i n g
add % s p , P T R E G S _ O F F , % o 1
sys_sigaltstack : ba,p t % x c c , d o _ s i g a l t s t a c k
add % i 6 , S T A C K _ B I A S , % o 2
# ifdef C O N F I G _ C O M P A T
.globl sys32_sigstack
sys32_sigstack : ba,p t % x c c , d o _ s y s32 _ s i g s t a c k
mov % i 6 , % o 2
.globl sys32_sigaltstack
sys32_sigaltstack :
ba,p t % x c c , d o _ s y s32 _ s i g a l t s t a c k
mov % i 6 , % o 2
# endif
.align 32
# ifdef C O N F I G _ C O M P A T
.globl sys32_sigreturn
sys32_sigreturn :
add % s p , P T R E G S _ O F F , % o 0
call d o _ s i g r e t u r n 3 2
add % o 7 , 1 f - . - 4 , % o 7
nop
# endif
sys_rt_sigreturn :
add % s p , P T R E G S _ O F F , % o 0
call d o _ r t _ s i g r e t u r n
add % o 7 , 1 f - . - 4 , % o 7
nop
# ifdef C O N F I G _ C O M P A T
.globl sys32_rt_sigreturn
sys32_rt_sigreturn :
add % s p , P T R E G S _ O F F , % o 0
call d o _ r t _ s i g r e t u r n 3 2
add % o 7 , 1 f - . - 4 , % o 7
nop
# endif
sys_ptrace : add % s p , P T R E G S _ O F F , % o 0
call d o _ p t r a c e
add % o 7 , 1 f - . - 4 , % o 7
nop
.align 32
1 : ldx [ % c u r p t r + T I _ F L A G S ] , % l 5
2005-07-11 06:29:45 +04:00
andcc % l 5 , ( _ T I F _ S Y S C A L L _ T R A C E | _ T I F _ S E C C O M P | _ T I F _ S Y S C A L L _ A U D I T ) , % g 0
2005-04-17 02:20:36 +04:00
be,p t % i c c , r t r a p
clr % l 6
2005-07-11 03:55:48 +04:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-17 02:20:36 +04:00
call s y s c a l l _ t r a c e
2005-07-11 03:55:48 +04:00
mov 1 , % o 1
2005-04-17 02:20:36 +04:00
ba,p t % x c c , r t r a p
clr % l 6
/ * This i s h o w f o r k ( ) w a s m e a n t t o b e d o n e , 8 i n s t r u c t i o n e n t r y .
*
* I q u e s t i o n e d t h e f o l l o w i n g c o d e b r i e f l y , l e t m e c l e a r t h i n g s
* up s o y o u m u s t n o t r e a s o n o n i t l i k e I d i d .
*
* Know t h e f o r k _ k p s r e t c . w e u s e i n t h e s p a r c32 p o r t ? W e d o n ' t
* need i t h e r e b e c a u s e t h e o n l y p i e c e o f w i n d o w s t a t e w e c o p y t o
* the c h i l d i s t h e C W P r e g i s t e r . E v e n i f t h e p a r e n t s l e e p s ,
* we a r e s a f e b e c a u s e w e s t u c k i t i n t o p t _ r e g s o f t h e p a r e n t
* so i t w i l l n o t c h a n g e .
*
* XXX T h i s r a i s e s t h e q u e s t i o n , w h e t h e r w e c a n d o t h e s a m e o n
* XXX s p a r c32 t o g e t r i d o f f o r k _ k p s r _ a n d _ f o r k _ k w i m . T h e
* XXX a n s w e r i s y e s . W e s t i c k f o r k _ k p s r i n U R E G _ G 0 a n d
* XXX f o r k _ k w i m i n U R E G _ G 1 ( g l o b a l r e g i s t e r s a r e c o n s i d e r e d
* XXX v o l a t i l e a c r o s s a s y s t e m c a l l i n t h e s p a r c A B I I t h i n k
* XXX i f i t i s n ' t w e c a n u s e r e g s - > y i n s t e a d , a n y o n e w h o d e p e n d s
* XXX u p o n t h e Y r e g i s t e r b e i n g p r e s e r v e d a c r o s s a f o r k d e s e r v e s
* XXX t o l o s e ) .
*
* In f a c t w e s h o u l d t a k e a d v a n t a g e o f t h a t f a c t f o r o t h e r t h i n g s
* during s y s t e m c a l l s . . .
* /
.globl sys_ f o r k , s y s _ v f o r k , s y s _ c l o n e , s p a r c _ e x i t
.globl ret_from_syscall
.align 32
sys_vfork : /* Under Linux, vfork and fork are just special cases of clone. */
sethi % h i ( 0 x40 0 0 | 0 x01 0 0 | S I G C H L D ) , % o 0
or % o 0 , % l o ( 0 x40 0 0 | 0 x01 0 0 | S I G C H L D ) , % o 0
ba,p t % x c c , s y s _ c l o n e
sys_fork : clr % o 1
mov S I G C H L D , % o 0
sys_clone : flushw
movrz % o 1 , % f p , % o 1
mov 0 , % o 3
ba,p t % x c c , s p a r c _ d o _ f o r k
add % s p , P T R E G S _ O F F , % o 2
ret_from_syscall :
2005-07-25 06:36:26 +04:00
/ * Clear c u r r e n t _ t h r e a d _ i n f o ( ) - > n e w _ c h i l d , a n d
* check p e r f o r m a n c e c o u n t e r s t u f f t o o .
2005-04-17 02:20:36 +04:00
* /
2005-07-25 06:36:26 +04:00
stb % g 0 , [ % g 6 + T I _ N E W _ C H I L D ]
ldx [ % g 6 + T I _ F L A G S ] , % l 0
2005-04-17 02:20:36 +04:00
call s c h e d u l e _ t a i l
mov % g 7 , % o 0
andcc % l 0 , _ T I F _ P E R F C T R , % g 0
be,p t % i c c , 1 f
nop
ldx [ % g 6 + T I _ P C R ] , % o 7
wr % g 0 , % o 7 , % p c r
/ * Blackbird e r r a t a w o r k a r o u n d . S e e c o m m e n t a r y i n
* smp. c : s m p _ p e r c p u _ t i m e r _ i n t e r r u p t ( ) f o r m o r e
* information.
* /
ba,p t % x c c , 9 9 f
nop
.align 64
99 : wr % g 0 , % g 0 , % p i c
rd % p i c , % g 0
1 : b,p t % x c c , r e t _ s y s _ c a l l
ldx [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 0 ] , % o 0
2006-02-01 05:34:06 +03:00
sparc_exit : rdpr % p s t a t e , % g 2
wrpr % g 2 , P S T A T E _ I E , % p s t a t e
2005-04-17 02:20:36 +04:00
rdpr % o t h e r w i n , % g 1
rdpr % c a n s a v e , % g 3
add % g 3 , % g 1 , % g 3
wrpr % g 3 , 0 x0 , % c a n s a v e
wrpr % g 0 , 0 x0 , % o t h e r w i n
2006-02-01 05:34:06 +03:00
wrpr % g 2 , 0 x0 , % p s t a t e
2005-04-17 02:20:36 +04:00
ba,p t % x c c , s y s _ e x i t
stb % g 0 , [ % g 6 + T I _ W S A V E D ]
linux_sparc_ni_syscall :
sethi % h i ( s y s _ n i _ s y s c a l l ) , % l 7
b,p t % x c c , 4 f
or % l 7 , % l o ( s y s _ n i _ s y s c a l l ) , % l 7
linux_syscall_trace32 :
2005-07-11 03:55:48 +04:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-17 02:20:36 +04:00
call s y s c a l l _ t r a c e
2005-07-11 03:55:48 +04:00
clr % o 1
2005-04-17 02:20:36 +04:00
srl % i 0 , 0 , % o 0
2005-07-11 03:55:48 +04:00
srl % i 4 , 0 , % o 4
2005-04-17 02:20:36 +04:00
srl % i 1 , 0 , % o 1
srl % i 2 , 0 , % o 2
b,p t % x c c , 2 f
srl % i 3 , 0 , % o 3
linux_syscall_trace :
2005-07-11 03:55:48 +04:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-17 02:20:36 +04:00
call s y s c a l l _ t r a c e
2005-07-11 03:55:48 +04:00
clr % o 1
2005-04-17 02:20:36 +04:00
mov % i 0 , % o 0
mov % i 1 , % o 1
mov % i 2 , % o 2
mov % i 3 , % o 3
b,p t % x c c , 2 f
mov % i 4 , % o 4
/* Linux 32-bit and SunOS system calls enter here... */
.align 32
.globl linux_sparc_syscall32
linux_sparc_syscall32 :
/* Direct access to user regs, much faster. */
cmp % g 1 , N R _ S Y S C A L L S ! I E U 1 G r o u p
bgeu,p n % x c c , l i n u x _ s p a r c _ n i _ s y s c a l l ! C T I
srl % i 0 , 0 , % o 0 ! I E U 0
sll % g 1 , 2 , % l 4 ! I E U 0 G r o u p
srl % i 4 , 0 , % o 4 ! I E U 1
lduw [ % l 7 + % l 4 ] , % l 7 ! L o a d
srl % i 1 , 0 , % o 1 ! I E U 0 G r o u p
ldx [ % c u r p t r + T I _ F L A G S ] , % l 0 ! L o a d
srl % i 5 , 0 , % o 5 ! I E U 1
srl % i 2 , 0 , % o 2 ! I E U 0 G r o u p
2005-07-11 06:29:45 +04:00
andcc % l 0 , ( _ T I F _ S Y S C A L L _ T R A C E | _ T I F _ S E C C O M P | _ T I F _ S Y S C A L L _ A U D I T ) , % g 0
2005-04-17 02:20:36 +04:00
bne,p n % i c c , l i n u x _ s y s c a l l _ t r a c e 3 2 ! C T I
mov % i 0 , % l 5 ! I E U 1
call % l 7 ! C T I G r o u p b r k f o r c e d
srl % i 3 , 0 , % o 3 ! I E U 0
ba,a ,p t % x c c , 3 f
/* Linux native and SunOS system calls enter here... */
.align 32
.globl linux_ s p a r c _ s y s c a l l , r e t _ s y s _ c a l l
linux_sparc_syscall :
/* Direct access to user regs, much faster. */
cmp % g 1 , N R _ S Y S C A L L S ! I E U 1 G r o u p
bgeu,p n % x c c , l i n u x _ s p a r c _ n i _ s y s c a l l ! C T I
mov % i 0 , % o 0 ! I E U 0
sll % g 1 , 2 , % l 4 ! I E U 0 G r o u p
mov % i 1 , % o 1 ! I E U 1
lduw [ % l 7 + % l 4 ] , % l 7 ! L o a d
4 : mov % i 2 , % o 2 ! I E U 0 G r o u p
ldx [ % c u r p t r + T I _ F L A G S ] , % l 0 ! L o a d
mov % i 3 , % o 3 ! I E U 1
mov % i 4 , % o 4 ! I E U 0 G r o u p
2005-07-11 06:29:45 +04:00
andcc % l 0 , ( _ T I F _ S Y S C A L L _ T R A C E | _ T I F _ S E C C O M P | _ T I F _ S Y S C A L L _ A U D I T ) , % g 0
2005-04-17 02:20:36 +04:00
bne,p n % i c c , l i n u x _ s y s c a l l _ t r a c e ! C T I G r o u p
mov % i 0 , % l 5 ! I E U 0
2 : call % l 7 ! C T I G r o u p b r k f o r c e d
mov % i 5 , % o 5 ! I E U 0
nop
3 : stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 0 ]
ret_sys_call :
ldx [ % s p + P T R E G S _ O F F + P T _ V 9 _ T S T A T E ] , % g 3
ldx [ % s p + P T R E G S _ O F F + P T _ V 9 _ T N P C ] , % l 1 ! p c = n p c
sra % o 0 , 0 , % o 0
mov % u l o ( T S T A T E _ X C A R R Y | T S T A T E _ I C A R R Y ) , % g 2
sllx % g 2 , 3 2 , % g 2
/ * Check i f f o r c e _ s u c c e s s f u l _ s y s c a l l _ r e t u r n ( )
* was i n v o k e d .
* /
2006-01-10 01:35:50 +03:00
ldub [ % c u r p t r + T I _ S Y S _ N O E R R O R ] , % l 2
brnz,a ,p n % l 2 , 8 0 f
2005-07-25 06:36:26 +04:00
stb % g 0 , [ % c u r p t r + T I _ S Y S _ N O E R R O R ]
2005-04-17 02:20:36 +04:00
cmp % o 0 , - E R E S T A R T _ R E S T A R T B L O C K
bgeu,p n % x c c , 1 f
2005-07-11 06:29:45 +04:00
andcc % l 0 , ( _ T I F _ S Y S C A L L _ T R A C E | _ T I F _ S E C C O M P | _ T I F _ S Y S C A L L _ A U D I T ) , % l 6
2005-04-17 02:20:36 +04:00
80 :
/* System call success, clear Carry condition code. */
andn % g 3 , % g 2 , % g 3
stx % g 3 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T S T A T E ]
bne,p n % i c c , l i n u x _ s y s c a l l _ t r a c e 2
add % l 1 , 0 x4 , % l 2 ! n p c = n p c + 4
stx % l 1 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T P C ]
ba,p t % x c c , r t r a p _ c l r _ l 6
stx % l 2 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T N P C ]
1 :
/ * System c a l l f a i l u r e , s e t C a r r y c o n d i t i o n c o d e .
* Also, g e t a b s ( e r r n o ) t o r e t u r n t o t h e p r o c e s s .
* /
2005-07-11 06:29:45 +04:00
andcc % l 0 , ( _ T I F _ S Y S C A L L _ T R A C E | _ T I F _ S E C C O M P | _ T I F _ S Y S C A L L _ A U D I T ) , % l 6
2005-04-17 02:20:36 +04:00
sub % g 0 , % o 0 , % o 0
or % g 3 , % g 2 , % g 3
stx % o 0 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ I 0 ]
mov 1 , % l 6
stx % g 3 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T S T A T E ]
bne,p n % i c c , l i n u x _ s y s c a l l _ t r a c e 2
add % l 1 , 0 x4 , % l 2 ! n p c = n p c + 4
stx % l 1 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T P C ]
b,p t % x c c , r t r a p
stx % l 2 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T N P C ]
linux_syscall_trace2 :
2005-07-11 03:55:48 +04:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-17 02:20:36 +04:00
call s y s c a l l _ t r a c e
2005-07-11 03:55:48 +04:00
mov 1 , % o 1
2005-04-17 02:20:36 +04:00
stx % l 1 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T P C ]
ba,p t % x c c , r t r a p
stx % l 2 , [ % s p + P T R E G S _ O F F + P T _ V 9 _ T N P C ]
.align 32
.globl __flushw_user
__flushw_user :
rdpr % o t h e r w i n , % g 1
brz,p n % g 1 , 2 f
clr % g 2
1 : save % s p , - 1 2 8 , % s p
rdpr % o t h e r w i n , % g 1
brnz,p t % g 1 , 1 b
add % g 2 , 1 , % g 2
1 : sub % g 2 , 1 , % g 2
brnz,p t % g 2 , 1 b
restore % g 0 , % g 0 , % g 0
2 : retl
nop
2006-02-27 10:24:22 +03:00
2006-02-27 10:27:19 +03:00
# ifdef C O N F I G _ S M P
.globl hard_smp_processor_id
hard_smp_processor_id :
_ _ GET_ C P U I D ( % o 0 )
2006-02-27 10:24:22 +03:00
retl
nop
2006-02-27 10:27:19 +03:00
# endif