c2cf139d9c
See rationale in previous commit. Targets should use the vmsd field of DeviceClass, not CPUClass. As migration is not important on the AVR target, break the migration compatibility and set the DeviceClass vmsd field. To feel safer, increment the vmstate version. Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20210517105140.1062037-14-f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
120 lines
3.1 KiB
C
120 lines
3.1 KiB
C
/*
|
|
* QEMU AVR CPU
|
|
*
|
|
* Copyright (c) 2016-2020 Michael Rolnik
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see
|
|
* <http://www.gnu.org/licenses/lgpl-2.1.html>
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "cpu.h"
|
|
#include "migration/cpu.h"
|
|
|
|
static int get_sreg(QEMUFile *f, void *opaque, size_t size,
|
|
const VMStateField *field)
|
|
{
|
|
CPUAVRState *env = opaque;
|
|
uint8_t sreg;
|
|
|
|
sreg = qemu_get_byte(f);
|
|
cpu_set_sreg(env, sreg);
|
|
return 0;
|
|
}
|
|
|
|
static int put_sreg(QEMUFile *f, void *opaque, size_t size,
|
|
const VMStateField *field, JSONWriter *vmdesc)
|
|
{
|
|
CPUAVRState *env = opaque;
|
|
uint8_t sreg = cpu_get_sreg(env);
|
|
|
|
qemu_put_byte(f, sreg);
|
|
return 0;
|
|
}
|
|
|
|
static const VMStateInfo vms_sreg = {
|
|
.name = "sreg",
|
|
.get = get_sreg,
|
|
.put = put_sreg,
|
|
};
|
|
|
|
static int get_segment(QEMUFile *f, void *opaque, size_t size,
|
|
const VMStateField *field)
|
|
{
|
|
uint32_t *ramp = opaque;
|
|
uint8_t temp;
|
|
|
|
temp = qemu_get_byte(f);
|
|
*ramp = ((uint32_t)temp) << 16;
|
|
return 0;
|
|
}
|
|
|
|
static int put_segment(QEMUFile *f, void *opaque, size_t size,
|
|
const VMStateField *field, JSONWriter *vmdesc)
|
|
{
|
|
uint32_t *ramp = opaque;
|
|
uint8_t temp = *ramp >> 16;
|
|
|
|
qemu_put_byte(f, temp);
|
|
return 0;
|
|
}
|
|
|
|
static const VMStateInfo vms_rampD = {
|
|
.name = "rampD",
|
|
.get = get_segment,
|
|
.put = put_segment,
|
|
};
|
|
static const VMStateInfo vms_rampX = {
|
|
.name = "rampX",
|
|
.get = get_segment,
|
|
.put = put_segment,
|
|
};
|
|
static const VMStateInfo vms_rampY = {
|
|
.name = "rampY",
|
|
.get = get_segment,
|
|
.put = put_segment,
|
|
};
|
|
static const VMStateInfo vms_rampZ = {
|
|
.name = "rampZ",
|
|
.get = get_segment,
|
|
.put = put_segment,
|
|
};
|
|
static const VMStateInfo vms_eind = {
|
|
.name = "eind",
|
|
.get = get_segment,
|
|
.put = put_segment,
|
|
};
|
|
|
|
const VMStateDescription vms_avr_cpu = {
|
|
.name = "cpu",
|
|
.version_id = 1,
|
|
.minimum_version_id = 1,
|
|
.fields = (VMStateField[]) {
|
|
VMSTATE_UINT32(env.pc_w, AVRCPU),
|
|
VMSTATE_UINT32(env.sp, AVRCPU),
|
|
VMSTATE_UINT32(env.skip, AVRCPU),
|
|
|
|
VMSTATE_UINT32_ARRAY(env.r, AVRCPU, NUMBER_OF_CPU_REGISTERS),
|
|
|
|
VMSTATE_SINGLE(env, AVRCPU, 0, vms_sreg, CPUAVRState),
|
|
VMSTATE_SINGLE(env.rampD, AVRCPU, 0, vms_rampD, uint32_t),
|
|
VMSTATE_SINGLE(env.rampX, AVRCPU, 0, vms_rampX, uint32_t),
|
|
VMSTATE_SINGLE(env.rampY, AVRCPU, 0, vms_rampY, uint32_t),
|
|
VMSTATE_SINGLE(env.rampZ, AVRCPU, 0, vms_rampZ, uint32_t),
|
|
VMSTATE_SINGLE(env.eind, AVRCPU, 0, vms_eind, uint32_t),
|
|
|
|
VMSTATE_END_OF_LIST()
|
|
}
|
|
};
|