diff mbox series

[kvm-unit-tests,RFC,2/2] lib: s390x: css: Name inline assembly arguments and clean them up

Message ID 20240201142356.534783-3-frankja@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series lib: s390x: Inline asm cleanup | expand

Commit Message

Janosch Frank Feb. 1, 2024, 2:23 p.m. UTC
Less need to count the operands makes the code easier to read.
For ssch and msch the second addr argument which was unused was removed.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
---
 lib/s390x/css.h | 76 ++++++++++++++++++++++++-------------------------
 1 file changed, 38 insertions(+), 38 deletions(-)

Comments

Nico Boehr April 22, 2024, 7:43 a.m. UTC | #1
Quoting Janosch Frank (2024-02-01 15:23:56)
[...]
> diff --git a/lib/s390x/css.h b/lib/s390x/css.h
> index 504b3f14..e4311124 100644
> --- a/lib/s390x/css.h
> +++ b/lib/s390x/css.h
[...]
> @@ -167,11 +167,11 @@ static inline int msch(unsigned long schid, struct schib *addr)
>         int cc;
>  
>         asm volatile(
> -               "       msch    0(%3)\n"
> -               "       ipm     %0\n"
> -               "       srl     %0,28"
> -               : "=d" (cc)
> -               : "d" (reg1), "m" (*addr), "a" (addr)
> +               "       msch    0(%[addr])\n"
> +               "       ipm     %[cc]\n"
> +               "       srl     %[cc],28"
> +               : [cc] "=d" (cc)
> +               : "d" (reg1), [addr] "a" (addr)

I think there was a reason why the "m"(*addr) was here. Either add it back
or add a memory clobber.

I will only take the first patch of this series for now.
Heiko Carstens April 22, 2024, 10:57 a.m. UTC | #2
On Mon, Apr 22, 2024 at 09:43:44AM +0200, Nico Boehr wrote:
> Quoting Janosch Frank (2024-02-01 15:23:56)
> [...]
> > diff --git a/lib/s390x/css.h b/lib/s390x/css.h
> > index 504b3f14..e4311124 100644
> > --- a/lib/s390x/css.h
> > +++ b/lib/s390x/css.h
> [...]
> > @@ -167,11 +167,11 @@ static inline int msch(unsigned long schid, struct schib *addr)
> >         int cc;
> >  
> >         asm volatile(
> > -               "       msch    0(%3)\n"
> > -               "       ipm     %0\n"
> > -               "       srl     %0,28"
> > -               : "=d" (cc)
> > -               : "d" (reg1), "m" (*addr), "a" (addr)
> > +               "       msch    0(%[addr])\n"
> > +               "       ipm     %[cc]\n"
> > +               "       srl     %[cc],28"
> > +               : [cc] "=d" (cc)
> > +               : "d" (reg1), [addr] "a" (addr)
> 
> I think there was a reason why the "m"(*addr) was here. Either add it back
> or add a memory clobber.

It is there to tell the compiler that the memory contents at *addr are used
as input. Without that, and only the "a" contraint, the compiler is free to
discard any potential previous writes to *addr.

The best solution here would be to use the Q constraint (memory reference
with short displacement and without index register) for the second operand
address of msch. Or simply copy the current implementation from the kernel
(drivers/s390/cio/ioasm.c).
diff mbox series

Patch

diff --git a/lib/s390x/css.h b/lib/s390x/css.h
index 504b3f14..e4311124 100644
--- a/lib/s390x/css.h
+++ b/lib/s390x/css.h
@@ -135,11 +135,11 @@  static inline int ssch(unsigned long schid, struct orb *addr)
 	int cc;
 
 	asm volatile(
-		"	ssch	0(%2)\n"
-		"	ipm	%0\n"
-		"	srl	%0,28\n"
-		: "=d" (cc)
-		: "d" (reg1), "a" (addr), "m" (*addr)
+		"	ssch	0(%[addr])\n"
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28\n"
+		: [cc] "=d" (cc)
+		: "d" (reg1), [addr] "a" (addr)
 		: "cc", "memory");
 	return cc;
 }
@@ -152,11 +152,11 @@  static inline int stsch(unsigned long schid, struct schib *addr)
 
 	asm volatile(
 		"       tmll    %[bogus_cc],3\n"
-		"	stsch	0(%3)\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc), "=m" (*addr)
-		: "d" (reg1), "a" (addr), [bogus_cc] "d" (bogus_cc)
+		"	stsch	0(%[addr])\n"
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc), "=m" (*addr)
+		: "d" (reg1), [addr] "a" (addr), [bogus_cc] "d" (bogus_cc)
 		: "cc");
 	return cc;
 }
@@ -167,11 +167,11 @@  static inline int msch(unsigned long schid, struct schib *addr)
 	int cc;
 
 	asm volatile(
-		"	msch	0(%3)\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc)
-		: "d" (reg1), "m" (*addr), "a" (addr)
+		"	msch	0(%[addr])\n"
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc)
+		: "d" (reg1), [addr] "a" (addr)
 		: "cc");
 	return cc;
 }
@@ -184,11 +184,11 @@  static inline int tsch(unsigned long schid, struct irb *addr)
 
 	asm volatile(
 		"       tmll    %[bogus_cc],3\n"
-		"	tsch	0(%3)\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc), "=m" (*addr)
-		: "d" (reg1), "a" (addr), [bogus_cc] "d" (bogus_cc)
+		"	tsch	0(%[addr])\n"
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc), "=m" (*addr)
+		: "d" (reg1), [addr] "a" (addr), [bogus_cc] "d" (bogus_cc)
 		: "cc");
 	return cc;
 }
@@ -200,9 +200,9 @@  static inline int hsch(unsigned long schid)
 
 	asm volatile(
 		"	hsch\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc)
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc)
 		: "d" (reg1)
 		: "cc");
 	return cc;
@@ -215,9 +215,9 @@  static inline int xsch(unsigned long schid)
 
 	asm volatile(
 		"	xsch\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc)
+		"	ipm	%[cc]\n"
+		"	srl	%cc,28"
+		: [cc] "=d" (cc)
 		: "d" (reg1)
 		: "cc");
 	return cc;
@@ -230,9 +230,9 @@  static inline int csch(unsigned long schid)
 
 	asm volatile(
 		"	csch\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc)
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc)
 		: "d" (reg1)
 		: "cc");
 	return cc;
@@ -245,9 +245,9 @@  static inline int rsch(unsigned long schid)
 
 	asm volatile(
 		"	rsch\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc)
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc)
 		: "d" (reg1)
 		: "cc");
 	return cc;
@@ -262,9 +262,9 @@  static inline int rchp(unsigned long chpid)
 	asm volatile(
 		"       tmll    %[bogus_cc],3\n"
 		"	rchp\n"
-		"	ipm	%0\n"
-		"	srl	%0,28"
-		: "=d" (cc)
+		"	ipm	%[cc]\n"
+		"	srl	%[cc],28"
+		: [cc] "=d" (cc)
 		: "d" (reg1), [bogus_cc] "d" (bogus_cc)
 		: "cc");
 	return cc;
@@ -369,9 +369,9 @@  static inline int _chsc(void *p)
 	int cc;
 
 	asm volatile(" .insn   rre,0xb25f0000,%2,0\n"
-		     " ipm     %0\n"
-		     " srl     %0,28\n"
-		     : "=d" (cc), "=m" (p)
+		     " ipm     %[cc]\n"
+		     " srl     %[cc],28\n"
+		     : [cc] "=d" (cc), "=m" (p)
 		     : "d" (p), "m" (p)
 		     : "cc");