From: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
To: Thomas Huth <thuth@redhat.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Nina Schoetterl-Glausch <nsg@linux.ibm.com>,
David Hildenbrand <david@redhat.com>,
kvm@vger.kernel.org, linux-s390@vger.kernel.org
Subject: [kvm-unit-tests PATCH v4 2/3] s390x/spec_ex: Add test introducing odd address into PSW
Date: Fri, 17 Mar 2023 14:32:52 +0100 [thread overview]
Message-ID: <20230317133253.965010-3-nsg@linux.ibm.com> (raw)
In-Reply-To: <20230317133253.965010-1-nsg@linux.ibm.com>
Instructions on s390 must be halfword aligned.
Introducing an odd instruction address into the PSW leads to a
specification exception when attempting to execute the instruction at
the odd address.
Add a test for this.
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
---
s390x/spec_ex.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c
index 2adc5996..ab023347 100644
--- a/s390x/spec_ex.c
+++ b/s390x/spec_ex.c
@@ -88,12 +88,23 @@ static void expect_invalid_psw(struct psw psw)
invalid_psw_expected = true;
}
+static void clear_invalid_psw(void)
+{
+ expected_psw = PSW(0, 0);
+ invalid_psw_expected = false;
+}
+
static int check_invalid_psw(void)
{
/* Since the fixup sets this to false we check for false here. */
if (!invalid_psw_expected) {
+ /*
+ * Early exception recognition: pgm_int_id == 0.
+ * Late exception recognition: psw address has been
+ * incremented by pgm_int_id (unpredictable value)
+ */
if (expected_psw.mask == invalid_psw.mask &&
- expected_psw.addr == invalid_psw.addr)
+ expected_psw.addr == invalid_psw.addr - lowcore.pgm_int_id)
return 0;
report_fail("Wrong invalid PSW");
} else {
@@ -112,6 +123,42 @@ static int psw_bit_12_is_1(void)
return check_invalid_psw();
}
+extern char misaligned_code[];
+asm ( ".balign 2\n"
+" . = . + 1\n"
+"misaligned_code:\n"
+" larl %r0,0\n"
+" br %r1\n"
+);
+
+static int psw_odd_address(void)
+{
+ struct psw odd = PSW_WITH_CUR_MASK((uint64_t)&misaligned_code);
+ uint64_t executed_addr;
+
+ expect_invalid_psw(odd);
+ fixup_psw.mask = extract_psw_mask();
+ asm volatile ( "xgr %%r0,%%r0\n"
+ " larl %%r1,0f\n"
+ " stg %%r1,%[fixup_addr]\n"
+ " lpswe %[odd_psw]\n"
+ "0: lr %[executed_addr],%%r0\n"
+ : [fixup_addr] "=&T" (fixup_psw.addr),
+ [executed_addr] "=d" (executed_addr)
+ : [odd_psw] "Q" (odd)
+ : "cc", "%r0", "%r1"
+ );
+
+ if (!executed_addr) {
+ return check_invalid_psw();
+ } else {
+ assert(executed_addr == odd.addr);
+ clear_invalid_psw();
+ report_fail("did not execute unaligned instructions");
+ return 1;
+ }
+}
+
/* A short PSW needs to have bit 12 set to be valid. */
static int short_psw_bit_12_is_0(void)
{
@@ -170,6 +217,7 @@ struct spec_ex_trigger {
static const struct spec_ex_trigger spec_ex_triggers[] = {
{ "psw_bit_12_is_1", &psw_bit_12_is_1, false, &fixup_invalid_psw },
{ "short_psw_bit_12_is_0", &short_psw_bit_12_is_0, false, &fixup_invalid_psw },
+ { "psw_odd_address", &psw_odd_address, false, &fixup_invalid_psw },
{ "bad_alignment", &bad_alignment, true, NULL },
{ "not_even", ¬_even, true, NULL },
{ NULL, NULL, false, NULL },
--
2.39.1
next prev parent reply other threads:[~2023-03-17 13:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-17 13:32 [kvm-unit-tests PATCH v4 0/3] s390x: Add misaligned instruction tests Nina Schoetterl-Glausch
2023-03-17 13:32 ` [kvm-unit-tests PATCH v4 1/3] s390x/spec_ex: Use PSW macro Nina Schoetterl-Glausch
2023-03-17 13:32 ` Nina Schoetterl-Glausch [this message]
2023-03-17 13:32 ` [kvm-unit-tests PATCH v4 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address Nina Schoetterl-Glausch
2023-04-03 15:38 ` Thomas Huth
2023-04-04 8:57 ` Nina Schoetterl-Glausch
2023-03-17 14:41 ` [kvm-unit-tests PATCH v4 0/3] s390x: Add misaligned instruction tests Claudio Imbrenda
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=20230317133253.965010-3-nsg@linux.ibm.com \
--to=nsg@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.