Message ID | 20220121150931.371720-3-nrb@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: Extend instruction interception tests | expand |
On 21/01/2022 16.09, Nico Boehr wrote: > PFMF should respect the low-address protection when clearing pages, hence > add some tests for it. > > When low-address protection fails, clearing frame 0 is a destructive > operation. It messes up interrupts and thus printing test results won't > work properly. Hence, we first attempt to clear frame 1 which is not as > destructive. > > Doing it this way around increases the chances for the user to see a > proper failure message instead of QEMU randomly quitting in the middle > of the test run. > > Signed-off-by: Nico Boehr <nrb@linux.ibm.com> > Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > Reviewed-by: Janosch Frank <frankja@linux.ibm.com> > --- > s390x/pfmf.c | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/s390x/pfmf.c b/s390x/pfmf.c > index 2f3cb110dc4c..aa1305292ee8 100644 > --- a/s390x/pfmf.c > +++ b/s390x/pfmf.c > @@ -113,6 +113,34 @@ static void test_1m_clear(void) > report_prefix_pop(); > } > > +static void test_low_addr_prot(void) > +{ > + union pfmf_r1 r1 = { > + .reg.cf = 1, > + .reg.fsc = PFMF_FSC_4K > + }; > + > + report_prefix_push("low-address protection"); > + > + report_prefix_push("0x1000"); > + expect_pgm_int(); > + low_prot_enable(); > + pfmf(r1.val, (void *)0x1000); > + low_prot_disable(); > + check_pgm_int_code(PGM_INT_CODE_PROTECTION); > + report_prefix_pop(); > + > + report_prefix_push("0x0"); > + expect_pgm_int(); > + low_prot_enable(); > + pfmf(r1.val, 0); > + low_prot_disable(); > + check_pgm_int_code(PGM_INT_CODE_PROTECTION); > + report_prefix_pop(); > + > + report_prefix_pop(); > +} > + > int main(void) > { > bool has_edat = test_facility(8); > @@ -124,6 +152,7 @@ int main(void) > } > > test_priv(); > + test_low_addr_prot(); > /* Force the buffer pages in */ > memset(pagebuf, 0, PAGE_SIZE * 256); > Reviewed-by: Thomas Huth <thuth@redhat.com>
diff --git a/s390x/pfmf.c b/s390x/pfmf.c index 2f3cb110dc4c..aa1305292ee8 100644 --- a/s390x/pfmf.c +++ b/s390x/pfmf.c @@ -113,6 +113,34 @@ static void test_1m_clear(void) report_prefix_pop(); } +static void test_low_addr_prot(void) +{ + union pfmf_r1 r1 = { + .reg.cf = 1, + .reg.fsc = PFMF_FSC_4K + }; + + report_prefix_push("low-address protection"); + + report_prefix_push("0x1000"); + expect_pgm_int(); + low_prot_enable(); + pfmf(r1.val, (void *)0x1000); + low_prot_disable(); + check_pgm_int_code(PGM_INT_CODE_PROTECTION); + report_prefix_pop(); + + report_prefix_push("0x0"); + expect_pgm_int(); + low_prot_enable(); + pfmf(r1.val, 0); + low_prot_disable(); + check_pgm_int_code(PGM_INT_CODE_PROTECTION); + report_prefix_pop(); + + report_prefix_pop(); +} + int main(void) { bool has_edat = test_facility(8); @@ -124,6 +152,7 @@ int main(void) } test_priv(); + test_low_addr_prot(); /* Force the buffer pages in */ memset(pagebuf, 0, PAGE_SIZE * 256);