1*d2f938fdSPatrick Mooney /* 2*d2f938fdSPatrick Mooney * This file and its contents are supplied under the terms of the 3*d2f938fdSPatrick Mooney * Common Development and Distribution License ("CDDL"), version 1.0. 4*d2f938fdSPatrick Mooney * You may only use this file in accordance with the terms of version 5*d2f938fdSPatrick Mooney * 1.0 of the CDDL. 6*d2f938fdSPatrick Mooney * 7*d2f938fdSPatrick Mooney * A full copy of the text of the CDDL should have accompanied this 8*d2f938fdSPatrick Mooney * source. A copy of the CDDL is also available via the Internet at 9*d2f938fdSPatrick Mooney * http://www.illumos.org/license/CDDL. 10*d2f938fdSPatrick Mooney */ 11*d2f938fdSPatrick Mooney 12*d2f938fdSPatrick Mooney /* 13*d2f938fdSPatrick Mooney * Copyright 2022 Oxide Computer Company 14*d2f938fdSPatrick Mooney */ 15*d2f938fdSPatrick Mooney 16*d2f938fdSPatrick Mooney #include "payload_common.h" 17*d2f938fdSPatrick Mooney #include "payload_utils.h" 18*d2f938fdSPatrick Mooney #include "test_defs.h" 19*d2f938fdSPatrick Mooney 20*d2f938fdSPatrick Mooney #define MSR_APICBASE 0x1b 21*d2f938fdSPatrick Mooney 22*d2f938fdSPatrick Mooney #define APICBASE_X2APIC (1 << 10) 23*d2f938fdSPatrick Mooney 24*d2f938fdSPatrick Mooney 25*d2f938fdSPatrick Mooney static void write_vlapic(uint_t reg,uint32_t value)26*d2f938fdSPatrick Mooneywrite_vlapic(uint_t reg, uint32_t value) 27*d2f938fdSPatrick Mooney { 28*d2f938fdSPatrick Mooney volatile uint32_t *ptr = (uint32_t *)(MMIO_LAPIC_BASE + reg); 29*d2f938fdSPatrick Mooney *ptr = value; 30*d2f938fdSPatrick Mooney } 31*d2f938fdSPatrick Mooney 32*d2f938fdSPatrick Mooney static uint32_t read_vlapic(uint_t reg)33*d2f938fdSPatrick Mooneyread_vlapic(uint_t reg) 34*d2f938fdSPatrick Mooney { 35*d2f938fdSPatrick Mooney volatile uint32_t *ptr = (uint32_t *)(MMIO_LAPIC_BASE + reg); 36*d2f938fdSPatrick Mooney return (*ptr); 37*d2f938fdSPatrick Mooney } 38*d2f938fdSPatrick Mooney 39*d2f938fdSPatrick Mooney static void barrier(void)40*d2f938fdSPatrick Mooneybarrier(void) 41*d2f938fdSPatrick Mooney { 42*d2f938fdSPatrick Mooney asm volatile("": : :"memory"); 43*d2f938fdSPatrick Mooney } 44*d2f938fdSPatrick Mooney 45*d2f938fdSPatrick Mooney void start(void)46*d2f938fdSPatrick Mooneystart(void) 47*d2f938fdSPatrick Mooney { 48*d2f938fdSPatrick Mooney uint64_t base = rdmsr(MSR_APICBASE); 49*d2f938fdSPatrick Mooney if ((base & APICBASE_X2APIC) != 0) { 50*d2f938fdSPatrick Mooney /* bail if the host has enabled x2apic for us */ 51*d2f938fdSPatrick Mooney outb(IOP_TEST_RESULT, TEST_RESULT_FAIL); 52*d2f938fdSPatrick Mooney } 53*d2f938fdSPatrick Mooney 54*d2f938fdSPatrick Mooney /* Access the "normal" register offsets */ 55*d2f938fdSPatrick Mooney for (uint_t reg = 0; reg < 0x1000; reg += 16) { 56*d2f938fdSPatrick Mooney uint32_t val; 57*d2f938fdSPatrick Mooney 58*d2f938fdSPatrick Mooney /* 59*d2f938fdSPatrick Mooney * This ignores the fact that some register offsets are reserved 60*d2f938fdSPatrick Mooney * (such as 0x3a0-0x3d0 and 0x3f0-0xff0) while others may be 61*d2f938fdSPatrick Mooney * read-only or write-only. For the time being, we know that 62*d2f938fdSPatrick Mooney * the emulation in bhyve will not emit errors or faults for 63*d2f938fdSPatrick Mooney * such indiscretions committed via MMIO. 64*d2f938fdSPatrick Mooney */ 65*d2f938fdSPatrick Mooney val = read_vlapic(reg); 66*d2f938fdSPatrick Mooney write_vlapic(reg, val); 67*d2f938fdSPatrick Mooney } 68*d2f938fdSPatrick Mooney 69*d2f938fdSPatrick Mooney /* 70*d2f938fdSPatrick Mooney * Scan through byte-wise, even though such behavior is undefined as far 71*d2f938fdSPatrick Mooney * as a to-specification LAPIC is concerned. 72*d2f938fdSPatrick Mooney */ 73*d2f938fdSPatrick Mooney for (uint_t off = 0; off < 0x1000; off++) { 74*d2f938fdSPatrick Mooney volatile uint8_t *ptr = (uint8_t *)(MMIO_LAPIC_BASE + off); 75*d2f938fdSPatrick Mooney 76*d2f938fdSPatrick Mooney uint8_t val; 77*d2f938fdSPatrick Mooney 78*d2f938fdSPatrick Mooney val = *ptr; 79*d2f938fdSPatrick Mooney barrier(); 80*d2f938fdSPatrick Mooney *ptr = val; 81*d2f938fdSPatrick Mooney } 82*d2f938fdSPatrick Mooney 83*d2f938fdSPatrick Mooney /* If we made it this far without an exception, it is a win */ 84*d2f938fdSPatrick Mooney outb(IOP_TEST_RESULT, TEST_RESULT_PASS); 85*d2f938fdSPatrick Mooney } 86