From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57983) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V3oIL-0000c7-VA for qemu-devel@nongnu.org; Mon, 29 Jul 2013 10:19:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V3oI9-0000my-8y for qemu-devel@nongnu.org; Mon, 29 Jul 2013 10:19:29 -0400 Received: from e06smtp11.uk.ibm.com ([195.75.94.107]:54955) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V3oI9-0000mk-0T for qemu-devel@nongnu.org; Mon, 29 Jul 2013 10:19:17 -0400 Received: from /spool/local by e06smtp11.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 29 Jul 2013 15:13:08 +0100 Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by d06dlp03.portsmouth.uk.ibm.com (Postfix) with ESMTP id 433DD1B08066 for ; Mon, 29 Jul 2013 15:19:14 +0100 (BST) Received: from d06av10.portsmouth.uk.ibm.com (d06av10.portsmouth.uk.ibm.com [9.149.37.251]) by b06cxnps4076.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r6TEJ2WY50004080 for ; Mon, 29 Jul 2013 14:19:02 GMT Received: from d06av10.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av10.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r6TEJDsV004034 for ; Mon, 29 Jul 2013 08:19:13 -0600 From: Christian Borntraeger Date: Mon, 29 Jul 2013 16:19:22 +0200 Message-Id: <1375107567-24301-2-git-send-email-borntraeger@de.ibm.com> In-Reply-To: <1375107567-24301-1-git-send-email-borntraeger@de.ibm.com> References: <1375107567-24301-1-git-send-email-borntraeger@de.ibm.com> Subject: [Qemu-devel] [PATCH 1/6] s390/kvm: basic implementation of diagnose 308 subcode 6 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Graf Cc: Cornelia Huck , "Eugene (jno) Dvurechenski" , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Christian Borntraeger , qemu-devel From: "Eugene (jno) Dvurechenski" Linux uses a check for subcode 6 to decide if other subcodes are available. Provide a minimal implementation. Signed-off-by: Eugene (jno) Dvurechenski Reviewed-by: Cornelia Huck Signed-off-by: Christian Borntraeger --- target-s390x/kvm.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 960b3cf..ec1d1a5 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -72,9 +72,12 @@ #define PRIV_XSCH 0x76 #define PRIV_SQBS 0x8a #define PRIV_EQBS 0x9c +#define DIAG_IPL 0x308 #define DIAG_KVM_HYPERCALL 0x500 #define DIAG_KVM_BREAKPOINT 0x501 +#define DIAG_IPL_RC_OK_NOT4CONF 0x0102 + #define ICPT_INSTRUCTION 0x04 #define ICPT_WAITPSW 0x1c #define ICPT_SOFT_INTERCEPT 0x24 @@ -578,11 +581,54 @@ static int handle_hypercall(S390CPU *cpu, struct kvm_run *run) return 0; } +static int handle_diag308(S390CPU *cpu, struct kvm_run *run) +{ + uint64_t r1, r3, addr, subcode; + + cpu_synchronize_state(CPU(cpu)); + + if (cpu->env.psw.mask & PSW_MASK_PSTATE) { + enter_pgmcheck(cpu, PGM_PRIVILEGED); + return 0; + } + + r1 = (run->s390_sieic.ipa & 0x00f0) >> 8; + r3 = run->s390_sieic.ipa & 0x000f; + addr = cpu->env.regs[r1]; + subcode = cpu->env.regs[r3]; + + if ((subcode & ~0x0ffffULL) || (subcode > 6)) { + enter_pgmcheck(cpu, PGM_SPECIFICATION); + return 0; + } + + switch (subcode) { + case 5: + if ((r1 & 1) || (addr & 0x0fffULL)) { + enter_pgmcheck(cpu, PGM_SPECIFICATION); + return 0; + } + return -1; + case 6: + if ((r1 & 1) || (addr & 0x0fffULL)) { + enter_pgmcheck(cpu, PGM_SPECIFICATION); + return 0; + } + cpu->env.regs[r1+1] = DIAG_IPL_RC_OK_NOT4CONF; + return 0; + default: + return -1; + } +} + static int handle_diag(S390CPU *cpu, struct kvm_run *run, int ipb_code) { int r = 0; switch (ipb_code) { + case DIAG_IPL: + r = handle_diag308(cpu, run); + break; case DIAG_KVM_HYPERCALL: r = handle_hypercall(cpu, run); break; -- 1.8.3.1