Commit 49b290e4 authored by Heiko Stuebner's avatar Heiko Stuebner Committed by Palmer Dabbelt

riscv: prevent compressed instructions in alternatives

Instructions are opportunistically compressed by the RISC-V assembler
when possible, but in alternatives-blocks both the old and new content
need to be the same size, so having the toolchain do somewhat random
optimizations will cause strange side-effects like
"attempt to move .org backwards" compile-time errors.

Already a simple "and" used in alternatives assembly will cause these
mismatched code sizes.

So prevent compressed instructions to be generated in alternatives-
code and use option-push and -pop to only limit this to the relevant
code blocks
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarPhilipp Tomsich <philipp.tomsich@vrull.eu>
Link: https://lore.kernel.org/r/20220511192921.2223629-7-heiko@sntech.deSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent e509204a
...@@ -21,7 +21,11 @@ ...@@ -21,7 +21,11 @@
.popsection .popsection
.subsection 1 .subsection 1
888 : 888 :
.option push
.option norvc
.option norelax
\new_c \new_c
.option pop
889 : 889 :
.previous .previous
.org . - (889b - 888b) + (887b - 886b) .org . - (889b - 888b) + (887b - 886b)
...@@ -31,7 +35,11 @@ ...@@ -31,7 +35,11 @@
.macro __ALTERNATIVE_CFG old_c, new_c, vendor_id, errata_id, enable .macro __ALTERNATIVE_CFG old_c, new_c, vendor_id, errata_id, enable
886 : 886 :
.option push
.option norvc
.option norelax
\old_c \old_c
.option pop
887 : 887 :
ALT_NEW_CONTENT \vendor_id, \errata_id, \enable, \new_c ALT_NEW_CONTENT \vendor_id, \errata_id, \enable, \new_c
.endm .endm
...@@ -42,7 +50,11 @@ ...@@ -42,7 +50,11 @@
.macro __ALTERNATIVE_CFG_2 old_c, new_c_1, vendor_id_1, errata_id_1, enable_1, \ .macro __ALTERNATIVE_CFG_2 old_c, new_c_1, vendor_id_1, errata_id_1, enable_1, \
new_c_2, vendor_id_2, errata_id_2, enable_2 new_c_2, vendor_id_2, errata_id_2, enable_2
886 : 886 :
.option push
.option norvc
.option norelax
\old_c \old_c
.option pop
887 : 887 :
ALT_NEW_CONTENT \vendor_id_1, \errata_id_1, \enable_1, \new_c_1 ALT_NEW_CONTENT \vendor_id_1, \errata_id_1, \enable_1, \new_c_1
ALT_NEW_CONTENT \vendor_id_2, \errata_id_2, \enable_2, \new_c_2 ALT_NEW_CONTENT \vendor_id_2, \errata_id_2, \enable_2, \new_c_2
...@@ -76,7 +88,11 @@ ...@@ -76,7 +88,11 @@
".popsection\n" \ ".popsection\n" \
".subsection 1\n" \ ".subsection 1\n" \
"888 :\n" \ "888 :\n" \
".option push\n" \
".option norvc\n" \
".option norelax\n" \
new_c "\n" \ new_c "\n" \
".option pop\n" \
"889 :\n" \ "889 :\n" \
".previous\n" \ ".previous\n" \
".org . - (887b - 886b) + (889b - 888b)\n" \ ".org . - (887b - 886b) + (889b - 888b)\n" \
...@@ -85,7 +101,11 @@ ...@@ -85,7 +101,11 @@
#define __ALTERNATIVE_CFG(old_c, new_c, vendor_id, errata_id, enable) \ #define __ALTERNATIVE_CFG(old_c, new_c, vendor_id, errata_id, enable) \
"886 :\n" \ "886 :\n" \
".option push\n" \
".option norvc\n" \
".option norelax\n" \
old_c "\n" \ old_c "\n" \
".option pop\n" \
"887 :\n" \ "887 :\n" \
ALT_NEW_CONTENT(vendor_id, errata_id, enable, new_c) ALT_NEW_CONTENT(vendor_id, errata_id, enable, new_c)
...@@ -97,7 +117,11 @@ ...@@ -97,7 +117,11 @@
new_c_2, vendor_id_2, errata_id_2, \ new_c_2, vendor_id_2, errata_id_2, \
enable_2) \ enable_2) \
"886 :\n" \ "886 :\n" \
".option push\n" \
".option norvc\n" \
".option norelax\n" \
old_c "\n" \ old_c "\n" \
".option pop\n" \
"887 :\n" \ "887 :\n" \
ALT_NEW_CONTENT(vendor_id_1, errata_id_1, enable_1, new_c_1) \ ALT_NEW_CONTENT(vendor_id_1, errata_id_1, enable_1, new_c_1) \
ALT_NEW_CONTENT(vendor_id_2, errata_id_2, enable_2, new_c_2) ALT_NEW_CONTENT(vendor_id_2, errata_id_2, enable_2, new_c_2)
......
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