* [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro [not found] <20230221174822.1378667-1-nsg@linux.ibm.com> @ 2023-02-21 17:48 ` Nina Schoetterl-Glausch 2023-02-21 17:50 ` Nina Schoetterl-Glausch 2023-02-23 10:09 ` Janosch Frank 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW Nina Schoetterl-Glausch 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address Nina Schoetterl-Glausch 2 siblings, 2 replies; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-02-21 17:48 UTC (permalink / raw) To: Thomas Huth, Janosch Frank, Claudio Imbrenda Cc: Nina Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390 Replace explicit psw definition by PSW macro. No functional change intended. Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> --- s390x/spec_ex.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c index 42ecaed3..2adc5996 100644 --- a/s390x/spec_ex.c +++ b/s390x/spec_ex.c @@ -105,10 +105,7 @@ static int check_invalid_psw(void) /* For normal PSWs bit 12 has to be 0 to be a valid PSW*/ static int psw_bit_12_is_1(void) { - struct psw invalid = { - .mask = BIT(63 - 12), - .addr = 0x00000000deadbeee - }; + struct psw invalid = PSW(BIT(63 - 12), 0x00000000deadbeee); expect_invalid_psw(invalid); load_psw(invalid); @@ -118,10 +115,7 @@ static int psw_bit_12_is_1(void) /* A short PSW needs to have bit 12 set to be valid. */ static int short_psw_bit_12_is_0(void) { - struct psw invalid = { - .mask = BIT(63 - 12), - .addr = 0x00000000deadbeee - }; + struct psw invalid = PSW(BIT(63 - 12), 0x00000000deadbeee); struct short_psw short_invalid = { .mask = 0x0, .addr = 0xdeadbeee -- 2.36.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro Nina Schoetterl-Glausch @ 2023-02-21 17:50 ` Nina Schoetterl-Glausch 2023-02-23 10:09 ` Janosch Frank 1 sibling, 0 replies; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-02-21 17:50 UTC (permalink / raw) To: Thomas Huth, Janosch Frank, Claudio Imbrenda Cc: David Hildenbrand, kvm, linux-s390 Messed up the recipients on the cover letter... Instructions on s390 must be halfword aligned. Add two tests for that. These currently fail when using TCG. v1 -> v2: * rebase * use PSW macros * simplify odd psw test (thanks Claudio) * rename some identifiers * pick up R-b (thanks Claudio) Nina Schoetterl-Glausch (3): s390x/spec_ex: Use PSW macro s390x/spec_ex: Add test introducing odd address into PSW s390x/spec_ex: Add test of EXECUTE with odd target address s390x/spec_ex.c | 85 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 9 deletions(-) Range-diff against v1: -: -------- > 1: d82f4fb6 s390x/spec_ex: Use PSW macro 1: 62f61c07 ! 2: e537797f s390x/spec_ex: Add test introducing odd address into PSW @@ Commit message Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> ## s390x/spec_ex.c ## -@@ s390x/spec_ex.c: static void fixup_invalid_psw(struct stack_frame_int *stack) - /* - * Load possibly invalid psw, but setup fixup_psw before, - * so that fixup_invalid_psw() can bring us back onto the right track. -+ * The provided argument is loaded into register 1. - * Also acts as compiler barrier, -> none required in expect/check_invalid_psw - */ --static void load_psw(struct psw psw) -+static void load_psw_with_arg(struct psw psw, uint64_t arg) - { - uint64_t scratch; - -@@ s390x/spec_ex.c: static void load_psw(struct psw psw) - fixup_psw.mask = extract_psw_mask(); - asm volatile ( "larl %[scratch],0f\n" - " stg %[scratch],%[fixup_addr]\n" -+ " lgr %%r1,%[arg]\n" - " lpswe %[psw]\n" - "0: nop\n" - : [scratch] "=&d" (scratch), - [fixup_addr] "=&T" (fixup_psw.addr) -- : [psw] "Q" (psw) -- : "cc", "memory" -+ : [psw] "Q" (psw), -+ [arg] "d" (arg) -+ : "cc", "memory", "%r1" - ); - } - -+static void load_psw(struct psw psw) -+{ -+ load_psw_with_arg(psw, 0); -+} -+ - static void load_short_psw(struct short_psw psw) - { - uint64_t scratch; @@ s390x/spec_ex.c: static void expect_invalid_psw(struct psw psw) invalid_psw_expected = true; } +static void clear_invalid_psw(void) +{ -+ expected_psw = (struct psw){0}; ++ expected_psw = PSW(0, 0); + invalid_psw_expected = false; +} + @@ s390x/spec_ex.c: static void expect_invalid_psw(struct psw psw) { /* 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) @@ s390x/spec_ex.c: 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" ++" bcr 0xf,%r1\n" ++); ++ +static int psw_odd_address(void) +{ -+ struct psw odd = { -+ .mask = extract_psw_mask(), -+ }; -+ uint64_t regs[16]; -+ int r; ++ struct psw odd = PSW_WITH_CUR_MASK((uint64_t)&misaligned_code); ++ uint64_t executed_addr; + -+ /* -+ * This asm is reentered at an odd address, which should cause a specification -+ * exception before the first unaligned instruction is executed. -+ * In this case, the interrupt handler fixes the address and the test succeeds. -+ * If, however, unaligned instructions *are* executed, they are jumped to -+ * from somewhere, with unknown registers, so save and restore those before. -+ */ -+ asm volatile ( "stmg %%r0,%%r15,%[regs]\n" -+ //can only offset by even number when using larl -> increment by one -+ " larl %[r],0f\n" -+ " aghi %[r],1\n" -+ " stg %[r],%[addr]\n" -+ " xr %[r],%[r]\n" -+ " brc 0xf,1f\n" -+ "0: . = . + 1\n" -+ " lmg %%r0,%%r15,0(%%r1)\n" -+ //address of the instruction itself, should be odd, store for assert -+ " larl %[r],0\n" -+ " stg %[r],%[addr]\n" -+ " larl %[r],0f\n" -+ " aghi %[r],1\n" -+ " bcr 0xf,%[r]\n" -+ "0: . = . + 1\n" -+ "1:\n" -+ : [addr] "=T" (odd.addr), -+ [regs] "=Q" (regs), -+ [r] "=d" (r) -+ : : "cc", "memory" ++ expect_invalid_psw(odd); ++ fixup_psw.mask = extract_psw_mask(); ++ asm volatile ( "xr %%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 (!r) { -+ expect_invalid_psw(odd); -+ load_psw_with_arg(odd, (uint64_t)®s); ++ if (!executed_addr) { + return check_invalid_psw(); + } else { -+ assert(odd.addr & 1); ++ assert(executed_addr == odd.addr); + clear_invalid_psw(); -+ report_fail("executed unaligned instructions"); ++ report_fail("did not execute unaligned instructions"); + return 1; + } +} 2: 30075863 ! 3: dc552880 s390x/spec_ex: Add test of EXECUTE with odd target address @@ s390x/spec_ex.c: static int short_psw_bit_12_is_0(void) +static int odd_ex_target(void) +{ -+ uint64_t target_addr_pre; ++ uint64_t pre_target_addr; + int to = 0, from = 0x0dd; + + asm volatile ( ".pushsection .rodata\n" -+ "odd_ex_target_pre_insn:\n" -+ " .balign 2\n" ++ "pre_odd_ex_target:\n" ++ " .balign 2\n" + " . = . + 1\n" + " lr %[to],%[from]\n" + " .popsection\n" + -+ " larl %[target_addr_pre],odd_ex_target_pre_insn\n" -+ " ex 0,1(%[target_addr_pre])\n" -+ : [target_addr_pre] "=&a" (target_addr_pre), ++ " larl %[pre_target_addr],pre_odd_ex_target\n" ++ " ex 0,1(%[pre_target_addr])\n" ++ : [pre_target_addr] "=&a" (pre_target_addr), + [to] "+d" (to) + : [from] "d" (from) + ); + -+ assert((target_addr_pre + 1) & 1); ++ assert((pre_target_addr + 1) & 1); + report(to != from, "did not perform ex with odd target"); + return 0; +} base-commit: e3c5c3ef2524c58023073c0fadde2e8ae3c04ec6 -- 2.36.1 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro Nina Schoetterl-Glausch 2023-02-21 17:50 ` Nina Schoetterl-Glausch @ 2023-02-23 10:09 ` Janosch Frank 1 sibling, 0 replies; 11+ messages in thread From: Janosch Frank @ 2023-02-23 10:09 UTC (permalink / raw) To: Nina Schoetterl-Glausch, Thomas Huth, Claudio Imbrenda Cc: David Hildenbrand, kvm, linux-s390 On 2/21/23 18:48, Nina Schoetterl-Glausch wrote: > Replace explicit psw definition by PSW macro. > No functional change intended. > > Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> > --- > s390x/spec_ex.c | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c > index 42ecaed3..2adc5996 100644 > --- a/s390x/spec_ex.c > +++ b/s390x/spec_ex.c > @@ -105,10 +105,7 @@ static int check_invalid_psw(void) > /* For normal PSWs bit 12 has to be 0 to be a valid PSW*/ > static int psw_bit_12_is_1(void) > { > - struct psw invalid = { > - .mask = BIT(63 - 12), > - .addr = 0x00000000deadbeee > - }; > + struct psw invalid = PSW(BIT(63 - 12), 0x00000000deadbeee); I think we've passed the point where we can use a constant for the short psw. But we can convert that at a later time, I'll add it to the TODO list, so: Reviewed-by: Janosch Frank <frankja@linux.ibm.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW [not found] <20230221174822.1378667-1-nsg@linux.ibm.com> 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro Nina Schoetterl-Glausch @ 2023-02-21 17:48 ` Nina Schoetterl-Glausch 2023-03-14 15:21 ` Claudio Imbrenda 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address Nina Schoetterl-Glausch 2 siblings, 1 reply; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-02-21 17:48 UTC (permalink / raw) To: Thomas Huth, Janosch Frank, Claudio Imbrenda Cc: Nina Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390 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. 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..a26c56aa 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" +" bcr 0xf,%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 ( "xr %%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.36.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW Nina Schoetterl-Glausch @ 2023-03-14 15:21 ` Claudio Imbrenda 2023-03-15 13:48 ` Nina Schoetterl-Glausch 0 siblings, 1 reply; 11+ messages in thread From: Claudio Imbrenda @ 2023-03-14 15:21 UTC (permalink / raw) To: Nina Schoetterl-Glausch Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390 On Tue, 21 Feb 2023 18:48:21 +0100 Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > 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. > > 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..a26c56aa 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" which section will this end up in? > +" . = . + 1\n" > +"misaligned_code:\n" > +" larl %r0,0\n" > +" bcr 0xf,%r1\n" you should just use br %r1 it's shorter and easier to understand > +); > + > +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 ( "xr %%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 }, ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW 2023-03-14 15:21 ` Claudio Imbrenda @ 2023-03-15 13:48 ` Nina Schoetterl-Glausch 0 siblings, 0 replies; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-03-15 13:48 UTC (permalink / raw) To: Claudio Imbrenda Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390 On Tue, 2023-03-14 at 16:21 +0100, Claudio Imbrenda wrote: > On Tue, 21 Feb 2023 18:48:21 +0100 > Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > > > 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. > > > > 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..a26c56aa 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" > > which section will this end up in? .text > > > +" . = . + 1\n" > > +"misaligned_code:\n" > > +" larl %r0,0\n" > > +" bcr 0xf,%r1\n" > > you should just use > br %r1 > it's shorter and easier to understand Yes. > > > +); > > + > > +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 ( "xr %%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 }, > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address [not found] <20230221174822.1378667-1-nsg@linux.ibm.com> 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro Nina Schoetterl-Glausch 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW Nina Schoetterl-Glausch @ 2023-02-21 17:48 ` Nina Schoetterl-Glausch 2023-03-14 15:25 ` Claudio Imbrenda 2 siblings, 1 reply; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-02-21 17:48 UTC (permalink / raw) To: Thomas Huth, Janosch Frank, Claudio Imbrenda Cc: Nina Schoetterl-Glausch, David Hildenbrand, kvm, linux-s390 The EXECUTE instruction executes the instruction at the given target address. This address must be halfword aligned, otherwise a specification exception occurs. Add a test for this. Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> --- s390x/spec_ex.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c index a26c56aa..dd097f9b 100644 --- a/s390x/spec_ex.c +++ b/s390x/spec_ex.c @@ -177,6 +177,30 @@ static int short_psw_bit_12_is_0(void) return 0; } +static int odd_ex_target(void) +{ + uint64_t pre_target_addr; + int to = 0, from = 0x0dd; + + asm volatile ( ".pushsection .rodata\n" + "pre_odd_ex_target:\n" + " .balign 2\n" + " . = . + 1\n" + " lr %[to],%[from]\n" + " .popsection\n" + + " larl %[pre_target_addr],pre_odd_ex_target\n" + " ex 0,1(%[pre_target_addr])\n" + : [pre_target_addr] "=&a" (pre_target_addr), + [to] "+d" (to) + : [from] "d" (from) + ); + + assert((pre_target_addr + 1) & 1); + report(to != from, "did not perform ex with odd target"); + return 0; +} + static int bad_alignment(void) { uint32_t words[5] __attribute__((aligned(16))); @@ -218,6 +242,7 @@ 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 }, + { "odd_ex_target", &odd_ex_target, true, NULL }, { "bad_alignment", &bad_alignment, true, NULL }, { "not_even", ¬_even, true, NULL }, { NULL, NULL, false, NULL }, -- 2.36.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address 2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address Nina Schoetterl-Glausch @ 2023-03-14 15:25 ` Claudio Imbrenda 2023-03-14 16:41 ` Nina Schoetterl-Glausch 0 siblings, 1 reply; 11+ messages in thread From: Claudio Imbrenda @ 2023-03-14 15:25 UTC (permalink / raw) To: Nina Schoetterl-Glausch Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390 On Tue, 21 Feb 2023 18:48:22 +0100 Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > The EXECUTE instruction executes the instruction at the given target > address. This address must be halfword aligned, otherwise a > specification exception occurs. > Add a test for this. > > Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> > --- > s390x/spec_ex.c | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c > index a26c56aa..dd097f9b 100644 > --- a/s390x/spec_ex.c > +++ b/s390x/spec_ex.c > @@ -177,6 +177,30 @@ static int short_psw_bit_12_is_0(void) > return 0; > } > > +static int odd_ex_target(void) > +{ > + uint64_t pre_target_addr; > + int to = 0, from = 0x0dd; > + > + asm volatile ( ".pushsection .rodata\n" and this should go in a .text.something subsection, as we discussed offline > + "pre_odd_ex_target:\n" shouldn't the label be after the align? > + " .balign 2\n" (i.e. here) > + " . = . + 1\n" > + " lr %[to],%[from]\n" > + " .popsection\n" > + > + " larl %[pre_target_addr],pre_odd_ex_target\n" > + " ex 0,1(%[pre_target_addr])\n" > + : [pre_target_addr] "=&a" (pre_target_addr), > + [to] "+d" (to) > + : [from] "d" (from) > + ); > + > + assert((pre_target_addr + 1) & 1); > + report(to != from, "did not perform ex with odd target"); > + return 0; > +} > + > static int bad_alignment(void) > { > uint32_t words[5] __attribute__((aligned(16))); > @@ -218,6 +242,7 @@ 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 }, > + { "odd_ex_target", &odd_ex_target, true, NULL }, > { "bad_alignment", &bad_alignment, true, NULL }, > { "not_even", ¬_even, true, NULL }, > { NULL, NULL, false, NULL }, ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address 2023-03-14 15:25 ` Claudio Imbrenda @ 2023-03-14 16:41 ` Nina Schoetterl-Glausch 2023-03-14 17:12 ` Claudio Imbrenda 0 siblings, 1 reply; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-03-14 16:41 UTC (permalink / raw) To: Claudio Imbrenda Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390 On Tue, 2023-03-14 at 16:25 +0100, Claudio Imbrenda wrote: > On Tue, 21 Feb 2023 18:48:22 +0100 > Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > > > The EXECUTE instruction executes the instruction at the given target > > address. This address must be halfword aligned, otherwise a > > specification exception occurs. > > Add a test for this. > > > > Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> > > --- > > s390x/spec_ex.c | 25 +++++++++++++++++++++++++ > > 1 file changed, 25 insertions(+) > > > > diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c > > index a26c56aa..dd097f9b 100644 > > --- a/s390x/spec_ex.c > > +++ b/s390x/spec_ex.c > > @@ -177,6 +177,30 @@ static int short_psw_bit_12_is_0(void) > > return 0; > > } > > > > +static int odd_ex_target(void) > > +{ > > + uint64_t pre_target_addr; > > + int to = 0, from = 0x0dd; > > + > > + asm volatile ( ".pushsection .rodata\n" > > and this should go in a .text.something subsection, as we discussed > offline Yes. > > > + "pre_odd_ex_target:\n" > > shouldn't the label be after the align? No, larl needs an aligned address, and the ex below adds 1. That's why it has the pre_ prefix, it's not the ex target itself. > > > + " .balign 2\n" > > (i.e. here) > > > + " . = . + 1\n" > > + " lr %[to],%[from]\n" > > + " .popsection\n" > > + > > + " larl %[pre_target_addr],pre_odd_ex_target\n" > > + " ex 0,1(%[pre_target_addr])\n" > > + : [pre_target_addr] "=&a" (pre_target_addr), > > + [to] "+d" (to) > > + : [from] "d" (from) > > + ); > > + > > + assert((pre_target_addr + 1) & 1); > > + report(to != from, "did not perform ex with odd target"); > > + return 0; > > +} > > + > > static int bad_alignment(void) > > { > > uint32_t words[5] __attribute__((aligned(16))); > > @@ -218,6 +242,7 @@ 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 }, > > + { "odd_ex_target", &odd_ex_target, true, NULL }, > > { "bad_alignment", &bad_alignment, true, NULL }, > > { "not_even", ¬_even, true, NULL }, > > { NULL, NULL, false, NULL }, > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address 2023-03-14 16:41 ` Nina Schoetterl-Glausch @ 2023-03-14 17:12 ` Claudio Imbrenda 2023-03-14 17:59 ` Nina Schoetterl-Glausch 0 siblings, 1 reply; 11+ messages in thread From: Claudio Imbrenda @ 2023-03-14 17:12 UTC (permalink / raw) To: Nina Schoetterl-Glausch Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390 On Tue, 14 Mar 2023 17:41:24 +0100 Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > On Tue, 2023-03-14 at 16:25 +0100, Claudio Imbrenda wrote: > > On Tue, 21 Feb 2023 18:48:22 +0100 > > Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > > > > > The EXECUTE instruction executes the instruction at the given target > > > address. This address must be halfword aligned, otherwise a > > > specification exception occurs. > > > Add a test for this. > > > > > > Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> > > > --- > > > s390x/spec_ex.c | 25 +++++++++++++++++++++++++ > > > 1 file changed, 25 insertions(+) > > > > > > diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c > > > index a26c56aa..dd097f9b 100644 > > > --- a/s390x/spec_ex.c > > > +++ b/s390x/spec_ex.c > > > @@ -177,6 +177,30 @@ static int short_psw_bit_12_is_0(void) > > > return 0; > > > } > > > > > > +static int odd_ex_target(void) > > > +{ > > > + uint64_t pre_target_addr; > > > + int to = 0, from = 0x0dd; > > > + > > > + asm volatile ( ".pushsection .rodata\n" > > > > and this should go in a .text.something subsection, as we discussed > > offline > > Yes. > > > > > + "pre_odd_ex_target:\n" > > > > shouldn't the label be after the align? > > No, larl needs an aligned address, and the ex below adds 1. > That's why it has the pre_ prefix, it's not the ex target itself. I understand that, but > > > > > + " .balign 2\n" doesn't the address get aligned here? so the label here would be aligned to 2 > > > > (i.e. here) > > > > > + " . = . + 1\n" and here it gets the +1? > > > + " lr %[to],%[from]\n" > > > + " .popsection\n" > > > + > > > + " larl %[pre_target_addr],pre_odd_ex_target\n" > > > + " ex 0,1(%[pre_target_addr])\n" > > > + : [pre_target_addr] "=&a" (pre_target_addr), > > > + [to] "+d" (to) > > > + : [from] "d" (from) > > > + ); > > > + > > > + assert((pre_target_addr + 1) & 1); > > > + report(to != from, "did not perform ex with odd target"); > > > + return 0; > > > +} > > > + > > > static int bad_alignment(void) > > > { > > > uint32_t words[5] __attribute__((aligned(16))); > > > @@ -218,6 +242,7 @@ 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 }, > > > + { "odd_ex_target", &odd_ex_target, true, NULL }, > > > { "bad_alignment", &bad_alignment, true, NULL }, > > > { "not_even", ¬_even, true, NULL }, > > > { NULL, NULL, false, NULL }, > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address 2023-03-14 17:12 ` Claudio Imbrenda @ 2023-03-14 17:59 ` Nina Schoetterl-Glausch 0 siblings, 0 replies; 11+ messages in thread From: Nina Schoetterl-Glausch @ 2023-03-14 17:59 UTC (permalink / raw) To: Claudio Imbrenda Cc: Thomas Huth, Janosch Frank, David Hildenbrand, kvm, linux-s390 On Tue, 2023-03-14 at 18:12 +0100, Claudio Imbrenda wrote: > On Tue, 14 Mar 2023 17:41:24 +0100 > Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > > > On Tue, 2023-03-14 at 16:25 +0100, Claudio Imbrenda wrote: > > > On Tue, 21 Feb 2023 18:48:22 +0100 > > > Nina Schoetterl-Glausch <nsg@linux.ibm.com> wrote: > > > > > > > The EXECUTE instruction executes the instruction at the given target > > > > address. This address must be halfword aligned, otherwise a > > > > specification exception occurs. > > > > Add a test for this. > > > > > > > > Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com> > > > > --- > > > > s390x/spec_ex.c | 25 +++++++++++++++++++++++++ > > > > 1 file changed, 25 insertions(+) > > > > > > > > diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c > > > > index a26c56aa..dd097f9b 100644 > > > > --- a/s390x/spec_ex.c > > > > +++ b/s390x/spec_ex.c > > > > @@ -177,6 +177,30 @@ static int short_psw_bit_12_is_0(void) > > > > return 0; > > > > } > > > > > > > > +static int odd_ex_target(void) > > > > +{ > > > > + uint64_t pre_target_addr; > > > > + int to = 0, from = 0x0dd; > > > > + > > > > + asm volatile ( ".pushsection .rodata\n" > > > > > > and this should go in a .text.something subsection, as we discussed > > > offline > > > > Yes. > > > > > > > + "pre_odd_ex_target:\n" > > > > > > shouldn't the label be after the align? > > > > No, larl needs an aligned address, and the ex below adds 1. > > That's why it has the pre_ prefix, it's not the ex target itself. > > I understand that, but > > > > > > > + " .balign 2\n" > > doesn't the address get aligned here? > so the label here would be aligned to 2 Uh, yeah, sorry. > > > > > > > (i.e. here) > > > > > > > + " . = . + 1\n" > > and here it gets the +1? > > > > > + " lr %[to],%[from]\n" > > > > + " .popsection\n" > > > > + > > > > + " larl %[pre_target_addr],pre_odd_ex_target\n" > > > > + " ex 0,1(%[pre_target_addr])\n" > > > > + : [pre_target_addr] "=&a" (pre_target_addr), > > > > + [to] "+d" (to) > > > > + : [from] "d" (from) > > > > + ); > > > > + > > > > + assert((pre_target_addr + 1) & 1); > > > > + report(to != from, "did not perform ex with odd target"); > > > > + return 0; > > > > +} > > > > + > > > > static int bad_alignment(void) > > > > { > > > > uint32_t words[5] __attribute__((aligned(16))); > > > > @@ -218,6 +242,7 @@ 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 }, > > > > + { "odd_ex_target", &odd_ex_target, true, NULL }, > > > > { "bad_alignment", &bad_alignment, true, NULL }, > > > > { "not_even", ¬_even, true, NULL }, > > > > { NULL, NULL, false, NULL }, > > > > > > ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-03-15 13:49 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20230221174822.1378667-1-nsg@linux.ibm.com>
2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 1/3] s390x/spec_ex: Use PSW macro Nina Schoetterl-Glausch
2023-02-21 17:50 ` Nina Schoetterl-Glausch
2023-02-23 10:09 ` Janosch Frank
2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 2/3] s390x/spec_ex: Add test introducing odd address into PSW Nina Schoetterl-Glausch
2023-03-14 15:21 ` Claudio Imbrenda
2023-03-15 13:48 ` Nina Schoetterl-Glausch
2023-02-21 17:48 ` [kvm-unit-tests PATCH v2 3/3] s390x/spec_ex: Add test of EXECUTE with odd target address Nina Schoetterl-Glausch
2023-03-14 15:25 ` Claudio Imbrenda
2023-03-14 16:41 ` Nina Schoetterl-Glausch
2023-03-14 17:12 ` Claudio Imbrenda
2023-03-14 17:59 ` Nina Schoetterl-Glausch
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox