Create a region 3 table with fc=1 (i.e. a 2G large page) mapping across the end of memory. Check that the part of the large page before the end of memory is accessible, and the part that is after the end of memory is not. Also fix a typo in the existing edat2 test. Signed-off-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> --- s390x/edat.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/s390x/edat.c b/s390x/edat.c index 16138397..1f582efc 100644 --- a/s390x/edat.c +++ b/s390x/edat.c @@ -196,6 +196,8 @@ static void test_edat1(void) static void test_edat2(void) { + uint64_t mem_end, i; + report_prefix_push("edat2"); p[0] = 42; @@ -206,7 +208,21 @@ static void test_edat2(void) /* Prefixing should not work with huge pages, just like large pages */ report(!memcmp(0, VIRT(prefix_buf), LC_SIZE) && !memcmp(prefix_buf, VIRT(0), LC_SIZE), - "pmd, large, prefixing"); + "pud, large, prefixing"); + + mem_end = get_ram_size(); + if (mem_end >= BIT_ULL(REGION3_SHIFT)) { + report_skip("pud spanning end of memory"); + } else { + for (i = 0; i < mem_end; i += PAGE_SIZE) + READ_ONCE(*(uint64_t *)VIRT(i)); + for (i = mem_end; i < BIT_ULL(REGION3_SHIFT); i += PAGE_SIZE) { + expect_pgm_int(); + READ_ONCE(*(uint64_t *)VIRT(i)); + assert(clear_pgm_int() == PGM_INT_CODE_ADDRESSING); + } + report_pass("pud spanning end of memory"); + } report_prefix_pop(); } -- 2.46.2