177f63e1dSRichard Henderson /* 277f63e1dSRichard Henderson * Microblaze VMState for qemu. 377f63e1dSRichard Henderson * 477f63e1dSRichard Henderson * Copyright (c) 2020 Linaro, Ltd. 577f63e1dSRichard Henderson * 677f63e1dSRichard Henderson * This library is free software; you can redistribute it and/or 777f63e1dSRichard Henderson * modify it under the terms of the GNU Lesser General Public 877f63e1dSRichard Henderson * License as published by the Free Software Foundation; either 9ee452036SChetan Pant * version 2.1 of the License, or (at your option) any later version. 1077f63e1dSRichard Henderson * 1177f63e1dSRichard Henderson * This library is distributed in the hope that it will be useful, 1277f63e1dSRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of 1377f63e1dSRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1477f63e1dSRichard Henderson * Lesser General Public License for more details. 1577f63e1dSRichard Henderson * 1677f63e1dSRichard Henderson * You should have received a copy of the GNU Lesser General Public 1777f63e1dSRichard Henderson * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1877f63e1dSRichard Henderson */ 1977f63e1dSRichard Henderson 2077f63e1dSRichard Henderson #include "qemu/osdep.h" 2177f63e1dSRichard Henderson #include "cpu.h" 2277f63e1dSRichard Henderson #include "migration/cpu.h" 2377f63e1dSRichard Henderson 2477f63e1dSRichard Henderson 2561d5442aSRichard Henderson static const VMStateField vmstate_mmu_fields[] = { 2677f63e1dSRichard Henderson VMSTATE_UINT64_2DARRAY(rams, MicroBlazeMMU, 2, TLB_ENTRIES), 2777f63e1dSRichard Henderson VMSTATE_UINT8_ARRAY(tids, MicroBlazeMMU, TLB_ENTRIES), 2877f63e1dSRichard Henderson VMSTATE_UINT32_ARRAY(regs, MicroBlazeMMU, 3), 2977f63e1dSRichard Henderson VMSTATE_END_OF_LIST() 3077f63e1dSRichard Henderson }; 3177f63e1dSRichard Henderson 3277f63e1dSRichard Henderson static const VMStateDescription vmstate_mmu = { 3377f63e1dSRichard Henderson .name = "mmu", 3477f63e1dSRichard Henderson .version_id = 0, 3577f63e1dSRichard Henderson .minimum_version_id = 0, 3677f63e1dSRichard Henderson .fields = vmstate_mmu_fields, 3777f63e1dSRichard Henderson }; 3877f63e1dSRichard Henderson 3977f63e1dSRichard Henderson static int get_msr(QEMUFile *f, void *opaque, size_t size, 4077f63e1dSRichard Henderson const VMStateField *field) 4177f63e1dSRichard Henderson { 4277f63e1dSRichard Henderson CPUMBState *env = container_of(opaque, CPUMBState, msr); 4377f63e1dSRichard Henderson 4477f63e1dSRichard Henderson mb_cpu_write_msr(env, qemu_get_be32(f)); 4577f63e1dSRichard Henderson return 0; 4677f63e1dSRichard Henderson } 4777f63e1dSRichard Henderson 4877f63e1dSRichard Henderson static int put_msr(QEMUFile *f, void *opaque, size_t size, 493ddba9a9SMarkus Armbruster const VMStateField *field, JSONWriter *vmdesc) 5077f63e1dSRichard Henderson { 5177f63e1dSRichard Henderson CPUMBState *env = container_of(opaque, CPUMBState, msr); 5277f63e1dSRichard Henderson 5377f63e1dSRichard Henderson qemu_put_be32(f, mb_cpu_read_msr(env)); 5477f63e1dSRichard Henderson return 0; 5577f63e1dSRichard Henderson } 5677f63e1dSRichard Henderson 5777f63e1dSRichard Henderson static const VMStateInfo vmstate_msr = { 5877f63e1dSRichard Henderson .name = "msr", 5977f63e1dSRichard Henderson .get = get_msr, 6077f63e1dSRichard Henderson .put = put_msr, 6177f63e1dSRichard Henderson }; 6277f63e1dSRichard Henderson 6361d5442aSRichard Henderson static const VMStateField vmstate_env_fields[] = { 6477f63e1dSRichard Henderson VMSTATE_UINT32_ARRAY(regs, CPUMBState, 32), 6577f63e1dSRichard Henderson 6677f63e1dSRichard Henderson VMSTATE_UINT32(pc, CPUMBState), 6777f63e1dSRichard Henderson VMSTATE_SINGLE(msr, CPUMBState, 0, vmstate_msr, uint32_t), 6877f63e1dSRichard Henderson VMSTATE_UINT32(esr, CPUMBState), 6977f63e1dSRichard Henderson VMSTATE_UINT32(fsr, CPUMBState), 7077f63e1dSRichard Henderson VMSTATE_UINT32(btr, CPUMBState), 7177f63e1dSRichard Henderson VMSTATE_UINT32(edr, CPUMBState), 7277f63e1dSRichard Henderson VMSTATE_UINT32(slr, CPUMBState), 7377f63e1dSRichard Henderson VMSTATE_UINT32(shr, CPUMBState), 7477f63e1dSRichard Henderson VMSTATE_UINT64(ear, CPUMBState), 7577f63e1dSRichard Henderson 7677f63e1dSRichard Henderson VMSTATE_UINT32(btarget, CPUMBState), 7777f63e1dSRichard Henderson VMSTATE_UINT32(imm, CPUMBState), 7877f63e1dSRichard Henderson VMSTATE_UINT32(iflags, CPUMBState), 7977f63e1dSRichard Henderson 8077f63e1dSRichard Henderson VMSTATE_UINT32(res_val, CPUMBState), 8177f63e1dSRichard Henderson VMSTATE_UINTTL(res_addr, CPUMBState), 8277f63e1dSRichard Henderson 8377f63e1dSRichard Henderson VMSTATE_STRUCT(mmu, CPUMBState, 0, vmstate_mmu, MicroBlazeMMU), 8477f63e1dSRichard Henderson 8577f63e1dSRichard Henderson VMSTATE_END_OF_LIST() 8677f63e1dSRichard Henderson }; 8777f63e1dSRichard Henderson 8877f63e1dSRichard Henderson static const VMStateDescription vmstate_env = { 8977f63e1dSRichard Henderson .name = "env", 9077f63e1dSRichard Henderson .version_id = 0, 9177f63e1dSRichard Henderson .minimum_version_id = 0, 9277f63e1dSRichard Henderson .fields = vmstate_env_fields, 9377f63e1dSRichard Henderson }; 9477f63e1dSRichard Henderson 9561d5442aSRichard Henderson static const VMStateField vmstate_cpu_fields[] = { 96*dd54fc2aSPhilippe Mathieu-Daudé VMSTATE_STRUCT(parent_obj, MicroBlazeCPU, 0, vmstate_cpu_common, CPUState), 9777f63e1dSRichard Henderson VMSTATE_STRUCT(env, MicroBlazeCPU, 1, vmstate_env, CPUMBState), 9877f63e1dSRichard Henderson VMSTATE_END_OF_LIST() 9977f63e1dSRichard Henderson }; 10077f63e1dSRichard Henderson 10177f63e1dSRichard Henderson const VMStateDescription vmstate_mb_cpu = { 10277f63e1dSRichard Henderson .name = "cpu", 10377f63e1dSRichard Henderson .version_id = 0, 10477f63e1dSRichard Henderson .minimum_version_id = 0, 10577f63e1dSRichard Henderson .fields = vmstate_cpu_fields, 10677f63e1dSRichard Henderson }; 107