summaryrefslogtreecommitdiffstats
path: root/arch/s390/hypfs
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2016-06-20 14:06:09 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-06-28 09:32:37 +0200
commite030c1125eab9eb822a7a271ed233a77ebfa2629 (patch)
treee179606da5fae5b0beb82dd07ef9062d1b1aa281 /arch/s390/hypfs
parent2c79813a1f459dd702f9b324a96b0849dd02a6a4 (diff)
downloadlinux-stable-e030c1125eab9eb822a7a271ed233a77ebfa2629.tar.gz
linux-stable-e030c1125eab9eb822a7a271ed233a77ebfa2629.tar.bz2
linux-stable-e030c1125eab9eb822a7a271ed233a77ebfa2629.zip
s390/hypfs: use basic block for diag inline assembly
Use only simple inline assemblies which consist of a single basic block if the register asm construct is being used. Otherwise gcc would generate broken code if the compiler option --sanitize-coverage=trace-pc would be used. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/hypfs')
-rw-r--r--arch/s390/hypfs/hypfs_diag.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/s390/hypfs/hypfs_diag.c b/arch/s390/hypfs/hypfs_diag.c
index 27779f0743ac..67d43a0eabb4 100644
--- a/arch/s390/hypfs/hypfs_diag.c
+++ b/arch/s390/hypfs/hypfs_diag.c
@@ -337,9 +337,9 @@ static inline __u64 phys_cpu__ctidx(enum diag204_format type, void *hdr)
/* Diagnose 204 functions */
-static inline int __diag204(unsigned long subcode, unsigned long size, void *addr)
+static inline int __diag204(unsigned long *subcode, unsigned long size, void *addr)
{
- register unsigned long _subcode asm("0") = subcode;
+ register unsigned long _subcode asm("0") = *subcode;
register unsigned long _size asm("1") = size;
asm volatile(
@@ -347,15 +347,17 @@ static inline int __diag204(unsigned long subcode, unsigned long size, void *add
"0: nopr %%r7\n"
EX_TABLE(0b,0b)
: "+d" (_subcode), "+d" (_size) : "d" (addr) : "memory");
- if (_subcode)
- return -1;
+ *subcode = _subcode;
return _size;
}
static int diag204(unsigned long subcode, unsigned long size, void *addr)
{
diag_stat_inc(DIAG_STAT_X204);
- return __diag204(subcode, size, addr);
+ size = __diag204(&subcode, size, addr);
+ if (subcode)
+ return -1;
+ return size;
}
/*