mirror of https://gitee.com/openkylin/linux.git
KVM: x86: Mark GPRs dirty when written
When performing VMGEXIT processing for an SEV-ES guest, register values will be synced between KVM and the GHCB. Prepare for detecting when a GPR has been updated (marked dirty) in order to determine whether to sync the register to the GHCB. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Message-Id: <7ca2a1cdb61456f2fe9c64193e34d601e395c133.1607620209.git.thomas.lendacky@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
add5e2f045
commit
1c04d8c986
|
@ -9,34 +9,6 @@
|
||||||
(X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \
|
(X86_CR4_PVI | X86_CR4_DE | X86_CR4_PCE | X86_CR4_OSFXSR \
|
||||||
| X86_CR4_OSXMMEXCPT | X86_CR4_PGE | X86_CR4_TSD | X86_CR4_FSGSBASE)
|
| X86_CR4_OSXMMEXCPT | X86_CR4_PGE | X86_CR4_TSD | X86_CR4_FSGSBASE)
|
||||||
|
|
||||||
#define BUILD_KVM_GPR_ACCESSORS(lname, uname) \
|
|
||||||
static __always_inline unsigned long kvm_##lname##_read(struct kvm_vcpu *vcpu)\
|
|
||||||
{ \
|
|
||||||
return vcpu->arch.regs[VCPU_REGS_##uname]; \
|
|
||||||
} \
|
|
||||||
static __always_inline void kvm_##lname##_write(struct kvm_vcpu *vcpu, \
|
|
||||||
unsigned long val) \
|
|
||||||
{ \
|
|
||||||
vcpu->arch.regs[VCPU_REGS_##uname] = val; \
|
|
||||||
}
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rax, RAX)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rbx, RBX)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rcx, RCX)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rdx, RDX)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rbp, RBP)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rsi, RSI)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(rdi, RDI)
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r8, R8)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r9, R9)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r10, R10)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r11, R11)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r12, R12)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r13, R13)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r14, R14)
|
|
||||||
BUILD_KVM_GPR_ACCESSORS(r15, R15)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline bool kvm_register_is_available(struct kvm_vcpu *vcpu,
|
static inline bool kvm_register_is_available(struct kvm_vcpu *vcpu,
|
||||||
enum kvm_reg reg)
|
enum kvm_reg reg)
|
||||||
{
|
{
|
||||||
|
@ -62,6 +34,35 @@ static inline void kvm_register_mark_dirty(struct kvm_vcpu *vcpu,
|
||||||
__set_bit(reg, (unsigned long *)&vcpu->arch.regs_dirty);
|
__set_bit(reg, (unsigned long *)&vcpu->arch.regs_dirty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BUILD_KVM_GPR_ACCESSORS(lname, uname) \
|
||||||
|
static __always_inline unsigned long kvm_##lname##_read(struct kvm_vcpu *vcpu)\
|
||||||
|
{ \
|
||||||
|
return vcpu->arch.regs[VCPU_REGS_##uname]; \
|
||||||
|
} \
|
||||||
|
static __always_inline void kvm_##lname##_write(struct kvm_vcpu *vcpu, \
|
||||||
|
unsigned long val) \
|
||||||
|
{ \
|
||||||
|
vcpu->arch.regs[VCPU_REGS_##uname] = val; \
|
||||||
|
kvm_register_mark_dirty(vcpu, VCPU_REGS_##uname); \
|
||||||
|
}
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rax, RAX)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rbx, RBX)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rcx, RCX)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rdx, RDX)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rbp, RBP)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rsi, RSI)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(rdi, RDI)
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r8, R8)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r9, R9)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r10, R10)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r11, R11)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r12, R12)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r13, R13)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r14, R14)
|
||||||
|
BUILD_KVM_GPR_ACCESSORS(r15, R15)
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg)
|
static inline unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg)
|
||||||
{
|
{
|
||||||
if (WARN_ON_ONCE((unsigned int)reg >= NR_VCPU_REGS))
|
if (WARN_ON_ONCE((unsigned int)reg >= NR_VCPU_REGS))
|
||||||
|
|
Loading…
Reference in New Issue