Commit 14644852 authored by Ilya Leoshkevich's avatar Ilya Leoshkevich Committed by Martin Schwidefsky

s390/jump_label: Use "jdd" constraint on gcc9

[heiko.carstens@de.ibm.com]:
-----
Laura Abbott reported that the kernel doesn't build anymore with gcc 9,
due to the "X" constraint. Ilya provided the gcc 9 patch "S/390:
Introduce jdd constraint" which introduces the new "jdd" constraint
which fixes this.
-----

The support for section anchors on S/390 introduced in gcc9 has changed
the behavior of "X" constraint, which can now produce register
references. Since existing constraints, in particular, "i", do not fit
the intended use case on S/390, the new machine-specific "jdd"
constraint was introduced. This patch makes jump labels use "jdd"
constraint when building with gcc9.
Reported-by: default avatarLaura Abbott <labbott@redhat.com>
Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent b1af7528
...@@ -10,6 +10,12 @@ ...@@ -10,6 +10,12 @@
#define JUMP_LABEL_NOP_SIZE 6 #define JUMP_LABEL_NOP_SIZE 6
#define JUMP_LABEL_NOP_OFFSET 2 #define JUMP_LABEL_NOP_OFFSET 2
#if __GNUC__ < 9
#define JUMP_LABEL_STATIC_KEY_CONSTRAINT "X"
#else
#define JUMP_LABEL_STATIC_KEY_CONSTRAINT "jdd"
#endif
/* /*
* We use a brcl 0,2 instruction for jump labels at compile time so it * We use a brcl 0,2 instruction for jump labels at compile time so it
* can be easily distinguished from a hotpatch generated instruction. * can be easily distinguished from a hotpatch generated instruction.
...@@ -20,9 +26,9 @@ static inline bool arch_static_branch(struct static_key *key, bool branch) ...@@ -20,9 +26,9 @@ static inline bool arch_static_branch(struct static_key *key, bool branch)
".pushsection __jump_table,\"aw\"\n" ".pushsection __jump_table,\"aw\"\n"
".balign 8\n" ".balign 8\n"
".long 0b-.,%l[label]-.\n" ".long 0b-.,%l[label]-.\n"
".quad %0-.\n" ".quad %0+%1-.\n"
".popsection\n" ".popsection\n"
: : "X" (&((char *)key)[branch]) : : label); : : JUMP_LABEL_STATIC_KEY_CONSTRAINT (key), "i" (branch) : : label);
return false; return false;
label: label:
return true; return true;
...@@ -34,9 +40,9 @@ static inline bool arch_static_branch_jump(struct static_key *key, bool branch) ...@@ -34,9 +40,9 @@ static inline bool arch_static_branch_jump(struct static_key *key, bool branch)
".pushsection __jump_table,\"aw\"\n" ".pushsection __jump_table,\"aw\"\n"
".balign 8\n" ".balign 8\n"
".long 0b-.,%l[label]-.\n" ".long 0b-.,%l[label]-.\n"
".quad %0-.\n" ".quad %0+%1-.\n"
".popsection\n" ".popsection\n"
: : "X" (&((char *)key)[branch]) : : label); : : JUMP_LABEL_STATIC_KEY_CONSTRAINT (key), "i" (branch) : : label);
return false; return false;
label: label:
return true; return true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment