On 7/21/20 9:28 AM, Thomas Huth wrote: > On 17/07/2020 16.58, Janosch Frank wrote: >> If a exception new psw mask contains a key a specification exception >> instead of a special operation exception is presented. > > I have troubles parsing that sentence... could you write that differently? > (and: "s/a exception/an exception/") How about: When an exception psw new with a storage key in its mask is loaded from lowcore a specification exception is raised instead of the special operation exception that is normally presented when skrf is active. > >> Let's test >> that. >> >> Also let's add the test to unittests.cfg so it is run more often. >> >> Signed-off-by: Janosch Frank >> --- >> s390x/skrf.c | 81 +++++++++++++++++++++++++++++++++++++++++++++ >> s390x/unittests.cfg | 4 +++ >> 2 files changed, 85 insertions(+) >> >> diff --git a/s390x/skrf.c b/s390x/skrf.c >> index 9cae589..9733412 100644 >> --- a/s390x/skrf.c >> +++ b/s390x/skrf.c >> @@ -15,6 +15,8 @@ >> #include >> #include >> #include >> +#include >> +#include >> >> static uint8_t pagebuf[PAGE_SIZE * 2] __attribute__((aligned(PAGE_SIZE * 2))); >> >> @@ -106,6 +108,84 @@ static void test_tprot(void) >> report_prefix_pop(); >> } >> >> +#include > > Can we keep the #includes at the top of the file, please? Yes > >> +static int testflag = 0; >> + >> +static void wait_for_flag(void) >> +{ >> + while (!testflag) >> + mb(); >> +} >> + >> +static void set_flag(int val) >> +{ >> + mb(); >> + testflag = val; >> + mb(); >> +} >> + >> +static void ecall_cleanup(void) >> +{ >> + struct lowcore *lc = (void *)0x0; >> + >> + lc->ext_new_psw.mask = 0x0000000180000000UL; > > Don't we have defines for the PSW values yet? Pierre dropped that patch because of your old binutils version... > >> + lc->sw_int_crs[0] = 0x0000000000040000; >> + >> + /* >> + * PGM old contains the ext new PSW, we need to clean it up, >> + * so we don't get a special oepration exception on the lpswe > > operation fixed > >> + * of pgm old. >> + */ >> + lc->pgm_old_psw.mask = 0x0000000180000000UL; >> + lc->pgm_old_psw.addr = (unsigned long)wait_for_flag; >> + >> + check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); >> + set_flag(1); >> +} > > Thomas >