Patchwork [04/15] Add a hook to allow hypercalls to be emulated on PowerPC

login
register
mail settings
Submitter David Gibson
Date Feb. 12, 2011, 2:54 p.m.
Message ID <1297522467-5975-5-git-send-email-david@gibson.dropbear.id.au>
Download mbox | patch
Permalink /patch/82916/
State New
Headers show

Comments

David Gibson - Feb. 12, 2011, 2:54 p.m.
From: David Gibson <dwg@au1.ibm.com>

PowerPC and POWER chips since the POWER4 and 970 have a special
hypervisor mode, and a corresponding form of the system call
instruction which traps to the hypervisor.

qemu currently has stub implementations of hypervisor mode.  That
is, the outline is there to allow qemu to run a PowerPC hypervisor
under emulation.  There are a number of details missing so this
won't actually work at present, but the idea is there.

What there is no provision at all, is for qemu to instead emulate
the hypervisor itself.  That is to have hypercalls trap into qemu
and their result be emulated from qemu, rather than running
hypervisor code within the emulated system.

Hypervisor hardware aware KVM implementations are in the works and
it would  be useful for debugging and development to also allow
full emulation of the same para-virtualized guests as such a KVM.

Therefore, this patch adds a hook which will allow a machine to
set up emulation of hypervisor calls.

Signed-off-by: David Gibson <dwg@au1.ibm.com>
---
 target-ppc/cpu.h    |    2 ++
 target-ppc/helper.c |    4 ++++
 2 files changed, 6 insertions(+), 0 deletions(-)
Alexander Graf - Feb. 12, 2011, 3:19 p.m.
On 12.02.2011, at 15:54, David Gibson wrote:

> From: David Gibson <dwg@au1.ibm.com>
> 
> PowerPC and POWER chips since the POWER4 and 970 have a special
> hypervisor mode, and a corresponding form of the system call
> instruction which traps to the hypervisor.
> 
> qemu currently has stub implementations of hypervisor mode.  That
> is, the outline is there to allow qemu to run a PowerPC hypervisor
> under emulation.  There are a number of details missing so this
> won't actually work at present, but the idea is there.
> 
> What there is no provision at all, is for qemu to instead emulate
> the hypervisor itself.  That is to have hypercalls trap into qemu
> and their result be emulated from qemu, rather than running
> hypervisor code within the emulated system.
> 
> Hypervisor hardware aware KVM implementations are in the works and
> it would  be useful for debugging and development to also allow
> full emulation of the same para-virtualized guests as such a KVM.
> 
> Therefore, this patch adds a hook which will allow a machine to
> set up emulation of hypervisor calls.
> 
> Signed-off-by: David Gibson <dwg@au1.ibm.com>

Acked-by: Alexander Graf <agraf@suse.de>


Alex

Patch

diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index a20c132..eaddc27 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -692,6 +692,8 @@  struct CPUPPCState {
     int bfd_mach;
     uint32_t flags;
     uint64_t insns_flags;
+    void (*emulate_hypercall)(CPUState *, void *);
+    void *hcall_opaque;
 
     int error_code;
     uint32_t pending_interrupts;
diff --git a/target-ppc/helper.c b/target-ppc/helper.c
index 2094ca3..19aa067 100644
--- a/target-ppc/helper.c
+++ b/target-ppc/helper.c
@@ -2152,6 +2152,10 @@  static inline void powerpc_excp(CPUState *env, int excp_model, int excp)
     case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
         dump_syscall(env);
         lev = env->error_code;
+	if ((lev == 1) && env->emulate_hypercall) {
+	    env->emulate_hypercall(env, env->hcall_opaque);
+	    return;
+	}	    
         if (lev == 1 || (lpes0 == 0 && lpes1 == 0))
             new_msr |= (target_ulong)MSR_HVB;
         goto store_next;