335 lines
9.7 KiB
Diff
335 lines
9.7 KiB
Diff
From 4a8e202ddd9bde207a5a9caaee6e0f06399a3052 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Mon, 22 Jul 2019 18:22:13 +0100
|
|
Subject: [PATCH 32/39] linux-headers: synchronize generic and x86 KVM headers
|
|
with upstream [rhel-only]
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
Message-id: <20190722182220.19374-12-pbonzini@redhat.com>
|
|
Patchwork-id: 89628
|
|
O-Subject: [RHEL-8.1.0 PATCH qemu-kvm v3 11/18] linux-headers: synchronize generic and x86 KVM headers with upstream [rhel-only]
|
|
Bugzilla: 1689269
|
|
RH-Acked-by: Peter Xu <zhexu@redhat.com>
|
|
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
|
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
|
From: Liran Alon <liran.alon@oracle.com>
|
|
|
|
Relevant files copied from upstream QEMU at commit
|
|
1d33bea4d013104f01d1c4badc4c670e55c16cca.
|
|
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
linux-headers/asm-x86/kvm.h | 76 ++++++++++++++++++++++++++++++++++++--
|
|
linux-headers/linux/kvm.h | 89 +++++++++++++++++++++++++++++++++++++++++++--
|
|
2 files changed, 158 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h
|
|
index dcf4dc9..6e7dd79 100644
|
|
--- a/linux-headers/asm-x86/kvm.h
|
|
+++ b/linux-headers/asm-x86/kvm.h
|
|
@@ -288,6 +288,7 @@ struct kvm_reinject_control {
|
|
#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002
|
|
#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004
|
|
#define KVM_VCPUEVENT_VALID_SMM 0x00000008
|
|
+#define KVM_VCPUEVENT_VALID_PAYLOAD 0x00000010
|
|
|
|
/* Interrupt shadow states */
|
|
#define KVM_X86_SHADOW_INT_MOV_SS 0x01
|
|
@@ -299,7 +300,7 @@ struct kvm_vcpu_events {
|
|
__u8 injected;
|
|
__u8 nr;
|
|
__u8 has_error_code;
|
|
- __u8 pad;
|
|
+ __u8 pending;
|
|
__u32 error_code;
|
|
} exception;
|
|
struct {
|
|
@@ -322,7 +323,9 @@ struct kvm_vcpu_events {
|
|
__u8 smm_inside_nmi;
|
|
__u8 latched_init;
|
|
} smi;
|
|
- __u32 reserved[9];
|
|
+ __u8 reserved[27];
|
|
+ __u8 exception_has_payload;
|
|
+ __u64 exception_payload;
|
|
};
|
|
|
|
/* for KVM_GET/SET_DEBUGREGS */
|
|
@@ -354,12 +357,79 @@ struct kvm_xcrs {
|
|
__u64 padding[16];
|
|
};
|
|
|
|
-/* definition of registers in kvm_run */
|
|
+#define KVM_SYNC_X86_REGS (1UL << 0)
|
|
+#define KVM_SYNC_X86_SREGS (1UL << 1)
|
|
+#define KVM_SYNC_X86_EVENTS (1UL << 2)
|
|
+
|
|
+#define KVM_SYNC_X86_VALID_FIELDS \
|
|
+ (KVM_SYNC_X86_REGS| \
|
|
+ KVM_SYNC_X86_SREGS| \
|
|
+ KVM_SYNC_X86_EVENTS)
|
|
+
|
|
+/* kvm_sync_regs struct included by kvm_run struct */
|
|
struct kvm_sync_regs {
|
|
+ /* Members of this structure are potentially malicious.
|
|
+ * Care must be taken by code reading, esp. interpreting,
|
|
+ * data fields from them inside KVM to prevent TOCTOU and
|
|
+ * double-fetch types of vulnerabilities.
|
|
+ */
|
|
+ struct kvm_regs regs;
|
|
+ struct kvm_sregs sregs;
|
|
+ struct kvm_vcpu_events events;
|
|
};
|
|
|
|
#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
|
|
#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
|
|
#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2)
|
|
+#define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3)
|
|
+
|
|
+#define KVM_STATE_NESTED_FORMAT_VMX 0
|
|
+#define KVM_STATE_NESTED_FORMAT_SVM 1
|
|
+
|
|
+#define KVM_STATE_NESTED_GUEST_MODE 0x00000001
|
|
+#define KVM_STATE_NESTED_RUN_PENDING 0x00000002
|
|
+#define KVM_STATE_NESTED_EVMCS 0x00000004
|
|
+
|
|
+#define KVM_STATE_NESTED_VMX_VMCS_SIZE 0x1000
|
|
+
|
|
+#define KVM_STATE_NESTED_SMM_GUEST_MODE 0x00000001
|
|
+#define KVM_STATE_NESTED_SMM_VMXON 0x00000002
|
|
+
|
|
+struct kvm_vmx_nested_state_data {
|
|
+ __u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
|
|
+ __u8 shadow_vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
|
|
+};
|
|
+
|
|
+struct kvm_vmx_nested_state_hdr {
|
|
+ __u64 vmxon_pa;
|
|
+ __u64 vmcs12_pa;
|
|
+
|
|
+ struct {
|
|
+ __u16 flags;
|
|
+ } smm;
|
|
+};
|
|
+
|
|
+/* for KVM_CAP_NESTED_STATE */
|
|
+struct kvm_nested_state {
|
|
+ __u16 flags;
|
|
+ __u16 format;
|
|
+ __u32 size;
|
|
+
|
|
+ union {
|
|
+ struct kvm_vmx_nested_state_hdr vmx;
|
|
+
|
|
+ /* Pad the header to 128 bytes. */
|
|
+ __u8 pad[120];
|
|
+ } hdr;
|
|
+
|
|
+ /*
|
|
+ * Define data region as 0 bytes to preserve backwards-compatability
|
|
+ * to old definition of kvm_nested_state in order to avoid changing
|
|
+ * KVM_{GET,PUT}_NESTED_STATE ioctl values.
|
|
+ */
|
|
+ union {
|
|
+ struct kvm_vmx_nested_state_data vmx[0];
|
|
+ } data;
|
|
+};
|
|
|
|
#endif /* _ASM_X86_KVM_H */
|
|
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
|
|
index 8be1232..c8423e7 100644
|
|
--- a/linux-headers/linux/kvm.h
|
|
+++ b/linux-headers/linux/kvm.h
|
|
@@ -396,6 +396,10 @@ struct kvm_run {
|
|
char padding[256];
|
|
};
|
|
|
|
+ /* 2048 is the size of the char array used to bound/pad the size
|
|
+ * of the union that holds sync regs.
|
|
+ */
|
|
+ #define SYNC_REGS_SIZE_BYTES 2048
|
|
/*
|
|
* shared registers between kvm and userspace.
|
|
* kvm_valid_regs specifies the register classes set by the host
|
|
@@ -407,7 +411,7 @@ struct kvm_run {
|
|
__u64 kvm_dirty_regs;
|
|
union {
|
|
struct kvm_sync_regs regs;
|
|
- char padding[2048];
|
|
+ char padding[SYNC_REGS_SIZE_BYTES];
|
|
} s;
|
|
};
|
|
|
|
@@ -416,13 +420,19 @@ struct kvm_run {
|
|
struct kvm_coalesced_mmio_zone {
|
|
__u64 addr;
|
|
__u32 size;
|
|
- __u32 pad;
|
|
+ union {
|
|
+ __u32 pad;
|
|
+ __u32 pio;
|
|
+ };
|
|
};
|
|
|
|
struct kvm_coalesced_mmio {
|
|
__u64 phys_addr;
|
|
__u32 len;
|
|
- __u32 pad;
|
|
+ union {
|
|
+ __u32 pad;
|
|
+ __u32 pio;
|
|
+ };
|
|
__u8 data[8];
|
|
};
|
|
|
|
@@ -482,6 +492,17 @@ struct kvm_dirty_log {
|
|
};
|
|
};
|
|
|
|
+/* for KVM_CLEAR_DIRTY_LOG */
|
|
+struct kvm_clear_dirty_log {
|
|
+ __u32 slot;
|
|
+ __u32 num_pages;
|
|
+ __u64 first_page;
|
|
+ union {
|
|
+ void *dirty_bitmap; /* one bit per page */
|
|
+ __u64 padding2;
|
|
+ };
|
|
+};
|
|
+
|
|
/* for KVM_SET_SIGNAL_MASK */
|
|
struct kvm_signal_mask {
|
|
__u32 len;
|
|
@@ -672,6 +693,13 @@ struct kvm_ioeventfd {
|
|
__u8 pad[36];
|
|
};
|
|
|
|
+#define KVM_X86_DISABLE_EXITS_MWAIT (1 << 0)
|
|
+#define KVM_X86_DISABLE_EXITS_HLT (1 << 1)
|
|
+#define KVM_X86_DISABLE_EXITS_PAUSE (1 << 2)
|
|
+#define KVM_X86_DISABLE_VALID_EXITS (KVM_X86_DISABLE_EXITS_MWAIT | \
|
|
+ KVM_X86_DISABLE_EXITS_HLT | \
|
|
+ KVM_X86_DISABLE_EXITS_PAUSE)
|
|
+
|
|
/* for KVM_ENABLE_CAP */
|
|
struct kvm_enable_cap {
|
|
/* in */
|
|
@@ -708,6 +736,7 @@ struct kvm_ppc_one_seg_page_size {
|
|
|
|
#define KVM_PPC_PAGE_SIZES_REAL 0x00000001
|
|
#define KVM_PPC_1T_SEGMENTS 0x00000002
|
|
+#define KVM_PPC_NO_HASH 0x00000004
|
|
|
|
struct kvm_ppc_smmu_info {
|
|
__u64 flags;
|
|
@@ -740,6 +769,15 @@ struct kvm_ppc_resize_hpt {
|
|
#define KVM_S390_SIE_PAGE_OFFSET 1
|
|
|
|
/*
|
|
+ * On arm64, machine type can be used to request the physical
|
|
+ * address size for the VM. Bits[7-0] are reserved for the guest
|
|
+ * PA size shift (i.e, log2(PA_Size)). For backward compatibility,
|
|
+ * value 0 implies the default IPA size, 40bits.
|
|
+ */
|
|
+#define KVM_VM_TYPE_ARM_IPA_SIZE_MASK 0xffULL
|
|
+#define KVM_VM_TYPE_ARM_IPA_SIZE(x) \
|
|
+ ((x) & KVM_VM_TYPE_ARM_IPA_SIZE_MASK)
|
|
+/*
|
|
* ioctls for /dev/kvm fds:
|
|
*/
|
|
#define KVM_GET_API_VERSION _IO(KVMIO, 0x00)
|
|
@@ -925,7 +963,7 @@ struct kvm_ppc_resize_hpt {
|
|
#define KVM_CAP_S390_GS 140
|
|
#define KVM_CAP_S390_AIS 141
|
|
#define KVM_CAP_SPAPR_TCE_VFIO 142
|
|
-#define KVM_CAP_X86_GUEST_MWAIT 143
|
|
+#define KVM_CAP_X86_DISABLE_EXITS 143
|
|
#define KVM_CAP_ARM_USER_IRQ 144
|
|
#define KVM_CAP_S390_CMMA_MIGRATION 145
|
|
#define KVM_CAP_PPC_FWNMI 146
|
|
@@ -936,11 +974,25 @@ struct kvm_ppc_resize_hpt {
|
|
#define KVM_CAP_PPC_GET_CPU_CHAR 151
|
|
#define KVM_CAP_S390_BPB 152
|
|
#define KVM_CAP_GET_MSR_FEATURES 153
|
|
+#define KVM_CAP_HYPERV_EVENTFD 154
|
|
+#define KVM_CAP_HYPERV_TLBFLUSH 155
|
|
#define KVM_CAP_S390_HPAGE_1M 156
|
|
#define KVM_CAP_NESTED_STATE 157
|
|
#define KVM_CAP_ARM_INJECT_SERROR_ESR 158
|
|
#define KVM_CAP_MSR_PLATFORM_INFO 159
|
|
#define KVM_CAP_PPC_NESTED_HV 160
|
|
+#define KVM_CAP_HYPERV_SEND_IPI 161
|
|
+#define KVM_CAP_COALESCED_PIO 162
|
|
+#define KVM_CAP_HYPERV_ENLIGHTENED_VMCS 163
|
|
+#define KVM_CAP_EXCEPTION_PAYLOAD 164
|
|
+#define KVM_CAP_ARM_VM_IPA_SIZE 165
|
|
+#define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT 166 /* Obsolete */
|
|
+#define KVM_CAP_HYPERV_CPUID 167
|
|
+#define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 168
|
|
+#define KVM_CAP_PPC_IRQ_XIVE 169
|
|
+#define KVM_CAP_ARM_SVE 170
|
|
+#define KVM_CAP_ARM_PTRAUTH_ADDRESS 171
|
|
+#define KVM_CAP_ARM_PTRAUTH_GENERIC 172
|
|
|
|
#ifdef KVM_CAP_IRQ_ROUTING
|
|
|
|
@@ -1098,6 +1150,7 @@ struct kvm_dirty_tlb {
|
|
#define KVM_REG_SIZE_U256 0x0050000000000000ULL
|
|
#define KVM_REG_SIZE_U512 0x0060000000000000ULL
|
|
#define KVM_REG_SIZE_U1024 0x0070000000000000ULL
|
|
+#define KVM_REG_SIZE_U2048 0x0080000000000000ULL
|
|
|
|
struct kvm_reg_list {
|
|
__u64 n; /* number of regs */
|
|
@@ -1164,6 +1217,8 @@ enum kvm_device_type {
|
|
#define KVM_DEV_TYPE_ARM_VGIC_V3 KVM_DEV_TYPE_ARM_VGIC_V3
|
|
KVM_DEV_TYPE_ARM_VGIC_ITS,
|
|
#define KVM_DEV_TYPE_ARM_VGIC_ITS KVM_DEV_TYPE_ARM_VGIC_ITS
|
|
+ KVM_DEV_TYPE_XIVE,
|
|
+#define KVM_DEV_TYPE_XIVE KVM_DEV_TYPE_XIVE
|
|
KVM_DEV_TYPE_MAX,
|
|
};
|
|
|
|
@@ -1380,6 +1435,22 @@ struct kvm_enc_region {
|
|
#define KVM_MEMORY_ENCRYPT_REG_REGION _IOR(KVMIO, 0xbb, struct kvm_enc_region)
|
|
#define KVM_MEMORY_ENCRYPT_UNREG_REGION _IOR(KVMIO, 0xbc, struct kvm_enc_region)
|
|
|
|
+/* Available with KVM_CAP_HYPERV_EVENTFD */
|
|
+#define KVM_HYPERV_EVENTFD _IOW(KVMIO, 0xbd, struct kvm_hyperv_eventfd)
|
|
+
|
|
+/* Available with KVM_CAP_NESTED_STATE */
|
|
+#define KVM_GET_NESTED_STATE _IOWR(KVMIO, 0xbe, struct kvm_nested_state)
|
|
+#define KVM_SET_NESTED_STATE _IOW(KVMIO, 0xbf, struct kvm_nested_state)
|
|
+
|
|
+/* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */
|
|
+#define KVM_CLEAR_DIRTY_LOG _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log)
|
|
+
|
|
+/* Available with KVM_CAP_HYPERV_CPUID */
|
|
+#define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2)
|
|
+
|
|
+/* Available with KVM_CAP_ARM_SVE */
|
|
+#define KVM_ARM_VCPU_FINALIZE _IOW(KVMIO, 0xc2, int)
|
|
+
|
|
/* Secure Encrypted Virtualization command */
|
|
enum sev_cmd_id {
|
|
/* Guest initialization commands */
|
|
@@ -1520,4 +1591,14 @@ struct kvm_assigned_msix_entry {
|
|
#define KVM_ARM_DEV_EL1_PTIMER (1 << 1)
|
|
#define KVM_ARM_DEV_PMU (1 << 2)
|
|
|
|
+struct kvm_hyperv_eventfd {
|
|
+ __u32 conn_id;
|
|
+ __s32 fd;
|
|
+ __u32 flags;
|
|
+ __u32 padding[3];
|
|
+};
|
|
+
|
|
+#define KVM_HYPERV_CONN_ID_MASK 0x00ffffff
|
|
+#define KVM_HYPERV_EVENTFD_DEASSIGN (1 << 0)
|
|
+
|
|
#endif /* __LINUX_KVM_H */
|
|
--
|
|
1.8.3.1
|
|
|