1*fdd8201dSApple OSS Distributions // Do not include system headers in this file. Code in this file needs to be
2*fdd8201dSApple OSS Distributions // self-contained, as it runs in a VM.
3*fdd8201dSApple OSS Distributions #include "hvtest_x86_guest.h"
4*fdd8201dSApple OSS Distributions #include <stdbool.h>
5*fdd8201dSApple OSS Distributions #include <stdatomic.h>
6*fdd8201dSApple OSS Distributions
7*fdd8201dSApple OSS Distributions #define VMCALL(x) __asm__("vmcall" : : "a" ((x)) :)
8*fdd8201dSApple OSS Distributions
9*fdd8201dSApple OSS Distributions void
simple_long_mode_vcpu_entry(uint64_t arg)10*fdd8201dSApple OSS Distributions simple_long_mode_vcpu_entry(uint64_t arg)
11*fdd8201dSApple OSS Distributions {
12*fdd8201dSApple OSS Distributions VMCALL(arg + 0x23456);
13*fdd8201dSApple OSS Distributions
14*fdd8201dSApple OSS Distributions while (true) {
15*fdd8201dSApple OSS Distributions }
16*fdd8201dSApple OSS Distributions }
17*fdd8201dSApple OSS Distributions
18*fdd8201dSApple OSS Distributions void
smp_vcpu_entry(uint64_t arg)19*fdd8201dSApple OSS Distributions smp_vcpu_entry(uint64_t arg)
20*fdd8201dSApple OSS Distributions {
21*fdd8201dSApple OSS Distributions // Performing this atomic operation on the same memory on all VCPUs confirms
22*fdd8201dSApple OSS Distributions // that they are running in the same IPA space, and that the space is
23*fdd8201dSApple OSS Distributions // shareable.
24*fdd8201dSApple OSS Distributions atomic_uint *count = (atomic_uint *)arg;
25*fdd8201dSApple OSS Distributions
26*fdd8201dSApple OSS Distributions VMCALL(atomic_fetch_add_explicit(count, 1,
27*fdd8201dSApple OSS Distributions memory_order_relaxed));
28*fdd8201dSApple OSS Distributions
29*fdd8201dSApple OSS Distributions while (true) {
30*fdd8201dSApple OSS Distributions }
31*fdd8201dSApple OSS Distributions }
32*fdd8201dSApple OSS Distributions
33*fdd8201dSApple OSS Distributions __unused static inline uint64_t
rdmsr(uint64_t msr)34*fdd8201dSApple OSS Distributions rdmsr(uint64_t msr)
35*fdd8201dSApple OSS Distributions {
36*fdd8201dSApple OSS Distributions uint32_t idx = (uint32_t)msr;
37*fdd8201dSApple OSS Distributions uint32_t outhi, outlo;
38*fdd8201dSApple OSS Distributions
39*fdd8201dSApple OSS Distributions __asm__("rdmsr" : "=d"(outhi), "=a"(outlo) : "c"(idx));
40*fdd8201dSApple OSS Distributions
41*fdd8201dSApple OSS Distributions return ((uint64_t)outhi << 32) | outlo;
42*fdd8201dSApple OSS Distributions }
43*fdd8201dSApple OSS Distributions
44*fdd8201dSApple OSS Distributions static inline void
wrmsr(uint64_t msr,uint64_t value)45*fdd8201dSApple OSS Distributions wrmsr(uint64_t msr, uint64_t value)
46*fdd8201dSApple OSS Distributions {
47*fdd8201dSApple OSS Distributions uint32_t idx = (uint32_t)msr;
48*fdd8201dSApple OSS Distributions uint32_t inhi = (uint32_t)((value & 0xffffffff00000000UL) >> 32);
49*fdd8201dSApple OSS Distributions uint32_t inlo = (uint32_t)(value & 0xffffffffUL);
50*fdd8201dSApple OSS Distributions
51*fdd8201dSApple OSS Distributions __asm__("wrmsr" : : "d"(inhi),"a"(inlo),"c"(idx));
52*fdd8201dSApple OSS Distributions }
53*fdd8201dSApple OSS Distributions
54*fdd8201dSApple OSS Distributions void
native_msr_vcpu_entry(uint64_t arg __unused)55*fdd8201dSApple OSS Distributions native_msr_vcpu_entry(uint64_t arg __unused)
56*fdd8201dSApple OSS Distributions {
57*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_STAR, 0x123456789abcdef0);
58*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_LSTAR, 0x123456789abc);
59*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_CSTAR, 0x123456789abc);
60*fdd8201dSApple OSS Distributions
61*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_FMASK, 0x123456789abcdef0);
62*fdd8201dSApple OSS Distributions
63*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_TSC_AUX, 0x123);
64*fdd8201dSApple OSS Distributions
65*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_SYSENTER_CS, 0xffff);
66*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_SYSENTER_ESP, 0x123456789abc);
67*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_SYSENTER_EIP, 0x123456789abc);
68*fdd8201dSApple OSS Distributions
69*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_FS_BASE, 0x123456789abc);
70*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_GS_BASE, 0x123456789abc);
71*fdd8201dSApple OSS Distributions wrmsr(MSR_IA32_KERNEL_GS_BASE, 0x123456789abc);
72*fdd8201dSApple OSS Distributions
73*fdd8201dSApple OSS Distributions VMCALL(0x23456);
74*fdd8201dSApple OSS Distributions
75*fdd8201dSApple OSS Distributions while (true) {
76*fdd8201dSApple OSS Distributions }
77*fdd8201dSApple OSS Distributions }
78