Re: [kvm-unit-tests PATCH] s390x: Only look at relevant skey bits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04.02.19 11:50, Janosch Frank wrote:
> Reference and change indication should not be consulted when checking
> for ACC and FP values of storage keys.
> 
> Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx>
> ---
> 
> Automated testing with the debug kernel seems to result in the
> referenced bit being 1 when the key is read after setting it. This
> makes the tests trip, as I compare the wrong bits (referenced and
> changed are allowed to change in-between).
> 
> ---
>  lib/s390x/asm/mem.h |  5 +++++
>  s390x/pfmf.c        |  6 +++++-
>  s390x/skey.c        | 10 ++++++----
>  3 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/s390x/asm/mem.h b/lib/s390x/asm/mem.h
> index 909e6d4..75bd778 100644
> --- a/lib/s390x/asm/mem.h
> +++ b/lib/s390x/asm/mem.h
> @@ -10,6 +10,11 @@
>  #ifndef _ASM_S390_MEM_H
>  #define _ASM_S390_MEM_H
>  
> +#define SKEY_ACC	0xf0
> +#define SKEY_FP		0x08
> +#define SKEY_RF		0x04
> +#define SKEY_CH		0x02
> +
>  union skey {
>  	struct {
>  		uint8_t acc : 4;
> diff --git a/s390x/pfmf.c b/s390x/pfmf.c
> index 5e61267..4cc6bd1 100644
> --- a/s390x/pfmf.c
> +++ b/s390x/pfmf.c
> @@ -70,6 +70,7 @@ static void test_4k_key(void)
>  	r1.reg.key = 0x30;
>  	pfmf(r1.val, (unsigned long) pagebuf);
>  	skey.val = get_storage_key((unsigned long) pagebuf);
> +	skey.val &= SKEY_ACC | SKEY_FP;
>  	report("set 4k", skey.val == 0x30);
>  }
>  
> @@ -77,6 +78,7 @@ static void test_1m_key(void)
>  {
>  	int i;
>  	union r1 r1;
> +	union skey skey;
>  
>  	r1.val = 0;
>  	r1.reg.sk = 1;
> @@ -84,7 +86,9 @@ static void test_1m_key(void)
>  	r1.reg.key = 0x30;
>  	pfmf(r1.val, (unsigned long) pagebuf);
>  	for (i = 0; i < 256; i++) {
> -		if (get_storage_key((unsigned long) pagebuf + i * PAGE_SIZE) != 0x30) {
> +		skey.val = get_storage_key((unsigned long) pagebuf + i * PAGE_SIZE);
> +		skey.val &= SKEY_ACC | SKEY_FP;
> +		if (skey.val != 0x30) {
>  			report("set 1M", false);
>  			return;
>  		}
> diff --git a/s390x/skey.c b/s390x/skey.c
> index 1949533..bb230d0 100644
> --- a/s390x/skey.c
> +++ b/s390x/skey.c
> @@ -35,9 +35,10 @@ static void test_set_mb(void)
>  	while (addr < end)
>  		addr = set_storage_key_mb(addr, skey.val);
>  
> -	ret1.val = get_storage_key(end - PAGE_SIZE);
> -	ret2.val = get_storage_key(end - PAGE_SIZE * 2);
> -	report("multi block", ret1.val == ret2.val && ret1.val == skey.val);
> +	ret1.val = get_storage_key(end - PAGE_SIZE) & (SKEY_ACC | SKEY_FP);
> +	ret2.val = get_storage_key(end - PAGE_SIZE * 2) & (SKEY_ACC | SKEY_FP);
> +	report("multi block",
> +	       ret1.val == ret2.val && ret1.val == skey.val);
>  }
>  
>  static void test_chg(void)
> @@ -60,7 +61,8 @@ static void test_set(void)
>  	ret.val = get_storage_key(page0);
>  	set_storage_key(page0, skey.val, 0);
>  	ret.val = get_storage_key(page0);
> -	report("set key test", skey.val == ret.val);
> +	report("set key test",
> +	       skey.str.acc == ret.str.acc && skey.str.fp == ret.str.fp);
>  }
>  
>  static void test_priv(void)
> 

Care to add a comment somewhere (one instance) why this is done?

Reviewed-by: David Hildenbrand <david@xxxxxxxxxx>

-- 

Thanks,

David / dhildenb



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Kernel Development]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Info]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Linux Media]     [Device Mapper]

  Powered by Linux