From: Nico Boehr <nrb@linux.ibm.com>
To: kvm@vger.kernel.org, linux-s390@vger.kernel.org
Cc: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com
Subject: [kvm-unit-tests PATCH v1 3/4] s390x: smp: use an array for sigp calls
Date: Wed, 13 Jul 2022 13:36:20 +0200 [thread overview]
Message-ID: <20220713113621.14778-4-nrb@linux.ibm.com> (raw)
In-Reply-To: <20220713113621.14778-1-nrb@linux.ibm.com>
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 <nrb@linux.ibm.com>
---
s390x/smp.c | 130 ++++++++++++++++++----------------------------------
1 file changed, 44 insertions(+), 86 deletions(-)
diff --git a/s390x/smp.c b/s390x/smp.c
index ea811087587e..857eae206daa 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,105 +303,51 @@ static void test_set_prefix(void)
}
-static void ecall(void)
-{
- unsigned long mask;
-
- expect_ext_int();
- ctl_set_bit(0, CTL0_EXTERNAL_CALL);
- mask = extract_psw_mask();
- mask |= PSW_MASK_EXT;
- load_psw_mask(mask);
- set_flag(1);
- while (lowcore.ext_int_code != 0x1202) { mb(); }
- report_pass("received");
- set_flag(1);
-}
-
-static void test_ecall(void)
-{
- struct psw psw;
- psw.mask = extract_psw_mask();
- psw.addr = (unsigned long)ecall;
-
- report_prefix_push("ecall");
- set_flag(0);
-
- 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();
-}
-
-static void emcall(void)
+static void call_received(void)
{
unsigned long mask;
expect_ext_int();
- ctl_set_bit(0, CTL0_EMERGENCY_SIGNAL);
+ ctl_set_bit(0, current_sigp_call_case->cr0_bit);
mask = extract_psw_mask();
mask |= PSW_MASK_EXT;
+ /* make sure conditional emergency is accepted by disabling IO interrupts */
+ mask &= ~PSW_MASK_IO;
load_psw_mask(mask);
set_flag(1);
- while (lowcore.ext_int_code != 0x1201) { mb(); }
+ while (lowcore.ext_int_code != current_sigp_call_case->ext_int_expected_type)
+ mb();
report_pass("received");
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);
-
- 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_pop();
-}
-
-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;
-
- report_prefix_push("conditional emergency call");
- if (uv_os_is_guest()) {
- report_skip("unsupported under PV");
- goto out;
+ 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;
+ }
+
+ set_flag(0);
+ psw.mask = extract_psw_mask();
+ psw.addr = (unsigned long)call_received;
+
+ smp_cpu_start(1, psw);
+ wait_for_flag();
+ set_flag(0);
+ smp_sigp(1, current_sigp_call_case->call, 0, NULL);
+ 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)
@@ -511,9 +471,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();
--
2.35.3
next prev parent reply other threads:[~2022-07-13 11:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-13 11:36 [kvm-unit-tests PATCH v1 0/4] s390x: add tests for SIGP call orders in enabled wait Nico Boehr
2022-07-13 11:36 ` [kvm-unit-tests PATCH v1 1/4] lib: s390x: add cleanup function for external interrupts Nico Boehr
2022-07-13 11:36 ` [kvm-unit-tests PATCH v1 2/4] s390x: smp: move sigp calls with invalid cpu address to array Nico Boehr
2022-07-13 11:36 ` Nico Boehr [this message]
2022-07-13 11:36 ` [kvm-unit-tests PATCH v1 4/4] s390x: smp: add tests for calls in wait state Nico Boehr
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220713113621.14778-4-nrb@linux.ibm.com \
--to=nrb@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.