x86, alternative: Use .pushsection/.popsection
authorH. Peter Anvin <hpa@linux.intel.com>
Fri, 21 Sep 2012 19:43:08 +0000 (12:43 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Fri, 21 Sep 2012 19:45:25 +0000 (12:45 -0700)
.section/.previous doesn't nest.  Use .pushsection/.popsection in
<asm/alternative.h> so that they can be properly nested.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Link: http://lkml.kernel.org/r/1348256595-29119-5-git-send-email-hpa@linux.intel.com
arch/x86/include/asm/alternative-asm.h
arch/x86/include/asm/alternative.h

index 952bd0100c5c050289baff430ab0e4e30f56e0fc..018d29fe634a928c9e4a74fecd3824da3163a8f1 100644 (file)
@@ -5,10 +5,10 @@
 #ifdef CONFIG_SMP
        .macro LOCK_PREFIX
 672:   lock
-       .section .smp_locks,"a"
+       .pushsection .smp_locks,"a"
        .balign 4
        .long 672b - .
-       .previous
+       .popsection
        .endm
 #else
        .macro LOCK_PREFIX
index 70780689599acf830b322be2cad0f835ac2bac03..87bc00d4efe94ff2ec85725dbab1cabe3f362b97 100644 (file)
 
 #ifdef CONFIG_SMP
 #define LOCK_PREFIX_HERE \
-               ".section .smp_locks,\"a\"\n"   \
-               ".balign 4\n"                   \
-               ".long 671f - .\n" /* offset */ \
-               ".previous\n"                   \
+               ".pushsection .smp_locks,\"a\"\n"       \
+               ".balign 4\n"                           \
+               ".long 671f - .\n" /* offset */         \
+               ".popsection\n"                         \
                "671:"
 
 #define LOCK_PREFIX LOCK_PREFIX_HERE "\n\tlock; "
@@ -99,30 +99,30 @@ static inline int alternatives_text_reserved(void *start, void *end)
 /* alternative assembly primitive: */
 #define ALTERNATIVE(oldinstr, newinstr, feature)                       \
        OLDINSTR(oldinstr)                                              \
-       ".section .altinstructions,\"a\"\n"                             \
+       ".pushsection .altinstructions,\"a\"\n"                         \
        ALTINSTR_ENTRY(feature, 1)                                      \
-       ".previous\n"                                                   \
-       ".section .discard,\"aw\",@progbits\n"                          \
+       ".popsection\n"                                                 \
+       ".pushsection .discard,\"aw\",@progbits\n"                      \
        DISCARD_ENTRY(1)                                                \
-       ".previous\n"                                                   \
-       ".section .altinstr_replacement, \"ax\"\n"                      \
+       ".popsection\n"                                                 \
+       ".pushsection .altinstr_replacement, \"ax\"\n"                  \
        ALTINSTR_REPLACEMENT(newinstr, feature, 1)                      \
-       ".previous"
+       ".popsection"
 
 #define ALTERNATIVE_2(oldinstr, newinstr1, feature1, newinstr2, feature2)\
        OLDINSTR(oldinstr)                                              \
-       ".section .altinstructions,\"a\"\n"                             \
+       ".pushsection .altinstructions,\"a\"\n"                         \
        ALTINSTR_ENTRY(feature1, 1)                                     \
        ALTINSTR_ENTRY(feature2, 2)                                     \
-       ".previous\n"                                                   \
-       ".section .discard,\"aw\",@progbits\n"                          \
+       ".popsection\n"                                                 \
+       ".pushsection .discard,\"aw\",@progbits\n"                      \
        DISCARD_ENTRY(1)                                                \
        DISCARD_ENTRY(2)                                                \
-       ".previous\n"                                                   \
-       ".section .altinstr_replacement, \"ax\"\n"                      \
+       ".popsection\n"                                                 \
+       ".pushsection .altinstr_replacement, \"ax\"\n"                  \
        ALTINSTR_REPLACEMENT(newinstr1, feature1, 1)                    \
        ALTINSTR_REPLACEMENT(newinstr2, feature2, 2)                    \
-       ".previous"
+       ".popsection"
 
 /*
  * This must be included *after* the definition of ALTERNATIVE due to