All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>,
	linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Cc: stable@vger.kernel.org, "Radim Krčmář" <rkrcmar@redhat.com>
Subject: Re: [PATCH] KVM: x86: allow RSM from 64-bit mode
Date: Tue, 3 Nov 2015 15:02:00 +0100	[thread overview]
Message-ID: <5638BE58.6060507@redhat.com> (raw)
In-Reply-To: <5638BAC7.2030704@redhat.com>

On 11/03/15 14:46, Paolo Bonzini wrote:
> 
> 
> On 03/11/2015 14:40, Laszlo Ersek wrote:
>> On 11/03/15 14:29, Paolo Bonzini wrote:
>>> The SDM says that exiting system management mode from 64-bit mode
>>> is invalid, but that would be too good to be true.  But actually,
>>> most of the code is already there to support exiting from compat
>>> mode (EFER.LME=1, EFER.LMA=0).  Getting all the way from 64-bit
>>> mode to real mode only requires clearing CS.L and CR4.PCIDE.
>>>
>>> Cc: stable@vger.kernel.org
>>> Fixes: 660a5d517aaab9187f93854425c4c63f4a09195c
>>> Cc: Laszlo Ersek <lersek@redhat.com>
>>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>>> ---
>>>  arch/x86/kvm/emulate.c | 30 +++++++++++++++++++++++++-----
>>>  1 file changed, 25 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
>>> index b60fed56671b..1505587d06e9 100644
>>> --- a/arch/x86/kvm/emulate.c
>>> +++ b/arch/x86/kvm/emulate.c
>>> @@ -2484,16 +2484,36 @@ static int em_rsm(struct x86_emulate_ctxt *ctxt)
>>>  
>>>  	/*
>>>  	 * Get back to real mode, to prepare a safe state in which to load
>>> -	 * CR0/CR3/CR4/EFER.
>>> -	 *
>>> -	 * CR4.PCIDE must be zero, because it is a 64-bit mode only feature.
>>> +	 * CR0/CR3/CR4/EFER.  It's all a bit more complicated if the vCPU
>>> +	 * supports long mode.
>>>  	 */
>>> +	cr4 = ctxt->ops->get_cr(ctxt, 4);
>>> +	if (emulator_has_longmode(ctxt)) {
>>> +		struct desc_struct cs_desc;
>>> +
>>> +		/* Zero CR4.PCIDE before CR0.PG.  */
>>> +		if (cr4 & X86_CR4_PCIDE) {
>>> +			ctxt->ops->set_cr(ctxt, 4, cr4 & ~X86_CR4_PCIDE);
>>> +			cr4 &= ~X86_CR4_PCIDE;
>>> +		}
>>> +
>>> +		/* A 32-bit code segment is required to clear EFER.LMA.  */
>>> +		memset(&cs_desc, 0, sizeof(cs_desc));
>>> +		cs_desc.type = 0xb;
>>> +		cs_desc.s = cs_desc.g = cs_desc.p = 1;
>>> +		ctxt->ops->set_segment(ctxt, 0, &cs_desc, 0, VCPU_SREG_CS);
>>> +	}
>>> +
>>> +	/* For the 64-bit case, this will clear EFER.LMA.  */
>>>  	cr0 = ctxt->ops->get_cr(ctxt, 0);
>>>  	if (cr0 & X86_CR0_PE)
>>>  		ctxt->ops->set_cr(ctxt, 0, cr0 & ~(X86_CR0_PG | X86_CR0_PE));
>>> -	cr4 = ctxt->ops->get_cr(ctxt, 4);
>>> +
>>> +	/* Now clear CR4.PAE (which must be done before clearing EFER.LME).  */
>>>  	if (cr4 & X86_CR4_PAE)
>>>  		ctxt->ops->set_cr(ctxt, 4, cr4 & ~X86_CR4_PAE);
>>> +
>>> +	/* And finally go back to 32-bit mode.  */
>>>  	efer = 0;
>>>  	ctxt->ops->set_msr(ctxt, MSR_EFER, efer);
>>>  
>>> @@ -4454,7 +4474,7 @@ static const struct opcode twobyte_table[256] = {
>>>  	F(DstMem | SrcReg | Src2CL | ModRM, em_shld), N, N,
>>>  	/* 0xA8 - 0xAF */
>>>  	I(Stack | Src2GS, em_push_sreg), I(Stack | Src2GS, em_pop_sreg),
>>> -	II(No64 | EmulateOnUD | ImplicitOps, em_rsm, rsm),
>>> +	II(EmulateOnUD | ImplicitOps, em_rsm, rsm),
>>>  	F(DstMem | SrcReg | ModRM | BitOp | Lock | PageTable, em_bts),
>>>  	F(DstMem | SrcReg | Src2ImmByte | ModRM, em_shrd),
>>>  	F(DstMem | SrcReg | Src2CL | ModRM, em_shrd),
>>>
>>
>> What branch should I test this on top of?
> 
> Just use whatever you were using before, and revert commit c9db607
> ("UefiCpuPkg: PiSmmCpuDxeSmm: do not execute RSM from 64-bit mode",
> 2015-10-14) from your OVMF branch.

Right, I planned to do that OVMF-side revert; I just wasn't sure if e.g.
kvm/queue had some prerequisite patches for this.

> This is how I tested it, in fact.

I'll try to report back soon.

Thanks!
Laszlo

  reply	other threads:[~2015-11-03 14:02 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-03 13:29 [PATCH] KVM: x86: allow RSM from 64-bit mode Paolo Bonzini
2015-11-03 13:40 ` Laszlo Ersek
2015-11-03 13:46   ` Paolo Bonzini
2015-11-03 14:02     ` Laszlo Ersek [this message]
2015-11-03 14:04       ` Paolo Bonzini
2015-11-03 18:27         ` Laszlo Ersek

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=5638BE58.6060507@redhat.com \
    --to=lersek@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=stable@vger.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.