[PATCH 15/27] Add mfdec emulation

2009-10-30 Thread Alexander Graf
We support setting the DEC to a certain value right now. Doing that basically
triggers the CPU local timer.

But there's also an mfdec command that enabled the OS to read the decrementor.

This is required at least by all desktop and server PowerPC Linux kernels. It
can't really hurt to allow embedded ones to do it as well though.

Signed-off-by: Alexander Graf ag...@suse.de
---
 arch/powerpc/kvm/emulate.c |   13 -
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
index 7737146..50d411d 100644
--- a/arch/powerpc/kvm/emulate.c
+++ b/arch/powerpc/kvm/emulate.c
@@ -66,12 +66,14 @@
 
 void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
 {
+   unsigned long nr_jiffies;
+
if (vcpu-arch.tcr  TCR_DIE) {
/* The decrementer ticks at the same rate as the timebase, so
 * that's how we convert the guest DEC value to the number of
 * host ticks. */
-   unsigned long nr_jiffies;
 
+   vcpu-arch.dec_jiffies = mftb();
nr_jiffies = vcpu-arch.dec / tb_ticks_per_jiffy;
mod_timer(vcpu-arch.dec_timer,
  get_jiffies_64() + nr_jiffies);
@@ -211,6 +213,15 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct 
kvm_vcpu *vcpu)
/* Note: SPRG4-7 are user-readable, so we don't get
 * a trap. */
 
+   case SPRN_DEC:
+   {
+   u64 jd = mftb() - vcpu-arch.dec_jiffies;
+   vcpu-arch.gpr[rt] = vcpu-arch.dec - jd;
+#ifdef DEBUG_EMUL
+   printk(KERN_INFO mfDEC: %x - %llx = %lx\n, 
vcpu-arch.dec, jd, vcpu-arch.gpr[rt]);
+#endif
+   break;
+   }
default:
emulated = kvmppc_core_emulate_mfspr(vcpu, 
sprn, rt);
if (emulated == EMULATE_FAIL) {
-- 
1.6.0.2

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


[PATCH 15/27] Add mfdec emulation

2009-10-21 Thread Alexander Graf
We support setting the DEC to a certain value right now. Doing that basically
triggers the CPU local timer.

But there's also an mfdec command that enabled the OS to read the decrementor.

This is required at least by all desktop and server PowerPC Linux kernels. It
can't really hurt to allow embedded ones to do it as well though.

Signed-off-by: Alexander Graf ag...@suse.de
---
 arch/powerpc/kvm/emulate.c |   13 -
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
index 7737146..50d411d 100644
--- a/arch/powerpc/kvm/emulate.c
+++ b/arch/powerpc/kvm/emulate.c
@@ -66,12 +66,14 @@
 
 void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
 {
+   unsigned long nr_jiffies;
+
if (vcpu-arch.tcr  TCR_DIE) {
/* The decrementer ticks at the same rate as the timebase, so
 * that's how we convert the guest DEC value to the number of
 * host ticks. */
-   unsigned long nr_jiffies;
 
+   vcpu-arch.dec_jiffies = mftb();
nr_jiffies = vcpu-arch.dec / tb_ticks_per_jiffy;
mod_timer(vcpu-arch.dec_timer,
  get_jiffies_64() + nr_jiffies);
@@ -211,6 +213,15 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct 
kvm_vcpu *vcpu)
/* Note: SPRG4-7 are user-readable, so we don't get
 * a trap. */
 
+   case SPRN_DEC:
+   {
+   u64 jd = mftb() - vcpu-arch.dec_jiffies;
+   vcpu-arch.gpr[rt] = vcpu-arch.dec - jd;
+#ifdef DEBUG_EMUL
+   printk(KERN_INFO mfDEC: %x - %llx = %lx\n, 
vcpu-arch.dec, jd, vcpu-arch.gpr[rt]);
+#endif
+   break;
+   }
default:
emulated = kvmppc_core_emulate_mfspr(vcpu, 
sprn, rt);
if (emulated == EMULATE_FAIL) {
-- 
1.6.0.2

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


Re: [PATCH 15/27] Add mfdec emulation

2009-10-09 Thread Hollis Blanchard
On Tue, 2009-09-29 at 10:18 +0200, Alexander Graf wrote:
 We support setting the DEC to a certain value right now. Doing that basically
 triggers the CPU local timer.
 
 But there's also an mfdec command that enabled the OS to read the decrementor.
 
 This is required at least by all desktop and server PowerPC Linux kernels. It
 can't really hurt to allow embedded ones to do it as well though.
 
 Signed-off-by: Alexander Graf ag...@suse.de
 ---
  arch/powerpc/kvm/emulate.c |   13 -
  1 files changed, 12 insertions(+), 1 deletions(-)
 
 diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
 index 7737146..50d411d 100644
 --- a/arch/powerpc/kvm/emulate.c
 +++ b/arch/powerpc/kvm/emulate.c
 @@ -66,12 +66,14 @@
 
  void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
  {
 + unsigned long nr_jiffies;
 +
   if (vcpu-arch.tcr  TCR_DIE) {
   /* The decrementer ticks at the same rate as the timebase, so
* that's how we convert the guest DEC value to the number of
* host ticks. */
 - unsigned long nr_jiffies;
 
 + vcpu-arch.dec_jiffies = mftb();
   nr_jiffies = vcpu-arch.dec / tb_ticks_per_jiffy;
   mod_timer(vcpu-arch.dec_timer,
 get_jiffies_64() + nr_jiffies);
 @@ -211,6 +213,15 @@ int kvmppc_emulate_instruction(struct kvm_run *run, 
 struct kvm_vcpu *vcpu)
   /* Note: SPRG4-7 are user-readable, so we don't get
* a trap. */
 
 + case SPRN_DEC:
 + {
 + u64 jd = mftb() - vcpu-arch.dec_jiffies;
 + vcpu-arch.gpr[rt] = vcpu-arch.dec - jd;
 +#ifdef DEBUG_EMUL
 + printk(KERN_INFO mfDEC: %x - %llx = %lx\n, 
 vcpu-arch.dec, jd, vcpu-arch.gpr[rt]);
 +#endif
 + break;
 + }
   default:
   emulated = kvmppc_core_emulate_mfspr(vcpu, 
 sprn, rt);
   if (emulated == EMULATE_FAIL) {

mftb() doesn't exist for ppc32, so we'll need to use the get_tb()
wrapper instead.

-- 
Hollis Blanchard
IBM Linux Technology Center

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