aboutsummaryrefslogtreecommitdiff
path: root/target/openrisc/machine.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2015-02-18 11:45:54 -0800
committerRichard Henderson <rth@twiddle.net>2017-02-14 08:14:59 +1100
commit84775c43f390d4f5dd9adf8732e7e0b6deed8f61 (patch)
tree56b0df7c4bfbcbafb342b4d3f7fb8c862ad2431e /target/openrisc/machine.c
parentcf2ae4428f320f3d8027a50c1cd45f4b5a6c93bb (diff)
downloadqemu-84775c43f390d4f5dd9adf8732e7e0b6deed8f61.zip
qemu-84775c43f390d4f5dd9adf8732e7e0b6deed8f61.tar.gz
qemu-84775c43f390d4f5dd9adf8732e7e0b6deed8f61.tar.bz2
target/openrisc: Keep SR_F in a separate variable
This avoids having to keep merging and extracting the flag from SR. Reviewed-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'target/openrisc/machine.c')
-rw-r--r--target/openrisc/machine.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/target/openrisc/machine.c b/target/openrisc/machine.c
index d0b47ef..b723138 100644
--- a/target/openrisc/machine.c
+++ b/target/openrisc/machine.c
@@ -24,6 +24,27 @@
#include "hw/boards.h"
#include "migration/cpu.h"
+static int get_sr(QEMUFile *f, void *opaque, size_t size, VMStateField *field)
+{
+ CPUOpenRISCState *env = opaque;
+ cpu_set_sr(env, qemu_get_be32(f));
+ return 0;
+}
+
+static int put_sr(QEMUFile *f, void *opaque, size_t size,
+ VMStateField *field, QJSON *vmdesc)
+{
+ CPUOpenRISCState *env = opaque;
+ qemu_put_be32(f, cpu_get_sr(env));
+ return 0;
+}
+
+static const VMStateInfo vmstate_sr = {
+ .name = "sr",
+ .get = get_sr,
+ .put = put_sr,
+};
+
static const VMStateDescription vmstate_env = {
.name = "env",
.version_id = 2,
@@ -38,7 +59,22 @@ static const VMStateDescription vmstate_env = {
VMSTATE_UINTTL(lock_value, CPUOpenRISCState),
VMSTATE_UINTTL(epcr, CPUOpenRISCState),
VMSTATE_UINTTL(eear, CPUOpenRISCState),
- VMSTATE_UINT32(sr, CPUOpenRISCState),
+
+ /* Save the architecture value of the SR, 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 ENV
+ to the helper functions, and we need to fill in the name by
+ hand since there's no field of that name. */
+ {
+ .name = "sr",
+ .version_id = 0,
+ .size = sizeof(uint32_t),
+ .info = &vmstate_sr,
+ .flags = VMS_SINGLE,
+ .offset = 0
+ },
+
VMSTATE_UINT32(vr, CPUOpenRISCState),
VMSTATE_UINT32(upr, CPUOpenRISCState),
VMSTATE_UINT32(cpucfgr, CPUOpenRISCState),