/* * Microblaze VMState for qemu. * * Copyright (c) 2020 Linaro, Ltd. * * 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 . */ #include "qemu/osdep.h" #include "cpu.h" #include "migration/cpu.h" static VMStateField vmstate_mmu_fields[] = { VMSTATE_UINT64_2DARRAY(rams, MicroBlazeMMU, 2, TLB_ENTRIES), VMSTATE_UINT8_ARRAY(tids, MicroBlazeMMU, TLB_ENTRIES), VMSTATE_UINT32_ARRAY(regs, MicroBlazeMMU, 3), VMSTATE_END_OF_LIST() }; static const VMStateDescription vmstate_mmu = { .name = "mmu", .version_id = 0, .minimum_version_id = 0, .fields = vmstate_mmu_fields, }; static int get_msr(QEMUFile *f, void *opaque, size_t size, const VMStateField *field) { CPUMBState *env = container_of(opaque, CPUMBState, msr); mb_cpu_write_msr(env, qemu_get_be32(f)); return 0; } static int put_msr(QEMUFile *f, void *opaque, size_t size, const VMStateField *field, QJSON *vmdesc) { CPUMBState *env = container_of(opaque, CPUMBState, msr); qemu_put_be32(f, mb_cpu_read_msr(env)); return 0; } static const VMStateInfo vmstate_msr = { .name = "msr", .get = get_msr, .put = put_msr, }; static VMStateField vmstate_env_fields[] = { VMSTATE_UINT32_ARRAY(regs, CPUMBState, 32), VMSTATE_UINT32(pc, CPUMBState), VMSTATE_SINGLE(msr, CPUMBState, 0, vmstate_msr, uint32_t), VMSTATE_UINT32(esr, CPUMBState), VMSTATE_UINT32(fsr, CPUMBState), VMSTATE_UINT32(btr, CPUMBState), VMSTATE_UINT32(edr, CPUMBState), VMSTATE_UINT32(slr, CPUMBState), VMSTATE_UINT32(shr, CPUMBState), VMSTATE_UINT64(ear, CPUMBState), VMSTATE_UINT32(btarget, CPUMBState), VMSTATE_UINT32(imm, CPUMBState), VMSTATE_UINT32(iflags, CPUMBState), VMSTATE_UINT32(res_val, CPUMBState), VMSTATE_UINTTL(res_addr, CPUMBState), VMSTATE_STRUCT(mmu, CPUMBState, 0, vmstate_mmu, MicroBlazeMMU), VMSTATE_END_OF_LIST() }; static const VMStateDescription vmstate_env = { .name = "env", .version_id = 0, .minimum_version_id = 0, .fields = vmstate_env_fields, }; static VMStateField vmstate_cpu_fields[] = { VMSTATE_CPU(), VMSTATE_STRUCT(env, MicroBlazeCPU, 1, vmstate_env, CPUMBState), VMSTATE_END_OF_LIST() }; const VMStateDescription vmstate_mb_cpu = { .name = "cpu", .version_id = 0, .minimum_version_id = 0, .fields = vmstate_cpu_fields, };