2005-04-16 15:20:36 -07: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 / 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 12:45:11 -07:00
# include < a s m / s f a f s r . h >
2006-06-20 01:20:00 -07:00
# include < a s m / p i l . h >
2006-11-05 16:51:03 -08:00
# include < a s m / u n i s t d . h >
2005-04-16 15:20:36 -07:00
# define c u r p t r g 6
.text
.align 32
/* This is trivial with the new code... */
.globl do_fpdis
do_fpdis :
2005-10-07 13:30:49 -07:00
sethi % h i ( T S T A T E _ P E F ) , % g 4
2005-04-16 15:20:36 -07: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-02 21:55:10 -08:00
1 : TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2006-02-26 23:24:22 -08:00
ldub [ % g 6 + T I _ F P S A V E D ] , % g 5
2005-10-07 13:30:49 -07: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-16 15:20:36 -07: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
2006-02-07 22:13:05 -08:00
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
2005-10-04 15:23:20 -07: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
2006-02-07 22:13:05 -08:00
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
2005-04-16 15:20:36 -07:00
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-07 13:30:49 -07:00
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f32
2005-04-16 15:20:36 -07:00
ldda [ % g 2 ] A S I _ B L K _ S , % f48
2005-10-07 13:30:49 -07:00
membar #S y n c
2005-04-16 15:20:36 -07: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-27 15:42:04 -07:00
nop
2005-04-16 15:20:36 -07: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
2006-02-07 22:13:05 -08:00
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
2005-04-16 15:20:36 -07:00
add % g 6 , T I _ F P R E G S , % g 1
2005-10-04 15:23:20 -07: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
2006-02-07 22:13:05 -08:00
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
2005-04-16 15:20:36 -07:00
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-07 13:30:49 -07:00
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f0
2005-04-16 15:20:36 -07:00
ldda [ % g 2 ] A S I _ B L K _ S , % f16
2005-10-07 13:30:49 -07:00
membar #S y n c
2005-04-16 15:20:36 -07: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-27 15:42:04 -07:00
nop
2005-04-16 15:20:36 -07: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
2006-02-07 22:13:05 -08:00
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
2005-10-04 15:23:20 -07: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
2006-02-07 22:13:05 -08:00
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
2005-04-16 15:20:36 -07:00
membar #S y n c
mov 0 x40 , % g 2
2005-10-07 13:30:49 -07:00
membar #S y n c
ldda [ % g 1 ] A S I _ B L K _ S , % f0
2005-04-16 15:20:36 -07: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 :
2006-02-07 22:13:05 -08:00
661 : stxa % g 5 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 5 , [ % g 3 ] A S I _ M M U
.previous
2005-04-16 15:20:36 -07:00
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-02 21:55:10 -08:00
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2005-04-16 15:20:36 -07: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 :
2006-02-16 02:18:49 -08:00
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2005-04-16 15:20:36 -07:00
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
2006-02-07 22:13:05 -08:00
661 : ldxa [ % g 3 ] A S I _ D M M U , % g 5
.section .sun4v_1insn_patch , " ax"
.word 661b
ldxa [ % g 3 ] A S I _ M M U , % g 5
.previous
2005-10-04 15:23:20 -07: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
2006-02-07 22:13:05 -08:00
661 : stxa % g 2 , [ % g 3 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 2 , [ % g 3 ] A S I _ M M U
.previous
2005-04-16 15:20:36 -07:00
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
2006-02-07 22:13:05 -08:00
661 : stxa % g 5 , [ % g 1 ] A S I _ D M M U
.section .sun4v_1insn_patch , " ax"
.word 661b
stxa % g 5 , [ % g 1 ] A S I _ M M U
.previous
2005-04-16 15:20:36 -07:00
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 00:32:17 -07: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-16 15:20:36 -07: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
2006-06-20 01:23:32 -07:00
sllx % g 3 , 3 , % g 3
2005-04-16 15:20:36 -07:00
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
2005-07-04 13:24:38 -07:00
2006-02-02 21:55:10 -08:00
TRAP_ L O A D _ I R Q _ W O R K ( % g 6 , % g 1 )
2006-02-26 23:24:22 -08:00
2006-06-20 01:20:00 -07:00
lduw [ % g 6 ] , % g 5 / * g 5 = i r q _ w o r k ( c p u ) * /
2005-04-16 15:20:36 -07:00
stw % g 5 , [ % g 3 + 0 x00 ] / * b u c k e t - > i r q _ c h a i n = g 5 * /
2006-06-20 01:20:00 -07:00
stw % g 3 , [ % g 6 ] / * i r q _ w o r k ( c p u ) = b u c k e t * /
wr % g 0 , 1 < < P I L _ D E V I C E _ I R Q , % s e t _ s o f t i n t
2005-04-16 15:20:36 -07:00
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-04 13:24:38 -07:00
2005-04-16 15:20:36 -07: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-26 23:24:22 -08:00
.globl utrap_trap
utrap_trap : /* %g3=handler,%g4=level */
2006-02-02 21:55:10 -08:00
TRAP_ L O A D _ T H R E A D _ R E G ( % g 6 , % g 1 )
2006-02-26 23:24:22 -08: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-16 15:20:36 -07:00
nop
2006-02-26 23:24:22 -08: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-16 15:20:36 -07: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 12:45:11 -07: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
2006-11-16 13:38:57 -08:00
2 :
# ifdef C O N F I G _ T R A C E _ I R Q F L A G S
call t r a c e _ h a r d i r q s _ o f f
nop
# endif
mov % l 4 , % o 1
2005-08-29 12:45:11 -07:00
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-16 15:20:36 -07: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 12:44:57 -07: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-16 15:20:36 -07: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 12:44:57 -07: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 12:45:11 -07: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 12:44:57 -07: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 12:45:11 -07:00
__spitfire_data_access_exception :
2005-04-16 15:20:36 -07: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 12:45:11 -07: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-16 15:20:36 -07: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 12:45:11 -07:00
.globl __spitfire_insn_access_exception
.globl __spitfire_insn_access_exception_tl1
__spitfire_insn_access_exception_tl1 :
2005-04-16 15:20:36 -07: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 12:44:40 -07: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-16 15:20:36 -07: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 12:45:11 -07: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-16 15:20:36 -07: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 12:45:11 -07:00
__spitfire_insn_access_exception :
2005-04-16 15:20:36 -07: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 12:44:40 -07: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-16 15:20:36 -07: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 12:45:11 -07: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-16 15:20:36 -07: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 00:32:17 -07: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-16 15:20:36 -07:00
rd % p c , % g 7
2006-11-16 13:38:57 -08:00
# ifdef C O N F I G _ T R A C E _ I R Q F L A G S
call t r a c e _ h a r d i r q s _ o f f
nop
# endif
2005-04-16 15:20:36 -07:00
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 00:32:17 -07:00
ba,a ,p t % x c c , r t r a p _ i r q
2005-04-16 15:20:36 -07: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 00:32:17 -07: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-16 15:20:36 -07:00
rd % p c , % g 7
2006-11-16 13:38:57 -08:00
# ifdef C O N F I G _ T R A C E _ I R Q F L A G S
call t r a c e _ h a r d i r q s _ o f f
nop
# endif
2005-04-16 15:20:36 -07:00
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 00:32:17 -07:00
ba,a ,p t % x c c , r t r a p _ i r q
2005-04-16 15:20:36 -07: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 00:32:17 -07: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-16 15:20:36 -07: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 00:32:17 -07: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-16 15:20:36 -07: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-30 15:11:52 -07: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-26 23:24:22 -08: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-30 15:11:52 -07: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-16 15:20:36 -07: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-30 15:11:52 -07: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-16 15:20:36 -07:00
2005-08-30 15:11:52 -07:00
c_fast_ecc :
2005-04-16 15:20:36 -07: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
2006-11-16 13:38:57 -08:00
# ifdef C O N F I G _ T R A C E _ I R Q F L A G S
call t r a c e _ h a r d i r q s _ o f f
nop
# endif
2005-04-16 15:20:36 -07:00
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-30 15:11:52 -07: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-16 15:20:36 -07:00
2005-08-30 15:11:52 -07:00
c_cee :
2005-04-16 15:20:36 -07: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
2006-11-16 13:38:57 -08:00
# ifdef C O N F I G _ T R A C E _ I R Q F L A G S
call t r a c e _ h a r d i r q s _ o f f
nop
# endif
2005-04-16 15:20:36 -07:00
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-30 15:11:52 -07: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-16 15:20:36 -07:00
2005-08-30 15:11:52 -07:00
c_deferred :
2005-04-16 15:20:36 -07: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
2006-11-16 13:38:57 -08:00
# ifdef C O N F I G _ T R A C E _ I R Q F L A G S
call t r a c e _ h a r d i r q s _ o f f
nop
# endif
2005-04-16 15:20:36 -07:00
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-10 19:29:45 -07: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-16 15:20:36 -07:00
be,p t % i c c , r t r a p
clr % l 6
2005-07-10 16:55:48 -07:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-16 15:20:36 -07:00
call s y s c a l l _ t r a c e
2005-07-10 16:55:48 -07:00
mov 1 , % o 1
2005-04-16 15:20:36 -07: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-24 19:36:26 -07: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-16 15:20:36 -07:00
* /
2005-07-24 19:36:26 -07: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-16 15:20:36 -07: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-01-31 18:34:06 -08: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-16 15:20:36 -07: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-01-31 18:34:06 -08:00
wrpr % g 2 , 0 x0 , % p s t a t e
2005-04-16 15:20:36 -07: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-10 16:55:48 -07:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-16 15:20:36 -07:00
call s y s c a l l _ t r a c e
2005-07-10 16:55:48 -07:00
clr % o 1
2005-04-16 15:20:36 -07:00
srl % i 0 , 0 , % o 0
2005-07-10 16:55:48 -07:00
srl % i 4 , 0 , % o 4
2005-04-16 15:20:36 -07: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-10 16:55:48 -07:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-16 15:20:36 -07:00
call s y s c a l l _ t r a c e
2005-07-10 16:55:48 -07:00
clr % o 1
2005-04-16 15:20:36 -07: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-10 19:29:45 -07: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-16 15:20:36 -07: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-10 19:29:45 -07: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-16 15:20:36 -07: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-09 14:35:50 -08: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-24 19:36:26 -07:00
stb % g 0 , [ % c u r p t r + T I _ S Y S _ N O E R R O R ]
2005-04-16 15:20:36 -07: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-10 19:29:45 -07: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-16 15:20:36 -07: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-10 19:29:45 -07: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-16 15:20:36 -07: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-10 16:55:48 -07:00
add % s p , P T R E G S _ O F F , % o 0
2005-04-16 15:20:36 -07:00
call s y s c a l l _ t r a c e
2005-07-10 16:55:48 -07:00
mov 1 , % o 1
2005-04-16 15:20:36 -07: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-26 23:24:22 -08:00
2006-02-26 23:27:19 -08:00
# ifdef C O N F I G _ S M P
.globl hard_smp_processor_id
hard_smp_processor_id :
2006-02-17 08:38:06 -08:00
# endif
.globl real_hard_smp_processor_id
real_hard_smp_processor_id :
2006-02-26 23:27:19 -08:00
_ _ GET_ C P U I D ( % o 0 )
2006-02-26 23:24:22 -08:00
retl
nop
2006-02-13 00:02:16 -08:00
/ * % o0 : devhandle
* % o1 : devino
*
* returns % o 0 : s y s i n o
* /
2006-02-13 00:23:32 -08:00
.globl sun4v_devino_to_sysino
2007-05-29 02:22:14 -07:00
.type sun4 v _ d e v i n o _ t o _ s y s i n o ,#f u n c t i o n
2006-02-13 00:02:16 -08:00
sun4v_devino_to_sysino :
mov H V _ F A S T _ I N T R _ D E V I N O 2 S Y S I N O , % o 5
ta H V _ F A S T _ T R A P
retl
mov % o 1 , % o 0
2007-05-29 02:22:14 -07:00
.size sun4 v _ d e v i n o _ t o _ s y s i n o , . - s u n 4 v _ d e v i n o _ t o _ s y s i n o
2006-02-13 00:23:32 -08:00
/ * % o0 : sysino
*
* returns % o 0 : i n t r _ e n a b l e d ( H V _ I N T R _ { D I S A B L E D ,E N A B L E D } )
* /
.globl sun4v_intr_getenabled
2007-05-29 02:22:14 -07:00
.type sun4 v _ i n t r _ g e t e n a b l e d ,#f u n c t i o n
2006-02-13 00:23:32 -08:00
sun4v_intr_getenabled :
mov H V _ F A S T _ I N T R _ G E T E N A B L E D , % o 5
ta H V _ F A S T _ T R A P
retl
mov % o 1 , % o 0
2007-05-29 02:22:14 -07:00
.size sun4 v _ i n t r _ g e t e n a b l e d , . - s u n 4 v _ i n t r _ g e t e n a b l e d
2006-02-13 00:23:32 -08:00
/ * % o0 : sysino
* % o1 : intr_ e n a b l e d ( H V _ I N T R _ { D I S A B L E D ,E N A B L E D } )
* /
.globl sun4v_intr_setenabled
2007-05-29 02:22:14 -07:00
.type sun4 v _ i n t r _ s e t e n a b l e d ,#f u n c t i o n
2006-02-13 00:23:32 -08:00
sun4v_intr_setenabled :
mov H V _ F A S T _ I N T R _ S E T E N A B L E D , % o 5
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ i n t r _ s e t e n a b l e d , . - s u n 4 v _ i n t r _ s e t e n a b l e d
2006-02-13 00:23:32 -08:00
/ * % o0 : sysino
*
* returns % o 0 : i n t r _ s t a t e ( H V _ I N T R _ S T A T E _ * )
* /
.globl sun4v_intr_getstate
2007-05-29 02:22:14 -07:00
.type sun4 v _ i n t r _ g e t s t a t e ,#f u n c t i o n
2006-02-13 00:23:32 -08:00
sun4v_intr_getstate :
mov H V _ F A S T _ I N T R _ G E T S T A T E , % o 5
ta H V _ F A S T _ T R A P
retl
mov % o 1 , % o 0
2007-05-29 02:22:14 -07:00
.size sun4 v _ i n t r _ g e t s t a t e , . - s u n 4 v _ i n t r _ g e t s t a t e
2006-02-13 00:23:32 -08:00
/ * % o0 : sysino
* % o1 : intr_ s t a t e ( H V _ I N T R _ S T A T E _ * )
* /
.globl sun4v_intr_setstate
2007-05-29 02:22:14 -07:00
.type sun4 v _ i n t r _ s e t s t a t e ,#f u n c t i o n
2006-02-13 00:23:32 -08:00
sun4v_intr_setstate :
mov H V _ F A S T _ I N T R _ S E T S T A T E , % o 5
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ i n t r _ s e t s t a t e , . - s u n 4 v _ i n t r _ s e t s t a t e
2006-02-13 00:23:32 -08:00
/ * % o0 : sysino
*
* returns % o 0 : c p u i d
* /
.globl sun4v_intr_gettarget
2007-05-29 02:22:14 -07:00
.type sun4 v _ i n t r _ g e t t a r g e t ,#f u n c t i o n
2006-02-13 00:23:32 -08:00
sun4v_intr_gettarget :
mov H V _ F A S T _ I N T R _ G E T T A R G E T , % o 5
ta H V _ F A S T _ T R A P
retl
mov % o 1 , % o 0
2007-05-29 02:22:14 -07:00
.size sun4 v _ i n t r _ g e t t a r g e t , . - s u n 4 v _ i n t r _ g e t t a r g e t
2006-02-13 00:23:32 -08:00
/ * % o0 : sysino
* % o1 : cpuid
* /
.globl sun4v_intr_settarget
2007-05-29 02:22:14 -07:00
.type sun4 v _ i n t r _ s e t t a r g e t ,#f u n c t i o n
2006-02-13 00:23:32 -08:00
sun4v_intr_settarget :
mov H V _ F A S T _ I N T R _ S E T T A R G E T , % o 5
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ i n t r _ s e t t a r g e t , . - s u n 4 v _ i n t r _ s e t t a r g e t
2006-02-13 00:23:32 -08:00
2007-05-29 02:22:14 -07:00
/ * % o0 : cpuid
* % o1 : pc
* % o2 : rtba
* % o3 : arg0
2006-02-16 14:26:53 -08:00
*
* returns % o 0 : s t a t u s
* /
2007-05-29 02:22:14 -07:00
.globl sun4v_cpu_start
.type sun4 v _ c p u _ s t a r t ,#f u n c t i o n
sun4v_cpu_start :
mov H V _ F A S T _ C P U _ S T A R T , % o 5
2006-02-16 14:26:53 -08:00
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ c p u _ s t a r t , . - s u n 4 v _ c p u _ s t a r t
2006-02-21 15:42:09 -08:00
2007-05-29 02:22:14 -07:00
/ * % o0 : cpuid
*
* returns % o 0 : s t a t u s
2006-02-21 15:42:09 -08:00
* /
2007-05-29 02:22:14 -07:00
.globl sun4v_cpu_stop
.type sun4 v _ c p u _ s t o p ,#f u n c t i o n
sun4v_cpu_stop :
mov H V _ F A S T _ C P U _ S T O P , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ c p u _ s t o p , . - s u n 4 v _ c p u _ s t o p
/* returns %o0: status */
2006-02-21 15:42:09 -08:00
.globl sun4v_cpu_yield
2007-05-29 02:22:14 -07:00
.type sun4 v _ c p u _ y i e l d , #f u n c t i o n
2006-02-21 15:42:09 -08:00
sun4v_cpu_yield :
mov H V _ F A S T _ C P U _ Y I E L D , % o 5
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ c p u _ y i e l d , . - s u n 4 v _ c p u _ y i e l d
/ * % o0 : type
* % o1 : queue p a d d r
* % o2 : num q u e u e e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_cpu_qconf
.type sun4 v _ c p u _ q c o n f ,#f u n c t i o n
sun4v_cpu_qconf :
mov H V _ F A S T _ C P U _ Q C O N F , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ c p u _ q c o n f , . - s u n 4 v _ c p u _ q c o n f
2006-02-28 15:10:26 -08:00
/ * % o0 : num c p u s i n c p u l i s t
* % o1 : cpu l i s t p a d d r
* % o2 : mondo b l o c k p a d d r
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_cpu_mondo_send
2007-05-29 02:22:14 -07:00
.type sun4 v _ c p u _ m o n d o _ s e n d ,#f u n c t i o n
2006-02-28 15:10:26 -08:00
sun4v_cpu_mondo_send :
mov H V _ F A S T _ C P U _ M O N D O _ S E N D , % o 5
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ c p u _ m o n d o _ s e n d , . - s u n 4 v _ c p u _ m o n d o _ s e n d
2006-02-28 15:10:26 -08:00
/ * % o0 : CPU I D
*
* returns % o 0 : - s t a t u s i f s t a t u s n o n - z e r o , e l s e
* % o0 : cpu s t a t e a s H V _ C P U _ S T A T E _ *
* /
.globl sun4v_cpu_state
2007-05-29 02:22:14 -07:00
.type sun4 v _ c p u _ s t a t e ,#f u n c t i o n
2006-02-28 15:10:26 -08:00
sun4v_cpu_state :
mov H V _ F A S T _ C P U _ S T A T E , % o 5
ta H V _ F A S T _ T R A P
brnz,p n % o 0 , 1 f
sub % g 0 , % o 0 , % o 0
mov % o 1 , % o 0
1 : retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ c p u _ s t a t e , . - s u n 4 v _ c p u _ s t a t e
/ * % o0 : virtual a d d r e s s
* % o1 : must b e z e r o
* % o2 : TTE
* % o3 : HV_ M M U _ * f l a g s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_mmu_map_perm_addr
.type sun4 v _ m m u _ m a p _ p e r m _ a d d r ,#f u n c t i o n
sun4v_mmu_map_perm_addr :
mov H V _ F A S T _ M M U _ M A P _ P E R M _ A D D R , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ m m u _ m a p _ p e r m _ a d d r , . - s u n 4 v _ m m u _ m a p _ p e r m _ a d d r
/ * % o0 : number o f T S B d e s c r i p t i o n s
* % o1 : TSB d e s c r i p t i o n s r e a l a d d r e s s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_mmu_tsb_ctx0
.type sun4 v _ m m u _ t s b _ c t x0 ,#f u n c t i o n
sun4v_mmu_tsb_ctx0 :
mov H V _ F A S T _ M M U _ T S B _ C T X 0 , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ m m u _ t s b _ c t x0 , . - s u n 4 v _ m m u _ t s b _ c t x0
2007-05-15 17:03:54 -07:00
/ * % o0 : API g r o u p n u m b e r
* % o1 : pointer t o u n s i g n e d l o n g m a j o r n u m b e r s t o r a g e
* % o2 : pointer t o u n s i g n e d l o n g m i n o r n u m b e r s t o r a g e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_get_version
2007-05-29 02:22:14 -07:00
.type sun4 v _ g e t _ v e r s i o n ,#f u n c t i o n
2007-05-15 17:03:54 -07:00
sun4v_get_version :
mov H V _ C O R E _ G E T _ V E R , % o 5
mov % o 1 , % o 3
mov % o 2 , % o 4
ta H V _ C O R E _ T R A P
stx % o 1 , [ % o 3 ]
retl
stx % o 2 , [ % o 4 ]
2007-05-29 02:22:14 -07:00
.size sun4 v _ g e t _ v e r s i o n , . - s u n 4 v _ g e t _ v e r s i o n
2007-05-15 17:03:54 -07:00
/ * % o0 : API g r o u p n u m b e r
* % o1 : desired m a j o r n u m b e r
* % o2 : desired m i n o r n u m b e r
* % o3 : pointer t o u n s i g n e d l o n g a c t u a l m i n o r n u m b e r s t o r a g e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_set_version
2007-05-29 02:22:14 -07:00
.type sun4 v _ s e t _ v e r s i o n ,#f u n c t i o n
2007-05-15 17:03:54 -07:00
sun4v_set_version :
mov H V _ C O R E _ S E T _ V E R , % o 5
mov % o 3 , % o 4
ta H V _ C O R E _ T R A P
retl
stx % o 1 , [ % o 4 ]
2007-05-29 02:22:14 -07:00
.size sun4 v _ s e t _ v e r s i o n , . - s u n 4 v _ s e t _ v e r s i o n
/ * % o0 : pointer t o u n s i g n e d l o n g t i m e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_tod_get
.type sun4 v _ t o d _ g e t ,#f u n c t i o n
sun4v_tod_get :
mov % o 0 , % o 4
mov H V _ F A S T _ T O D _ G E T , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % o 4 ]
retl
nop
.size sun4 v _ t o d _ g e t , . - s u n 4 v _ t o d _ g e t
/ * % o0 : time
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_tod_set
.type sun4 v _ t o d _ s e t ,#f u n c t i o n
sun4v_tod_set :
mov H V _ F A S T _ T O D _ S E T , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ t o d _ s e t , . - s u n 4 v _ t o d _ s e t
2007-05-15 17:03:54 -07:00
/ * % o0 : pointer t o u n s i g n e d l o n g s t a t u s
*
* returns % o 0 : s i g n e d c h a r a c t e r
* /
.globl sun4v_con_getchar
2007-05-29 02:22:14 -07:00
.type sun4 v _ c o n _ g e t c h a r ,#f u n c t i o n
2007-05-15 17:03:54 -07:00
sun4v_con_getchar :
mov % o 0 , % o 4
mov H V _ F A S T _ C O N S _ G E T C H A R , % o 5
clr % o 0
clr % o 1
ta H V _ F A S T _ T R A P
stx % o 0 , [ % o 4 ]
retl
sra % o 1 , 0 , % o 0
2007-05-29 02:22:14 -07:00
.size sun4 v _ c o n _ g e t c h a r , . - s u n 4 v _ c o n _ g e t c h a r
2007-05-15 17:03:54 -07:00
/ * % o0 : signed l o n g c h a r a c t e r
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_con_putchar
2007-05-29 02:22:14 -07:00
.type sun4 v _ c o n _ p u t c h a r ,#f u n c t i o n
2007-05-15 17:03:54 -07:00
sun4v_con_putchar :
mov H V _ F A S T _ C O N S _ P U T C H A R , % o 5
ta H V _ F A S T _ T R A P
retl
sra % o 0 , 0 , % o 0
2007-05-29 02:22:14 -07:00
.size sun4 v _ c o n _ p u t c h a r , . - s u n 4 v _ c o n _ p u t c h a r
2007-05-15 17:03:54 -07:00
/ * % o0 : buffer r e a l a d d r e s s
* % o1 : buffer s i z e
* % o2 : pointer t o u n s i g n e d l o n g b y t e s _ r e a d
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_con_read
2007-05-29 02:22:14 -07:00
.type sun4 v _ c o n _ r e a d ,#f u n c t i o n
2007-05-15 17:03:54 -07:00
sun4v_con_read :
mov % o 2 , % o 4
mov H V _ F A S T _ C O N S _ R E A D , % o 5
ta H V _ F A S T _ T R A P
brnz % o 0 , 1 f
cmp % o 1 , - 1 / * b r e a k * /
be,a ,p n % i c c , 1 f
mov % o 1 , % o 0
cmp % o 1 , - 2 / * h u p * /
be,a ,p n % i c c , 1 f
mov % o 1 , % o 0
stx % o 1 , [ % o 4 ]
1 : retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ c o n _ r e a d , . - s u n 4 v _ c o n _ r e a d
2007-05-15 17:03:54 -07:00
/ * % o0 : buffer r e a l a d d r e s s
* % o1 : buffer s i z e
* % o2 : pointer t o u n s i g n e d l o n g b y t e s _ w r i t t e n
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_con_write
2007-05-29 02:22:14 -07:00
.type sun4 v _ c o n _ w r i t e ,#f u n c t i o n
2007-05-15 17:03:54 -07:00
sun4v_con_write :
mov % o 2 , % o 4
mov H V _ F A S T _ C O N S _ W R I T E , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % o 4 ]
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ c o n _ w r i t e , . - s u n 4 v _ c o n _ w r i t e
2007-05-25 00:37:12 -07:00
/ * % o0 : soft s t a t e
* % o1 : address o f d e s c r i p t i o n s t r i n g
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_mach_set_soft_state
2007-05-29 02:22:14 -07:00
.type sun4 v _ m a c h _ s e t _ s o f t _ s t a t e ,#f u n c t i o n
2007-05-25 00:37:12 -07:00
sun4v_mach_set_soft_state :
mov H V _ F A S T _ M A C H _ S E T _ S O F T _ S T A T E , % o 5
ta H V _ F A S T _ T R A P
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ m a c h _ s e t _ s o f t _ s t a t e , . - s u n 4 v _ m a c h _ s e t _ s o f t _ s t a t e
2007-05-25 15:49:59 -07:00
2007-05-29 02:22:14 -07:00
/ * % o0 : exit c o d e
*
* Does n o t r e t u r n .
* /
.globl sun4v_mach_exit
.type sun4 v _ m a c h _ e x i t ,#f u n c t i o n
sun4v_mach_exit :
mov H V _ F A S T _ M A C H _ E X I T , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ m a c h _ e x i t , . - s u n 4 v _ m a c h _ e x i t
/ * % o0 : buffer r e a l a d d r e s s
* % o1 : buffer l e n g t h
* % o2 : pointer t o u n s i g n e d l o n g r e a l _ b u f _ l e n
*
* returns % o 0 : s t a t u s
* /
2007-05-25 15:49:59 -07:00
.globl sun4v_mach_desc
2007-05-29 02:22:14 -07:00
.type sun4 v _ m a c h _ d e s c ,#f u n c t i o n
2007-05-25 15:49:59 -07:00
sun4v_mach_desc :
mov % o 2 , % o 4
mov H V _ F A S T _ M A C H _ D E S C , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % o 4 ]
retl
nop
2007-05-29 02:22:14 -07:00
.size sun4 v _ m a c h _ d e s c , . - s u n 4 v _ m a c h _ d e s c
/ * % o0 : new t i m e o u t i n m i l l i s e c o n d s
* % o1 : pointer t o u n s i g n e d l o n g o r i g _ t i m e o u t
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_mach_set_watchdog
.type sun4 v _ m a c h _ s e t _ w a t c h d o g ,#f u n c t i o n
sun4v_mach_set_watchdog :
mov % o 1 , % o 4
mov H V _ F A S T _ M A C H _ S E T _ W A T C H D O G , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % o 4 ]
retl
nop
.size sun4 v _ m a c h _ s e t _ w a t c h d o g , . - s u n 4 v _ m a c h _ s e t _ w a t c h d o g
/* No inputs and does not return. */
.globl sun4v_mach_sir
.type sun4 v _ m a c h _ s i r ,#f u n c t i o n
sun4v_mach_sir :
mov % o 1 , % o 4
mov H V _ F A S T _ M A C H _ S I R , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % o 4 ]
retl
nop
.size sun4 v _ m a c h _ s i r , . - s u n 4 v _ m a c h _ s i r
/ * % o0 : channel
* % o1 : ra
* % o2 : num_ e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_tx_qconf
.type sun4 v _ l d c _ t x _ q c o n f ,#f u n c t i o n
sun4v_ldc_tx_qconf :
mov H V _ F A S T _ L D C _ T X _ Q C O N F , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ t x _ q c o n f , . - s u n 4 v _ l d c _ t x _ q c o n f
/ * % o0 : channel
* % o1 : pointer t o u n s i g n e d l o n g r a
* % o2 : pointer t o u n s i g n e d l o n g n u m _ e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_tx_qinfo
.type sun4 v _ l d c _ t x _ q i n f o ,#f u n c t i o n
sun4v_ldc_tx_qinfo :
mov % o 1 , % g 1
mov % o 2 , % g 2
mov H V _ F A S T _ L D C _ T X _ Q I N F O , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
stx % o 2 , [ % g 2 ]
retl
nop
.size sun4 v _ l d c _ t x _ q i n f o , . - s u n 4 v _ l d c _ t x _ q i n f o
/ * % o0 : channel
* % o1 : pointer t o u n s i g n e d l o n g h e a d _ o f f
* % o2 : pointer t o u n s i g n e d l o n g t a i l _ o f f
* % o2 : pointer t o u n s i g n e d l o n g c h a n _ s t a t e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_tx_get_state
.type sun4 v _ l d c _ t x _ g e t _ s t a t e ,#f u n c t i o n
sun4v_ldc_tx_get_state :
mov % o 1 , % g 1
mov % o 2 , % g 2
mov % o 3 , % g 3
mov H V _ F A S T _ L D C _ T X _ G E T _ S T A T E , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
stx % o 2 , [ % g 2 ]
stx % o 3 , [ % g 3 ]
retl
nop
.size sun4 v _ l d c _ t x _ g e t _ s t a t e , . - s u n 4 v _ l d c _ t x _ g e t _ s t a t e
/ * % o0 : channel
* % o1 : tail_ o f f
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_tx_set_qtail
.type sun4 v _ l d c _ t x _ s e t _ q t a i l ,#f u n c t i o n
sun4v_ldc_tx_set_qtail :
mov H V _ F A S T _ L D C _ T X _ S E T _ Q T A I L , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ t x _ s e t _ q t a i l , . - s u n 4 v _ l d c _ t x _ s e t _ q t a i l
/ * % o0 : channel
* % o1 : ra
* % o2 : num_ e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_rx_qconf
.type sun4 v _ l d c _ r x _ q c o n f ,#f u n c t i o n
sun4v_ldc_rx_qconf :
mov H V _ F A S T _ L D C _ R X _ Q C O N F , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ r x _ q c o n f , . - s u n 4 v _ l d c _ r x _ q c o n f
/ * % o0 : channel
* % o1 : pointer t o u n s i g n e d l o n g r a
* % o2 : pointer t o u n s i g n e d l o n g n u m _ e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_rx_qinfo
.type sun4 v _ l d c _ r x _ q i n f o ,#f u n c t i o n
sun4v_ldc_rx_qinfo :
mov % o 1 , % g 1
mov % o 2 , % g 2
mov H V _ F A S T _ L D C _ R X _ Q I N F O , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
stx % o 2 , [ % g 2 ]
retl
nop
.size sun4 v _ l d c _ r x _ q i n f o , . - s u n 4 v _ l d c _ r x _ q i n f o
/ * % o0 : channel
* % o1 : pointer t o u n s i g n e d l o n g h e a d _ o f f
* % o2 : pointer t o u n s i g n e d l o n g t a i l _ o f f
* % o2 : pointer t o u n s i g n e d l o n g c h a n _ s t a t e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_rx_get_state
.type sun4 v _ l d c _ r x _ g e t _ s t a t e ,#f u n c t i o n
sun4v_ldc_rx_get_state :
mov % o 1 , % g 1
mov % o 2 , % g 2
mov % o 3 , % g 3
mov H V _ F A S T _ L D C _ R X _ G E T _ S T A T E , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
stx % o 2 , [ % g 2 ]
stx % o 3 , [ % g 3 ]
retl
nop
.size sun4 v _ l d c _ r x _ g e t _ s t a t e , . - s u n 4 v _ l d c _ r x _ g e t _ s t a t e
/ * % o0 : channel
* % o1 : head_ o f f
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_rx_set_qhead
.type sun4 v _ l d c _ r x _ s e t _ q h e a d ,#f u n c t i o n
sun4v_ldc_rx_set_qhead :
mov H V _ F A S T _ L D C _ R X _ S E T _ Q H E A D , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ r x _ s e t _ q h e a d , . - s u n 4 v _ l d c _ r x _ s e t _ q h e a d
/ * % o0 : channel
* % o1 : ra
* % o2 : num_ e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_set_map_table
.type sun4 v _ l d c _ s e t _ m a p _ t a b l e ,#f u n c t i o n
sun4v_ldc_set_map_table :
mov H V _ F A S T _ L D C _ S E T _ M A P _ T A B L E , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ s e t _ m a p _ t a b l e , . - s u n 4 v _ l d c _ s e t _ m a p _ t a b l e
/ * % o0 : channel
* % o1 : pointer t o u n s i g n e d l o n g r a
* % o2 : pointer t o u n s i g n e d l o n g n u m _ e n t r i e s
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_get_map_table
.type sun4 v _ l d c _ g e t _ m a p _ t a b l e ,#f u n c t i o n
sun4v_ldc_get_map_table :
mov % o 1 , % g 1
mov % o 2 , % g 2
mov H V _ F A S T _ L D C _ G E T _ M A P _ T A B L E , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
stx % o 2 , [ % g 2 ]
retl
nop
.size sun4 v _ l d c _ g e t _ m a p _ t a b l e , . - s u n 4 v _ l d c _ g e t _ m a p _ t a b l e
/ * % o0 : channel
* % o1 : dir_ c o d e
* % o2 : tgt_ r a d d r
* % o3 : lcl_ r a d d r
* % o4 : len
* % o5 : pointer t o u n s i g n e d l o n g a c t u a l _ l e n
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_copy
.type sun4 v _ l d c _ c o p y ,#f u n c t i o n
sun4v_ldc_copy :
mov % o 5 , % g 1
mov H V _ F A S T _ L D C _ C O P Y , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
retl
nop
.size sun4 v _ l d c _ c o p y , . - s u n 4 v _ l d c _ c o p y
/ * % o0 : channel
* % o1 : cookie
* % o2 : pointer t o u n s i g n e d l o n g r a
* % o3 : pointer t o u n s i g n e d l o n g p e r m
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_mapin
.type sun4 v _ l d c _ m a p i n ,#f u n c t i o n
sun4v_ldc_mapin :
mov % o 2 , % g 1
mov % o 3 , % g 2
mov H V _ F A S T _ L D C _ M A P I N , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
stx % o 2 , [ % g 2 ]
retl
nop
.size sun4 v _ l d c _ m a p i n , . - s u n 4 v _ l d c _ m a p i n
/ * % o0 : ra
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_unmap
.type sun4 v _ l d c _ u n m a p ,#f u n c t i o n
sun4v_ldc_unmap :
mov H V _ F A S T _ L D C _ U N M A P , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ u n m a p , . - s u n 4 v _ l d c _ u n m a p
/ * % o0 : cookie
* % o1 : mte_ c o o k i e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ldc_revoke
.type sun4 v _ l d c _ r e v o k e ,#f u n c t i o n
sun4v_ldc_revoke :
mov H V _ F A S T _ L D C _ R E V O K E , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ l d c _ r e v o k e , . - s u n 4 v _ l d c _ r e v o k e
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : pointer t o u n s i g n e d l o n g c o o k i e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_get_cookie
.type sun4 v _ v i n t r _ g e t _ c o o k i e ,#f u n c t i o n
sun4v_vintr_get_cookie :
mov % o 2 , % g 1
mov H V _ F A S T _ V I N T R _ G E T _ C O O K I E , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
retl
nop
.size sun4 v _ v i n t r _ g e t _ c o o k i e , . - s u n 4 v _ v i n t r _ g e t _ c o o k i e
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : cookie
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_set_cookie
.type sun4 v _ v i n t r _ s e t _ c o o k i e ,#f u n c t i o n
sun4v_vintr_set_cookie :
mov H V _ F A S T _ V I N T R _ S E T _ C O O K I E , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ v i n t r _ s e t _ c o o k i e , . - s u n 4 v _ v i n t r _ s e t _ c o o k i e
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : pointer t o u n s i g n e d l o n g v a l i d _ s t a t e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_get_valid
.type sun4 v _ v i n t r _ g e t _ v a l i d ,#f u n c t i o n
sun4v_vintr_get_valid :
mov % o 2 , % g 1
mov H V _ F A S T _ V I N T R _ G E T _ V A L I D , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
retl
nop
.size sun4 v _ v i n t r _ g e t _ v a l i d , . - s u n 4 v _ v i n t r _ g e t _ v a l i d
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : valid_ s t a t e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_set_valid
.type sun4 v _ v i n t r _ s e t _ v a l i d ,#f u n c t i o n
sun4v_vintr_set_valid :
mov H V _ F A S T _ V I N T R _ S E T _ V A L I D , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ v i n t r _ s e t _ v a l i d , . - s u n 4 v _ v i n t r _ s e t _ v a l i d
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : pointer t o u n s i g n e d l o n g s t a t e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_get_state
.type sun4 v _ v i n t r _ g e t _ s t a t e ,#f u n c t i o n
sun4v_vintr_get_state :
mov % o 2 , % g 1
mov H V _ F A S T _ V I N T R _ G E T _ S T A T E , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
retl
nop
.size sun4 v _ v i n t r _ g e t _ s t a t e , . - s u n 4 v _ v i n t r _ g e t _ s t a t e
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : state
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_set_state
.type sun4 v _ v i n t r _ s e t _ s t a t e ,#f u n c t i o n
sun4v_vintr_set_state :
mov H V _ F A S T _ V I N T R _ S E T _ S T A T E , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ v i n t r _ s e t _ s t a t e , . - s u n 4 v _ v i n t r _ s e t _ s t a t e
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : pointer t o u n s i g n e d l o n g c p u i d
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_get_target
.type sun4 v _ v i n t r _ g e t _ t a r g e t ,#f u n c t i o n
sun4v_vintr_get_target :
mov % o 2 , % g 1
mov H V _ F A S T _ V I N T R _ G E T _ T A R G E T , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % g 1 ]
retl
nop
.size sun4 v _ v i n t r _ g e t _ t a r g e t , . - s u n 4 v _ v i n t r _ g e t _ t a r g e t
/ * % o0 : device h a n d l e
* % o1 : device I N O
* % o2 : cpuid
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_vintr_set_target
.type sun4 v _ v i n t r _ s e t _ t a r g e t ,#f u n c t i o n
sun4v_vintr_set_target :
mov H V _ F A S T _ V I N T R _ S E T _ T A R G E T , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ v i n t r _ s e t _ t a r g e t , . - s u n 4 v _ v i n t r _ s e t _ t a r g e t
2007-05-30 19:01:47 -07:00
/ * % o0 : NCS s u b - f u n c t i o n
* % o1 : sub- f u n c t i o n a r g r e a l - a d d r e s s
* % o2 : sub- f u n c t i o n a r g s i z e
*
* returns % o 0 : s t a t u s
* /
.globl sun4v_ncs_request
.type sun4 v _ n c s _ r e q u e s t ,#f u n c t i o n
sun4v_ncs_request :
mov H V _ F A S T _ N C S _ R E Q U E S T , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ n c s _ r e q u e s t , . - s u n 4 v _ n c s _ r e q u e s t
.globl sun4v_scv_send
.type sun4 v _ s c v _ s e n d ,#f u n c t i o n
sun4v_scv_send :
save % s p , - 1 9 2 , % s p
mov % i 0 , % o 0
mov % i 1 , % o 1
mov % i 2 , % o 2
mov H V _ F A S T _ S V C _ S E N D , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % i 3 ]
ret
restore
.size sun4 v _ s c v _ s e n d , . - s u n 4 v _ s c v _ s e n d
.globl sun4v_scv_recv
.type sun4 v _ s c v _ r e c v ,#f u n c t i o n
sun4v_scv_recv :
save % s p , - 1 9 2 , % s p
mov % i 0 , % o 0
mov % i 1 , % o 1
mov % i 2 , % o 2
mov H V _ F A S T _ S V C _ R E C V , % o 5
ta H V _ F A S T _ T R A P
stx % o 1 , [ % i 3 ]
ret
restore
.size sun4 v _ s c v _ r e c v , . - s u n 4 v _ s c v _ r e c v
.globl sun4v_scv_getstatus
.type sun4 v _ s c v _ g e t s t a t u s ,#f u n c t i o n
sun4v_scv_getstatus :
mov H V _ F A S T _ S V C _ G E T S T A T U S , % o 5
mov % o 1 , % o 4
ta H V _ F A S T _ T R A P
stx % o 1 , [ % o 4 ]
retl
nop
.size sun4 v _ s c v _ g e t s t a t u s , . - s u n 4 v _ s c v _ g e t s t a t u s
.globl sun4v_scv_setstatus
.type sun4 v _ s c v _ s e t s t a t u s ,#f u n c t i o n
sun4v_scv_setstatus :
mov H V _ F A S T _ S V C _ S E T S T A T U S , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ s c v _ s e t s t a t u s , . - s u n 4 v _ s c v _ s e t s t a t u s
.globl sun4v_scv_clrstatus
.type sun4 v _ s c v _ c l r s t a t u s ,#f u n c t i o n
sun4v_scv_clrstatus :
mov H V _ F A S T _ S V C _ C L R S T A T U S , % o 5
ta H V _ F A S T _ T R A P
retl
nop
.size sun4 v _ s c v _ c l r s t a t u s , . - s u n 4 v _ s c v _ c l r s t a t u s