mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 08:34:47 +10:00 
			
		
		
		
	We only have to save/restore MSR_GS_BASE on every VMEXIT. The rest can be saved/restored when we leave the VCPU. Since we don't emulate the DEBUGCTL MSRs and the guest cannot write to them, we don't have to worry about saving/restoring them at all. This shaves a whopping 40% off raw vmexit costs on AMD. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
		
			
				
	
	
		
			43 lines
		
	
	
		
			857 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			857 B
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef __KVM_SVM_H
 | 
						|
#define __KVM_SVM_H
 | 
						|
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <linux/types.h>
 | 
						|
#include <linux/list.h>
 | 
						|
#include <asm/msr.h>
 | 
						|
 | 
						|
#include "svm.h"
 | 
						|
#include "kvm.h"
 | 
						|
 | 
						|
static const u32 host_save_user_msrs[] = {
 | 
						|
#ifdef CONFIG_X86_64
 | 
						|
	MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE,
 | 
						|
	MSR_FS_BASE,
 | 
						|
#endif
 | 
						|
	MSR_IA32_SYSENTER_CS, MSR_IA32_SYSENTER_ESP, MSR_IA32_SYSENTER_EIP,
 | 
						|
};
 | 
						|
 | 
						|
#define NR_HOST_SAVE_USER_MSRS ARRAY_SIZE(host_save_user_msrs)
 | 
						|
#define NUM_DB_REGS 4
 | 
						|
 | 
						|
struct vcpu_svm {
 | 
						|
	struct vmcb *vmcb;
 | 
						|
	unsigned long vmcb_pa;
 | 
						|
	struct svm_cpu_data *svm_data;
 | 
						|
	uint64_t asid_generation;
 | 
						|
 | 
						|
	unsigned long db_regs[NUM_DB_REGS];
 | 
						|
 | 
						|
	u64 next_rip;
 | 
						|
 | 
						|
	u64 host_user_msrs[NR_HOST_SAVE_USER_MSRS];
 | 
						|
	u64 host_gs_base;
 | 
						|
	unsigned long host_cr2;
 | 
						|
	unsigned long host_db_regs[NUM_DB_REGS];
 | 
						|
	unsigned long host_dr6;
 | 
						|
	unsigned long host_dr7;
 | 
						|
};
 | 
						|
 | 
						|
#endif
 | 
						|
 |