diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2011-10-12 22:40:32 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2011-10-30 17:11:54 +0100 |
commit | a1e985833cde3208b0f57c4c7e640b60fbc6c54d (patch) | |
tree | 2432eab7cdf273d20cfab776518f6aecbebdcda1 /target-ppc/kvm.c | |
parent | be40edcd87b8493cdf691dbe77049e0d9644dcc1 (diff) |
ppc: First cut implementation of -cpu host
For convenience with kvm, x86 allows the user to specify -cpu host on the
qemu command line, which means make the guest cpu the same as the host
cpu. This patch implements the same option for ppc targets.
For now, this just read the host PVR (Processor Version Register) and
selects one of our existing CPU specs based on it. This means that the
option will not work if the host cpu is not supported by TCG, even if that
wouldn't matter for use under kvm.
In future, we can extend this in future to override parts of the cpu spec
based on information obtained from the host (via /proc/cpuinfo, the host
device tree, or explicit KVM calls). That will let us handle cases where
the real kvm-virtualized CPU doesn't behave exactly like the TCG-emulated
CPU. With appropriate annotation of the CPU specs we'll also then be able
to use host cpus under kvm even when there isn't a matching full TCG model.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-ppc/kvm.c')
-rw-r--r-- | target-ppc/kvm.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c index 96139acb23..313c7b2af2 100644 --- a/target-ppc/kvm.c +++ b/target-ppc/kvm.c @@ -879,6 +879,25 @@ int kvmppc_remove_spapr_tce(void *table, int fd, uint32_t window_size) return 0; } +static inline uint32_t mfpvr(void) +{ + uint32_t pvr; + + asm ("mfpvr %0" + : "=r"(pvr)); + return pvr; +} + +const ppc_def_t *kvmppc_host_cpu_def(void) +{ + uint32_t host_pvr = mfpvr(); + const ppc_def_t *base_spec; + + base_spec = ppc_find_by_pvr(host_pvr); + + return base_spec; +} + bool kvm_arch_stop_on_emulation_error(CPUState *env) { return true; |