Re: [PATCH] KVM: s390: get rid of register asm usage

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

 



On Mon, 21 Jun 2021 16:03:56 +0200
Heiko Carstens <hca@xxxxxxxxxxxxx> wrote:

> Using register asm statements has been proven to be very error prone,
> especially when using code instrumentation where gcc may add function
> calls, which clobbers register contents in an unexpected way.
> 
> Therefore get rid of register asm statements in kvm code, even though
> there is currently nothing wrong with them. This way we know for sure
> that this bug class won't be introduced here.
> 
> Reviewed-by: Christian Borntraeger <borntraeger@xxxxxxxxxx>
> Signed-off-by: Heiko Carstens <hca@xxxxxxxxxxxxx>

Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx>

> ---
>  arch/s390/kvm/kvm-s390.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index 1296fc10f80c..4b7b24f07790 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -329,31 +329,31 @@ static void allow_cpu_feat(unsigned long nr)
>  
>  static inline int plo_test_bit(unsigned char nr)
>  {
> -	register unsigned long r0 asm("0") = (unsigned long) nr |
> 0x100;
> +	unsigned long function = (unsigned long) nr | 0x100;
>  	int cc;
>  
>  	asm volatile(
> +		"	lgr	0,%[function]\n"
>  		/* Parameter registers are ignored for "test bit" */
>  		"	plo	0,0,0,0(0)\n"
>  		"	ipm	%0\n"
>  		"	srl	%0,28\n"
>  		: "=d" (cc)
> -		: "d" (r0)
> -		: "cc");
> +		: [function] "d" (function)
> +		: "cc", "0");
>  	return cc == 0;
>  }
>  
>  static __always_inline void __insn32_query(unsigned int opcode, u8
> *query) {
> -	register unsigned long r0 asm("0") = 0;	/* query
> function */
> -	register unsigned long r1 asm("1") = (unsigned long) query;
> -
>  	asm volatile(
> -		/* Parameter regs are ignored */
> +		"	lghi	0,0\n"
> +		"	lgr	1,%[query]\n"
> +		/* Parameter registers are ignored */
>  		"	.insn	rrf,%[opc] << 16,2,4,6,0\n"
>  		:
> -		: "d" (r0), "a" (r1), [opc] "i" (opcode)
> -		: "cc", "memory");
> +		: [query] "d" ((unsigned long)query), [opc] "i"
> (opcode)
> +		: "cc", "memory", "0", "1");
>  }
>  
>  #define INSN_SORTL 0xb938




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux