From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49862) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZhZEa-0004u7-Jz for qemu-devel@nongnu.org; Thu, 01 Oct 2015 04:29:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZhZEW-0004rx-9p for qemu-devel@nongnu.org; Thu, 01 Oct 2015 04:29:00 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41175) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZhZEW-0004rs-43 for qemu-devel@nongnu.org; Thu, 01 Oct 2015 04:28:56 -0400 References: <201509301533.29564.wpaul@windriver.com> From: Paolo Bonzini Message-ID: <560CEEC4.2010309@redhat.com> Date: Thu, 1 Oct 2015 10:28:52 +0200 MIME-Version: 1.0 In-Reply-To: <201509301533.29564.wpaul@windriver.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] Correctly re-init EFER state during INIT IPI List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Bill Paul , qemu-devel@nongnu.org Cc: Eduardo Habkost , Richard Henderson On 01/10/2015 00:33, Bill Paul wrote: > When doing a re-initialization of a CPU core, the default state is to _not_ > have 64-bit long mode enabled. This means the LME (long mode enable) and LMA > (long mode active) bits in the EFER model-specific register should be cleared. > > However, the EFER state is part of the CPU environment which is > preserved by do_cpu_init(), so if EFER.LME and EFER.LMA were set at the > time an INIT IPI was received, they will remain set after the init completes. > > This is contrary to what the Intel architecture manual describes and what > happens on real hardware, and it leaves the CPU in a weird state that the > guest can't clear. > > To fix this, the 'efer' member of the CPUX86State structure has been moved > to an area outside the region preserved by do_cpu_init(), so that it can > be properly re-initialized by x86_cpu_reset(). > > Signed-off-by: Bill Paul > CC: Paolo Bonzini > CC: Richard Henderson > CC: Eduardo Habkost Reviewed-by: Paolo Bonzini > --- > target-i386/cpu.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/target-i386/cpu.h b/target-i386/cpu.h > index 034fab6..fac773c 100644 > --- a/target-i386/cpu.h > +++ b/target-i386/cpu.h > @@ -833,6 +833,7 @@ typedef struct CPUX86State { > BNDReg bnd_regs[4]; > BNDCSReg bndcs_regs; > uint64_t msr_bndcfgs; > + uint64_t efer; > > /* Beginning of state preserved by INIT (dummy marker). */ > struct {} start_init_save; > @@ -865,7 +866,6 @@ typedef struct CPUX86State { > uint32_t sysenter_cs; > target_ulong sysenter_esp; > target_ulong sysenter_eip; > - uint64_t efer; > uint64_t star; > > uint64_t vm_hsave; >