Re: [PATCH v3 02/26] KVM: Split cpuid register access from computation

2012-07-04 Thread Avi Kivity
On 07/03/2012 08:34 PM, Marcelo Tosatti wrote:
 On Wed, Jun 27, 2012 at 06:24:50PM +0300, Avi Kivity wrote:
 Introduce kvm_cpuid() to perform the leaf limit check and calculate
 register values, and let kvm_emulate_cpuid() just handle reading and
 writing the registers from/to the vcpu.  This allows us to reuse
 kvm_cpuid() in a context where directly reading and writing registers
 is not desired.
 
 Signed-off-by: Avi Kivity a...@redhat.com
 ---
  arch/x86/kvm/cpuid.c | 38 --
  arch/x86/kvm/cpuid.h |  1 +
  2 files changed, 25 insertions(+), 14 deletions(-)
 
 diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
 index 7df1c6d..44476fb 100644
 --- a/arch/x86/kvm/cpuid.c
 +++ b/arch/x86/kvm/cpuid.c
 @@ -639,33 +639,43 @@ static struct kvm_cpuid_entry2* 
 check_cpuid_limit(struct kvm_vcpu *vcpu,
  return kvm_find_cpuid_entry(vcpu, maxlevel-eax, index);
  }
  
 -void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
 +void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 
 *edx)
  {
 -u32 function, index;
 +u32 function = *eax, index = *ecx;
  struct kvm_cpuid_entry2 *best;
  
 -function = kvm_register_read(vcpu, VCPU_REGS_RAX);
 -index = kvm_register_read(vcpu, VCPU_REGS_RCX);
 -kvm_register_write(vcpu, VCPU_REGS_RAX, 0);
 -kvm_register_write(vcpu, VCPU_REGS_RBX, 0);
 -kvm_register_write(vcpu, VCPU_REGS_RCX, 0);
 -kvm_register_write(vcpu, VCPU_REGS_RDX, 0);
  best = kvm_find_cpuid_entry(vcpu, function, index);
  
  if (!best)
  best = check_cpuid_limit(vcpu, function, index);
  
  if (best) {
 -kvm_register_write(vcpu, VCPU_REGS_RAX, best-eax);
 -kvm_register_write(vcpu, VCPU_REGS_RBX, best-ebx);
 -kvm_register_write(vcpu, VCPU_REGS_RCX, best-ecx);
 -kvm_register_write(vcpu, VCPU_REGS_RDX, best-edx);
 -}
 -kvm_x86_ops-skip_emulated_instruction(vcpu);
 +*eax = best-eax;
 +*ebx = best-ebx;
 +*ecx = best-ecx;
 +*edx = best-edx;
 +} else
 +*eax = *ebx = *ecx = *edx = 0;
 +
  trace_kvm_cpuid(function,
  kvm_register_read(vcpu, VCPU_REGS_RAX),
  kvm_register_read(vcpu, VCPU_REGS_RBX),
  kvm_register_read(vcpu, VCPU_REGS_RCX),
  kvm_register_read(vcpu, VCPU_REGS_RDX));
  }
 +
 +void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
 +{
 +u32 function, eax, ebx, ecx, edx;
 +
 +function = eax = kvm_register_read(vcpu, VCPU_REGS_RAX);
 +ecx = kvm_register_read(vcpu, VCPU_REGS_RCX);
 +kvm_cpuid(vcpu, eax, ebx, ecx, edx);
 +kvm_register_write(vcpu, VCPU_REGS_RAX, eax);
 +kvm_register_write(vcpu, VCPU_REGS_RBX, ebx);
 +kvm_register_write(vcpu, VCPU_REGS_RCX, ecx);
 +kvm_register_write(vcpu, VCPU_REGS_RDX, edx);
 +kvm_x86_ops-skip_emulated_instruction(vcpu);
 +trace_kvm_cpuid(function, eax, ebx, ecx, edx);
 +}
 
 Tracing is duplicated. Is that intented?

