#include <sys/asm_linkage.h>
#include "payload_common.h"
ENTRY(outb)
movw %di, %dx
movb %sil, %al
outb (%dx)
ret
SET_SIZE(outb)
ENTRY(outw)
movw %di, %dx
movw %si, %ax
outw (%dx)
ret
SET_SIZE(outb)
ENTRY(outl)
movw %di, %dx
movl %esi, %eax
outl (%dx)
ret
SET_SIZE(outl)
ENTRY(inb)
movw %di, %dx
inb (%dx)
ret
SET_SIZE(inb)
ENTRY(inw)
movw %di, %dx
inw (%dx)
ret
SET_SIZE(inw)
ENTRY(inl)
movw %di, %dx
inl (%dx)
ret
SET_SIZE(inl)
ENTRY(rdmsr)
movl %edi, %ecx
rdmsr
shlq $32, %rdx
orq %rdx, %rax
ret
SET_SIZE(rdmsr)
ENTRY(wrmsr)
movq %rsi, %rdx
shrq $32, %rdx
movl %esi, %eax
movl %edi, %ecx
wrmsr
ret
SET_SIZE(wrmsr)
ENTRY(cpuid)
pushq %rbx
movl %edi, %eax
movl %esi, %ecx
movq %rdx, %r8
cpuid
movl %eax, (%r8)
movl %ebx, 4(%r8)
movl %ecx, 8(%r8)
movl %edx, 12(%r8)
popq %rbx
ret
SET_SIZE(cpuid)
ENTRY(rdtsc)
rdtsc
shlq $32, %rdx
orq %rdx, %rax
ret
SET_SIZE(rdtsc)
ENTRY(ud2a)
ud2a
SET_SIZE(ud2a)
ENTRY(setcr4)
movq %rdi, %cr4
ret
SET_SIZE(setcr4)
ENTRY(getcr4)
movq %cr4, %rax
ret
SET_SIZE(getcr4)
ENTRY(setxcr)
movq %rsi, %rdx
shrq $32, %rdx
movl %esi, %eax
movl %edi, %ecx
.byte 0x0f,0x01,0xd1
ret
SET_SIZE(setxcr)
ENTRY(getxcr)
movl %edi, %ecx
.byte 0x0f,0x01,0xd0
shlq $32, %rdx
orq %rdx, %rax
ret
SET_SIZE(getxcr)
ENTRY(test_result_pass)
movl $IOP_TEST_RESULT, %edi
movl $TEST_RESULT_PASS, %esi
call outb
ret
SET_SIZE(test_result_pass)
ENTRY(test_result_fail)
movl $IOP_TEST_RESULT, %edi
movl $TEST_RESULT_FAIL, %esi
call outb
ret
SET_SIZE(test_result_fail)
ENTRY(test_msg)
movl %edi, %esi
movl $IOP_TEST_MSG, %edi
call outl
ret
SET_SIZE(test_msg)