mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 3 changed files with 25 additions and 4 deletions
				
			
		| 
						 | 
					@ -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 a new issue