[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [RFC 12/17] ppc: Migrate compatibility mode
From: |
David Gibson |
Subject: |
[Qemu-ppc] [RFC 12/17] ppc: Migrate compatibility mode |
Date: |
Sun, 30 Oct 2016 22:12:03 +1100 |
Server-class POWER CPUs can be put into several compatibility modes. These
can be specified on the command line, or negotiated by the guest during
boot.
Currently we don't migrate the compatibility mode, which means after a
migration the guest will revert to running with whatever compatibility
mode (or none) specified on the command line.
With the limited range of CPUs currently used, this doesn't usually cause
a problem, but it could. Fix this by adding the compatibility mode (if
set) to the migration stream.
Signed-off-by: David Gibson <address@hidden>
---
target-ppc/machine.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/target-ppc/machine.c b/target-ppc/machine.c
index 4820f22..5d87ff6 100644
--- a/target-ppc/machine.c
+++ b/target-ppc/machine.c
@@ -9,6 +9,7 @@
#include "mmu-hash64.h"
#include "migration/cpu.h"
#include "exec/exec-all.h"
+#include "qapi/error.h"
static int cpu_load_old(QEMUFile *f, void *opaque, int version_id)
{
@@ -176,6 +177,20 @@ static int cpu_post_load(void *opaque, int version_id)
* software has to take care of running QEMU in a compatible mode.
*/
env->spr[SPR_PVR] = env->spr_cb[SPR_PVR].default_value;
+
+#if defined(TARGET_PPC64)
+ if (cpu->compat_pvr) {
+ Error *local_err = NULL;
+
+ ppc_set_compat(cpu, cpu->compat_pvr, &local_err);
+ if (local_err) {
+ error_report_err(local_err);
+ error_free(local_err);
+ return -1;
+ }
+ }
+#endif
+
env->lr = env->spr[SPR_LR];
env->ctr = env->spr[SPR_CTR];
cpu_write_xer(env, env->spr[SPR_XER]);
@@ -528,6 +543,24 @@ static const VMStateDescription vmstate_tlbmas = {
}
};
+static bool compat_needed(void *opaque)
+{
+ PowerPCCPU *cpu = opaque;
+
+ return cpu->compat_pvr != 0;
+}
+
+static const VMStateDescription vmstate_compat = {
+ .name = "cpu/compat",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .needed = compat_needed,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT32(compat_pvr, PowerPCCPU),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
const VMStateDescription vmstate_ppc_cpu = {
.name = "cpu",
.version_id = 5,
@@ -580,6 +613,7 @@ const VMStateDescription vmstate_ppc_cpu = {
&vmstate_tlb6xx,
&vmstate_tlbemb,
&vmstate_tlbmas,
+ &vmstate_compat,
NULL
}
};
--
2.7.4
- [Qemu-ppc] [RFC 02/17] powernv: CPU compatibility modes don't make sense for powernv, (continued)
- [Qemu-ppc] [RFC 02/17] powernv: CPU compatibility modes don't make sense for powernv, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 01/17] ppc: Remove some stub POWER6 models, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 14/17] pseries: Reset CPU compatibility mode, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 06/17] ppc: Rename cpu_version to compat_pvr, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 05/17] ppc: Clean up and QOMify hypercall emulation, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 08/17] ppc: Rewrite ppc_get_compat_smt_threads(), David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 12/17] ppc: Migrate compatibility mode,
David Gibson <=
- [Qemu-ppc] [RFC 17/17] pseries: Default to POWER8 compatibility mode, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 16/17] ppc: Remove counter-productive "sanity checks" in migration, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 04/17] pseries: Make cpu_update during CAS unconditional, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 15/17] ppc: Check that CPU model stays consistent across migration, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 03/17] pseries: Always use core objects for CPU construction, David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 07/17] ppc: Rewrite ppc_set_compat(), David Gibson, 2016/10/30
- [Qemu-ppc] [RFC 09/17] ppc: Validate compatibility modes when setting, David Gibson, 2016/10/30