From: Avi Kivity <avi@redhat.com>
To: BrillyWu@viatech.com.cn
Cc: mtosatti@redhat.com, kvm@vger.kernel.org
Subject: Re: [PATCH] KVM: Add CPUID support for VIA CPU
Date: Thu, 14 Apr 2011 13:07:01 +0300 [thread overview]
Message-ID: <4DA6C745.9070406@redhat.com> (raw)
In-Reply-To: <C4F7CD9A92DBFF48AD8779355CD4D7890D7A97@exchsg04.s3graphics.com>
On 04/14/2011 12:54 PM, BrillyWu@viatech.com.cn wrote:
> > On 04/14/2011 06:14 AM, BrillyWu@viatech.com.cn wrote:
> > > On 04/13/2011 02:05 PM, BrillyWu@viatech.com.cn wrote:
> > > > > >>
> > > > > >> + /* cpuid 0xC0000001.edx */
> > > > > >> + const u32 kvm_supported_word5_x86_features =
> > > > > >> + F(XSTORE) | F(XSTORE_EN) |
> > F(XCRYPT) | F(XCRYPT_EN) |
> > > > > >> + F(ACE2) | F(ACE2_EN) | F(PHE) |
> > F(PHE_EN) |
> > > > > >> + F(PMM) | F(PMM_EN);
> > > > > >> +
> > > >
> > > > > > Are all of these features save wrt save/restore?
> > (do they all act
> > > > > >on state in standard registers?) Do they need any control
> > > > register> >bits to be active or MSRs to configure?
> > > >
> > > > > These features depend on instructions for the PadLock
> > hardware engine of VIA CPU.
> > > > > The PadLock instructions just act on standard
> > registers like general X86 instructions, and the features have been
> > enabled when the CPU leave the factory, so there is no need to
> > activate any control register bits or configure MSRs.
> > >
> > > > I see there is a dependency on EFLAGS[30]. Does a VM
> > entry clear this bit? If not, we have to do it ourselves.
> > >
> > > Yes, PadLock hardware engine has some association with
> > EFLAGS[30], but it just required that the EFLAGS[30] should be set to
> > "0"
> > > before using PadLock ACE instructions. It is recommanded
> > that execute
> > > instruction sequence "pushf;popf" to clear this bit before
> > using ACE instructions.
> > > AFAIK, the VM entry never sets the EFLAGS[30] bit, so it
> > seems that we do not have to do it ourselves.
> >
> > I don't think we need to. kvm kernel code doesn't use padlock; other
> > sources which might set EFLAGS[30] are:
> >
> > - the guest; but VMEXIT clears EFLAGS
> > - userspace; but syscall/sysenter/int instructions clear EFLAGS[30]
> > - another kernel thread; there is likely a popf in the context switch
> > path somewhere (we should verify this)
>
> Thank you very much for telling me where the EFLAGS[30] might
> be set and cleared.
> In fact, adding the CPUID support into kvm
> kernel code is just to provide correct result for the calling of
> the "kvm_arch_get_supported_cpuid" function in Qemu-kvm
> application.
That may not be sufficient for correct operation.
Consider:
- guest executes a padlock instruction
- cpu sets EFLAGS[30]
- external interrupt
- VMEXIT (saves EFLAGS in GUEST_RFLAGS with EFLAGS[30] set)
- external interrupt is processed, causes a task switch
- EFLAGS[30] is cleared
- some other process uses padlock instructions, which causes a reload of
key information
- switch back to kvm
- VM entry (loads EFLAGS from GUEST_RFLAGS; still has EFLAGS[30] set)
- guest executes following padlock instruction, doesn't reload key
information
so I think the code as is causes data corruption.
> There is no dependency on EFLAGS when calling VIA CPUID
> instruction.
>
> Before using padlock engine functions, the application first need detect
> is the features exist through cpuid instruction, then use ACE and other
> instructions such as PHE/RNG/PMM.
>
> And as previously said, only the ACE instructions required
> that the EFLAGS[30] should be set to "0", It is recommanded
> that execute instruction sequence "pushf;popf" to clear this bit
> before using ACE instructions.
The problem is that VM entry reloads eflags from saved state and is not
affected by popf.
> I have re-submitted this patch, please check it. Thanks!
wrt cpuid it seems reasonable but that's we need to clear the EFLAGS[30]
issue first.
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2011-04-14 10:07 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-13 3:26 [PATCH] KVM: Add CPUID support for VIA CPU BrillyWu
2011-04-13 8:59 ` Avi Kivity
2011-04-13 11:05 ` BrillyWu
2011-04-13 11:32 ` Avi Kivity
2011-04-14 3:14 ` BrillyWu
2011-04-14 7:48 ` Avi Kivity
2011-04-14 9:54 ` BrillyWu
2011-04-14 10:07 ` Avi Kivity [this message]
2011-04-21 10:06 ` BrillyWu
2011-04-24 7:18 ` Avi Kivity
2011-04-25 5:55 ` BrillyWu
2011-04-27 8:48 ` Avi Kivity
2011-04-28 1:27 ` [PATCH] qemu-kvm: " BrillyWu
2011-04-14 3:59 ` [PATCH v2] KVM: " BrillyWu
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=4DA6C745.9070406@redhat.com \
--to=avi@redhat.com \
--cc=BrillyWu@viatech.com.cn \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
/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.