Message ID | 20210903162537.57178-1-david@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [kvm-unit-tests,v1] s390x/skey: Test for ADDRESSING exceptions | expand |
On 9/3/21 6:25 PM, David Hildenbrand wrote: > ... 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. Reviewed-by: Janosch Frank <frankja@linux.ibm.com> > > Signed-off-by: David Hildenbrand <david@redhat.com> > --- > 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 40b22b6..845c00c 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 2539944..58a5543 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(); >
On Fri, 3 Sep 2021 18:25:37 +0200 David Hildenbrand <david@redhat.com> wrote: > ... 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@redhat.com> Maybe consider testing rrbm too, but anyway: Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > --- > 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 40b22b6..845c00c 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 2539944..58a5543 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();
diff --git a/lib/s390x/asm/mem.h b/lib/s390x/asm/mem.h index 40b22b6..845c00c 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 2539944..58a5543 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();
... 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@redhat.com> --- lib/s390x/asm/mem.h | 12 ++++++++++++ s390x/skey.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+)