xref: /qemu/target/alpha/machine.c (revision 4d5712f19b464cce8a3fdfad055f3d5833bd0d08)
1b758aca1SRichard Henderson #include "hw/hw.h"
2b758aca1SRichard Henderson #include "hw/boards.h"
3b758aca1SRichard Henderson 
4b758aca1SRichard Henderson static int get_fpcr(QEMUFile *f, void *opaque, size_t size)
5b758aca1SRichard Henderson {
6b758aca1SRichard Henderson     CPUAlphaState *env = opaque;
7b758aca1SRichard Henderson     cpu_alpha_store_fpcr(env, qemu_get_be64(f));
8b758aca1SRichard Henderson     return 0;
9b758aca1SRichard Henderson }
10b758aca1SRichard Henderson 
11b758aca1SRichard Henderson static void put_fpcr(QEMUFile *f, void *opaque, size_t size)
12b758aca1SRichard Henderson {
13b758aca1SRichard Henderson     CPUAlphaState *env = opaque;
14b758aca1SRichard Henderson     qemu_put_be64(f, cpu_alpha_load_fpcr(env));
15b758aca1SRichard Henderson }
16b758aca1SRichard Henderson 
17b758aca1SRichard Henderson static const VMStateInfo vmstate_fpcr = {
18b758aca1SRichard Henderson     .name = "fpcr",
19b758aca1SRichard Henderson     .get = get_fpcr,
20b758aca1SRichard Henderson     .put = put_fpcr,
21b758aca1SRichard Henderson };
22b758aca1SRichard Henderson 
23b758aca1SRichard Henderson static VMStateField vmstate_cpu_fields[] = {
244d5712f1SAndreas Färber     VMSTATE_UINTTL_ARRAY(ir, CPUAlphaState, 31),
254d5712f1SAndreas Färber     VMSTATE_UINTTL_ARRAY(fir, CPUAlphaState, 31),
26b758aca1SRichard Henderson     /* Save the architecture value of the fpcr, not the internally
27b758aca1SRichard Henderson        expanded version.  Since this architecture value does not
28b758aca1SRichard Henderson        exist in memory to be stored, this requires a but of hoop
29b758aca1SRichard Henderson        jumping.  We want OFFSET=0 so that we effectively pass ENV
30b758aca1SRichard Henderson        to the helper functions, and we need to fill in the name by
31b758aca1SRichard Henderson        hand since there's no field of that name.  */
32b758aca1SRichard Henderson     {
33b758aca1SRichard Henderson         .name = "fpcr",
34b758aca1SRichard Henderson         .version_id = 0,
35b758aca1SRichard Henderson         .size = sizeof(uint64_t),
36b758aca1SRichard Henderson         .info = &vmstate_fpcr,
37b758aca1SRichard Henderson         .flags = VMS_SINGLE,
38b758aca1SRichard Henderson         .offset = 0
39b758aca1SRichard Henderson     },
404d5712f1SAndreas Färber     VMSTATE_UINTTL(pc, CPUAlphaState),
414d5712f1SAndreas Färber     VMSTATE_UINTTL(unique, CPUAlphaState),
424d5712f1SAndreas Färber     VMSTATE_UINTTL(lock_addr, CPUAlphaState),
434d5712f1SAndreas Färber     VMSTATE_UINTTL(lock_value, CPUAlphaState),
44b758aca1SRichard Henderson     /* Note that lock_st_addr is not saved; it is a temporary
45b758aca1SRichard Henderson        used during the execution of the st[lq]_c insns.  */
46b758aca1SRichard Henderson 
474d5712f1SAndreas Färber     VMSTATE_UINT8(ps, CPUAlphaState),
484d5712f1SAndreas Färber     VMSTATE_UINT8(intr_flag, CPUAlphaState),
494d5712f1SAndreas Färber     VMSTATE_UINT8(pal_mode, CPUAlphaState),
504d5712f1SAndreas Färber     VMSTATE_UINT8(fen, CPUAlphaState),
5126b46094SRichard Henderson 
524d5712f1SAndreas Färber     VMSTATE_UINT32(pcc_ofs, CPUAlphaState),
53b758aca1SRichard Henderson 
544d5712f1SAndreas Färber     VMSTATE_UINTTL(trap_arg0, CPUAlphaState),
554d5712f1SAndreas Färber     VMSTATE_UINTTL(trap_arg1, CPUAlphaState),
564d5712f1SAndreas Färber     VMSTATE_UINTTL(trap_arg2, CPUAlphaState),
57b758aca1SRichard Henderson 
584d5712f1SAndreas Färber     VMSTATE_UINTTL(exc_addr, CPUAlphaState),
594d5712f1SAndreas Färber     VMSTATE_UINTTL(palbr, CPUAlphaState),
604d5712f1SAndreas Färber     VMSTATE_UINTTL(ptbr, CPUAlphaState),
614d5712f1SAndreas Färber     VMSTATE_UINTTL(vptptr, CPUAlphaState),
624d5712f1SAndreas Färber     VMSTATE_UINTTL(sysval, CPUAlphaState),
634d5712f1SAndreas Färber     VMSTATE_UINTTL(usp, CPUAlphaState),
6426b46094SRichard Henderson 
654d5712f1SAndreas Färber     VMSTATE_UINTTL_ARRAY(shadow, CPUAlphaState, 8),
664d5712f1SAndreas Färber     VMSTATE_UINTTL_ARRAY(scratch, CPUAlphaState, 24),
6726b46094SRichard Henderson 
68b758aca1SRichard Henderson     VMSTATE_END_OF_LIST()
69b758aca1SRichard Henderson };
70b758aca1SRichard Henderson 
71b758aca1SRichard Henderson static const VMStateDescription vmstate_cpu = {
72b758aca1SRichard Henderson     .name = "cpu",
73b758aca1SRichard Henderson     .version_id = 1,
74b758aca1SRichard Henderson     .minimum_version_id = 1,
75b758aca1SRichard Henderson     .minimum_version_id_old = 1,
76b758aca1SRichard Henderson     .fields = vmstate_cpu_fields,
77b758aca1SRichard Henderson };
78b758aca1SRichard Henderson 
79b758aca1SRichard Henderson void cpu_save(QEMUFile *f, void *opaque)
80b758aca1SRichard Henderson {
81b758aca1SRichard Henderson     vmstate_save_state(f, &vmstate_cpu, opaque);
82b758aca1SRichard Henderson }
83b758aca1SRichard Henderson 
84b758aca1SRichard Henderson int cpu_load(QEMUFile *f, void *opaque, int version_id)
85b758aca1SRichard Henderson {
86b758aca1SRichard Henderson     return vmstate_load_state(f, &vmstate_cpu, opaque, version_id);
87b758aca1SRichard Henderson }
88