Commit 59d21d67 authored by Vineeth Pillai's avatar Vineeth Pillai Committed by Paolo Bonzini

KVM: SVM: Software reserved fields

SVM added support for certain reserved fields to be used by
software or hypervisor. Add the following reserved fields:
  - VMCB offset 0x3e0 - 0x3ff
  - Clean bit 31
  - SVM intercept exit code 0xf0000000

Later patches will make use of this for supporting Hyper-V
nested virtualization enhancements.
Signed-off-by: default avatarVineeth Pillai <viremana@linux.microsoft.com>
Message-Id: <a1f17a43a8e9e751a1a9cc0281649d71bdbf721b.1622730232.git.viremana@linux.microsoft.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 3c86c0d3
...@@ -156,6 +156,12 @@ struct __attribute__ ((__packed__)) vmcb_control_area { ...@@ -156,6 +156,12 @@ struct __attribute__ ((__packed__)) vmcb_control_area {
u64 avic_physical_id; /* Offset 0xf8 */ u64 avic_physical_id; /* Offset 0xf8 */
u8 reserved_7[8]; u8 reserved_7[8];
u64 vmsa_pa; /* Used for an SEV-ES guest */ u64 vmsa_pa; /* Used for an SEV-ES guest */
u8 reserved_8[720];
/*
* Offset 0x3e0, 32 bytes reserved
* for use by hypervisor/software.
*/
u8 reserved_sw[32];
}; };
...@@ -314,7 +320,7 @@ struct ghcb { ...@@ -314,7 +320,7 @@ struct ghcb {
#define EXPECTED_VMCB_SAVE_AREA_SIZE 1032 #define EXPECTED_VMCB_SAVE_AREA_SIZE 1032
#define EXPECTED_VMCB_CONTROL_AREA_SIZE 272 #define EXPECTED_VMCB_CONTROL_AREA_SIZE 1024
#define EXPECTED_GHCB_SIZE PAGE_SIZE #define EXPECTED_GHCB_SIZE PAGE_SIZE
static inline void __unused_size_checks(void) static inline void __unused_size_checks(void)
...@@ -326,7 +332,6 @@ static inline void __unused_size_checks(void) ...@@ -326,7 +332,6 @@ static inline void __unused_size_checks(void)
struct vmcb { struct vmcb {
struct vmcb_control_area control; struct vmcb_control_area control;
u8 reserved_control[1024 - sizeof(struct vmcb_control_area)];
struct vmcb_save_area save; struct vmcb_save_area save;
} __packed; } __packed;
......
...@@ -110,6 +110,9 @@ ...@@ -110,6 +110,9 @@
#define SVM_VMGEXIT_GET_AP_JUMP_TABLE 1 #define SVM_VMGEXIT_GET_AP_JUMP_TABLE 1
#define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff #define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff
/* Exit code reserved for hypervisor/software use */
#define SVM_EXIT_SW 0xf0000000
#define SVM_EXIT_ERR -1 #define SVM_EXIT_ERR -1
#define SVM_EXIT_REASONS \ #define SVM_EXIT_REASONS \
......
...@@ -31,6 +31,11 @@ ...@@ -31,6 +31,11 @@
extern u32 msrpm_offsets[MSRPM_OFFSETS] __read_mostly; extern u32 msrpm_offsets[MSRPM_OFFSETS] __read_mostly;
extern bool npt_enabled; extern bool npt_enabled;
/*
* Clean bits in VMCB.
* VMCB_ALL_CLEAN_MASK might also need to
* be updated if this enum is modified.
*/
enum { enum {
VMCB_INTERCEPTS, /* Intercept vectors, TSC offset, VMCB_INTERCEPTS, /* Intercept vectors, TSC offset,
pause filter count */ pause filter count */
...@@ -48,9 +53,17 @@ enum { ...@@ -48,9 +53,17 @@ enum {
* AVIC PHYSICAL_TABLE pointer, * AVIC PHYSICAL_TABLE pointer,
* AVIC LOGICAL_TABLE pointer * AVIC LOGICAL_TABLE pointer
*/ */
VMCB_DIRTY_MAX, VMCB_SW = 31, /* Reserved for hypervisor/software use */
}; };
#define VMCB_ALL_CLEAN_MASK ( \
(1U << VMCB_INTERCEPTS) | (1U << VMCB_PERM_MAP) | \
(1U << VMCB_ASID) | (1U << VMCB_INTR) | \
(1U << VMCB_NPT) | (1U << VMCB_CR) | (1U << VMCB_DR) | \
(1U << VMCB_DT) | (1U << VMCB_SEG) | (1U << VMCB_CR2) | \
(1U << VMCB_LBR) | (1U << VMCB_AVIC) | \
(1U << VMCB_SW))
/* TPR and CR2 are always written before VMRUN */ /* TPR and CR2 are always written before VMRUN */
#define VMCB_ALWAYS_DIRTY_MASK ((1U << VMCB_INTR) | (1U << VMCB_CR2)) #define VMCB_ALWAYS_DIRTY_MASK ((1U << VMCB_INTR) | (1U << VMCB_CR2))
...@@ -237,7 +250,7 @@ static inline void vmcb_mark_all_dirty(struct vmcb *vmcb) ...@@ -237,7 +250,7 @@ static inline void vmcb_mark_all_dirty(struct vmcb *vmcb)
static inline void vmcb_mark_all_clean(struct vmcb *vmcb) static inline void vmcb_mark_all_clean(struct vmcb *vmcb)
{ {
vmcb->control.clean = ((1 << VMCB_DIRTY_MAX) - 1) vmcb->control.clean = VMCB_ALL_CLEAN_MASK
& ~VMCB_ALWAYS_DIRTY_MASK; & ~VMCB_ALWAYS_DIRTY_MASK;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment