]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
s390/smp: use basic blocks for sigp inline assemblies
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 20 Jun 2016 12:04:17 +0000 (14:04 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 28 Jun 2016 07:32:35 +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/include/asm/sigp.h
arch/s390/kernel/smp.c

index 1c8f33fca356ebae01ad04271f2f4f7d54278903..72df5f2de6b0b71f98cb0ffe1d18c8b8d38836f4 100644 (file)
@@ -37,8 +37,8 @@
 
 #ifndef __ASSEMBLY__
 
-static inline int __pcpu_sigp(u16 addr, u8 order, unsigned long parm,
-                             u32 *status)
+static inline int ____pcpu_sigp(u16 addr, u8 order, unsigned long parm,
+                               u32 *status)
 {
        register unsigned long reg1 asm ("1") = parm;
        int cc;
@@ -48,8 +48,19 @@ static inline int __pcpu_sigp(u16 addr, u8 order, unsigned long parm,
                "       ipm     %0\n"
                "       srl     %0,28\n"
                : "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc");
+       *status = reg1;
+       return cc;
+}
+
+static inline int __pcpu_sigp(u16 addr, u8 order, unsigned long parm,
+                             u32 *status)
+{
+       u32 _status;
+       int cc;
+
+       cc = ____pcpu_sigp(addr, order, parm, &_status);
        if (status && cc == 1)
-               *status = reg1;
+               *status = _status;
        return cc;
 }
 
index 830537432493421f7050e8c0321374aa4858ef4a..5c8f7caf9f31e42d7adeb5261d03ad69bcbeb583 100644 (file)
@@ -318,17 +318,11 @@ static void pcpu_delegate(struct pcpu *pcpu, void (*func)(void *),
  */
 static int pcpu_set_smt(unsigned int mtid)
 {
-       register unsigned long reg1 asm ("1") = (unsigned long) mtid;
        int cc;
 
        if (smp_cpu_mtid == mtid)
                return 0;
-       asm volatile(
-               "       sigp    %1,0,%2 # sigp set multi-threading\n"
-               "       ipm     %0\n"
-               "       srl     %0,28\n"
-               : "=d" (cc) : "d" (reg1), "K" (SIGP_SET_MULTI_THREADING)
-               : "cc");
+       cc = __pcpu_sigp(0, SIGP_SET_MULTI_THREADING, mtid, NULL);
        if (cc == 0) {
                smp_cpu_mtid = mtid;
                smp_cpu_mt_shift = 0;