1*98fb3357SAndrey Smetanin #ifndef __HYPERV_H 2*98fb3357SAndrey Smetanin #define __HYPERV_H 3*98fb3357SAndrey Smetanin 4*98fb3357SAndrey Smetanin #include "libcflat.h" 5*98fb3357SAndrey Smetanin #include "processor.h" 6*98fb3357SAndrey Smetanin #include "io.h" 7*98fb3357SAndrey Smetanin 8*98fb3357SAndrey Smetanin #define HYPERV_CPUID_FEATURES 0x40000003 9*98fb3357SAndrey Smetanin 10*98fb3357SAndrey Smetanin #define HV_X64_MSR_SYNIC_AVAILABLE (1 << 2) 11*98fb3357SAndrey Smetanin 12*98fb3357SAndrey Smetanin /* Define synthetic interrupt controller model specific registers. */ 13*98fb3357SAndrey Smetanin #define HV_X64_MSR_SCONTROL 0x40000080 14*98fb3357SAndrey Smetanin #define HV_X64_MSR_SVERSION 0x40000081 15*98fb3357SAndrey Smetanin #define HV_X64_MSR_SIEFP 0x40000082 16*98fb3357SAndrey Smetanin #define HV_X64_MSR_SIMP 0x40000083 17*98fb3357SAndrey Smetanin #define HV_X64_MSR_EOM 0x40000084 18*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT0 0x40000090 19*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT1 0x40000091 20*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT2 0x40000092 21*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT3 0x40000093 22*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT4 0x40000094 23*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT5 0x40000095 24*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT6 0x40000096 25*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT7 0x40000097 26*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT8 0x40000098 27*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT9 0x40000099 28*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT10 0x4000009A 29*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT11 0x4000009B 30*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT12 0x4000009C 31*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT13 0x4000009D 32*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT14 0x4000009E 33*98fb3357SAndrey Smetanin #define HV_X64_MSR_SINT15 0x4000009F 34*98fb3357SAndrey Smetanin 35*98fb3357SAndrey Smetanin #define HV_SYNIC_CONTROL_ENABLE (1ULL << 0) 36*98fb3357SAndrey Smetanin #define HV_SYNIC_SIMP_ENABLE (1ULL << 0) 37*98fb3357SAndrey Smetanin #define HV_SYNIC_SIEFP_ENABLE (1ULL << 0) 38*98fb3357SAndrey Smetanin #define HV_SYNIC_SINT_MASKED (1ULL << 16) 39*98fb3357SAndrey Smetanin #define HV_SYNIC_SINT_AUTO_EOI (1ULL << 17) 40*98fb3357SAndrey Smetanin #define HV_SYNIC_SINT_VECTOR_MASK (0xFF) 41*98fb3357SAndrey Smetanin #define HV_SYNIC_SINT_COUNT 16 42*98fb3357SAndrey Smetanin 43*98fb3357SAndrey Smetanin enum { 44*98fb3357SAndrey Smetanin HV_TEST_DEV_SINT_ROUTE_CREATE = 1, 45*98fb3357SAndrey Smetanin HV_TEST_DEV_SINT_ROUTE_DESTROY, 46*98fb3357SAndrey Smetanin HV_TEST_DEV_SINT_ROUTE_SET_SINT 47*98fb3357SAndrey Smetanin }; 48*98fb3357SAndrey Smetanin 49*98fb3357SAndrey Smetanin static inline bool synic_supported(void) 50*98fb3357SAndrey Smetanin { 51*98fb3357SAndrey Smetanin return cpuid(HYPERV_CPUID_FEATURES).a & HV_X64_MSR_SYNIC_AVAILABLE; 52*98fb3357SAndrey Smetanin } 53*98fb3357SAndrey Smetanin 54*98fb3357SAndrey Smetanin void synic_sint_create(int vcpu, int sint, int vec, bool auto_eoi); 55*98fb3357SAndrey Smetanin void synic_sint_set(int vcpu, int sint); 56*98fb3357SAndrey Smetanin void synic_sint_destroy(int vcpu, int sint); 57*98fb3357SAndrey Smetanin 58*98fb3357SAndrey Smetanin #endif 59