15103e761SPatrick Mooney/*
25103e761SPatrick Mooney * This file and its contents are supplied under the terms of the
35103e761SPatrick Mooney * Common Development and Distribution License ("CDDL"), version 1.0.
45103e761SPatrick Mooney * You may only use this file in accordance with the terms of version
55103e761SPatrick Mooney * 1.0 of the CDDL.
65103e761SPatrick Mooney *
75103e761SPatrick Mooney * A full copy of the text of the CDDL should have accompanied this
85103e761SPatrick Mooney * source.  A copy of the CDDL is also available via the Internet at
95103e761SPatrick Mooney * http://www.illumos.org/license/CDDL.
105103e761SPatrick Mooney */
115103e761SPatrick Mooney
125103e761SPatrick Mooney/*
13717646f7SJordan Paige Hendricks * Copyright 2023 Oxide Computer Company
145103e761SPatrick Mooney */
155103e761SPatrick Mooney
165103e761SPatrick Mooney#include <sys/asm_linkage.h>
17a1d41cf9SPatrick Mooney#include "payload_common.h"
185103e761SPatrick Mooney
19578d9a56SPatrick Mooney/* void outb(uint16_t port, uint8_t val) */
205103e761SPatrick MooneyENTRY(outb)
215103e761SPatrick Mooney	movw    %di, %dx
225103e761SPatrick Mooney	movb    %sil, %al
235103e761SPatrick Mooney	outb    (%dx)
245103e761SPatrick Mooney	ret
255103e761SPatrick MooneySET_SIZE(outb)
265103e761SPatrick Mooney
27578d9a56SPatrick Mooney/* void outw(uint16_t port, uint16_t val) */
285103e761SPatrick MooneyENTRY(outw)
295103e761SPatrick Mooney	movw    %di, %dx
305103e761SPatrick Mooney	movw    %si, %ax
315103e761SPatrick Mooney	outw    (%dx)
325103e761SPatrick Mooney	ret
335103e761SPatrick MooneySET_SIZE(outb)
345103e761SPatrick Mooney
35578d9a56SPatrick Mooney/* void outl(uint16_t port, uint32_t val) */
365103e761SPatrick MooneyENTRY(outl)
375103e761SPatrick Mooney	movw    %di, %dx
385103e761SPatrick Mooney	movl    %esi, %eax
395103e761SPatrick Mooney	outl    (%dx)
405103e761SPatrick Mooney	ret
415103e761SPatrick MooneySET_SIZE(outl)
425103e761SPatrick Mooney
43578d9a56SPatrick Mooney/* uint8_t inb(uint16_t port) */
445103e761SPatrick MooneyENTRY(inb)
455103e761SPatrick Mooney	movw    %di, %dx
465103e761SPatrick Mooney	inb    (%dx)
475103e761SPatrick Mooney	ret
485103e761SPatrick MooneySET_SIZE(inb)
495103e761SPatrick Mooney
50578d9a56SPatrick Mooney/* uint16_t inw(uint16_t port) */
515103e761SPatrick MooneyENTRY(inw)
525103e761SPatrick Mooney	movw    %di, %dx
535103e761SPatrick Mooney	inw    (%dx)
545103e761SPatrick Mooney	ret
555103e761SPatrick MooneySET_SIZE(inw)
565103e761SPatrick Mooney
57578d9a56SPatrick Mooney/* uint32_t inl(uint16_t port) */
585103e761SPatrick MooneyENTRY(inl)
595103e761SPatrick Mooney	movw    %di, %dx
605103e761SPatrick Mooney	inl    (%dx)
615103e761SPatrick Mooney	ret
625103e761SPatrick MooneySET_SIZE(inl)
63d2f938fdSPatrick Mooney
64717646f7SJordan Paige Hendricks/* uint64_t rdmsr(uint32_t msr) */
65d2f938fdSPatrick MooneyENTRY(rdmsr)
66d2f938fdSPatrick Mooney	movl    %edi, %ecx
67d2f938fdSPatrick Mooney	rdmsr
68d2f938fdSPatrick Mooney	shlq    $32, %rdx
69d2f938fdSPatrick Mooney	orq     %rdx, %rax
70d2f938fdSPatrick Mooney	ret
71d2f938fdSPatrick MooneySET_SIZE(rdmsr)
72d2f938fdSPatrick Mooney
73578d9a56SPatrick Mooney/* void wrmsr(uint32_t msr, uint64_t val) */
74d2f938fdSPatrick MooneyENTRY(wrmsr)
75d2f938fdSPatrick Mooney	movq    %rsi, %rdx
76d2f938fdSPatrick Mooney	shrq    $32, %rdx
77d2f938fdSPatrick Mooney	movl    %esi, %eax
78d2f938fdSPatrick Mooney	movl    %edi, %ecx
79d2f938fdSPatrick Mooney	wrmsr
80d2f938fdSPatrick Mooney	ret
81d2f938fdSPatrick MooneySET_SIZE(wrmsr)
82578d9a56SPatrick Mooney
83578d9a56SPatrick Mooney/* void cpuid(uint32_t in_eax, uint32_t in_ecx, uint32_t *out_regs) */
84578d9a56SPatrick MooneyENTRY(cpuid)
85578d9a56SPatrick Mooney	pushq   %rbx
86578d9a56SPatrick Mooney	movl    %edi, %eax
87578d9a56SPatrick Mooney	movl    %esi, %ecx
88578d9a56SPatrick Mooney	movq    %rdx, %r8
89578d9a56SPatrick Mooney	cpuid
90578d9a56SPatrick Mooney	movl    %eax, (%r8)
91578d9a56SPatrick Mooney	movl    %ebx, 4(%r8)
92578d9a56SPatrick Mooney	movl    %ecx, 8(%r8)
93578d9a56SPatrick Mooney	movl    %edx, 12(%r8)
94578d9a56SPatrick Mooney	popq    %rbx
95578d9a56SPatrick Mooney	ret
96578d9a56SPatrick MooneySET_SIZE(cpuid)
97717646f7SJordan Paige Hendricks
98717646f7SJordan Paige Hendricks/* uint64_t rdtsc(void) */
99717646f7SJordan Paige HendricksENTRY(rdtsc)
100717646f7SJordan Paige Hendricks	rdtsc
101717646f7SJordan Paige Hendricks	shlq    $32, %rdx
102717646f7SJordan Paige Hendricks	orq     %rdx, %rax
103717646f7SJordan Paige Hendricks	ret
104717646f7SJordan Paige HendricksSET_SIZE(rdtsc)
105a1d41cf9SPatrick Mooney
106*72473353SPatrick Mooney/* void ud2a(void) */
107*72473353SPatrick MooneyENTRY(ud2a)
108*72473353SPatrick Mooney	ud2a
109*72473353SPatrick MooneySET_SIZE(ud2a)
110*72473353SPatrick Mooney
111a1d41cf9SPatrick Mooney/* void test_result_pass(void) */
112a1d41cf9SPatrick MooneyENTRY(test_result_pass)
113a1d41cf9SPatrick Mooney	movl    $IOP_TEST_RESULT, %edi
114a1d41cf9SPatrick Mooney	movl    $TEST_RESULT_PASS, %esi
115a1d41cf9SPatrick Mooney	call    outb
116a1d41cf9SPatrick Mooney	ret
117a1d41cf9SPatrick MooneySET_SIZE(test_result_pass)
118a1d41cf9SPatrick Mooney
119a1d41cf9SPatrick Mooney/* void test_result_fail(void) */
120a1d41cf9SPatrick MooneyENTRY(test_result_fail)
121a1d41cf9SPatrick Mooney	movl    $IOP_TEST_RESULT, %edi
122a1d41cf9SPatrick Mooney	movl    $TEST_RESULT_FAIL, %esi
123a1d41cf9SPatrick Mooney	call    outb
124a1d41cf9SPatrick Mooney	ret
125a1d41cf9SPatrick MooneySET_SIZE(test_result_fail)
126a1d41cf9SPatrick Mooney
127a1d41cf9SPatrick Mooney/* void test_msg(const char *) */
128a1d41cf9SPatrick MooneyENTRY(test_msg)
129a1d41cf9SPatrick Mooney	/*
130a1d41cf9SPatrick Mooney	 * Message address is assumed to be in lower 32-bits, since that is where
131a1d41cf9SPatrick Mooney	 * the payload is currently being mapped.
132a1d41cf9SPatrick Mooney	 */
133a1d41cf9SPatrick Mooney	movl    %edi, %esi
134a1d41cf9SPatrick Mooney	movl    $IOP_TEST_MSG, %edi
135a1d41cf9SPatrick Mooney	call    outl
136a1d41cf9SPatrick Mooney
137a1d41cf9SPatrick Mooney	ret
138a1d41cf9SPatrick MooneySET_SIZE(test_msg)
139