s390/sysinfo: use basic block for stsi inline assembly
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 20 Jun 2016 12:05:54 +0000 (14:05 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 28 Jun 2016 07:32:36 +0000 (09:32 +0200)
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>
arch/s390/kernel/sysinfo.c

index 96d81502e599db25100af720ef4496952e7a0acd..050b8d067d3b6132c3f7ce798a6c059f8e01d17f 100644 (file)
 
 int topology_max_mnest;
 
-/*
- * stsi - store system information
- *
- * Returns the current configuration level if function code 0 was specified.
- * Otherwise returns 0 on success or a negative value on error.
- */
-int stsi(void *sysinfo, int fc, int sel1, int sel2)
+static inline int __stsi(void *sysinfo, int fc, int sel1, int sel2, int *lvl)
 {
        register int r0 asm("0") = (fc << 28) | sel1;
        register int r1 asm("1") = sel2;
@@ -41,9 +35,24 @@ int stsi(void *sysinfo, int fc, int sel1, int sel2)
                : "+d" (r0), "+d" (rc)
                : "d" (r1), "a" (sysinfo), "K" (-EOPNOTSUPP)
                : "cc", "memory");
+       *lvl = ((unsigned int) r0) >> 28;
+       return rc;
+}
+
+/*
+ * stsi - store system information
+ *
+ * Returns the current configuration level if function code 0 was specified.
+ * Otherwise returns 0 on success or a negative value on error.
+ */
+int stsi(void *sysinfo, int fc, int sel1, int sel2)
+{
+       int lvl, rc;
+
+       rc = __stsi(sysinfo, fc, sel1, sel2, &lvl);
        if (rc)
                return rc;
-       return fc ? 0 : ((unsigned int) r0) >> 28;
+       return fc ? 0 : lvl;
 }
 EXPORT_SYMBOL(stsi);