From patchwork Mon Jan 20 18:42:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 11342741 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 51C711398 for ; Mon, 20 Jan 2020 18:43:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3A2842253D for ; Mon, 20 Jan 2020 18:43:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726915AbgATSnF (ORCPT ); Mon, 20 Jan 2020 13:43:05 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:4646 "EHLO mx0b-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726586AbgATSnF (ORCPT ); Mon, 20 Jan 2020 13:43:05 -0500 Received: from pps.filterd (m0127361.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00KIcj24142819 for ; Mon, 20 Jan 2020 13:43:03 -0500 Received: from e06smtp04.uk.ibm.com (e06smtp04.uk.ibm.com [195.75.94.100]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xkwq70njx-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 20 Jan 2020 13:43:03 -0500 Received: from localhost by e06smtp04.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2020 18:43:01 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp04.uk.ibm.com (192.168.101.134) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 20 Jan 2020 18:42:58 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00KIgvIV50724962 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jan 2020 18:42:57 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 73CD54C058; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3784C4C04A; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) Received: from p-imbrenda.boeblingen.de.ibm.com (unknown [9.152.224.108]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, thuth@redhat.com, david@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com Subject: [kvm-unit-tests PATCH v8 1/6] s390x: export sclp_setup_int Date: Mon, 20 Jan 2020 19:42:51 +0100 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200120184256.188698-1-imbrenda@linux.ibm.com> References: <20200120184256.188698-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20012018-0016-0000-0000-000002DF270F X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012018-0017-0000-0000-00003341CC1B Message-Id: <20200120184256.188698-2-imbrenda@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-20_08:2020-01-20,2020-01-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 malwarescore=0 suspectscore=1 phishscore=0 adultscore=0 priorityscore=1501 mlxscore=0 lowpriorityscore=0 mlxlogscore=999 impostorscore=0 spamscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001200156 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Export sclp_setup_int() so that it can be used in tests. Needed for an upcoming unit test. Signed-off-by: Claudio Imbrenda Reviewed-by: Thomas Huth Reviewed-by: Janosch Frank --- lib/s390x/sclp.h | 1 + lib/s390x/sclp.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h index 6d40fb7..675f07e 100644 --- a/lib/s390x/sclp.h +++ b/lib/s390x/sclp.h @@ -265,6 +265,7 @@ typedef struct ReadEventData { } __attribute__((packed)) ReadEventData; extern char _sccb[]; +void sclp_setup_int(void); void sclp_handle_ext(void); void sclp_wait_busy(void); void sclp_mark_busy(void); diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c index 7798f04..123b639 100644 --- a/lib/s390x/sclp.c +++ b/lib/s390x/sclp.c @@ -45,7 +45,7 @@ static void mem_init(phys_addr_t mem_end) page_alloc_ops_enable(); } -static void sclp_setup_int(void) +void sclp_setup_int(void) { uint64_t mask; From patchwork Mon Jan 20 18:42:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 11342743 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 193AD1398 for ; Mon, 20 Jan 2020 18:43:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 00AF52253D for ; Mon, 20 Jan 2020 18:43:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727092AbgATSnM (ORCPT ); Mon, 20 Jan 2020 13:43:12 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:60022 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726780AbgATSnF (ORCPT ); Mon, 20 Jan 2020 13:43:05 -0500 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00KIcs5h036048 for ; Mon, 20 Jan 2020 13:43:04 -0500 Received: from e06smtp05.uk.ibm.com (e06smtp05.uk.ibm.com [195.75.94.101]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xmgf04hr9-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 20 Jan 2020 13:43:04 -0500 Received: from localhost by e06smtp05.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2020 18:43:01 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp05.uk.ibm.com (192.168.101.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 20 Jan 2020 18:42:59 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00KIgvva49217572 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jan 2020 18:42:57 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BF18F4C052; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8A7984C04A; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) Received: from p-imbrenda.boeblingen.de.ibm.com (unknown [9.152.224.108]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, thuth@redhat.com, david@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com Subject: [kvm-unit-tests PATCH v8 2/6] s390x: sclp: add service call instruction wrapper Date: Mon, 20 Jan 2020 19:42:52 +0100 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200120184256.188698-1-imbrenda@linux.ibm.com> References: <20200120184256.188698-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20012018-0020-0000-0000-000003A274CF X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012018-0021-0000-0000-000021FA015A Message-Id: <20200120184256.188698-3-imbrenda@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-20_08:2020-01-20,2020-01-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 impostorscore=0 priorityscore=1501 suspectscore=1 mlxlogscore=999 spamscore=0 mlxscore=0 phishscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001200156 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add a wrapper for the service call instruction, and use it for SCLP interactions instead of using inline assembly everywhere. Signed-off-by: Claudio Imbrenda Reviewed-by: David Hildenbrand Reviewed-by: Thomas Huth Reviewed-by: Janosch Frank --- lib/s390x/asm/arch_def.h | 13 +++++++++++++ lib/s390x/sclp.c | 7 +------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/s390x/asm/arch_def.h b/lib/s390x/asm/arch_def.h index cf6e1ca..1a5e3c6 100644 --- a/lib/s390x/asm/arch_def.h +++ b/lib/s390x/asm/arch_def.h @@ -271,4 +271,17 @@ static inline int stsi(void *addr, int fc, int sel1, int sel2) return cc; } +static inline int servc(uint32_t command, unsigned long sccb) +{ + int cc; + + asm volatile( + " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */ + " ipm %0\n" + " srl %0,28" + : "=&d" (cc) : "d" (command), "a" (sccb) + : "cc", "memory"); + return cc; +} + #endif diff --git a/lib/s390x/sclp.c b/lib/s390x/sclp.c index 123b639..4054d0e 100644 --- a/lib/s390x/sclp.c +++ b/lib/s390x/sclp.c @@ -116,12 +116,7 @@ int sclp_service_call(unsigned int command, void *sccb) int cc; sclp_setup_int(); - asm volatile( - " .insn rre,0xb2200000,%1,%2\n" /* servc %1,%2 */ - " ipm %0\n" - " srl %0,28" - : "=&d" (cc) : "d" (command), "a" (__pa(sccb)) - : "cc", "memory"); + cc = servc(command, __pa(sccb)); sclp_wait_busy(); if (cc == 3) return -1; From patchwork Mon Jan 20 18:42:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 11342731 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5AF9F1398 for ; Mon, 20 Jan 2020 18:43:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 42A5F22314 for ; Mon, 20 Jan 2020 18:43:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726589AbgATSnF (ORCPT ); Mon, 20 Jan 2020 13:43:05 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:50474 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726642AbgATSnF (ORCPT ); Mon, 20 Jan 2020 13:43:05 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00KIcuOg145284 for ; Mon, 20 Jan 2020 13:43:04 -0500 Received: from e06smtp05.uk.ibm.com (e06smtp05.uk.ibm.com [195.75.94.101]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xmgcnkkym-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 20 Jan 2020 13:43:04 -0500 Received: from localhost by e06smtp05.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2020 18:43:01 -0000 Received: from b06avi18626390.portsmouth.uk.ibm.com (9.149.26.192) by e06smtp05.uk.ibm.com (192.168.101.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 20 Jan 2020 18:42:59 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00KIg8Vi34079036 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jan 2020 18:42:08 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1D4D44C05A; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D56C04C04A; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) Received: from p-imbrenda.boeblingen.de.ibm.com (unknown [9.152.224.108]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jan 2020 18:42:57 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, thuth@redhat.com, david@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com Subject: [kvm-unit-tests PATCH v8 3/6] s390x: lib: fix stfl wrapper asm Date: Mon, 20 Jan 2020 19:42:53 +0100 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200120184256.188698-1-imbrenda@linux.ibm.com> References: <20200120184256.188698-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20012018-0020-0000-0000-000003A274D0 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012018-0021-0000-0000-000021FA015B Message-Id: <20200120184256.188698-4-imbrenda@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-20_08:2020-01-20,2020-01-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=691 mlxscore=0 phishscore=0 impostorscore=0 priorityscore=1501 bulkscore=0 adultscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 suspectscore=1 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001200156 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org the stfl wrapper in lib/s390x/asm/facility.h was lacking the "memory" clobber in the inline asm. Signed-off-by: Claudio Imbrenda Reviewed-by: Thomas Huth Reviewed-by: David Hildenbrand Reviewed-by: Janosch Frank --- lib/s390x/asm/facility.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/s390x/asm/facility.h b/lib/s390x/asm/facility.h index 5103dd4..e34dc2c 100644 --- a/lib/s390x/asm/facility.h +++ b/lib/s390x/asm/facility.h @@ -24,7 +24,7 @@ static inline bool test_facility(int nr) static inline void stfl(void) { - asm volatile(" stfl 0(0)\n"); + asm volatile(" stfl 0(0)\n" : : : "memory"); } static inline void stfle(uint8_t *fac, unsigned int len) From patchwork Mon Jan 20 18:42:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 11342737 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B16741398 for ; Mon, 20 Jan 2020 18:43:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 991DC2253D for ; Mon, 20 Jan 2020 18:43:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726935AbgATSnH (ORCPT ); Mon, 20 Jan 2020 13:43:07 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:54784 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726954AbgATSnG (ORCPT ); Mon, 20 Jan 2020 13:43:06 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00KIcu35145263 for ; Mon, 20 Jan 2020 13:43:06 -0500 Received: from e06smtp04.uk.ibm.com (e06smtp04.uk.ibm.com [195.75.94.100]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xmgcnkm0e-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 20 Jan 2020 13:43:05 -0500 Received: from localhost by e06smtp04.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2020 18:43:03 -0000 Received: from b06avi18626390.portsmouth.uk.ibm.com (9.149.26.192) by e06smtp04.uk.ibm.com (192.168.101.134) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 20 Jan 2020 18:43:00 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00KIg8Ye46072192 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jan 2020 18:42:08 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 67AED4C05A; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 348334C04A; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) Received: from p-imbrenda.boeblingen.de.ibm.com (unknown [9.152.224.108]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, thuth@redhat.com, david@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com Subject: [kvm-unit-tests PATCH v8 4/6] s390x: lib: add SPX and STPX instruction wrapper Date: Mon, 20 Jan 2020 19:42:54 +0100 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200120184256.188698-1-imbrenda@linux.ibm.com> References: <20200120184256.188698-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20012018-0016-0000-0000-000002DF2710 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012018-0017-0000-0000-00003341CC1C Message-Id: <20200120184256.188698-5-imbrenda@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-20_08:2020-01-20,2020-01-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=983 mlxscore=0 phishscore=0 impostorscore=0 priorityscore=1501 bulkscore=0 adultscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 suspectscore=1 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001200156 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Add a wrapper for the SET PREFIX and STORE PREFIX instructions, and use it instead of using inline assembly. Signed-off-by: Claudio Imbrenda Reviewed-by: Thomas Huth Reviewed-by: Janosch Frank --- lib/s390x/asm/arch_def.h | 13 +++++++++++++ s390x/intercept.c | 24 +++++++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lib/s390x/asm/arch_def.h b/lib/s390x/asm/arch_def.h index 1a5e3c6..15a4d49 100644 --- a/lib/s390x/asm/arch_def.h +++ b/lib/s390x/asm/arch_def.h @@ -284,4 +284,17 @@ static inline int servc(uint32_t command, unsigned long sccb) return cc; } +static inline void set_prefix(uint32_t new_prefix) +{ + asm volatile(" spx %0" : : "Q" (new_prefix) : "memory"); +} + +static inline uint32_t get_prefix(void) +{ + uint32_t current_prefix; + + asm volatile(" stpx %0" : "=Q" (current_prefix)); + return current_prefix; +} + #endif diff --git a/s390x/intercept.c b/s390x/intercept.c index 3696e33..5f46b82 100644 --- a/s390x/intercept.c +++ b/s390x/intercept.c @@ -13,6 +13,7 @@ #include #include #include +#include static uint8_t pagebuf[PAGE_SIZE * 2] __attribute__((aligned(PAGE_SIZE * 2))); @@ -26,13 +27,10 @@ static void test_stpx(void) uint32_t new_prefix = (uint32_t)(intptr_t)pagebuf; /* Can we successfully change the prefix? */ - asm volatile ( - " stpx %0\n" - " spx %2\n" - " stpx %1\n" - " spx %0\n" - : "+Q"(old_prefix), "+Q"(tst_prefix) - : "Q"(new_prefix)); + old_prefix = get_prefix(); + set_prefix(new_prefix); + tst_prefix = get_prefix(); + set_prefix(old_prefix); report(old_prefix == 0 && tst_prefix == new_prefix, "store prefix"); expect_pgm_int(); @@ -63,14 +61,10 @@ static void test_spx(void) * some facility bits there ... at least some of them should be * set in our buffer afterwards. */ - asm volatile ( - " stpx %0\n" - " spx %1\n" - " stfl 0\n" - " spx %0\n" - : "+Q"(old_prefix) - : "Q"(new_prefix) - : "memory"); + old_prefix = get_prefix(); + set_prefix(new_prefix); + stfl(); + set_prefix(old_prefix); report(pagebuf[GEN_LC_STFL] != 0, "stfl to new prefix"); expect_pgm_int(); From patchwork Mon Jan 20 18:42:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 11342739 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 39E411580 for ; Mon, 20 Jan 2020 18:43:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2205D2253D for ; Mon, 20 Jan 2020 18:43:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727041AbgATSnI (ORCPT ); Mon, 20 Jan 2020 13:43:08 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:53884 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726903AbgATSnG (ORCPT ); Mon, 20 Jan 2020 13:43:06 -0500 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00KIcrA0043554 for ; Mon, 20 Jan 2020 13:43:05 -0500 Received: from e06smtp03.uk.ibm.com (e06smtp03.uk.ibm.com [195.75.94.99]) by mx0b-001b2d01.pphosted.com with ESMTP id 2xmg7her95-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 20 Jan 2020 13:43:05 -0500 Received: from localhost by e06smtp03.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2020 18:43:03 -0000 Received: from b06avi18626390.portsmouth.uk.ibm.com (9.149.26.192) by e06smtp03.uk.ibm.com (192.168.101.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 20 Jan 2020 18:43:00 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00KIg8mx33030446 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jan 2020 18:42:09 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C34A64C040; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7E2384C05E; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) Received: from p-imbrenda.boeblingen.de.ibm.com (unknown [9.152.224.108]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, thuth@redhat.com, david@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com Subject: [kvm-unit-tests PATCH v8 5/6] s390x: lib: fix program interrupt handler if sclp_busy was set Date: Mon, 20 Jan 2020 19:42:55 +0100 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200120184256.188698-1-imbrenda@linux.ibm.com> References: <20200120184256.188698-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20012018-0012-0000-0000-0000037F2438 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012018-0013-0000-0000-000021BB6206 Message-Id: <20200120184256.188698-6-imbrenda@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-20_08:2020-01-20,2020-01-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=710 spamscore=0 suspectscore=1 clxscore=1015 impostorscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 phishscore=0 adultscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001200156 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Fix the program interrupt handler for the case where sclp_busy is set. The interrupt handler will attempt to write an error message on the console using the SCLP, and will wait for sclp_busy to become false before doing so. If an exception happenes between setting the flag and the SCLP call, or if the call itself raises an exception, we need to clear the flag so we can successfully print the error message. Signed-off-by: Claudio Imbrenda Acked-by: Thomas Huth Reviewed-by: David Hildenbrand --- lib/s390x/interrupt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/s390x/interrupt.c b/lib/s390x/interrupt.c index 05f30be..ccb376a 100644 --- a/lib/s390x/interrupt.c +++ b/lib/s390x/interrupt.c @@ -106,10 +106,13 @@ static void fixup_pgm_int(void) void handle_pgm_int(void) { - if (!pgm_int_expected) + if (!pgm_int_expected) { + /* Force sclp_busy to false, otherwise we will loop forever */ + sclp_handle_ext(); report_abort("Unexpected program interrupt: %d at %#lx, ilen %d\n", lc->pgm_int_code, lc->pgm_old_psw.addr, lc->pgm_int_id); + } pgm_int_expected = false; fixup_pgm_int(); From patchwork Mon Jan 20 18:42:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 11342735 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5BA451398 for ; Mon, 20 Jan 2020 18:43:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2F20F22314 for ; Mon, 20 Jan 2020 18:43:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726982AbgATSnG (ORCPT ); Mon, 20 Jan 2020 13:43:06 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:53162 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726874AbgATSnG (ORCPT ); Mon, 20 Jan 2020 13:43:06 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00KIcrAu090477 for ; Mon, 20 Jan 2020 13:43:04 -0500 Received: from e06smtp04.uk.ibm.com (e06smtp04.uk.ibm.com [195.75.94.100]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xmgdk8qph-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 20 Jan 2020 13:43:04 -0500 Received: from localhost by e06smtp04.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 20 Jan 2020 18:43:02 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp04.uk.ibm.com (192.168.101.134) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Mon, 20 Jan 2020 18:43:00 -0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00KIgxKp48824484 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Jan 2020 18:42:59 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 282C14C040; Mon, 20 Jan 2020 18:42:59 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D12824C044; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) Received: from p-imbrenda.boeblingen.de.ibm.com (unknown [9.152.224.108]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 20 Jan 2020 18:42:58 +0000 (GMT) From: Claudio Imbrenda To: kvm@vger.kernel.org Cc: linux-s390@vger.kernel.org, thuth@redhat.com, david@redhat.com, borntraeger@de.ibm.com, frankja@linux.ibm.com Subject: [kvm-unit-tests PATCH v8 6/6] s390x: SCLP unit test Date: Mon, 20 Jan 2020 19:42:56 +0100 X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200120184256.188698-1-imbrenda@linux.ibm.com> References: <20200120184256.188698-1-imbrenda@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 20012018-0016-0000-0000-000002DF2711 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012018-0017-0000-0000-00003341CC1D Message-Id: <20200120184256.188698-7-imbrenda@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-20_08:2020-01-20,2020-01-20 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 clxscore=1015 bulkscore=0 suspectscore=1 mlxlogscore=999 lowpriorityscore=0 spamscore=0 adultscore=0 malwarescore=0 impostorscore=0 phishscore=0 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1910280000 definitions=main-2001200156 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org SCLP unit test. Testing the following: * Correctly ignoring instruction bits that should be ignored * Privileged instruction check * Check for addressing exceptions * Specification exceptions: - SCCB size less than 8 - SCCB unaligned - SCCB overlaps prefix or lowcore - SCCB address higher than 2GB * Return codes for - Invalid command - SCCB too short (but at least 8) - SCCB page boundary violation Signed-off-by: Claudio Imbrenda Reviewed-by: Thomas Huth Acked-by: Janosch Frank --- s390x/Makefile | 1 + s390x/sclp.c | 474 ++++++++++++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 8 + 3 files changed, 483 insertions(+) create mode 100644 s390x/sclp.c diff --git a/s390x/Makefile b/s390x/Makefile index 3744372..ddb4b48 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -16,6 +16,7 @@ tests += $(TEST_DIR)/diag288.elf tests += $(TEST_DIR)/stsi.elf tests += $(TEST_DIR)/skrf.elf tests += $(TEST_DIR)/smp.elf +tests += $(TEST_DIR)/sclp.elf tests_binary = $(patsubst %.elf,%.bin,$(tests)) all: directories test_cases test_cases_binary diff --git a/s390x/sclp.c b/s390x/sclp.c new file mode 100644 index 0000000..215347e --- /dev/null +++ b/s390x/sclp.c @@ -0,0 +1,474 @@ +/* + * Service Call tests + * + * Copyright (c) 2019 IBM Corp + * + * Authors: + * Claudio Imbrenda + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2. + */ + +#include +#include +#include +#include +#include + +#define PGM_NONE 1 +#define PGM_BIT_SPEC (1ULL << PGM_INT_CODE_SPECIFICATION) +#define PGM_BIT_ADDR (1ULL << PGM_INT_CODE_ADDRESSING) +#define PGM_BIT_PRIV (1ULL << PGM_INT_CODE_PRIVILEGED_OPERATION) +#define MKPTR(x) ((void *)(uint64_t)(x)) + +#define LC_SIZE (2 * PAGE_SIZE) + +static uint8_t pagebuf[LC_SIZE] __attribute__((aligned(LC_SIZE))); /* scratch pages used for some tests */ +static uint8_t prefix_buf[LC_SIZE] __attribute__((aligned(LC_SIZE))); /* temporary lowcore for test_sccb_prefix */ +static uint8_t sccb_template[PAGE_SIZE]; /* SCCB template to be used */ +static uint32_t valid_code; /* valid command code for READ SCP INFO */ +static struct lowcore *lc; + +/** + * Perform one service call, handling exceptions and interrupts. + */ +static int sclp_service_call_test(unsigned int command, void *sccb) +{ + int cc; + + sclp_mark_busy(); + sclp_setup_int(); + cc = servc(command, __pa(sccb)); + if (lc->pgm_int_code) { + sclp_handle_ext(); + return 0; + } + if (!cc) + sclp_wait_busy(); + return cc; +} + +/** + * Perform one test at the given address, optionally using the SCCB template, + * checking for the expected program interrupts and return codes. + * + * The parameter buf_len indicates the number of bytes of the template that + * should be copied to the test address, and should be 0 when the test + * address is invalid, in which case nothing is copied. + * + * The template is used to simplify tests where the same buffer content is + * used many times in a row, at different addresses. + * + * Returns true in case of success or false in case of failure + */ +static bool test_one_sccb(uint32_t cmd, uint8_t *addr, uint16_t buf_len, uint64_t exp_pgm, uint16_t exp_rc) +{ + SCCBHeader *h = (SCCBHeader *)addr; + int res, pgm; + + /* Copy the template to the test address if needed */ + if (buf_len) + memcpy(addr, sccb_template, buf_len); + if (exp_pgm != PGM_NONE) + expect_pgm_int(); + /* perform the actual call */ + res = sclp_service_call_test(cmd, h); + if (res) { + report_info("SCLP not ready (command %#x, address %p, cc %d)", cmd, addr, res); + return false; + } + pgm = clear_pgm_int(); + /* Check if the program exception was one of the expected ones */ + if (!((1ULL << pgm) & exp_pgm)) { + report_info("First failure at addr %p, buf_len %d, cmd %#x, pgm code %d", + addr, buf_len, cmd, pgm); + return false; + } + /* Check if the response code is the one expected */ + if (exp_rc && exp_rc != h->response_code) { + report_info("First failure at addr %p, buf_len %d, cmd %#x, resp code %#x", + addr, buf_len, cmd, h->response_code); + return false; + } + return true; +} + +/** + * Wrapper for test_one_sccb to be used when the template should not be + * copied and the memory address should not be touched. + */ +static bool test_one_ro(uint32_t cmd, uint8_t *addr, uint64_t exp_pgm, uint16_t exp_rc) +{ + return test_one_sccb(cmd, addr, 0, exp_pgm, exp_rc); +} + +/** + * Wrapper for test_one_sccb to set up a simple SCCB template. + * + * The parameter sccb_len indicates the value that will be saved in the SCCB + * length field of the SCCB, buf_len indicates the number of bytes of + * template that need to be copied to the actual test address. In many cases + * it's enough to clear/copy the first 8 bytes of the buffer, while the SCCB + * itself can be larger. + * + * Returns true in case of success or false in case of failure + */ +static bool test_one_simple(uint32_t cmd, uint8_t *addr, uint16_t sccb_len, + uint16_t buf_len, uint64_t exp_pgm, uint16_t exp_rc) +{ + memset(sccb_template, 0, sizeof(sccb_template)); + ((SCCBHeader *)sccb_template)->length = sccb_len; + return test_one_sccb(cmd, addr, buf_len, exp_pgm, exp_rc); +} + +/** + * Test SCCB lengths < 8. + */ +static void test_sccb_too_short(void) +{ + int len; + + for (len = 0; len < 8; len++) + if (!test_one_simple(valid_code, pagebuf, len, 8, PGM_BIT_SPEC, 0)) + break; + + report(len == 8, "SCCB too short"); +} + +/** + * Test SCCBs that are not 64-bit aligned. + */ +static void test_sccb_unaligned(void) +{ + int offset; + + for (offset = 1; offset < 8; offset++) + if (!test_one_simple(valid_code, offset + pagebuf, 8, 8, PGM_BIT_SPEC, 0)) + break; + report(offset == 8, "SCCB unaligned"); +} + +/** + * Test SCCBs whose address is in the lowcore or prefix area. + */ +static void test_sccb_prefix(void) +{ + uint8_t scratch[LC_SIZE]; + uint32_t prefix, new_prefix; + int offset; + + /* + * copy the current lowcore to the future new location, otherwise we + * will not have a valid lowcore after setting the new prefix. + */ + memcpy(prefix_buf, 0, LC_SIZE); + /* save the current prefix (it's probably going to be 0) */ + prefix = get_prefix(); + /* + * save the current content of absolute pages 0 and 1, so we can + * restore them after we trash them later on + */ + memcpy(scratch, (void *)(intptr_t)prefix, LC_SIZE); + /* set the new prefix to prefix_buf */ + new_prefix = (uint32_t)(intptr_t)prefix_buf; + set_prefix(new_prefix); + + /* + * testing with SCCB addresses in the lowcore; since we can't + * actually trash the lowcore (unsurprisingly, things break if we + * do), this will be a read-only test. + */ + for (offset = 0; offset < LC_SIZE; offset += 8) + if (!test_one_ro(valid_code, MKPTR(offset), PGM_BIT_SPEC, 0)) + break; + report(offset == LC_SIZE, "SCCB low pages"); + + /* + * the SCLP should not even touch the memory, but we will write the + * SCCBs all over the two pages starting at absolute address 0, thus + * trashing them; we will need to restore them later. + */ + for (offset = 0; offset < LC_SIZE; offset += 8) + if (!test_one_simple(valid_code, MKPTR(new_prefix + offset), 8, 8, PGM_BIT_SPEC, 0)) + break; + report(offset == LC_SIZE, "SCCB prefix pages"); + + /* restore the previous contents of absolute pages 0 and 1 */ + memcpy(prefix_buf, 0, LC_SIZE); + /* restore the prefix to the original value */ + set_prefix(prefix); +} + +/** + * Test SCCBs that are above 2GB. If outside of memory, an addressing + * exception is also allowed. + */ +static void test_sccb_high(void) +{ + SCCBHeader *h = (SCCBHeader *)pagebuf; + uintptr_t a[33 * 4 * 2 + 2]; /* for the list of addresses to test */ + + uint64_t maxram; + int i, pgm, len = 0; + + h->length = 8; + /* addresses with 1 bit set in the first 33 bits */ + for (i = 0; i < 33; i++) + a[len++] = 1UL << (i + 31); + /* addresses with 2 consecutive bits set in the first 33 bits */ + for (i = 0; i < 33; i++) + a[len++] = 3UL << (i + 31); + /* addresses with all bits set in bits 0..N */ + for (i = 0; i < 33; i++) + a[len++] = 0xffffffff80000000UL << i; + /* addresses with all bits set in bits N..33 */ + a[len++] = 0x80000000; + for (i = 1; i < 33; i++, len++) + a[len] = a[len - 1] | (1UL << (i + 31)); + /* all the addresses above, but adding the offset of a valid buffer */ + for (i = 0; i < len; i++) + a[len + i] = a[i] + (intptr_t)h; + len += i; + /* two more hand-crafted addresses */ + a[len++] = 0xdeadbeef00000000; + a[len++] = 0xdeaddeadbeef0000; + + maxram = get_ram_size(); + for (i = 0; i < len; i++) { + pgm = PGM_BIT_SPEC | (a[i] >= maxram ? PGM_BIT_ADDR : 0); + if (!test_one_ro(valid_code, (void *)a[i], pgm, 0)) + break; + } + report(i == len, "SCCB high addresses"); +} + +/** + * Test invalid commands, both invalid command detail codes and valid + * ones with invalid command class code. + */ +static void test_inval(void) +{ + const uint16_t res = SCLP_RC_INVALID_SCLP_COMMAND; + uint32_t cmd; + int i; + + report_prefix_push("Invalid command"); + for (i = 0; i < 65536; i++) { + cmd = 0xdead0000 | i; + if (!test_one_simple(cmd, pagebuf, PAGE_SIZE, PAGE_SIZE, PGM_NONE, res)) + break; + } + report(i == 65536, "Command detail code"); + + for (i = 0; i < 256; i++) { + cmd = (valid_code & ~0xff) | i; + if (cmd == valid_code) + continue; + if (!test_one_simple(cmd, pagebuf, PAGE_SIZE, PAGE_SIZE, PGM_NONE, res)) + break; + } + report(i == 256, "Command class code"); + report_prefix_pop(); +} + + +/** + * Test short SCCBs (but larger than 8). + */ +static void test_short(void) +{ + const uint16_t res = SCLP_RC_INSUFFICIENT_SCCB_LENGTH; + int len; + + for (len = 8; len < 144; len++) + if (!test_one_simple(valid_code, pagebuf, len, len, PGM_NONE, res)) + break; + report(len == 144, "Insufficient SCCB length (Read SCP info)"); + + for (len = 8; len < 40; len++) + if (!test_one_simple(SCLP_READ_CPU_INFO, pagebuf, len, len, PGM_NONE, res)) + break; + report(len == 40, "Insufficient SCCB length (Read CPU info)"); +} + +/** + * Test SCCB page boundary violations. + */ +static void test_boundary(void) +{ + const uint32_t cmd = SCLP_CMD_WRITE_EVENT_DATA; + const uint16_t res = SCLP_RC_SCCB_BOUNDARY_VIOLATION; + WriteEventData *sccb = (WriteEventData *)sccb_template; + int len, offset; + + memset(sccb_template, 0, sizeof(sccb_template)); + sccb->h.function_code = SCLP_FC_NORMAL_WRITE; + for (len = 32; len <= 4096; len++) { + offset = len & 7 ? len & ~7 : len - 8; + for (offset = 4096 - offset; offset < 4096; offset += 8) { + sccb->h.length = len; + if (!test_one_sccb(cmd, offset + pagebuf, len, PGM_NONE, res)) + goto out; + } + } +out: + report(len > 4096 && offset == 4096, "SCCB page boundary violation"); +} + +/** + * Test excessively long SCCBs. + */ +static void test_toolong(void) +{ + const uint32_t cmd = SCLP_CMD_WRITE_EVENT_DATA; + const uint16_t res = SCLP_RC_SCCB_BOUNDARY_VIOLATION; + WriteEventData *sccb = (WriteEventData *)sccb_template; + int len; + + memset(sccb_template, 0, sizeof(sccb_template)); + sccb->h.function_code = SCLP_FC_NORMAL_WRITE; + for (len = 4097; len < 8192; len++) { + sccb->h.length = len; + if (!test_one_sccb(cmd, pagebuf, PAGE_SIZE, PGM_NONE, res)) + break; + } + report(len == 8192, "SCCB bigger than 4k"); +} + +/** + * Test privileged operation. + */ +static void test_priv(void) +{ + SCCBHeader *h = (SCCBHeader *)pagebuf; + + report_prefix_push("Privileged operation"); + h->length = 8; + expect_pgm_int(); + enter_pstate(); + servc(valid_code, __pa(h)); + check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION); + report_prefix_pop(); +} + +/** + * Test addressing exceptions. We need to test SCCB addresses between the + * end of available memory and 2GB, because after 2GB a specification + * exception is also allowed. + * Only applicable if the VM has less than 2GB of memory + */ +static void test_addressing(void) +{ + unsigned long i, maxram = get_ram_size(); + + /* the VM has more than 2GB of memory */ + if (maxram >= 0x80000000) { + report_skip("Invalid SCCB address"); + return; + } + /* test all possible valid addresses immediately after the end of memory + * up to 64KB after the end of memory + */ + for (i = 0; i < 0x10000 && i + maxram < 0x80000000; i += 8) + if (!test_one_ro(valid_code, MKPTR(i + maxram), PGM_BIT_ADDR, 0)) + goto out; + /* test more addresses until we reach 1MB after end of memory; + * increment by a prime number (times 8) in order to test all + * possible valid offsets inside pages + */ + for (; i < 0x100000 && i + maxram < 0x80000000 ; i += 808) + if (!test_one_ro(valid_code, MKPTR(i + maxram), PGM_BIT_ADDR, 0)) + goto out; + /* test the remaining addresses until we reach address 2GB; + * increment by a prime number (times 8) in order to test all + * possible valid offsets inside pages + */ + for (; i + maxram < 0x80000000; i += 800024) + if (!test_one_ro(valid_code, MKPTR(i + maxram), PGM_BIT_ADDR, 0)) + goto out; +out: + report(i + maxram >= 0x80000000, "Invalid SCCB address"); +} + +/** + * Test some bits in the instruction format that are specified to be ignored. + */ +static void test_instbits(void) +{ + SCCBHeader *h = (SCCBHeader *)pagebuf; + int cc; + + sclp_mark_busy(); + h->length = 8; + sclp_setup_int(); + + asm volatile( + " .insn rre,0xb2204200,%1,%2\n" /* servc %1,%2 */ + " ipm %0\n" + " srl %0,28" + : "=&d" (cc) : "d" (valid_code), "a" (__pa(pagebuf)) + : "cc", "memory"); + /* No exception, but also no command accepted, so no interrupt is + * expected. We need to clear the flag manually otherwise we will + * loop forever when we try to report failure. + */ + if (cc) + sclp_handle_ext(); + else + sclp_wait_busy(); + report(cc == 0, "Instruction format ignored bits"); +} + +/** + * Find a valid READ INFO command code; not all codes are always allowed, and + * probing should be performed in the right order. + */ +static void find_valid_sclp_code(void) +{ + const unsigned int commands[] = { SCLP_CMDW_READ_SCP_INFO_FORCED, + SCLP_CMDW_READ_SCP_INFO }; + SCCBHeader *h = (SCCBHeader *)pagebuf; + int i, cc; + + for (i = 0; i < ARRAY_SIZE(commands); i++) { + sclp_mark_busy(); + memset(h, 0, sizeof(*h)); + h->length = 4096; + + valid_code = commands[i]; + cc = sclp_service_call(commands[i], h); + if (cc) + break; + if (h->response_code == SCLP_RC_NORMAL_READ_COMPLETION) + return; + if (h->response_code != SCLP_RC_INVALID_SCLP_COMMAND) + break; + } + report_abort("READ_SCP_INFO failed"); +} + +int main(void) +{ + report_prefix_push("sclp"); + find_valid_sclp_code(); + + /* Test some basic things */ + test_instbits(); + test_priv(); + test_addressing(); + + /* Test the specification exceptions */ + test_sccb_too_short(); + test_sccb_unaligned(); + test_sccb_prefix(); + test_sccb_high(); + + /* Test the expected response codes */ + test_inval(); + test_short(); + test_boundary(); + test_toolong(); + + return report_summary(); +} diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg index f1b07cd..07013b2 100644 --- a/s390x/unittests.cfg +++ b/s390x/unittests.cfg @@ -75,3 +75,11 @@ file = stsi.elf [smp] file = smp.elf extra_params =-smp 2 + +[sclp-1g] +file = sclp.elf +extra_params = -m 1G + +[sclp-3g] +file = sclp.elf +extra_params = -m 3G