#include <sys/asi.h>
#include <sys/asm_linkage.h>
#include <sys/machthread.h>
#include <sys/privregs.h>
#include <sys/ontrap.h>
#include <sys/dditypes.h>
#include "assym.h"
.align 32
ENTRY(ddi_get8)
ALTENTRY(ddi_io_get8)
ALTENTRY(ddi_mem_get8)
ldn [%o0 + AHI_GET8], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_get8)
SET_SIZE(ddi_io_get8)
SET_SIZE(ddi_mem_get8)
.align 16
ENTRY(i_ddi_get8)
retl
ldub [%o1], %o0
SET_SIZE(i_ddi_get8)
.align 32
ENTRY(ddi_get16)
ALTENTRY(ddi_io_get16)
ALTENTRY(ddi_mem_get16)
ldn [%o0 + AHI_GET16], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_get16)
SET_SIZE(ddi_io_get16)
SET_SIZE(ddi_mem_get16)
.align 16
ENTRY(i_ddi_get16)
ALTENTRY(i_ddi_swap_get16)
retl
lduh [%o1], %o0
SET_SIZE(i_ddi_get16)
SET_SIZE(i_ddi_swap_get16)
.align 32
ENTRY(ddi_get32)
ALTENTRY(ddi_io_get32)
ALTENTRY(ddi_mem_get32)
ldn [%o0 + AHI_GET32], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_get32)
SET_SIZE(ddi_io_get32)
SET_SIZE(ddi_mem_get32)
.align 16
ENTRY(i_ddi_get32)
ALTENTRY(i_ddi_swap_get32)
retl
ld [%o1], %o0
SET_SIZE(i_ddi_get32)
SET_SIZE(i_ddi_swap_get32)
.align 32
ENTRY(ddi_get64)
ALTENTRY(ddi_io_get64)
ALTENTRY(ddi_mem_get64)
ldn [%o0 + AHI_GET64], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_get64)
SET_SIZE(ddi_io_get64)
SET_SIZE(ddi_mem_get64)
.align 16
ENTRY(i_ddi_get64)
ALTENTRY(i_ddi_swap_get64)
retl
ldx [%o1], %o0
SET_SIZE(i_ddi_get64)
SET_SIZE(i_ddi_swap_get64)
.align 32
ENTRY(ddi_put8)
ALTENTRY(ddi_io_put8)
ALTENTRY(ddi_mem_put8)
ldn [%o0 + AHI_PUT8], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_put8)
SET_SIZE(ddi_io_put8)
SET_SIZE(ddi_mem_put8)
.align 16
ENTRY(i_ddi_put8)
retl
stub %o2, [%o1]
SET_SIZE(i_ddi_put8)
.align 32
ENTRY(ddi_put16)
ALTENTRY(ddi_io_put16)
ALTENTRY(ddi_mem_put16)
ldn [%o0 + AHI_PUT16], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_put16)
SET_SIZE(ddi_io_put16)
SET_SIZE(ddi_mem_put16)
.align 16
ENTRY(i_ddi_put16)
ALTENTRY(i_ddi_swap_put16)
retl
stuh %o2, [%o1]
SET_SIZE(i_ddi_put16)
SET_SIZE(i_ddi_swap_put16)
.align 32
ENTRY(ddi_put32)
ALTENTRY(ddi_io_put32)
ALTENTRY(ddi_mem_put32)
ldn [%o0 + AHI_PUT32], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_put32)
SET_SIZE(ddi_io_put32)
SET_SIZE(ddi_mem_put32)
.align 16
ENTRY(i_ddi_put32)
ALTENTRY(i_ddi_swap_put32)
retl
st %o2, [%o1]
SET_SIZE(i_ddi_put32)
SET_SIZE(i_ddi_swap_put32)
.align 32
ENTRY(ddi_put64)
ALTENTRY(ddi_io_put64)
ALTENTRY(ddi_mem_put64)
ldn [%o0 + AHI_PUT64], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_put64)
SET_SIZE(ddi_io_put64)
SET_SIZE(ddi_mem_put64)
.align 16
ENTRY(i_ddi_put64)
ALTENTRY(i_ddi_swap_put64)
retl
stx %o2, [%o1]
SET_SIZE(i_ddi_put64)
SET_SIZE(i_ddi_swap_put64)
#define DDI_REP_GET(n,s) \
cmp DDI_DEV_NO_AUTOINCR, %o4; \
mov %g0, %o4; \
brz,pn %o3, 1f; \
movnz %xcc, n, %o4; \
2: \
dec %o3; \
ld##s [%o2], %g4; \
add %o2, %o4, %o2; \
st##s %g4, [%o1]; \
brnz,pt %o3, 2b; \
add %o1, n, %o1; \
1:
.align 32
ENTRY(ddi_rep_get8)
ALTENTRY(ddi_mem_rep_get8)
ldn [%o0 + AHI_REP_GET8], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_get8)
SET_SIZE(ddi_mem_rep_get8)
.align 16
ENTRY(i_ddi_rep_get8)
DDI_REP_GET(1,ub)
retl
nop
SET_SIZE(i_ddi_rep_get8)
.align 32
ENTRY(ddi_rep_get16)
ALTENTRY(ddi_mem_rep_get16)
ldn [%o0 + AHI_REP_GET16], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_get16)
SET_SIZE(ddi_mem_rep_get16)
.align 16
ENTRY(i_ddi_rep_get16)
ALTENTRY(i_ddi_swap_rep_get16)
DDI_REP_GET(2,uh)
retl
nop
SET_SIZE(i_ddi_rep_get16)
SET_SIZE(i_ddi_swap_rep_get16)
.align 32
ENTRY(ddi_rep_get32)
ALTENTRY(ddi_mem_rep_get32)
ldn [%o0 + AHI_REP_GET32], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_get32)
SET_SIZE(ddi_mem_rep_get32)
.align 16
ENTRY(i_ddi_rep_get32)
ALTENTRY(i_ddi_swap_rep_get32)
DDI_REP_GET(4,)
retl
nop
SET_SIZE(i_ddi_rep_get32)
SET_SIZE(i_ddi_swap_rep_get32)
.align 32
ENTRY(ddi_rep_get64)
ALTENTRY(ddi_mem_rep_get64)
ldn [%o0 + AHI_REP_GET64], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_get64)
SET_SIZE(ddi_mem_rep_get64)
.align 16
ENTRY(i_ddi_rep_get64)
ALTENTRY(i_ddi_swap_rep_get64)
DDI_REP_GET(8,x)
retl
nop
SET_SIZE(i_ddi_rep_get64)
SET_SIZE(i_ddi_swap_rep_get64)
#define DDI_REP_PUT(n,s) \
cmp DDI_DEV_NO_AUTOINCR, %o4; \
mov %g0, %o4; \
brz,pn %o3, 1f; \
movnz %xcc, n, %o4; \
2: \
dec %o3; \
ld##s [%o1], %g4; \
add %o1, n, %o1; \
st##s %g4, [%o2]; \
brnz,pt %o3, 2b; \
add %o2, %o4, %o2; \
1:
.align 32
ENTRY(ddi_rep_put8)
ALTENTRY(ddi_mem_rep_put8)
ldn [%o0 + AHI_REP_PUT8], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_put8)
SET_SIZE(ddi_mem_rep_put8)
.align 16
ENTRY(i_ddi_rep_put8)
DDI_REP_PUT(1,ub)
retl
nop
SET_SIZE(i_ddi_rep_put8)
.align 32
ENTRY(ddi_rep_put16)
ALTENTRY(ddi_mem_rep_put16)
ldn [%o0 + AHI_REP_PUT16], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_put16)
SET_SIZE(ddi_mem_rep_put16)
.align 16
ENTRY(i_ddi_rep_put16)
ALTENTRY(i_ddi_swap_rep_put16)
DDI_REP_PUT(2,uh)
retl
nop
SET_SIZE(i_ddi_rep_put16)
SET_SIZE(i_ddi_swap_rep_put16)
.align 32
ENTRY(ddi_rep_put32)
ALTENTRY(ddi_mem_rep_put32)
ldn [%o0 + AHI_REP_PUT32], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_put32)
SET_SIZE(ddi_mem_rep_put32)
.align 16
ENTRY(i_ddi_rep_put32)
ALTENTRY(i_ddi_swap_rep_put32)
DDI_REP_PUT(4,)
retl
nop
SET_SIZE(i_ddi_rep_put32)
SET_SIZE(i_ddi_swap_rep_put32)
.align 32
ENTRY(ddi_rep_put64)
ALTENTRY(ddi_mem_rep_put64)
ldn [%o0 + AHI_REP_PUT64], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_rep_put64)
SET_SIZE(ddi_mem_rep_put64)
.align 16
ENTRY(i_ddi_rep_put64)
ALTENTRY(i_ddi_swap_rep_put64)
DDI_REP_PUT(8,x)
retl
nop
SET_SIZE(i_ddi_rep_put64)
SET_SIZE(i_ddi_swap_rep_put64)
.align 16
ENTRY(ddi_io_rep_get8)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_GET8], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_get8)
.align 16
ENTRY(ddi_io_rep_get16)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_GET16], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_get16)
.align 16
ENTRY(ddi_io_rep_get32)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_GET32], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_get32)
.align 16
ENTRY(ddi_io_rep_get64)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_GET64], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_get64)
.align 64
ENTRY(ddi_check_acc_handle)
save %sp, -SA(WINDOWSIZE), %sp ! get a new window
ldn [%i0 + AHI_FAULT_CHECK], %g1
jmpl %g1, %o7
mov %i0, %o0
brnz,a,pn %o0, 0f ! if (return_value != 0)
mov -1, %o0 ! return (DDI_FAILURE)
0: ! else return (DDI_SUCCESS)
sra %o0, 0, %i0
ret
restore
SET_SIZE(ddi_check_acc_handle)
.align 16
ENTRY(i_ddi_acc_fault_check)
retl
ld [%o0 + AHI_FAULT], %o0
SET_SIZE(i_ddi_acc_fault_check)
.align 16
ENTRY(ddi_io_rep_put8)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_PUT8], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_put8)
.align 16
ENTRY(ddi_io_rep_put16)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_PUT16], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_put16)
.align 16
ENTRY(ddi_io_rep_put32)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_PUT32], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_put32)
.align 16
ENTRY(ddi_io_rep_put64)
set DDI_DEV_NO_AUTOINCR, %o4
ldn [%o0 + AHI_REP_PUT64], %g1
jmpl %g1, %g0
nop
SET_SIZE(ddi_io_rep_put64)
ENTRY(do_peek)
rdpr %pstate, %o3 ! check ints
andcc %o3, PSTATE_IE, %g0
bz,a done
or %g0, 1, %o0 ! Return failure if ints are disabled
wrpr %o3, PSTATE_IE, %pstate
cmp %o0, 8 ! 64-bit?
bne,a .peek_int
cmp %o0, 4 ! 32-bit?
ldx [%o1], %g1
ba .peekdone
stx %g1, [%o2]
.peek_int:
bne,a .peek_half
cmp %o0, 2 ! 16-bit?
lduw [%o1], %g1
ba .peekdone
stuw %g1, [%o2]
.peek_half:
bne,a .peek_byte
ldub [%o1], %g1 ! 8-bit!
lduh [%o1], %g1
ba .peekdone
stuh %g1, [%o2]
.peek_byte:
stub %g1, [%o2]
.peekdone:
membar #Sync ! Make sure the loads take
rdpr %pstate, %o3 ! check&enable ints
andcc %o3, PSTATE_IE, %g0
bnz 1f
nop
wrpr %o3, PSTATE_IE, %pstate
1:
mov %g0, %o0
done:
retl
nop
SET_SIZE(do_peek)
ENTRY(do_poke)
cmp %o0, 8 ! 64 bit?
bne,a .poke_int
cmp %o0, 4 ! 32-bit?
ldx [%o2], %g1
ba .pokedone
stx %g1, [%o1]
.poke_int:
bne,a .poke_half
cmp %o0, 2 ! 16-bit?
lduw [%o2], %g1
ba .pokedone
stuw %g1, [%o1]
.poke_half:
bne,a .poke_byte
ldub [%o2], %g1 ! 8-bit!
lduh [%o2], %g1
ba .pokedone
stuh %g1, [%o1]
.poke_byte:
stub %g1, [%o1]
.pokedone:
membar #Sync
retl
mov %g0, %o0
SET_SIZE(do_poke)
.seg ".data"
.peek_panic:
.asciz "peek_fault: missing or invalid on_trap_data"
.poke_panic:
.asciz "poke_fault: missing or invalid on_trap_data"
ENTRY(peek_fault)
ldn [THREAD_REG + T_ONTRAP], %o0 ! %o0 = on_trap_data pointer
brz,pn %o0, .peekfail ! if (%o0 == NULL) panic
nop
lduh [%o0 + OT_PROT], %o1 ! %o1 = %o0->ot_prot
andcc %o1, OT_DATA_ACCESS, %g0 ! if (!(%o1 & OT_DATA_ACCESS))
bz,pn %icc, .peekfail ! panic
rdpr %pstate, %o3
andcc %o3, PSTATE_IE, %g0 ! enable interrupts
bnz 1f
nop
wrpr %o3, PSTATE_IE, %pstate
1:
retl
sub %g0, 1, %o0 ! return (DDI_FAILURE);
.peekfail:
set .peek_panic, %o0 ! Load panic message
call panic ! Panic if bad t_ontrap data
nop
SET_SIZE(peek_fault)
ENTRY(poke_fault)
ldn [THREAD_REG + T_ONTRAP], %o0 ! %o0 = on_trap_data pointer
brz,pn %o0, .pokefail ! if (%o0 == NULL) panic
nop
lduh [%o0 + OT_PROT], %o1 ! %o1 = %o0->ot_prot
andcc %o1, OT_DATA_ACCESS, %g0 ! if (!(%o1 & OT_DATA_ACCESS))
bz,pn %icc, .pokefail ! panic
nop
retl
sub %g0, 1, %o0 ! return (DDI_FAILURE);
.pokefail:
set .poke_panic, %o0 ! Load panic message
call panic ! Panic if bad t_ontrap data
nop
SET_SIZE(poke_fault)
.seg ".data"
.acc_panic:
.asciz "DDI access: missing or invalid on_trap_data"
ENTRY(i_ddi_caut_trampoline)
ldn [THREAD_REG + T_ONTRAP], %o5 ! %o5 = curthread->t_ontrap
lduh [%o5 + OT_PROT], %o1 ! %o1 = %o0->ot_prot
andcc %o1, OT_DATA_ACCESS, %g0 ! if (!(%o1 & OT_DATA_ACCESS))
bz,pn %icc, .cautaccfail ! panic
rdpr %pstate, %o3
andcc %o3, PSTATE_IE, %g0 ! enable interrupts
bnz 1f
nop
wrpr %o3, PSTATE_IE, %pstate
1:
ldn [%o5 + OT_HANDLE], %o0 ! %o0 = ot_handle
brz,pn %o0, .cautaccfail ! if (ot_handle == NULL) panic
nop
ldn [%o0 + AHI_ERR], %o4 ! %o4 = hp->ahi_err
membar #Sync
stx %g0, [%o4 + ERR_ENA] ! ahi_err->err_ena = 0
mov -2, %o0
st %o0, [%o4 + ERR_STATUS] ! ahi_err->err_status = NONFATAL
b longjmp ! longjmp back
add %o5, OT_JMPBUF, %o0 ! %o0 = &ot_jmpbuf
.cautaccfail:
set .acc_panic, %o0 ! Load panic message
call panic ! Panic if bad t_ontrap data
nop
SET_SIZE(i_ddi_caut_trampoline)
ENTRY(i_ddi_ontrap)
ldn [%o0 + AHI_ERR], %o4
ldn [%o4 + ERR_ONTRAP], %o4 ! %o4 = hp->ahi_err->err_ontrap
ldn [THREAD_REG + T_ONTRAP], %o5 ! %o5 = curthread->t_ontrap
stn %o5, [%o4 + OT_PREV] ! ot_prev = t_ontrap
membar #Sync ! force error barrier
stn %o4, [THREAD_REG + T_ONTRAP] ! t_ontrap = err_ontrap
b setjmp
add %o4, OT_JMPBUF, %o0
SET_SIZE(i_ddi_ontrap)
ENTRY(i_ddi_notrap)
membar #Sync ! force error barrier
ldn [%o0 + AHI_ERR], %o4
ldn [%o4 + ERR_ONTRAP], %o4 ! %o4 = hp->ahi_err->err_ontrap
ldn [%o4 + OT_PREV], %o4
retl
stn %o4, [THREAD_REG + T_ONTRAP] ! restore curthread->t_ontrap
SET_SIZE(i_ddi_notrap)
ENTRY(i_ddi_prot_trampoline)
ldn [THREAD_REG + T_ONTRAP], %o5 ! %o5 = curthread->t_ontrap
lduh [%o5 + OT_PROT], %o1 ! %o1 = %o0->ot_prot
andcc %o1, OT_DATA_ACCESS, %g0 ! if (!(%o1 & OT_DATA_ACCESS))
bz,pn %icc, .protaccfail ! panic
rdpr %pstate, %o3
andcc %o3, PSTATE_IE, %g0 ! enable interrupts
bnz 1f
nop
wrpr %o3, PSTATE_IE, %pstate
1:
ldn [%o5 + OT_HANDLE], %o0 ! %o0 = ot_handle
brz,pn %o0, .protaccfail ! if (ot_handle == NULL) panic
nop
ldn [%o0 + AHI_ERR], %o4 ! %o4 = hp->ahi_err
stn %g0, [%o4 + ERR_ENA] ! ahi_err->err_ena = 0
mov -2, %o0
st %o0, [%o4 + ERR_STATUS] ! ahi_err->err_status = NONFATAL
ldn [%o5 + OT_PREV], %o0 ! restore ontrap
membar #Sync ! force error barrier
stn %o0, [THREAD_REG + T_ONTRAP];
b longjmp ! longjmp back
add %o5, OT_JMPBUF, %o0 ! %o0 = &ot_jmpbuf
.protaccfail:
set .acc_panic, %o0 ! Load panic message
call panic ! Panic if bad t_ontrap data
nop
SET_SIZE(i_ddi_prot_trampoline)
#define DDI_PROTECT() \
ldn [%o0 + AHI_ERR], %o4; \
ldn [%o4 + ERR_ONTRAP], %o4; \
ldn [THREAD_REG + T_ONTRAP], %o5; \
stn %o5, [%o4 + OT_PREV]; \
membar #Sync; \
stn %o4, [THREAD_REG + T_ONTRAP]; \
add %o4, OT_JMPBUF, %o0; \
stn %o7, [%o0 + L_PC]; \
stn %sp, [%o0 + L_SP]; \
clr %o0;
#define DDI_NOPROTECT() \
ldn [THREAD_REG + T_ONTRAP], %o4; \
ldn [%o4 + OT_PREV], %o5; \
membar #Sync; \
stn %o5, [THREAD_REG + T_ONTRAP];
.align 16
ENTRY(i_ddi_prot_get8)
DDI_PROTECT() ! set ontrap protection
ldub [%o1], %o2 ! do the io access
DDI_NOPROTECT() ! remove protection & ret
retl
mov %o2, %o0 ! set return value
SET_SIZE(i_ddi_prot_get8)
.align 16
ENTRY(i_ddi_prot_get16)
DDI_PROTECT() ! set ontrap protection
lduh [%o1], %o2 ! do the io access
DDI_NOPROTECT() ! remove protection & ret
retl
mov %o2, %o0 ! set return value
SET_SIZE(i_ddi_prot_get16)
.align 16
ENTRY(i_ddi_prot_get32)
DDI_PROTECT() ! set ontrap protection
ld [%o1], %o2 ! do the io access
DDI_NOPROTECT() ! remove protection & ret
retl
mov %o2, %o0 ! set return value
SET_SIZE(i_ddi_prot_get32)
.align 16
ENTRY(i_ddi_prot_get64)
DDI_PROTECT() ! set ontrap protection
ldx [%o1], %o2 ! do the io access
DDI_NOPROTECT() ! remove protection & ret
retl
mov %o2, %o0 ! set return value
SET_SIZE(i_ddi_prot_get64)
.align 16
ENTRY(i_ddi_prot_put8)
stub %o2, [%o1] ! do the io access
retl
membar #Sync;
SET_SIZE(i_ddi_prot_put8)
.align 16
ENTRY(i_ddi_prot_put16)
stuh %o2, [%o1] ! do the io access
retl
membar #Sync;
SET_SIZE(i_ddi_prot_put16)
.align 16
ENTRY(i_ddi_prot_put32)
st %o2, [%o1] ! do the io access
retl
membar #Sync;
SET_SIZE(i_ddi_prot_put32)
.align 16
ENTRY(i_ddi_prot_put64)
stx %o2, [%o1] ! do the io access
retl
membar #Sync;
SET_SIZE(i_ddi_prot_put64)
.align 16
ENTRY(i_ddi_prot_rep_get8)
DDI_PROTECT() ! set ontrap protection
tst %o0 ! check access error
bnz,a 1f
nop
DDI_REP_GET(1,ub)
1:
DDI_NOPROTECT() ! remove protection & ret
retl
nop
SET_SIZE(i_ddi_prot_rep_get8)
.align 16
ENTRY(i_ddi_prot_rep_get16)
DDI_PROTECT() ! set ontrap protection
tst %o0 ! check access error
bnz,a 1f
nop
DDI_REP_GET(2,uh)
1:
DDI_NOPROTECT() ! remove protection & ret
retl
nop
SET_SIZE(i_ddi_prot_rep_get16)
.align 16
ENTRY(i_ddi_prot_rep_get32)
DDI_PROTECT() ! set ontrap protection
tst %o0 ! check access error
bnz,a 1f
nop
DDI_REP_GET(4,)
1:
DDI_NOPROTECT() ! remove protection & ret
retl
nop
SET_SIZE(i_ddi_prot_rep_get32)
.align 16
ENTRY(i_ddi_prot_rep_get64)
DDI_PROTECT() ! set ontrap protection
tst %o0 ! check access error
bnz,a 1f
nop
DDI_REP_GET(8,x)
1:
DDI_NOPROTECT() ! remove protection & ret
retl
nop
SET_SIZE(i_ddi_prot_rep_get64)
.align 16
ENTRY(i_ddi_prot_rep_put8)
DDI_REP_PUT(1,ub)
retl
membar #Sync;
SET_SIZE(i_ddi_prot_rep_put8)
.align 16
ENTRY(i_ddi_prot_rep_put16)
DDI_REP_PUT(2,uh)
retl
membar #Sync;
SET_SIZE(i_ddi_prot_rep_put16)
.align 16
ENTRY(i_ddi_prot_rep_put32)
DDI_REP_PUT(4,)
retl
membar #Sync;
SET_SIZE(i_ddi_prot_rep_put32)
.align 16
ENTRY(i_ddi_prot_rep_put64)
DDI_REP_PUT(8,x)
retl
membar #Sync;
SET_SIZE(i_ddi_prot_rep_put64)
ENTRY(i_ddi_caut_get)
rdpr %pstate, %o3 ! check ints
andcc %o3, PSTATE_IE, %g0
bz,a cautdone
nop
wrpr %o3, PSTATE_IE, %pstate
cmp %o0, 8 ! 64-bit?
bne,a .get_int
cmp %o0, 4 ! 32-bit?
ldx [%o1], %g1
ba .getdone
stx %g1, [%o2]
.get_int:
bne,a .get_half
cmp %o0, 2 ! 16-bit?
lduw [%o1], %g1
ba .getdone
stuw %g1, [%o2]
.get_half:
bne,a .get_byte
ldub [%o1], %g1 ! 8-bit!
lduh [%o1], %g1
ba .getdone
stuh %g1, [%o2]
.get_byte:
stub %g1, [%o2]
.getdone:
rdpr %pstate, %o3 ! check&enable ints
andcc %o3, PSTATE_IE, %g0
bnz,a cautdone
nop
wrpr %o3, PSTATE_IE, %pstate
cautdone:
retl
nop
SET_SIZE(i_ddi_caut_get)