target/ppc: Use mtvscr/mfvscr for vmstate
This is required before changing the representation of the register. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Acked-by: David Gibson <david@gibson.dropbear.id.au> Message-Id: <20190215100058.20015-14-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
cc2b90d725
commit
596fff20d0
@ -10,6 +10,7 @@
|
|||||||
#include "migration/cpu.h"
|
#include "migration/cpu.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "kvm_ppc.h"
|
#include "kvm_ppc.h"
|
||||||
|
#include "exec/helper-proto.h"
|
||||||
|
|
||||||
static int cpu_load_old(QEMUFile *f, void *opaque, int version_id)
|
static int cpu_load_old(QEMUFile *f, void *opaque, int version_id)
|
||||||
{
|
{
|
||||||
@ -17,7 +18,7 @@ static int cpu_load_old(QEMUFile *f, void *opaque, int version_id)
|
|||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
target_ulong sdr1;
|
target_ulong sdr1;
|
||||||
uint32_t fpscr;
|
uint32_t fpscr, vscr;
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
int32_t slb_nr;
|
int32_t slb_nr;
|
||||||
#endif
|
#endif
|
||||||
@ -84,7 +85,8 @@ static int cpu_load_old(QEMUFile *f, void *opaque, int version_id)
|
|||||||
if (!cpu->vhyp) {
|
if (!cpu->vhyp) {
|
||||||
ppc_store_sdr1(env, sdr1);
|
ppc_store_sdr1(env, sdr1);
|
||||||
}
|
}
|
||||||
qemu_get_be32s(f, &env->vscr);
|
qemu_get_be32s(f, &vscr);
|
||||||
|
helper_mtvscr(env, vscr);
|
||||||
qemu_get_be64s(f, &env->spe_acc);
|
qemu_get_be64s(f, &env->spe_acc);
|
||||||
qemu_get_be32s(f, &env->spe_fscr);
|
qemu_get_be32s(f, &env->spe_fscr);
|
||||||
qemu_get_betls(f, &env->msr_mask);
|
qemu_get_betls(f, &env->msr_mask);
|
||||||
@ -429,6 +431,28 @@ static bool altivec_needed(void *opaque)
|
|||||||
return (cpu->env.insns_flags & PPC_ALTIVEC);
|
return (cpu->env.insns_flags & PPC_ALTIVEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_vscr(QEMUFile *f, void *opaque, size_t size,
|
||||||
|
const VMStateField *field)
|
||||||
|
{
|
||||||
|
PowerPCCPU *cpu = opaque;
|
||||||
|
helper_mtvscr(&cpu->env, qemu_get_be32(f));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int put_vscr(QEMUFile *f, void *opaque, size_t size,
|
||||||
|
const VMStateField *field, QJSON *vmdesc)
|
||||||
|
{
|
||||||
|
PowerPCCPU *cpu = opaque;
|
||||||
|
qemu_put_be32(f, helper_mfvscr(&cpu->env));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const VMStateInfo vmstate_vscr = {
|
||||||
|
.name = "cpu/altivec/vscr",
|
||||||
|
.get = get_vscr,
|
||||||
|
.put = put_vscr,
|
||||||
|
};
|
||||||
|
|
||||||
static const VMStateDescription vmstate_altivec = {
|
static const VMStateDescription vmstate_altivec = {
|
||||||
.name = "cpu/altivec",
|
.name = "cpu/altivec",
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
@ -436,7 +460,21 @@ static const VMStateDescription vmstate_altivec = {
|
|||||||
.needed = altivec_needed,
|
.needed = altivec_needed,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_AVR_ARRAY(env.vsr, PowerPCCPU, 32),
|
VMSTATE_AVR_ARRAY(env.vsr, PowerPCCPU, 32),
|
||||||
VMSTATE_UINT32(env.vscr, PowerPCCPU),
|
/*
|
||||||
|
* Save the architecture value of the vscr, not the internally
|
||||||
|
* expanded version. Since this architecture value does not
|
||||||
|
* exist in memory to be stored, this requires a but of hoop
|
||||||
|
* jumping. We want OFFSET=0 so that we effectively pass CPU
|
||||||
|
* to the helper functions.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
.name = "vscr",
|
||||||
|
.version_id = 0,
|
||||||
|
.size = sizeof(uint32_t),
|
||||||
|
.info = &vmstate_vscr,
|
||||||
|
.flags = VMS_SINGLE,
|
||||||
|
.offset = 0
|
||||||
|
},
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user