diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2016-06-20 07:31:55 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-06-28 03:32:29 -0400 |
commit | 931641c639cea024d4462d79ad9716406bba7b19 (patch) | |
tree | ed985ee956f8cb7469ed44dcd45d4175eeaa3fe7 /arch/s390/mm | |
parent | db7f5eef3dc0866320a4a92c38c58d6fb8dfdd34 (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.c | 13 |
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 | ||
37 | void __init cmma_init(void) | 37 | static 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 | |||
51 | void __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 | ||