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