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@xxxxxxxxxxxxx>
Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx>
Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx>
---
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@xxxxxxxxxx>