The first instance is bogus, since it's reading vcpu registers which
might not have been the input to the function.  I'll remove it.

-- 
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


Re: [PATCH v3 02/26] KVM: Split cpuid register access from computation

2012-07-03 Thread Marcelo Tosatti
On Wed, Jun 27, 2012 at 06:24:50PM +0300, Avi Kivity wrote:
 Introduce kvm_cpuid() to perform the leaf limit check and calculate
 register values, and let kvm_emulate_cpuid() just handle reading and
 writing the registers from/to the vcpu.  This allows us to reuse
 kvm_cpuid() in a context where directly reading and writing registers
 is not desired.
 
 Signed-off-by: Avi Kivity a...@redhat.com
 ---
  arch/x86/kvm/cpuid.c | 38 --
  arch/x86/kvm/cpuid.h |  1 +
  2 files changed, 25 insertions(+), 14 deletions(-)
 
 diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
 index 7df1c6d..44476fb 100644
 --- a/arch/x86/kvm/cpuid.c
 +++ b/arch/x86/kvm/cpuid.c
 @@ -639,33 +639,43 @@ static struct kvm_cpuid_entry2* 
 check_cpuid_limit(struct kvm_vcpu *vcpu,
   return kvm_find_cpuid_entry(vcpu, maxlevel-eax, index);
  }
  
 -void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
 +void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
  {
 - u32 function, index;
 + u32 function = *eax, index = *ecx;
   struct kvm_cpuid_entry2 *best;
  
 - function = kvm_register_read(vcpu, VCPU_REGS_RAX);
 - index = kvm_register_read(vcpu, VCPU_REGS_RCX);
 - kvm_register_write(vcpu, VCPU_REGS_RAX, 0);
 - kvm_register_write(vcpu, VCPU_REGS_RBX, 0);
 - kvm_register_write(vcpu, VCPU_REGS_RCX, 0);
 - kvm_register_write(vcpu, VCPU_REGS_RDX, 0);
   best = kvm_find_cpuid_entry(vcpu, function, index);
  
   if (!best)
   best = check_cpuid_limit(vcpu, function, index);
  
   if (best) {
 - kvm_register_write(vcpu, VCPU_REGS_RAX, best-eax);
 - kvm_register_write(vcpu, VCPU_REGS_RBX, best-ebx);
 - kvm_register_write(vcpu, VCPU_REGS_RCX, best-ecx);
 - kvm_register_write(vcpu, VCPU_REGS_RDX, best-edx);
 - }
 - kvm_x86_ops-skip_emulated_instruction(vcpu);
 + *eax = best-eax;
 + *ebx = best-ebx;
 + *ecx = best-ecx;
 + *edx = best-edx;
 + } else
 + *eax = *ebx = *ecx = *edx = 0;
 +
   trace_kvm_cpuid(function,
   kvm_register_read(vcpu, VCPU_REGS_RAX),
   kvm_register_read(vcpu, VCPU_REGS_RBX),
   kvm_register_read(vcpu, VCPU_REGS_RCX),
   kvm_register_read(vcpu, VCPU_REGS_RDX));
  }
 +
 +void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
 +{
 + u32 function, eax, ebx, ecx, edx;
 +
 + function = eax = kvm_register_read(vcpu, VCPU_REGS_RAX);
 + ecx = kvm_register_read(vcpu, VCPU_REGS_RCX);
 + kvm_cpuid(vcpu, eax, ebx, ecx, edx);
 + kvm_register_write(vcpu, VCPU_REGS_RAX, eax);
 + kvm_register_write(vcpu, VCPU_REGS_RBX, ebx);
 + kvm_register_write(vcpu, VCPU_REGS_RCX, ecx);
 + kvm_register_write(vcpu, VCPU_REGS_RDX, edx);
 + kvm_x86_ops-skip_emulated_instruction(vcpu);
 + trace_kvm_cpuid(function, eax, ebx, ecx, edx);
 +}

Tracing is duplicated. Is that intented?

--
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


