From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:59224) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TgyPD-0000mq-UH for qemu-devel@nongnu.org; Fri, 07 Dec 2012 08:56:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TgyP7-0004y5-RQ for qemu-devel@nongnu.org; Fri, 07 Dec 2012 08:55:55 -0500 Received: from e06smtp12.uk.ibm.com ([195.75.94.108]:60322) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TgyP7-0004xQ-IB for qemu-devel@nongnu.org; Fri, 07 Dec 2012 08:55:49 -0500 Received: from /spool/local by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 7 Dec 2012 13:55:36 -0000 Received: from d06av12.portsmouth.uk.ibm.com (d06av12.portsmouth.uk.ibm.com [9.149.37.247]) by b06cxnps4076.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id qB7DtaZ165863812 for ; Fri, 7 Dec 2012 13:55:36 GMT Received: from d06av12.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av12.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id qB7Dth3M024992 for ; Fri, 7 Dec 2012 06:55:44 -0700 From: Jens Freimann Date: Fri, 7 Dec 2012 14:55:31 +0100 Message-Id: <1354888531-47836-4-git-send-email-jfrei@linux.vnet.ibm.com> In-Reply-To: <1354888531-47836-1-git-send-email-jfrei@linux.vnet.ibm.com> References: <1354888531-47836-1-git-send-email-jfrei@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 3/3] s390: add cpu reset handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: Heinz Graalfs , qemu-devel , Christian Borntraeger , Jens Freimann , Cornelia Huck , Einar Lueck Add a CPU reset handler to have all CPUs in a PoP compliant state. Signed-off-by: Jens Freimann --- target-s390x/cpu.c | 25 +++++++++++++++++++++++++ target-s390x/kvm.c | 10 +++++++++- 2 files changed, 34 insertions(+), 1 deletions(-) diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c index 619b202..a601380 100644 --- a/target-s390x/cpu.c +++ b/target-s390x/cpu.c @@ -4,6 +4,7 @@ * Copyright (c) 2009 Ulrich Hecht * Copyright (c) 2011 Alexander Graf * Copyright (c) 2012 SUSE LINUX Products GmbH + * Copyright (c) 2012 IBM Corp. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,12 +19,35 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see * + * Contributions after 2012-12-07 are licensed under the terms of the + * GNU GPL, version 2 or (at your option) any later version. + * */ #include "cpu.h" +#include "hw/hw.h" #include "qemu-common.h" #include "qemu-timer.h" +/* TODO: remove me, when reset over QOM tree is implemented */ +static void s390_cpu_machine_reset_cb(void *opaque) +{ + S390CPU *cpu = opaque; + CPUS390XState *env = &cpu->env; + + memset(env->regs, 0, sizeof(env->regs)); + memset(env->aregs, 0, sizeof(env->aregs)); + memset(env->cregs, 0, sizeof(env->cregs)); + memset(env->fregs, 0, sizeof(env->fregs)); + /* architectured initial values for CR 0 and 14 */ + env->cregs[0] = 0xE0UL; + env->cregs[14] = 0xC2000000UL; + env->psw.addr = 0; + /* set to z/Architecture mode */ + env->psw.mask = 0x0000000180000000ULL; + env->psa = 0; + s390_del_running_cpu(env); +} /* CPUClass::reset() */ static void s390_cpu_reset(CPUState *s) @@ -56,6 +80,7 @@ static void s390_cpu_initfn(Object *obj) cpu_exec_init(env); #if !defined(CONFIG_USER_ONLY) + qemu_register_reset(s390_cpu_machine_reset_cb, cpu); qemu_get_timedate(&tm, 0); env->tod_offset = TOD_UNIX_EPOCH + (time2tod(mktimegm(&tm)) * 1000000000ULL); diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 94de764..3969a49 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -85,7 +85,15 @@ int kvm_arch_init_vcpu(CPUS390XState *env) void kvm_arch_reset_vcpu(CPUS390XState *env) { - /* FIXME: add code to reset vcpu. */ + /* The initial reset call is needed here to reset in-kernel + * vcpu data that we can't access directly from QEMU + * (i.e. with older kernels which don't support sync_regs/ONE_REG). + * Before this ioctl cpu_synchronize_state() is called in common kvm + * code (kvm-all) */ + if (kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, NULL)) { + perror("Can't reset vcpu\n"); + } + } int kvm_arch_put_registers(CPUS390XState *env, int level) -- 1.7.1