From ef1df13087768c0ab4010355595b0e3dd91bbd3c Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 30 Sep 2014 10:58:42 +0200 Subject: s390x/migration: migrate CPU state This patch provides the cpu save information for dumps and later life migration and enables migration of the CPU state. The code is based on earlier work from Christian Borntraeger and Jason Herne. Signed-off-by: Thomas Huth Signed-off-by: David Hildenbrand [provide cpu_post_load()] Signed-off-by: Jens Freimann CC: Andreas Faerber CC: Christian Borntraeger CC: Jason J. Herne Tested-by: Christian Borntraeger [Cornelia Huck: tweaked cpu_post_load() comment] Signed-off-by: Cornelia Huck --- target-s390x/Makefile.objs | 2 +- target-s390x/cpu-qom.h | 4 +++ target-s390x/cpu.c | 7 +---- target-s390x/machine.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 target-s390x/machine.c (limited to 'target-s390x') diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs index f8731463ff..2c5749447f 100644 --- a/target-s390x/Makefile.objs +++ b/target-s390x/Makefile.objs @@ -1,5 +1,5 @@ obj-y += translate.o helper.o cpu.o interrupt.o obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o misc_helper.o obj-y += gdbstub.o -obj-$(CONFIG_SOFTMMU) += ioinst.o arch_dump.o +obj-$(CONFIG_SOFTMMU) += machine.o ioinst.o arch_dump.o obj-$(CONFIG_KVM) += kvm.o diff --git a/target-s390x/cpu-qom.h b/target-s390x/cpu-qom.h index 4f7d4cbe14..8b376df1b7 100644 --- a/target-s390x/cpu-qom.h +++ b/target-s390x/cpu-qom.h @@ -77,6 +77,10 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env) #define ENV_OFFSET offsetof(S390CPU, env) +#ifndef CONFIG_USER_ONLY +extern const struct VMStateDescription vmstate_s390_cpu; +#endif + void s390_cpu_do_interrupt(CPUState *cpu); bool s390_cpu_exec_interrupt(CPUState *cpu, int int_req); void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index ec7df90dcd..d2f6312e03 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -292,11 +292,6 @@ unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu) } #endif -static const VMStateDescription vmstate_s390_cpu = { - .name = "cpu", - .unmigratable = 1, -}; - static void s390_cpu_class_init(ObjectClass *oc, void *data) { S390CPUClass *scc = S390_CPU_CLASS(oc); @@ -323,11 +318,11 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data) cc->handle_mmu_fault = s390_cpu_handle_mmu_fault; #else cc->get_phys_page_debug = s390_cpu_get_phys_page_debug; + cc->vmsd = &vmstate_s390_cpu; cc->write_elf64_note = s390_cpu_write_elf64_note; cc->write_elf64_qemunote = s390_cpu_write_elf64_qemunote; cc->cpu_exec_interrupt = s390_cpu_exec_interrupt; #endif - dc->vmsd = &vmstate_s390_cpu; cc->gdb_num_core_regs = S390_NUM_CORE_REGS; cc->gdb_core_xml_file = "s390x-core64.xml"; } diff --git a/target-s390x/machine.c b/target-s390x/machine.c new file mode 100644 index 0000000000..fbcb0d0863 --- /dev/null +++ b/target-s390x/machine.c @@ -0,0 +1,76 @@ +/* + * S390x machine definitions and functions + * + * Copyright IBM Corp. 2014 + * + * Authors: + * Thomas Huth + * Christian Borntraeger + * Jason J. Herne + * + * This work is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + */ + +#include "hw/hw.h" +#include "cpu.h" +#include "sysemu/kvm.h" + +static int cpu_post_load(void *opaque, int version_id) +{ + S390CPU *cpu = opaque; + + /* + * As the cpu state is pushed to kvm via kvm_set_mp_state rather + * than via cpu_synchronize_state, we need update kvm here. + */ + if (kvm_enabled()) { + kvm_s390_set_cpu_state(cpu, cpu->env.cpu_state); + } + + return 0; +} + +const VMStateDescription vmstate_s390_cpu = { + .name = "cpu", + .post_load = cpu_post_load, + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_UINT64(env.fregs[0].ll, S390CPU), + VMSTATE_UINT64(env.fregs[1].ll, S390CPU), + VMSTATE_UINT64(env.fregs[2].ll, S390CPU), + VMSTATE_UINT64(env.fregs[3].ll, S390CPU), + VMSTATE_UINT64(env.fregs[4].ll, S390CPU), + VMSTATE_UINT64(env.fregs[5].ll, S390CPU), + VMSTATE_UINT64(env.fregs[6].ll, S390CPU), + VMSTATE_UINT64(env.fregs[7].ll, S390CPU), + VMSTATE_UINT64(env.fregs[8].ll, S390CPU), + VMSTATE_UINT64(env.fregs[9].ll, S390CPU), + VMSTATE_UINT64(env.fregs[10].ll, S390CPU), + VMSTATE_UINT64(env.fregs[11].ll, S390CPU), + VMSTATE_UINT64(env.fregs[12].ll, S390CPU), + VMSTATE_UINT64(env.fregs[13].ll, S390CPU), + VMSTATE_UINT64(env.fregs[14].ll, S390CPU), + VMSTATE_UINT64(env.fregs[15].ll, S390CPU), + VMSTATE_UINT64_ARRAY(env.regs, S390CPU, 16), + VMSTATE_UINT64(env.psw.mask, S390CPU), + VMSTATE_UINT64(env.psw.addr, S390CPU), + VMSTATE_UINT64(env.psa, S390CPU), + VMSTATE_UINT32(env.fpc, S390CPU), + VMSTATE_UINT32(env.todpr, S390CPU), + VMSTATE_UINT64(env.pfault_token, S390CPU), + VMSTATE_UINT64(env.pfault_compare, S390CPU), + VMSTATE_UINT64(env.pfault_select, S390CPU), + VMSTATE_UINT64(env.cputm, S390CPU), + VMSTATE_UINT64(env.ckc, S390CPU), + VMSTATE_UINT64(env.gbea, S390CPU), + VMSTATE_UINT64(env.pp, S390CPU), + VMSTATE_UINT32_ARRAY(env.aregs, S390CPU, 16), + VMSTATE_UINT64_ARRAY(env.cregs, S390CPU, 16), + VMSTATE_UINT8(env.cpu_state, S390CPU), + VMSTATE_END_OF_LIST() + }, +}; -- cgit v1.2.1