[PATCH v3 02/26] KVM: Split cpuid register access from computation

2012-06-27 Thread Avi Kivity
Introduce kvm_cpuid() to perform the leaf limit check and calculate
register values, and let kvm_emulate_cpuid() just handle reading and
writing the registers from/to the vcpu.  This allows us to reuse
kvm_cpuid() in a context where directly reading and writing registers
is not desired.

Signed-off-by: Avi Kivity a...@redhat.com
---
 arch/x86/kvm/cpuid.c | 38 --
 arch/x86/kvm/cpuid.h |  1 +
 2 files changed, 25 insertions(+), 14 deletions(-)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 7df1c6d..44476fb 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -639,33 +639,43 @@ static struct kvm_cpuid_entry2* check_cpuid_limit(struct 
kvm_vcpu *vcpu,
return kvm_find_cpuid_entry(vcpu, maxlevel-eax, index);
 }
 
-void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
+void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
 {
-   u32 function, index;
+   u32 function = *eax, index = *ecx;
struct kvm_cpuid_entry2 *best;
 
-   function = kvm_register_read(vcpu, VCPU_REGS_RAX);
-   index = kvm_register_read(vcpu, VCPU_REGS_RCX);
-   kvm_register_write(vcpu, VCPU_REGS_RAX, 0);
-   kvm_register_write(vcpu, VCPU_REGS_RBX, 0);
-   kvm_register_write(vcpu, VCPU_REGS_RCX, 0);
-   kvm_register_write(vcpu, VCPU_REGS_RDX, 0);
best = kvm_find_cpuid_entry(vcpu, function, index);
 
if (!best)
best = check_cpuid_limit(vcpu, function, index);
 
if (best) {
-   kvm_register_write(vcpu, VCPU_REGS_RAX, best-eax);
-   kvm_register_write(vcpu, VCPU_REGS_RBX, best-ebx);
-   kvm_register_write(vcpu, VCPU_REGS_RCX, best-ecx);
-   kvm_register_write(vcpu, VCPU_REGS_RDX, best-edx);
-   }
-   kvm_x86_ops-skip_emulated_instruction(vcpu);
+   *eax = best-eax;
+   *ebx = best-ebx;
+   *ecx = best-ecx;
+   *edx = best-edx;
+   } else
+   *eax = *ebx = *ecx = *edx = 0;
+
trace_kvm_cpuid(function,
kvm_register_read(vcpu, VCPU_REGS_RAX),
kvm_register_read(vcpu, VCPU_REGS_RBX),
kvm_register_read(vcpu, VCPU_REGS_RCX),
kvm_register_read(vcpu, VCPU_REGS_RDX));
 }
+
+void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
+{
+   u32 function, eax, ebx, ecx, edx;
+
+   function = eax = kvm_register_read(vcpu, VCPU_REGS_RAX);
+   ecx = kvm_register_read(vcpu, VCPU_REGS_RCX);
+   kvm_cpuid(vcpu, eax, ebx, ecx, edx);
+   kvm_register_write(vcpu, VCPU_REGS_RAX, eax);
+   kvm_register_write(vcpu, VCPU_REGS_RBX, ebx);
+   kvm_register_write(vcpu, VCPU_REGS_RCX, ecx);
+   kvm_register_write(vcpu, VCPU_REGS_RDX, edx);
+   kvm_x86_ops-skip_emulated_instruction(vcpu);
+   trace_kvm_cpuid(function, eax, ebx, ecx, edx);
+}
 EXPORT_SYMBOL_GPL(kvm_emulate_cpuid);
diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h
index 26d1fb4..f449edc 100644
--- a/arch/x86/kvm/cpuid.h
+++ b/arch/x86/kvm/cpuid.h
@@ -17,6 +17,7 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
 int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
  struct kvm_cpuid2 *cpuid,
  struct kvm_cpuid_entry2 __user *entries);
+void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx);
 
 
 static inline bool guest_cpuid_has_xsave(struct kvm_vcpu *vcpu)
-- 
1.7.11

--
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