From patchwork Mon Jul 25 15:54:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nico Boehr X-Patchwork-Id: 12928254 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 56930CCA48A for ; Mon, 25 Jul 2022 15:54:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235658AbiGYPya (ORCPT ); Mon, 25 Jul 2022 11:54:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36942 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235752AbiGYPy2 (ORCPT ); Mon, 25 Jul 2022 11:54:28 -0400 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A995411C12 for ; Mon, 25 Jul 2022 08:54:27 -0700 (PDT) Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26PFkmnD013344 for ; Mon, 25 Jul 2022 15:54:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=LT2+RIvfx80kuLNJteTfvoQ7bTmESYyiZmE/eQJ2sTs=; b=R8qsFYQ42tjmwgMBSlXsxJB1GkQlkQnJ9htIcyXtOeASXWVAUCHaK3RPLs9dTxtLcRJD m9jLjFYRTLuejYAY5GFeVwgvN4qnNw2dFY//U4464A765Y8dErXeAA6uyXKSkT87nvI0 4AasnBJ1R30MQ6kQsUpkDW5bjTPLiVepkEsY1Bp+Y1HjR7zs9lSrgGtSmo96dIMQkf7V rQVyw+tjfK+E49kamoxMiYOiWca8b5ZyjoXuSXr3WdFG7uIpsAfRaN+6T2zV3XqAb0b+ KTFFy5ojXefLKeQy828qX/+xr0ljVKHSHl2mqNS1zW/c1NvHdDIFnKgZIlR5atREJLZJ UQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hhx49g7vp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 25 Jul 2022 15:54:26 +0000 Received: from m0098421.ppops.net (m0098421.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 26PFkx7m013888 for ; Mon, 25 Jul 2022 15:54:26 GMT Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hhx49g7uq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 15:54:26 +0000 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 26PFqU0P011216; Mon, 25 Jul 2022 15:54:24 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma04ams.nl.ibm.com with ESMTP id 3hg96wjp1b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 15:54:24 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 26PFsL4e17170766 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Jul 2022 15:54:21 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E21E25204F; Mon, 25 Jul 2022 15:54:20 +0000 (GMT) Received: from a46lp57.lnxne.boe (unknown [9.152.108.100]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id B067B52051; Mon, 25 Jul 2022 15:54:20 +0000 (GMT) From: Nico Boehr To: kvm@vger.kernel.org Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com Subject: [kvm-unit-tests PATCH v3 1/3] s390x: smp: move sigp calls with invalid cpu address to array Date: Mon, 25 Jul 2022 17:54:18 +0200 Message-Id: <20220725155420.2009109-2-nrb@linux.ibm.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220725155420.2009109-1-nrb@linux.ibm.com> References: <20220725155420.2009109-1-nrb@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: SbjBzUOa0d-TOzpTWFGAZ_oidrOG7eq5 X-Proofpoint-GUID: fOPrRjKIL65QtLdKlqmQdZ5353eovFWc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-25_10,2022-07-25_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 adultscore=0 mlxscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 mlxlogscore=999 spamscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207250063 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org We have the nice array to test SIGP calls with invalid CPU addresses. Move the SIGP cases there to eliminate some of the duplicated code in test_emcall and test_cond_emcall. Since adding coverage for invalid CPU addresses in the ecall case is now trivial, do that as well. Signed-off-by: Nico Boehr Reviewed-by: Janosch Frank --- s390x/smp.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/s390x/smp.c b/s390x/smp.c index 0df4751f9cee..34ae91c3fe12 100644 --- a/s390x/smp.c +++ b/s390x/smp.c @@ -30,6 +30,9 @@ static const struct sigp_invalid_cases cases_invalid_cpu_addr[] = { { SIGP_STOP, "stop with invalid CPU address" }, { SIGP_START, "start with invalid CPU address" }, { SIGP_CPU_RESET, "reset with invalid CPU address" }, + { SIGP_COND_EMERGENCY_SIGNAL, "conditional emcall with invalid CPU address" }, + { SIGP_EMERGENCY_SIGNAL, "emcall with invalid CPU address" }, + { SIGP_EXTERNAL_CALL, "ecall with invalid CPU address" }, { INVALID_ORDER_CODE, "invalid order code and CPU address" }, { SIGP_SENSE, "sense with invalid CPU address" }, { SIGP_STOP_AND_STORE_STATUS, "stop and store status with invalid CPU address" }, @@ -329,7 +332,6 @@ static void emcall(void) static void test_emcall(void) { struct psw psw; - int cc; psw.mask = extract_psw_mask(); psw.addr = (unsigned long)emcall; @@ -343,13 +345,6 @@ static void test_emcall(void) wait_for_flag(); smp_cpu_stop(1); - report_prefix_push("invalid CPU address"); - - cc = sigp(INVALID_CPU_ADDRESS, SIGP_EMERGENCY_SIGNAL, 0, NULL); - report(cc == 3, "CC = 3"); - - report_prefix_pop(); - report_prefix_pop(); } @@ -368,13 +363,6 @@ static void test_cond_emcall(void) goto out; } - report_prefix_push("invalid CPU address"); - - cc = sigp(INVALID_CPU_ADDRESS, SIGP_COND_EMERGENCY_SIGNAL, 0, NULL); - report(cc == 3, "CC = 3"); - - report_prefix_pop(); - report_prefix_push("success"); set_flag(0); From patchwork Mon Jul 25 15:54:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nico Boehr X-Patchwork-Id: 12928256 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CCDFDC43334 for ; Mon, 25 Jul 2022 15:54:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235821AbiGYPyd (ORCPT ); Mon, 25 Jul 2022 11:54:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235769AbiGYPy2 (ORCPT ); Mon, 25 Jul 2022 11:54:28 -0400 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9A4C9DF66 for ; Mon, 25 Jul 2022 08:54:27 -0700 (PDT) Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26PFkm9J013357 for ; Mon, 25 Jul 2022 15:54:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=GvSlKAwmM6xH2jC+G8CBN6a8W+aiWedGe5iriGscECw=; b=YzFNY2jUhQMH4SjJyVBWgw3IsqW8TQi7QLhL/8YzNdkyeqfOKRd1GZS1Z+1nhLSqZjRk 5NbbfBbcs5bR4icNYZWSlBDdOWcdDYI2uFIRFD1fBMbri28iv5m4wb5fYUYBOvuSRi1i aYz8KvNDxvLNJNdJWJDPw775yux0a17k7Xf2JarmqYV3cu7fHV5eFtgESFh6ElZDOR1n mqqkkX5NtYsrvaZmjvjw/vwuTzoGntsO8A9f4HwpsfbgthCB5SUzfd0ZKxfJWLqWmscV LHZzoDpVxLqPffDa34YwCVoNFNcztx0ah1AmavxTvpfuoSbA6+SKpWs4LhVkcT/YCrI9 NQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hhx49g7vm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 25 Jul 2022 15:54:26 +0000 Received: from m0098421.ppops.net (m0098421.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 26PFlMA3015490 for ; Mon, 25 Jul 2022 15:54:26 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hhx49g7ur-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 15:54:26 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 26PFr0ig026921; Mon, 25 Jul 2022 15:54:24 GMT Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by ppma06ams.nl.ibm.com with ESMTP id 3hg97tap16-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 15:54:24 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 26PFsLwX23069018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Jul 2022 15:54:21 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 216275204E; Mon, 25 Jul 2022 15:54:21 +0000 (GMT) Received: from a46lp57.lnxne.boe (unknown [9.152.108.100]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id E37A052050; Mon, 25 Jul 2022 15:54:20 +0000 (GMT) From: Nico Boehr To: kvm@vger.kernel.org Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com Subject: [kvm-unit-tests PATCH v3 2/3] s390x: smp: use an array for sigp calls Date: Mon, 25 Jul 2022 17:54:19 +0200 Message-Id: <20220725155420.2009109-3-nrb@linux.ibm.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220725155420.2009109-1-nrb@linux.ibm.com> References: <20220725155420.2009109-1-nrb@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 44oEtxaYLJ5jMhn9Gvx5BLHYevAttgDm X-Proofpoint-GUID: IW5RckHbq_kYUGHZSCc8lB8BAtLpe3DT X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-25_10,2022-07-25_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 adultscore=0 mlxscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 mlxlogscore=880 spamscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207250063 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Tests for the SIGP calls are quite similar, so we have a lot of code duplication right now. Since upcoming changes will add more cases, refactor the code to iterate over an array, similarily as we already do for test_invalid(). The receiving CPU is disabled for IO interrupts. This makes sure the conditional emergency signal is accepted and doesn't hurt the other orders. Signed-off-by: Nico Boehr Reviewed-by: Janosch Frank Reviewed-by: Claudio Imbrenda --- s390x/smp.c | 124 ++++++++++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 76 deletions(-) diff --git a/s390x/smp.c b/s390x/smp.c index 34ae91c3fe12..12c40cadaed2 100644 --- a/s390x/smp.c +++ b/s390x/smp.c @@ -43,6 +43,20 @@ static const struct sigp_invalid_cases cases_valid_cpu_addr[] = { static uint32_t cpu1_prefix; +struct sigp_call_cases { + char name[20]; + int call; + uint16_t ext_int_expected_type; + uint32_t cr0_bit; + bool supports_pv; +}; +static const struct sigp_call_cases cases_sigp_call[] = { + { "emcall", SIGP_EMERGENCY_SIGNAL, 0x1201, CTL0_EMERGENCY_SIGNAL, true }, + { "cond emcall", SIGP_COND_EMERGENCY_SIGNAL, 0x1201, CTL0_EMERGENCY_SIGNAL, false }, + { "ecall", SIGP_EXTERNAL_CALL, 0x1202, CTL0_EXTERNAL_CALL, true }, +}; +static const struct sigp_call_cases *current_sigp_call_case; + static void test_invalid(void) { const struct sigp_invalid_cases *c; @@ -289,97 +303,57 @@ static void test_set_prefix(void) } -static void ecall(void) +static void call_received(void) { expect_ext_int(); - ctl_set_bit(0, CTL0_EXTERNAL_CALL); - psw_mask_set_bits(PSW_MASK_EXT); - set_flag(1); - while (lowcore.ext_int_code != 0x1202) { mb(); } - report_pass("received"); - set_flag(1); -} + ctl_set_bit(0, current_sigp_call_case->cr0_bit); + /* make sure conditional emergency is accepted by disabling IO interrupts */ + psw_mask_clear_and_set_bits(PSW_MASK_IO, PSW_MASK_EXT); -static void test_ecall(void) -{ - struct psw psw; - psw.mask = extract_psw_mask(); - psw.addr = (unsigned long)ecall; + /* Indicate that we're ready to receive the call */ + set_flag(1); - report_prefix_push("ecall"); - set_flag(0); + while (lowcore.ext_int_code != current_sigp_call_case->ext_int_expected_type) + mb(); + report_pass("received"); - smp_cpu_start(1, psw); - wait_for_flag(); - set_flag(0); - smp_sigp(1, SIGP_EXTERNAL_CALL, 0, NULL); - wait_for_flag(); - smp_cpu_stop(1); - report_prefix_pop(); -} + ctl_clear_bit(0, current_sigp_call_case->cr0_bit); -static void emcall(void) -{ - expect_ext_int(); - ctl_set_bit(0, CTL0_EMERGENCY_SIGNAL); - psw_mask_set_bits(PSW_MASK_EXT); - set_flag(1); - while (lowcore.ext_int_code != 0x1201) { mb(); } - report_pass("received"); + /* Indicate that we're done */ set_flag(1); } -static void test_emcall(void) +static void test_calls(void) { + int i; struct psw psw; - psw.mask = extract_psw_mask(); - psw.addr = (unsigned long)emcall; - report_prefix_push("emcall"); - set_flag(0); + for (i = 0; i < ARRAY_SIZE(cases_sigp_call); i++) { + current_sigp_call_case = &cases_sigp_call[i]; - smp_cpu_start(1, psw); - wait_for_flag(); - set_flag(0); - smp_sigp(1, SIGP_EMERGENCY_SIGNAL, 0, NULL); - wait_for_flag(); - smp_cpu_stop(1); + report_prefix_push(current_sigp_call_case->name); + if (!current_sigp_call_case->supports_pv && uv_os_is_guest()) { + report_skip("Not supported under PV"); + report_prefix_pop(); + continue; + } - report_prefix_pop(); -} + set_flag(0); + psw.mask = extract_psw_mask(); + psw.addr = (unsigned long)call_received; + smp_cpu_start(1, psw); -static void test_cond_emcall(void) -{ - uint32_t status = 0; - struct psw psw; - int cc; - psw.mask = extract_psw_mask() & ~PSW_MASK_IO; - psw.addr = (unsigned long)emcall; + /* Wait until the receiver has finished setup */ + wait_for_flag(); + set_flag(0); - report_prefix_push("conditional emergency call"); + smp_sigp(1, current_sigp_call_case->call, 0, NULL); - if (uv_os_is_guest()) { - report_skip("unsupported under PV"); - goto out; + /* Wait until the receiver has handled the call */ + wait_for_flag(); + smp_cpu_stop(1); + report_prefix_pop(); } - - report_prefix_push("success"); - set_flag(0); - - smp_cpu_start(1, psw); - wait_for_flag(); - set_flag(0); - cc = smp_sigp(1, SIGP_COND_EMERGENCY_SIGNAL, 0, &status); - report(!cc, "CC = 0"); - - wait_for_flag(); - smp_cpu_stop(1); - - report_prefix_pop(); - -out: - report_prefix_pop(); - } static void test_sense_running(void) @@ -499,9 +473,7 @@ int main(void) test_stop_store_status(); test_store_status(); test_set_prefix(); - test_ecall(); - test_emcall(); - test_cond_emcall(); + test_calls(); test_sense_running(); test_reset(); test_reset_initial(); From patchwork Mon Jul 25 15:54:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nico Boehr X-Patchwork-Id: 12928255 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CB848CCA473 for ; Mon, 25 Jul 2022 15:54:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235804AbiGYPyb (ORCPT ); Mon, 25 Jul 2022 11:54:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235775AbiGYPy2 (ORCPT ); Mon, 25 Jul 2022 11:54:28 -0400 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D537112740 for ; Mon, 25 Jul 2022 08:54:27 -0700 (PDT) Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26PFkltm013296 for ; Mon, 25 Jul 2022 15:54:27 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=GfJFCxMYKXtYWuuwJIfYZ9Iy6tHMydG8ae2oT96zmj4=; b=ZDXMqc++9YN2omfUIOD//mc9/kmu2OnrmJiKn01SZ1UnYV+mwrO5hrFa0TXq7vU4tv0n qcATwN5COj8ABToMmwh/KXFMtnCpfo6WxSpkJEF+8t00pG33k7VgAITehPymqC31vDwj NmcIJqvxKdyY0saNI8QWVqMd/9iOYvMsEamuT26uNE/uwAvDwrS0Iy3gUHGJd2YzMUax yTvtz1F7XeUFawxMHd3oV5zPJRLLlOr4LAnOrnJ6yaa/aHcTR6rMIvKQgiirH93vroTE ZYGUtaoqsnuuwWdR0l4pJ7vCRy4Y9G5+SAKKj2cH6zTIxW/HZB4FFm7yqY1U2TRR2oXt Pg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hhx49g7vr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 25 Jul 2022 15:54:26 +0000 Received: from m0098421.ppops.net (m0098421.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 26PFsQBn016775 for ; Mon, 25 Jul 2022 15:54:26 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hhx49g7uv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 15:54:26 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 26PFqe5H015823; Mon, 25 Jul 2022 15:54:24 GMT Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by ppma05fra.de.ibm.com with ESMTP id 3hg94ea06a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 15:54:24 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 26PFsL0j23069020 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Jul 2022 15:54:21 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5459D5204E; Mon, 25 Jul 2022 15:54:21 +0000 (GMT) Received: from a46lp57.lnxne.boe (unknown [9.152.108.100]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 2280A5204F; Mon, 25 Jul 2022 15:54:21 +0000 (GMT) From: Nico Boehr To: kvm@vger.kernel.org Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com Subject: [kvm-unit-tests PATCH v3 3/3] s390x: smp: add tests for calls in wait state Date: Mon, 25 Jul 2022 17:54:20 +0200 Message-Id: <20220725155420.2009109-4-nrb@linux.ibm.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220725155420.2009109-1-nrb@linux.ibm.com> References: <20220725155420.2009109-1-nrb@linux.ibm.com> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: J9ggzL6y-ke0UD214PnYZgHMtiBN-MCn X-Proofpoint-GUID: RDRmyue9oKOWi8LdNLWpowv5kHWa9mSK X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-25_10,2022-07-25_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 adultscore=0 mlxscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 mlxlogscore=835 spamscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207250063 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org When the SIGP interpretation facility is in use a SIGP external call to a waiting CPU will result in an exit of the calling cpu. For non-pv guests it's a code 56 (partial execution) exit otherwise its a code 108 (secure instruction notification) exit. Those exits are handled differently from a normal SIGP instruction intercept that happens without interpretation and hence need to be tested. Signed-off-by: Nico Boehr --- s390x/smp.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/s390x/smp.c b/s390x/smp.c index 12c40cadaed2..d59ca38e7a37 100644 --- a/s390x/smp.c +++ b/s390x/smp.c @@ -356,6 +356,83 @@ static void test_calls(void) } } +static void call_in_wait_ext_int_fixup(struct stack_frame_int *stack) +{ + /* Clear wait bit so we don't immediately wait again after the fixup */ + lowcore.ext_old_psw.mask &= ~PSW_MASK_WAIT; + + stack->crs[0] &= ~BIT(current_sigp_call_case->cr0_bit); +} + +static void call_in_wait_setup(void) +{ + expect_ext_int(); + ctl_set_bit(0, current_sigp_call_case->cr0_bit); + register_ext_cleanup_func(call_in_wait_ext_int_fixup); + + set_flag(1); +} + +static void call_in_wait_received(void) +{ + report(lowcore.ext_int_code == current_sigp_call_case->ext_int_expected_type, "received"); + register_ext_cleanup_func(NULL); + + set_flag(1); +} + +static void test_calls_in_wait(void) +{ + int i; + struct psw psw; + + report_prefix_push("psw wait"); + for (i = 0; i < ARRAY_SIZE(cases_sigp_call); i++) { + current_sigp_call_case = &cases_sigp_call[i]; + + report_prefix_push(current_sigp_call_case->name); + if (!current_sigp_call_case->supports_pv && uv_os_is_guest()) { + report_skip("Not supported under PV"); + report_prefix_pop(); + continue; + } + + /* Let the secondary CPU setup the external mask and the external interrupt cleanup function */ + set_flag(0); + psw.mask = extract_psw_mask(); + psw.addr = (unsigned long)call_in_wait_setup; + smp_cpu_start(1, psw); + + /* Wait until the receiver has finished setup */ + wait_for_flag(); + set_flag(0); + + /* + * To avoid races, we need to know that the secondary CPU has entered wait, + * but the architecture provides no way to check whether the secondary CPU + * is in wait. + * + * But since a waiting CPU is considered operating, simply stop the CPU, set + * up the restart new PSW mask in wait, send the restart interrupt and then + * wait until the CPU becomes operating (done by smp_cpu_start). + */ + smp_cpu_stop(1); + expect_ext_int(); + psw.mask = extract_psw_mask() | PSW_MASK_EXT | PSW_MASK_WAIT; + psw.addr = (unsigned long)call_in_wait_received; + smp_cpu_start(1, psw); + + smp_sigp(1, current_sigp_call_case->call, 0, NULL); + + /* Wait until the receiver has handled the call */ + wait_for_flag(); + smp_cpu_stop(1); + + report_prefix_pop(); + } + report_prefix_pop(); +} + static void test_sense_running(void) { report_prefix_push("sense_running"); @@ -474,6 +551,7 @@ int main(void) test_store_status(); test_set_prefix(); test_calls(); + test_calls_in_wait(); test_sense_running(); test_reset(); test_reset_initial();