Message ID | 1297522467-5975-5-git-send-email-david@gibson.dropbear.id.au |
---|---|
State | New |
Headers | show |
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
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;