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: Vineeth Pillai <viremana@linux.microsoft.com> Message-Id: <a1f17a43a8e9e751a1a9cc0281649d71bdbf721b.1622730232.git.viremana@linux.microsoft.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3c86c0d3db
commit
59d21d67f3
@ -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 {
|
|||||||
|
|
||||||
|
|
||||||
#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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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 @@
|
|||||||
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 {
|
|||||||
* 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)
|
|||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user