#include <sys/asm_linkage.h>
#include <sys/hypervisor_api.h>
#include <sys/dditypes.h>
#include <px_ioapi.h>
#include "px_lib4v.h"
ENTRY(hvio_iommu_map)
save %sp, -SA(MINFRAME64), %sp
mov %i0, %o0
mov %i1, %o1
mov %i2, %o2
mov %i3, %o3
mov %i4, %o4
mov HVIO_IOMMU_MAP, %o5
ta FAST_TRAP
brnz %o0, 1f
mov %o0, %i0
stuw %o1, [%i5]
1:
ret
restore
SET_SIZE(hvio_iommu_map)
ENTRY(hvio_iommu_demap)
mov HVIO_IOMMU_DEMAP, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o3]
1: retl
nop
SET_SIZE(hvio_iommu_demap)
ENTRY(hvio_iommu_getmap)
mov %o2, %o4
mov HVIO_IOMMU_GETMAP, %o5
ta FAST_TRAP
brnz %o0, 1f
nop
stx %o2, [%o3]
st %o1, [%o4]
1:
retl
nop
SET_SIZE(hvio_iommu_getmap)
ENTRY(hvio_iommu_getbypass)
mov HVIO_IOMMU_GETBYPASS, %o5
ta FAST_TRAP
brz,a %o0, 1f
stx %o1, [%o3]
1: retl
nop
SET_SIZE(hvio_iommu_getbypass)
ENTRY(hvio_peek)
mov HVIO_PEEK, %o5
ta FAST_TRAP
brnz %o0, 1f
nop
stx %o2, [%o4]
st %o1, [%o3]
1:
retl
nop
SET_SIZE(hvio_peek)
ENTRY(hvio_poke)
save %sp, -SA(MINFRAME64), %sp
mov %i0, %o0
mov %i1, %o1
mov %i2, %o2
mov %i3, %o3
mov %i4, %o4
mov HVIO_POKE, %o5
ta FAST_TRAP
brnz %o0, 1f
mov %o0, %i0
stuw %o1, [%i5]
1:
ret
restore
SET_SIZE(hvio_poke)
ENTRY(hvio_dma_sync)
mov HVIO_DMA_SYNC, %o5
ta FAST_TRAP
brz,a %o0, 1f
stx %o1, [%o4]
1: retl
nop
SET_SIZE(hvio_dma_sync)
ENTRY(hvio_msiq_conf)
mov HVIO_MSIQ_CONF, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msiq_conf)
ENTRY(hvio_msiq_info)
mov %o2, %o4
mov HVIO_MSIQ_INFO, %o5
ta FAST_TRAP
brnz %o0, 1f
nop
stx %o1, [%o4]
stuw %o2, [%o3]
1: retl
nop
SET_SIZE(hvio_msiq_info)
ENTRY(hvio_msiq_getvalid)
mov HVIO_MSIQ_GETVALID, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msiq_getvalid)
ENTRY(hvio_msiq_setvalid)
mov HVIO_MSIQ_SETVALID, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msiq_setvalid)
ENTRY(hvio_msiq_getstate)
mov HVIO_MSIQ_GETSTATE, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msiq_getstate)
ENTRY(hvio_msiq_setstate)
mov HVIO_MSIQ_SETSTATE, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msiq_setstate)
ENTRY(hvio_msiq_gethead)
mov HVIO_MSIQ_GETHEAD, %o5
ta FAST_TRAP
brz,a %o0, 1f
stx %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msiq_gethead)
ENTRY(hvio_msiq_sethead)
mov HVIO_MSIQ_SETHEAD, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msiq_sethead)
ENTRY(hvio_msiq_gettail)
mov HVIO_MSIQ_GETTAIL, %o5
ta FAST_TRAP
brz,a %o0, 1f
stx %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msiq_gettail)
ENTRY(hvio_msi_getmsiq)
mov HVIO_MSI_GETMSIQ, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msi_getmsiq)
ENTRY(hvio_msi_setmsiq)
mov HVIO_MSI_SETMSIQ, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msi_setmsiq)
ENTRY(hvio_msi_getvalid)
mov HVIO_MSI_GETVALID, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msi_getvalid)
ENTRY(hvio_msi_setvalid)
mov HVIO_MSI_SETVALID, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msi_setvalid)
ENTRY(hvio_msi_getstate)
mov HVIO_MSI_GETSTATE, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msi_getstate)
ENTRY(hvio_msi_setstate)
mov HVIO_MSI_SETSTATE, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msi_setstate)
ENTRY(hvio_msg_getmsiq)
mov HVIO_MSG_GETMSIQ, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msg_getmsiq)
ENTRY(hvio_msg_setmsiq)
mov HVIO_MSG_SETMSIQ, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msg_setmsiq)
ENTRY(hvio_msg_getvalid)
mov HVIO_MSG_GETVALID, %o5
ta FAST_TRAP
brz,a %o0, 1f
stuw %o1, [%o2]
1: retl
nop
SET_SIZE(hvio_msg_getvalid)
ENTRY(hvio_msg_setvalid)
mov HVIO_MSG_SETVALID, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(hvio_msg_setvalid)
ENTRY(pci_error_send)
mov PCI_ERROR_SEND, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(pci_error_send)
#define SHIFT_REGS mov %o1,%o0; mov %o2,%o1; mov %o3,%o2; mov %o4,%o3
! px_phys_acc_4v: Do physical address read.
!
! After SHIFT_REGS:
! %o0 is "from" address
! %o1 is "to" address
!
! Assumes 8 byte data and that alignment is correct.
!
! Always returns success (0) in %o0
! px_phys_acc_4v must not be split across pages.
!
! ATTN: Be sure that the alignment value is larger than the size of
! the px_phys_acc_4v function.
!
.align 0x40
ENTRY(px_phys_acc_4v)
SHIFT_REGS
ldx [%o0], %g1
stx %g1, [%o1]
membar #Sync ! Make sure the loads take
mov %g0, %o0
done
SET_SIZE(px_phys_acc_4v)
ENTRY(pci_iov_root_configured)
mov PCI_IOV_ROOT_CONFIGURED, %o5
ta FAST_TRAP
retl
nop
SET_SIZE(pci_iov_root_configured)