From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54894) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIcog-0000he-M9 for qemu-devel@nongnu.org; Wed, 26 Feb 2014 06:38:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WIcoX-0001u3-Cw for qemu-devel@nongnu.org; Wed, 26 Feb 2014 06:38:22 -0500 Received: from e06smtp16.uk.ibm.com ([195.75.94.112]:40973) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIcoX-0001tL-4m for qemu-devel@nongnu.org; Wed, 26 Feb 2014 06:38:13 -0500 Received: from /spool/local by e06smtp16.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 26 Feb 2014 11:38:11 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by d06dlp02.portsmouth.uk.ibm.com (Postfix) with ESMTP id 5EEF9219005E for ; Wed, 26 Feb 2014 11:38:05 +0000 (GMT) Received: from d06av05.portsmouth.uk.ibm.com (d06av05.portsmouth.uk.ibm.com [9.149.37.229]) by b06cxnps3075.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s1QBbuhn27590710 for ; Wed, 26 Feb 2014 11:37:56 GMT Received: from d06av05.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av05.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s1QBc7kT023403 for ; Wed, 26 Feb 2014 04:38:08 -0700 From: Christian Borntraeger Date: Wed, 26 Feb 2014 12:38:25 +0100 Message-Id: <1393414708-37739-3-git-send-email-borntraeger@de.ibm.com> In-Reply-To: <1393414708-37739-1-git-send-email-borntraeger@de.ibm.com> References: <1393414708-37739-1-git-send-email-borntraeger@de.ibm.com> Subject: [Qemu-devel] [PATCH 2/5] s390x/kvm: Rework SIGP INITIAL CPU RESET handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel Cc: Peter Maydell , Thomas Huth , Alexander Graf , Christian Borntraeger , Jens Freimann , Anthony Liguori , Cornelia Huck , Richard Henderson From: Thomas Huth The s390_cpu_initial_reset() function had two deficiencies: First, it used an ioctl for the destination CPU, and this ioctl could block nearly forever, as long as the destination CPU was running in the SIE loop. Second, it also cleared the general purpose registers - something it should not do according to the Principles of Operations. Since we've already got another function for the initial CPU reset in cpu.c, we can also use that function instead. And by using run_on_cpu() for executing this code, we make sure that the destination CPU is correctly kicked out of kernel mode now. Suggested-by: Christian Borntraeger Signed-off-by: Thomas Huth Reviewed-by: Cornelia Huck Signed-off-by: Christian Borntraeger --- target-s390x/kvm.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index d3f0d4a..75e8822 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -626,25 +626,13 @@ int kvm_s390_cpu_restart(S390CPU *cpu) return 0; } -static int s390_cpu_initial_reset(S390CPU *cpu) +static void sigp_initial_cpu_reset(void *arg) { - CPUState *cs = CPU(cpu); - CPUS390XState *env = &cpu->env; - int i; - - s390_del_running_cpu(cpu); - if (kvm_vcpu_ioctl(cs, KVM_S390_INITIAL_RESET, NULL) < 0) { - perror("cannot init reset vcpu"); - } + CPUState *cpu = arg; + S390CPUClass *scc = S390_CPU_GET_CLASS(cpu); - /* Manually zero out all registers */ - cpu_synchronize_state(cs); - for (i = 0; i < 16; i++) { - env->regs[i] = 0; - } - - DPRINTF("DONE: SIGP initial reset: %p\n", env); - return 0; + cpu_synchronize_state(cpu); + scc->initial_cpu_reset(cpu); } #define SIGP_ORDER_MASK 0x000000ff @@ -683,7 +671,8 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) cc = 1; /* status stored */ break; case SIGP_INITIAL_CPU_RESET: - cc = s390_cpu_initial_reset(target_cpu); + run_on_cpu(CPU(target_cpu), sigp_initial_cpu_reset, CPU(target_cpu)); + cc = 0; break; default: DPRINTF("KVM: unknown SIGP: 0x%x\n", order_code); -- 1.8.4.2