From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51606) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vsubf-0005mf-BL for qemu-devel@nongnu.org; Tue, 17 Dec 2013 08:22:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VsubW-00053Q-CZ for qemu-devel@nongnu.org; Tue, 17 Dec 2013 08:22:39 -0500 Received: from e06smtp10.uk.ibm.com ([195.75.94.106]:47388) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsubW-00053J-3a for qemu-devel@nongnu.org; Tue, 17 Dec 2013 08:22:30 -0500 Received: from /spool/local by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 17 Dec 2013 13:22:29 -0000 Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by d06dlp03.portsmouth.uk.ibm.com (Postfix) with ESMTP id B8ADE1B08075 for ; Tue, 17 Dec 2013 13:21:33 +0000 (GMT) Received: from d06av01.portsmouth.uk.ibm.com (d06av01.portsmouth.uk.ibm.com [9.149.37.212]) by b06cxnps4074.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id rBHDMCHR62980126 for ; Tue, 17 Dec 2013 13:22:12 GMT Received: from d06av01.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av01.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id rBHDMOCW010809 for ; Tue, 17 Dec 2013 06:22:24 -0700 From: Jens Freimann Date: Tue, 17 Dec 2013 14:22:09 +0100 Message-Id: <1387286530-31516-8-git-send-email-jfrei@linux.vnet.ibm.com> In-Reply-To: <1387286530-31516-1-git-send-email-jfrei@linux.vnet.ibm.com> References: <1387286530-31516-1-git-send-email-jfrei@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 7/8] s390x/kvm: Fixed condition code for unknown SIGP orders List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Christian Borntraeger , Alexander Graf Cc: Jens Freimann , qemu-devel@nongnu.org, Thomas Huth From: Thomas Huth If SIGP is called with an unknown order code, it has to return CC1 instead of CC3 and set the "invalid order" bit in the return status. Signed-off-by: Thomas Huth Reviewed-by: Cornelia Huck Signed-off-by: Jens Freimann --- target-s390x/kvm.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 0bf3d1f..f7b7726 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -633,8 +633,9 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) CPUS390XState *env = &cpu->env; uint8_t order_code; uint16_t cpu_addr; - int r = -1; S390CPU *target_cpu; + uint64_t *statusreg = &env->regs[ipa1 >> 4]; + int cc; cpu_synchronize_state(CPU(cpu)); @@ -644,29 +645,33 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1) cpu_addr = env->regs[ipa1 & 0x0f]; target_cpu = s390_cpu_addr2state(cpu_addr); if (target_cpu == NULL) { + cc = 3; /* not operational */ goto out; } switch (order_code) { case SIGP_START: - r = kvm_s390_cpu_start(target_cpu); + cc = kvm_s390_cpu_start(target_cpu); break; case SIGP_RESTART: - r = kvm_s390_cpu_restart(target_cpu); + cc = kvm_s390_cpu_restart(target_cpu); break; case SIGP_SET_ARCH: /* make the caller panic */ return -1; case SIGP_INITIAL_CPU_RESET: - r = s390_cpu_initial_reset(target_cpu); + cc = s390_cpu_initial_reset(target_cpu); break; default: - fprintf(stderr, "KVM: unknown SIGP: 0x%x\n", order_code); + DPRINTF("KVM: unknown SIGP: 0x%x\n", order_code); + *statusreg &= 0xffffffff00000000UL; + *statusreg |= SIGP_STAT_INVALID_ORDER; + cc = 1; /* status stored */ break; } out: - setcc(cpu, r ? 3 : 0); + setcc(cpu, cc); return 0; } -- 1.8.3.4