xref: /kvm-unit-tests/x86/hyperv.h (revision 98fb335724f3c19116da720ce5b07f543f7d408a)
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