On 2013-08-05 10:07, Gleb Natapov wrote: > From: Yang Zhang <yang.z.zhang@xxxxxxxxx> > > Inject nEPT fault to L1 guest. This patch is original from Xinhao. > > Reviewed-by: Xiao Guangrong <xiaoguangrong@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Jun Nakajima <jun.nakajima@xxxxxxxxx> > Signed-off-by: Xinhao Xu <xinhao.xu@xxxxxxxxx> > Signed-off-by: Yang Zhang <yang.z.zhang@xxxxxxxxx> > Signed-off-by: Gleb Natapov <gleb@xxxxxxxxxx> > --- > arch/x86/include/asm/kvm_host.h | 4 +++ > arch/x86/kvm/mmu.c | 61 ++++++++++++++++++++++++++++++++------- > arch/x86/kvm/paging_tmpl.h | 25 ++++++++++++++-- > arch/x86/kvm/vmx.c | 19 ++++++++++++ > 4 files changed, 95 insertions(+), 14 deletions(-) > > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h > index 531f47c..58a17c0 100644 > --- a/arch/x86/include/asm/kvm_host.h > +++ b/arch/x86/include/asm/kvm_host.h > @@ -286,6 +286,7 @@ struct kvm_mmu { > u64 *pae_root; > u64 *lm_root; > u64 rsvd_bits_mask[2][4]; > + u64 bad_mt_xwr; > > /* > * Bitmap: bit set = last pte in walk > @@ -512,6 +513,9 @@ struct kvm_vcpu_arch { > * instruction. > */ > bool write_fault_to_shadow_pgtable; > + > + /* set at EPT violation at this point */ > + unsigned long exit_qualification; > }; > > struct kvm_lpage_info { > diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c > index a512ecf..f2d982d 100644 > --- a/arch/x86/kvm/mmu.c > +++ b/arch/x86/kvm/mmu.c > @@ -3519,6 +3519,8 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, > int maxphyaddr = cpuid_maxphyaddr(vcpu); > u64 exb_bit_rsvd = 0; > > + context->bad_mt_xwr = 0; > + > if (!context->nx) > exb_bit_rsvd = rsvd_bits(63, 63); > switch (context->root_level) { > @@ -3574,7 +3576,40 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, > } > } > > -static void update_permission_bitmask(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu) > +static void reset_rsvds_bits_mask_ept(struct kvm_vcpu *vcpu, > + struct kvm_mmu *context, bool execonly) > +{ > + int maxphyaddr = cpuid_maxphyaddr(vcpu); > + int pte; > + > + context->rsvd_bits_mask[0][3] = > + rsvd_bits(maxphyaddr, 51) | rsvd_bits(3, 7); > + context->rsvd_bits_mask[0][2] = > + rsvd_bits(maxphyaddr, 51) | rsvd_bits(3, 6); > + context->rsvd_bits_mask[0][1] = > + rsvd_bits(maxphyaddr, 51) | rsvd_bits(3, 6); > + context->rsvd_bits_mask[0][0] = rsvd_bits(maxphyaddr, 51); > + > + /* large page */ > + context->rsvd_bits_mask[1][3] = context->rsvd_bits_mask[0][3]; > + context->rsvd_bits_mask[1][2] = > + rsvd_bits(maxphyaddr, 51) | rsvd_bits(12, 29); > + context->rsvd_bits_mask[1][1] = > + rsvd_bits(maxphyaddr, 51) | rsvd_bits(12, 20); > + context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[0][0]; > + Here is a whitespace error (says git am). Jan
Attachment:
signature.asc
Description: OpenPGP digital signature