From: David Hildenbrand <david@xxxxxxxxxx> ... used to be broken in TCG, so let's add a very simple test for SSKE and ISKE. In order to test RRBE as well, introduce a helper to call the machine instruction. Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> Message-Id: <20210903162537.57178-1-david@xxxxxxxxxx> Link: https://lore.kernel.org/kvm/20210903162537.57178-1-david@xxxxxxxxxx/ Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> --- lib/s390x/asm/mem.h | 12 ++++++++++++ s390x/skey.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/lib/s390x/asm/mem.h b/lib/s390x/asm/mem.h index 40b22b63..845c00cc 100644 --- a/lib/s390x/asm/mem.h +++ b/lib/s390x/asm/mem.h @@ -50,6 +50,18 @@ static inline unsigned char get_storage_key(void *addr) return skey; } +static inline unsigned char reset_reference_bit(void *addr) +{ + int cc; + + asm volatile( + "rrbe 0,%1\n" + "ipm %0\n" + "srl %0,28\n" + : "=d" (cc) : "a" (addr) : "cc"); + return cc; +} + #define PFMF_FSC_4K 0 #define PFMF_FSC_1M 1 #define PFMF_FSC_2G 2 diff --git a/s390x/skey.c b/s390x/skey.c index 25399443..58a55436 100644 --- a/s390x/skey.c +++ b/s390x/skey.c @@ -120,6 +120,33 @@ static void test_priv(void) report_prefix_pop(); } +static void test_invalid_address(void) +{ + void *inv_addr = (void *)-1ull; + + report_prefix_push("invalid address"); + + report_prefix_push("sske"); + expect_pgm_int(); + set_storage_key(inv_addr, 0, 0); + check_pgm_int_code(PGM_INT_CODE_ADDRESSING); + report_prefix_pop(); + + report_prefix_push("iske"); + expect_pgm_int(); + get_storage_key(inv_addr); + check_pgm_int_code(PGM_INT_CODE_ADDRESSING); + report_prefix_pop(); + + report_prefix_push("rrbe"); + expect_pgm_int(); + reset_reference_bit(inv_addr); + check_pgm_int_code(PGM_INT_CODE_ADDRESSING); + report_prefix_pop(); + + report_prefix_pop(); +} + int main(void) { report_prefix_push("skey"); @@ -128,6 +155,7 @@ int main(void) goto done; } test_priv(); + test_invalid_address(); test_set(); test_set_mb(); test_chg(); -- 2.31.1