public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Singh, Brijesh" <brijesh.singh@amd.com>
To: Jim Mattson <jmattson@google.com>
Cc: "Singh, Brijesh" <brijesh.singh@amd.com>,
	"kvm list" <kvm@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	"the arch/x86 maintainers" <x86@kernel.org>,
	"Borislav Petkov" <bp@alien8.de>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Ingo Molnar" <mingo@redhat.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Radim Krčmář" <rkrcmar@redhat.com>,
	"Joerg Roedel" <joro@8bytes.org>, "Borislav Petkov" <bp@suse.de>,
	"Lendacky, Thomas" <Thomas.Lendacky@amd.com>
Subject: Re: [Part2 PATCH v9 38/38] KVM: X86: Restart the guest when insn_len is zero and SEV is enabled
Date: Mon, 4 Feb 2019 19:22:56 +0000	[thread overview]
Message-ID: <f69e911d-0884-39bd-0aab-e775a005331f@amd.com> (raw)
In-Reply-To: <CALMp9eTpMm4qpNCUj00qk8CA7BmW-uq4YRwHzKa_GAwON2kgyQ@mail.gmail.com>



On 2/1/19 2:21 PM, Jim Mattson wrote:
> On Mon, Dec 4, 2017 at 5:07 PM Brijesh Singh <brijesh.singh@amd.com> wrote:
>>
>> On AMD platforms, under certain conditions insn_len may be zero on #NPF.
>> This can happen if a guest gets a page-fault on data access but the HW
>> table walker is not able to read the instruction page (e.g instruction
>> page is not present in memory).
>>
>> Typically, when insn_len is zero, x86_emulate_instruction() walks the
>> guest page table and fetches the instruction bytes from guest memory.
>> When SEV is enabled, the guest memory is encrypted with guest-specific
>> key hence hypervisor will not able to fetch the instruction bytes.
>> In those cases we simply restart the guest.
>>
>> I have encountered this issue when running kernbench inside the guest.
>>
>> Cc: Thomas Gleixner <tglx@linutronix.de>
>> Cc: Ingo Molnar <mingo@redhat.com>
>> Cc: "H. Peter Anvin" <hpa@zytor.com>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: "Radim Krčmář" <rkrcmar@redhat.com>
>> Cc: Joerg Roedel <joro@8bytes.org>
>> Cc: Borislav Petkov <bp@suse.de>
>> Cc: Tom Lendacky <thomas.lendacky@amd.com>
>> Cc: x86@kernel.org
>> Cc: kvm@vger.kernel.org
>> Cc: linux-kernel@vger.kernel.org
>> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
>> ---
>>   arch/x86/kvm/mmu.c | 10 ++++++++++
>>   arch/x86/kvm/svm.c |  6 ++++--
>>   2 files changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
>> index e5e66e5c6640..d5e5dbd0e5ad 100644
>> --- a/arch/x86/kvm/mmu.c
>> +++ b/arch/x86/kvm/mmu.c
>> @@ -4950,6 +4950,16 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u64 error_code,
>>          if (mmio_info_in_cache(vcpu, cr2, direct))
>>                  emulation_type = 0;
>>   emulate:
>> +       /*
>> +        * On AMD platforms, under certain conditions insn_len may be zero on #NPF.
>> +        * This can happen if a guest gets a page-fault on data access but the HW
>> +        * table walker is not able to read the instruction page (e.g instruction
>> +        * page is not present in memory). In those cases we simply restart the
>> +        * guest.
>> +        */
>> +       if (unlikely(insn && !insn_len))
>> +               return 1;
>> +
> 
> How does this work, for instance, with MMIO at CPL3 with SMAP enabled?
> 


The processor will still attempt to supply correct instruction
bytes in this case (basically it disables SMAP temporarily during
this read). *HOWEVER*, looking through Zen docs, there is an
errata about this on Zen. See errata 1096 in
https://www.amd.com/system/files/TechDocs/55449_Fam_17h_M_00h0Fh_Rev_Guide.pdf

Looking at errata it seems on Zen processors, the CPU will not
supply instruction bytes in this scenario (MMIO at CPL3 with
SMAP=1). I will reach out to HW folks to see if there is any
plans to fix in upcoming CPU cores.

We probably need to workaround for this errata. In non SEV case
we can let the host read the instruction bytes but in SEV case
we can disable SMAP temporarily in CR4, then retry the guest,
and then restore the CR4.SMAP settings. I will work on patch
and post on mailing list.

-Brijesh

      reply	other threads:[~2019-02-04 19:23 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-05  1:06 [Part2 PATCH v9 30/38] KVM: SVM: Add support for SEV LAUNCH_FINISH command Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 31/38] KVM: SVM: Add support for SEV GUEST_STATUS command Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 32/38] KVM: SVM: Add support for SEV DEBUG_DECRYPT command Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 33/38] KVM: SVM: Add support for SEV DEBUG_ENCRYPT command Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 34/38] KVM: SVM: Add support for SEV LAUNCH_SECRET command Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 35/38] KVM: SVM: Pin guest memory when SEV is active Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 36/38] KVM: SVM: Clear C-bit from the page fault address Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 37/38] KVM: SVM: Do not install #UD intercept when SEV is enabled Brijesh Singh
2017-12-05  1:06 ` [Part2 PATCH v9 38/38] KVM: X86: Restart the guest when insn_len is zero and " Brijesh Singh
2019-02-01 20:21   ` Jim Mattson
2019-02-04 19:22     ` Singh, Brijesh [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f69e911d-0884-39bd-0aab-e775a005331f@amd.com \
    --to=brijesh.singh@amd.com \
    --cc=Thomas.Lendacky@amd.com \
    --cc=bp@alien8.de \
    --cc=bp@suse.de \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox