Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b57838ea authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

[S390] Fix __ctl_load/__ctl_store inline assembly constraints



__ctl_load/__ctl_store are called with either an array of unsigned long or
a single unsigned long value. Add an address operator to the "m"/"=m"
contraints to make them work for unsigned long arguments as well.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 24d3e210
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -315,14 +315,14 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
	asm volatile(						\
		"	lctlg	%1,%2,0(%0)\n"			\
		: : "a" (&array), "i" (low), "i" (high),	\
		    "m" (*(addrtype *)(array)));		\
		    "m" (*(addrtype *)(&array)));		\
	})

#define __ctl_store(array, low, high) ({			\
	typedef struct { char _[sizeof(array)]; } addrtype;	\
	asm volatile(						\
		"	stctg	%2,%3,0(%1)\n"			\
		: "=m" (*(addrtype *)(array))			\
		: "=m" (*(addrtype *)(&array))			\
		: "a" (&array), "i" (low), "i" (high));		\
	})

@@ -333,14 +333,14 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
	asm volatile(						\
		"	lctl	%1,%2,0(%0)\n"			\
		: : "a" (&array), "i" (low), "i" (high),	\
		    "m" (*(addrtype *)(array)));		\
		    "m" (*(addrtype *)(&array)));		\
})

#define __ctl_store(array, low, high) ({			\
	typedef struct { char _[sizeof(array)]; } addrtype;	\
	asm volatile(						\
		"	stctl	%2,%3,0(%1)\n"			\
		: "=m" (*(addrtype *)(array))			\
		: "=m" (*(addrtype *)(&array))			\
		: "a" (&array), "i" (low), "i" (high));		\
	})