#include "assym.h"
#include <sys/asm_linkage.h>
#include <sys/privregs.h>
#include <sys/x_call.h>
#include <sys/xc_impl.h>
#ifdef TRAPTRACE
#include <sys/traptrace.h>
#endif
ENTRY_NP(self_xcall)
!
! TL>0 handlers are expected to do "retry"
! prepare their return PC and nPC now
!
rdpr %tnpc, %g1
wrpr %g1, %tpc ! PC <- TNPC[TL]
add %g1, 4, %g1
wrpr %g1, %tnpc ! nPC <- TNPC[TL] + 4
#ifdef TRAPTRACE
TRACE_PTR(%g4, %g6)
GET_TRACE_TICK(%g6, %g3)
stxa %g6, [%g4 + TRAP_ENT_TICK]%asi
rdpr %tl, %g6
stha %g6, [%g4 + TRAP_ENT_TL]%asi
rdpr %tt, %g6
stha %g6, [%g4 + TRAP_ENT_TT]%asi
stna %o3, [%g4 + TRAP_ENT_TR]%asi ! pc of the TL>0 handler
rdpr %tpc, %g6
stna %g6, [%g4 + TRAP_ENT_TPC]%asi
rdpr %tstate, %g6
stxa %g6, [%g4 + TRAP_ENT_TSTATE]%asi
stna %sp, [%g4 + TRAP_ENT_SP]%asi
stna %o1, [%g4 + TRAP_ENT_F1]%asi ! arg 1
stna %o2, [%g4 + TRAP_ENT_F2]%asi ! arg 2
stna %g0, [%g4 + TRAP_ENT_F3]%asi
stna %g0, [%g4 + TRAP_ENT_F4]%asi
TRACE_NEXT(%g4, %g6, %g3)
#endif
!
! Load the arguments for the fast trap handler.
!
mov %o1, %g1
jmp %o3 ! call the fast trap handler
mov %o2, %g2
SET_SIZE(self_xcall)
#ifdef TRAPTRACE
ENTRY(xc_trace)
rdpr %pstate, %g1
andn %g1, PSTATE_IE | PSTATE_AM, %g2
wrpr %g0, %g2, %pstate
TRACE_PTR(%g3, %g4)
GET_TRACE_TICK(%g6, %g4)
stxa %g6, [%g3 + TRAP_ENT_TICK]%asi
stha %g0, [%g3 + TRAP_ENT_TL]%asi
set TT_XCALL, %g2
or %o0, %g2, %g4
stha %g4, [%g3 + TRAP_ENT_TT]%asi
stna %o7, [%g3 + TRAP_ENT_TPC]%asi
ldn [%o1], %g2
stna %g2, [%g3 + TRAP_ENT_SP]%asi
stna %o2, [%g3 + TRAP_ENT_TR]%asi
stna %o3, [%g3 + TRAP_ENT_F1]%asi
stna %o4, [%g3 + TRAP_ENT_F2]%asi
stna %g0, [%g3 + TRAP_ENT_F3]%asi
stna %i7, [%g3 + TRAP_ENT_F4]%asi
stxa %g1, [%g3 + TRAP_ENT_TSTATE]%asi
TRACE_NEXT(%g2, %g3, %g4)
#if CPUSET_SIZE > CLONGSIZE
add %o1, CPUSET_SIZE, %g5
clr %o2
1:
TRACE_PTR(%g3, %g4)
stha %g0, [%g3 + TRAP_ENT_TL]%asi
set TT_XCALL_CONT, %g2
or %g2, %o2, %g2
stha %g2, [%g3 + TRAP_ENT_TT]%asi
stxa %g6, [%g3 + TRAP_ENT_TICK]%asi
stna %g0, [%g3 + TRAP_ENT_TPC]%asi
stna %g0, [%g3 + TRAP_ENT_SP]%asi
stna %g0, [%g3 + TRAP_ENT_TR]%asi
stxa %g0, [%g3 + TRAP_ENT_TSTATE]%asi
stna %g0, [%g3 + TRAP_ENT_F2]%asi
stna %g0, [%g3 + TRAP_ENT_F3]%asi
stna %g0, [%g3 + TRAP_ENT_F4]%asi
ldn [%o1], %g2
stna %g2, [%g3 + TRAP_ENT_F1]%asi
add %o1, CLONGSIZE, %o1
cmp %o1, %g5
bge 2f
ldn [%o1], %g2
stna %g2, [%g3 + TRAP_ENT_F2]%asi
add %o1, CLONGSIZE, %o1
cmp %o1, %g5
bge 2f
ldn [%o1], %g2
stna %g2, [%g3 + TRAP_ENT_F3]%asi
add %o1, CLONGSIZE, %o1
cmp %o1, %g5
bge 2f
ldn [%o1], %g2
stna %g2, [%g3 + TRAP_ENT_F4]%asi
add %o1, CLONGSIZE, %o1
2:
TRACE_NEXT(%g2, %g3, %g4)
cmp %o1, %g5
bl 1b
inc %o2
#endif
retl
wrpr %g0, %g1, %pstate
SET_SIZE(xc_trace)
#endif
ENTRY_NP(xt_sync_tl1)
retry
SET_SIZE(xt_sync_tl1)