[PATCH 04/24] KVM: Provide current CPL as part of emulator context.

2010-03-09 Thread Gleb Natapov
Eliminate the need to call back into KVM to get it from emulator.

Signed-off-by: Gleb Natapov 
---
 arch/x86/include/asm/kvm_emulate.h |1 +
 arch/x86/kvm/emulate.c |6 +++---
 arch/x86/kvm/x86.c |1 +
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/kvm_emulate.h 
b/arch/x86/include/asm/kvm_emulate.h
index 0c5caa4..d8b2da0 100644
--- a/arch/x86/include/asm/kvm_emulate.h
+++ b/arch/x86/include/asm/kvm_emulate.h
@@ -159,6 +159,7 @@ struct x86_emulate_ctxt {
struct kvm_vcpu *vcpu;
 
unsigned long eflags;
+   int cpl;
/* Emulated execution mode, represented by an X86EMUL_MODE value. */
int mode;
u32 cs_base;
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 3d1ee74..ed29a52 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1254,7 +1254,7 @@ static int emulate_popf(struct x86_emulate_ctxt *ctxt,
int rc;
unsigned long val, change_mask;
int iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT;
-   int cpl = kvm_x86_ops->get_cpl(ctxt->vcpu);
+   int cpl = ctxt->cpl;
 
rc = emulate_pop(ctxt, ops, &val, len);
if (rc != X86EMUL_CONTINUE)
@@ -1763,7 +1763,7 @@ static bool emulator_bad_iopl(struct x86_emulate_ctxt 
*ctxt)
if (ctxt->mode == X86EMUL_MODE_VM86)
return true;
iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT;
-   return kvm_x86_ops->get_cpl(ctxt->vcpu) > iopl;
+   return ctxt->cpl > iopl;
 }
 
 static bool emulator_io_port_access_allowed(struct x86_emulate_ctxt *ctxt,
@@ -1839,7 +1839,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct 
x86_emulate_ops *ops)
}
 
/* Privileged instruction can be executed only in CPL=0 */
-   if ((c->d & Priv) && kvm_x86_ops->get_cpl(ctxt->vcpu)) {
+   if ((c->d & Priv) && ctxt->cpl) {
kvm_inject_gp(ctxt->vcpu, 0);
goto done;
}
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 8f2b61c..9b5fb43 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3499,6 +3499,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
 
vcpu->arch.emulate_ctxt.vcpu = vcpu;
vcpu->arch.emulate_ctxt.eflags = kvm_x86_ops->get_rflags(vcpu);
+   vcpu->arch.emulate_ctxt.cpl = kvm_x86_ops->get_cpl(vcpu);
vcpu->arch.emulate_ctxt.mode =
(!is_protmode(vcpu)) ? X86EMUL_MODE_REAL :
(vcpu->arch.emulate_ctxt.eflags & X86_EFLAGS_VM)
-- 
1.6.5

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 04/24] KVM: Provide current CPL as part of emulator context.

2010-03-09 Thread Gleb Natapov
On Tue, Mar 09, 2010 at 04:24:45PM +0200, Avi Kivity wrote:
> On 03/09/2010 04:09 PM, Gleb Natapov wrote:
> >Eliminate the need to call back into KVM to get it from emulator.
> >
> >
> >@@ -3499,6 +3499,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,
> >
> > vcpu->arch.emulate_ctxt.vcpu = vcpu;
> > vcpu->arch.emulate_ctxt.eflags = kvm_x86_ops->get_rflags(vcpu);
> >+vcpu->arch.emulate_ctxt.cpl = kvm_x86_ops->get_cpl(vcpu);
> > vcpu->arch.emulate_ctxt.mode =
> > (!is_protmode(vcpu)) ? X86EMUL_MODE_REAL :
> > (vcpu->arch.emulate_ctxt.eflags&  X86_EFLAGS_VM)
> 
> This is an unconditional VMREAD, which is slow (extra slow if
> nested).  Most common emulator ops do not need the cpl.
> 
Will have to make it one of x86_emulate_ops callback then.

--
Gleb.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 04/24] KVM: Provide current CPL as part of emulator context.

2010-03-09 Thread Avi Kivity

On 03/09/2010 04:09 PM, Gleb Natapov wrote:

Eliminate the need to call back into KVM to get it from emulator.


@@ -3499,6 +3499,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu,

vcpu->arch.emulate_ctxt.vcpu = vcpu;
vcpu->arch.emulate_ctxt.eflags = kvm_x86_ops->get_rflags(vcpu);
+   vcpu->arch.emulate_ctxt.cpl = kvm_x86_ops->get_cpl(vcpu);
vcpu->arch.emulate_ctxt.mode =
(!is_protmode(vcpu)) ? X86EMUL_MODE_REAL :
(vcpu->arch.emulate_ctxt.eflags&  X86_EFLAGS_VM)
   


This is an unconditional VMREAD, which is slow (extra slow if nested).  
Most common emulator ops do not need the cpl.


--
error compiling committee.c: too many arguments to function

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html