aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/mm
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2016-06-20 07:31:55 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-06-28 03:32:29 -0400
commit931641c639cea024d4462d79ad9716406bba7b19 (patch)
treeed985ee956f8cb7469ed44dcd45d4175eeaa3fe7 /arch/s390/mm
parentdb7f5eef3dc0866320a4a92c38c58d6fb8dfdd34 (diff)
s390/mm: use basic block for essa 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/mm')
-rw-r--r--arch/s390/mm/page-states.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/s390/mm/page-states.c b/arch/s390/mm/page-states.c
index a90d45e9dfb0..3330ea124eec 100644
--- a/arch/s390/mm/page-states.c
+++ b/arch/s390/mm/page-states.c
@@ -34,20 +34,25 @@ static int __init cmma(char *str)
34} 34}
35__setup("cmma=", cmma); 35__setup("cmma=", cmma);
36 36
37void __init cmma_init(void) 37static inline int cmma_test_essa(void)
38{ 38{
39 register unsigned long tmp asm("0") = 0; 39 register unsigned long tmp asm("0") = 0;
40 register int rc asm("1") = -EOPNOTSUPP; 40 register int rc asm("1") = -EOPNOTSUPP;
41 41
42 if (!cmma_flag)
43 return;
44 asm volatile( 42 asm volatile(
45 " .insn rrf,0xb9ab0000,%1,%1,0,0\n" 43 " .insn rrf,0xb9ab0000,%1,%1,0,0\n"
46 "0: la %0,0\n" 44 "0: la %0,0\n"
47 "1:\n" 45 "1:\n"
48 EX_TABLE(0b,1b) 46 EX_TABLE(0b,1b)
49 : "+&d" (rc), "+&d" (tmp)); 47 : "+&d" (rc), "+&d" (tmp));
50 if (rc) 48 return rc;
49}
50
51void __init cmma_init(void)
52{
53 if (!cmma_flag)
54 return;
55 if (cmma_test_essa())
51 cmma_flag = 0; 56 cmma_flag = 0;
52} 57}
53 58