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,
david@redhat.com
Subject: [PATCH kvm-unit-tests v1 4/8] s390x: Add tests for STCRW
Date: Fri, 21 Jan 2022 16:09:27 +0100 [thread overview]
Message-ID: <20220121150931.371720-5-nrb@linux.ibm.com> (raw)
In-Reply-To: <20220121150931.371720-1-nrb@linux.ibm.com>
The test consists of two parts: First a simple check to ensure we
enforce an aligned address. We test misalignment by 1 and 2 bytes.
The second part tests the handling of pending Channel Reports (CR). We
first assume no CR is initally pending and check STCRW returns
accordingly. Then, we generate a CR by resetting a Channel Path using
RCHP and make sure this results in exactly one CRW being generated which
has a Reporting-Source Code (RSC) corresponding to the Channel Path
facility.
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.ibm.com>
---
lib/s390x/css.h | 17 ++++++++++
lib/s390x/css_lib.c | 60 +++++++++++++++++++++++++++++++++
s390x/css.c | 82 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 159 insertions(+)
diff --git a/lib/s390x/css.h b/lib/s390x/css.h
index 0db8a28166f6..a6a68577248b 100644
--- a/lib/s390x/css.h
+++ b/lib/s390x/css.h
@@ -266,6 +266,20 @@ static inline int rchp(unsigned long chpid)
return cc;
}
+static inline int stcrw(uint32_t *crw)
+{
+ int cc;
+
+ asm volatile(
+ " stcrw %[crw]\n"
+ " ipm %[cc]\n"
+ " srl %[cc],28"
+ : [cc] "=d" (cc)
+ : [crw] "Q" (*crw)
+ : "cc", "memory");
+ return cc;
+}
+
/* Debug functions */
char *dump_pmcw_flags(uint16_t f);
char *dump_scsw_flags(uint32_t f);
@@ -294,6 +308,9 @@ int css_residual_count(unsigned int schid);
void enable_io_isc(uint8_t isc);
int wait_and_check_io_completion(int schid);
+int css_find_installed_chpid(int sid, uint8_t *chpid_out);
+int css_generate_crw(int sid);
+
/*
* CHSC definitions
*/
diff --git a/lib/s390x/css_lib.c b/lib/s390x/css_lib.c
index 80e9e078b0f6..a9f5097f3486 100644
--- a/lib/s390x/css_lib.c
+++ b/lib/s390x/css_lib.c
@@ -504,3 +504,63 @@ void enable_io_isc(uint8_t isc)
value = (uint64_t)isc << 24;
lctlg(6, value);
}
+
+static int is_path_installed(struct schib *schib, int chp_idx)
+{
+ return schib->pmcw.pim & BIT(7 - chp_idx);
+}
+
+/*
+ * css_find_installed_chpid: find any installed CHPID
+ * @sid: subsystem-identification word
+ * @chpid_out: store the found chpid here, left alone if none found
+ *
+ * returns 0 on success, -1 if no chpid found any other value
+ * indicates the condition code of a failing STSCH instruction
+ */
+int css_find_installed_chpid(int sid, uint8_t *chpid_out)
+{
+ int cc;
+
+ cc = stsch(sid, &schib);
+ if (cc) {
+ report_fail("%s: sch %08x failed with cc=%d", __func__, sid, cc);
+ return cc;
+ }
+
+ for (int i = 0; i < ARRAY_SIZE(schib.pmcw.chpid); i++) {
+ if (is_path_installed(&schib, i)) {
+ *chpid_out = schib.pmcw.chpid[i];
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+/*
+ * css_generate_crw: Generate a CRW by issuing RCHP on any channel path
+ * @sid: subsystem-identification word
+ *
+ * returns 0 when a CRW was generated, -1 if no chpid found.
+ */
+int css_generate_crw(int sid)
+{
+ int ret, cc;
+ uint8_t chpid;
+
+ report_prefix_push("Generate CRW");
+
+ ret = css_find_installed_chpid(sid, &chpid);
+ if (ret) {
+ report_fail("No CHPID found: ret=%d", ret);
+ return -1;
+ }
+
+ cc = rchp(chpid);
+ report(!cc, "rhcp cc != 0");
+
+ report_prefix_pop();
+
+ return 0;
+}
diff --git a/s390x/css.c b/s390x/css.c
index afe1f71bb576..3f9dbac173e3 100644
--- a/s390x/css.c
+++ b/s390x/css.c
@@ -381,6 +381,87 @@ static void test_msch(void)
report_prefix_pop();
}
+static void check_stcrw_no_crw_available(void)
+{
+ uint32_t crw = 0xfeedc0fe;
+ int cc;
+
+ report_prefix_push("No CRW available");
+ cc = stcrw(&crw);
+ report(cc == 1, "cc == 1");
+ report(!crw, "stored zeroes in crw");
+ report_prefix_pop();
+}
+
+static int check_stcrw_crw_available(void)
+{
+ const uint32_t magic = 0xfeedc0fe;
+ uint32_t crw = magic;
+ int cc;
+
+ report_prefix_push("CRW available");
+ cc = stcrw(&crw);
+ report(!cc, "cc is zero");
+ report(crw != magic, "stored crw");
+ report_prefix_pop();
+
+ return crw;
+}
+
+static uint32_t crw_get_rsc(uint32_t crw)
+{
+ const int rsc_begin = 4;
+ const int rsc_end = 8;
+
+ return (crw & GENMASK(31 - rsc_begin, 31 - rsc_end)) >> 24;
+}
+
+#define CRW_RSC_CHP 4
+static void test_stcrw(void)
+{
+ const int align_to = 4;
+ int res;
+ uint32_t crw;
+
+ if (!test_device_sid) {
+ report_skip("No device");
+ return;
+ }
+
+ report_prefix_push("Unaligned");
+ for (int i = 1; i < align_to; i *= 2) {
+ report_prefix_pushf("%d", i);
+
+ expect_pgm_int();
+ stcrw((uint32_t *)(alignment_test_page + i));
+ check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
+
+ report_prefix_pop();
+ }
+ report_prefix_pop();
+
+ report_prefix_push("No CRW available initally");
+ check_stcrw_no_crw_available();
+ report_prefix_pop();
+
+ res = css_generate_crw(test_device_sid);
+ if (res) {
+ report_skip("Couldn't generate CRW");
+ report_prefix_pop();
+ return;
+ }
+
+ crw = check_stcrw_crw_available();
+
+ report_prefix_push("CRW available");
+ report(crw_get_rsc(crw) == CRW_RSC_CHP, "CRW has Channel Path RSC");
+ report_prefix_pop();
+
+ report_prefix_push("No more CRWs pending");
+ check_stcrw_no_crw_available();
+ report_prefix_pop();
+}
+
static struct {
const char *name;
void (*func)(void);
@@ -394,6 +475,7 @@ static struct {
{ "measurement block format0", test_schm_fmt0 },
{ "measurement block format1", test_schm_fmt1 },
{ "msch", test_msch },
+ { "stcrw", test_stcrw },
{ NULL, NULL }
};
--
2.31.1
next prev parent reply other threads:[~2022-01-21 15:09 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-21 15:09 [PATCH kvm-unit-tests v1 0/8] s390x: Extend instruction interception tests Nico Boehr
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 1/8] s390x: Add more tests for MSCH Nico Boehr
2022-01-25 11:54 ` Thomas Huth
2022-01-25 12:57 ` Nico Boehr
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 2/8] s390x: Add test for PFMF low-address protection Nico Boehr
2022-01-25 13:00 ` Thomas Huth
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 3/8] s390x: Add sck tests Nico Boehr
2022-01-21 15:09 ` Nico Boehr [this message]
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 5/8] s390x: Add more tests for SSCH Nico Boehr
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 6/8] s390x: Add more tests for STSCH Nico Boehr
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 7/8] s390x: Add tests for TSCH Nico Boehr
2022-01-21 15:09 ` [PATCH kvm-unit-tests v1 8/8] s390x: Add EPSW test 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=20220121150931.371720-5-nrb@linux.ibm.com \
--to=nrb@linux.ibm.com \
--cc=david@redhat.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.