]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-powerpc/feature-fixups.h
lguest: virtio-rng support
[linux-2.6-omap-h63xx.git] / include / asm-powerpc / feature-fixups.h
index 85972125bbb89d44ac942ebe2f1ab4bd77538d2a..a1029967620be29003550a84fd12d3e78a13c4b7 100644 (file)
  * that values will be negative, that is, the fixup table has to be
  * located after the code it fixes up.
  */
-#ifdef CONFIG_PPC64
-
-#ifdef __powerpc64__
-
-/* 64 bits kernel, 64 bits code */
-#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect)  \
-99:                                                    \
-       .section sect,"a";                              \
-       .align 3;                                       \
-98:                                                    \
-       .llong msk;                                     \
-       .llong val;                                     \
-       .llong label##b-98b;                            \
-       .llong 99b-98b;                                 \
-       .previous
-
-#else /* __powerpc64__ */
-
+#if defined(CONFIG_PPC64) && !defined(__powerpc64__)
 /* 64 bits kernel, 32 bits code (ie. vdso32) */
-#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect)  \
-99:                                                    \
-       .section sect,"a";                              \
-       .align 3;                                       \
-98:                                                    \
-       .llong msk;                                     \
-       .llong val;                                     \
-       .long 0xffffffff;                               \
-       .long label##b-98b;                             \
-       .long 0xffffffff;                               \
-       .long 99b-98b;                                  \
-       .previous
+#define FTR_ENTRY_LONG         .llong
+#define FTR_ENTRY_OFFSET       .long 0xffffffff; .long
+#else
+/* 64 bit kernel 64 bit code, or 32 bit kernel 32 bit code */
+#define FTR_ENTRY_LONG         PPC_LONG
+#define FTR_ENTRY_OFFSET       PPC_LONG
+#endif
+
+#define START_FTR_SECTION(label)       label##1:
+
+#define FTR_SECTION_ELSE_NESTED(label)                 \
+label##2:                                              \
+       .pushsection __ftr_alt_##label,"a";             \
+       .align 2;                                       \
+label##3:
 
-#endif /* !__powerpc64__ */
-
-#else /* CONFIG_PPC64 */
-
-/* 32 bits kernel, 32 bits code */
 #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect)  \
-99:                                                    \
-       .section sect,"a";                              \
-       .align 2;                                       \
-98:                                                    \
-       .long msk;                                      \
-       .long val;                                      \
-       .long label##b-98b;                             \
-       .long 99b-98b;                                  \
-       .previous
-
-#endif /* !CONFIG_PPC64 */
+label##4:                                              \
+       .popsection;                                    \
+       .pushsection sect,"a";                          \
+       .align 3;                                       \
+label##5:                                              \
+       FTR_ENTRY_LONG msk;                             \
+       FTR_ENTRY_LONG val;                             \
+       FTR_ENTRY_OFFSET label##1b-label##5b;           \
+       FTR_ENTRY_OFFSET label##2b-label##5b;           \
+       FTR_ENTRY_OFFSET label##3b-label##5b;           \
+       FTR_ENTRY_OFFSET label##4b-label##5b;           \
+       .popsection;
 
 
 /* CPU feature dependent sections */
-#define BEGIN_FTR_SECTION_NESTED(label)        label:
-#define BEGIN_FTR_SECTION              BEGIN_FTR_SECTION_NESTED(97)
+#define BEGIN_FTR_SECTION_NESTED(label)        START_FTR_SECTION(label)
+#define BEGIN_FTR_SECTION              START_FTR_SECTION(97)
 
-#define END_FTR_SECTION_NESTED(msk, val, label) \
+#define END_FTR_SECTION_NESTED(msk, val, label)                \
+       FTR_SECTION_ELSE_NESTED(label)                          \
        MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
 
 #define END_FTR_SECTION(msk, val)              \
 #define END_FTR_SECTION_IFSET(msk)     END_FTR_SECTION((msk), (msk))
 #define END_FTR_SECTION_IFCLR(msk)     END_FTR_SECTION((msk), 0)
 
+/* CPU feature sections with alternatives, use BEGIN_FTR_SECTION to start */
+#define FTR_SECTION_ELSE       FTR_SECTION_ELSE_NESTED(97)
+#define ALT_FTR_SECTION_END_NESTED(msk, val, label)    \
+       MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
+#define ALT_FTR_SECTION_END_NESTED_IFSET(msk, label)   \
+       ALT_FTR_SECTION_END_NESTED(msk, msk, label)
+#define ALT_FTR_SECTION_END_NESTED_IFCLR(msk, label)   \
+       ALT_FTR_SECTION_END_NESTED(msk, 0, label)
+#define ALT_FTR_SECTION_END(msk, val)  \
+       ALT_FTR_SECTION_END_NESTED(msk, val, 97)
+#define ALT_FTR_SECTION_END_IFSET(msk) \
+       ALT_FTR_SECTION_END_NESTED_IFSET(msk, 97)
+#define ALT_FTR_SECTION_END_IFCLR(msk) \
+       ALT_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
 
 /* Firmware feature dependent sections */
-#define BEGIN_FW_FTR_SECTION_NESTED(label)     label:
-#define BEGIN_FW_FTR_SECTION                   BEGIN_FW_FTR_SECTION_NESTED(97)
+#define BEGIN_FW_FTR_SECTION_NESTED(label)     START_FTR_SECTION(label)
+#define BEGIN_FW_FTR_SECTION                   START_FTR_SECTION(97)
 
-#define END_FW_FTR_SECTION_NESTED(msk, val, label) \
+#define END_FW_FTR_SECTION_NESTED(msk, val, label)             \
+       FTR_SECTION_ELSE_NESTED(label)                          \
        MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
 
 #define END_FW_FTR_SECTION(msk, val)           \
 #define END_FW_FTR_SECTION_IFSET(msk)  END_FW_FTR_SECTION((msk), (msk))
 #define END_FW_FTR_SECTION_IFCLR(msk)  END_FW_FTR_SECTION((msk), 0)
 
+/* Firmware feature sections with alternatives */
+#define FW_FTR_SECTION_ELSE_NESTED(label)      FTR_SECTION_ELSE_NESTED(label)
+#define FW_FTR_SECTION_ELSE    FTR_SECTION_ELSE_NESTED(97)
+#define ALT_FW_FTR_SECTION_END_NESTED(msk, val, label) \
+       MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
+#define ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, label)        \
+       ALT_FW_FTR_SECTION_END_NESTED(msk, msk, label)
+#define ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, label)        \
+       ALT_FW_FTR_SECTION_END_NESTED(msk, 0, label)
+#define ALT_FW_FTR_SECTION_END(msk, val)       \
+       ALT_FW_FTR_SECTION_END_NESTED(msk, val, 97)
+#define ALT_FW_FTR_SECTION_END_IFSET(msk)      \
+       ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, 97)
+#define ALT_FW_FTR_SECTION_END_IFCLR(msk)      \
+       ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
+
 #endif /* __ASSEMBLY__ */
 
+/* LWSYNC feature sections */
+#define START_LWSYNC_SECTION(label)    label##1:
+#define MAKE_LWSYNC_SECTION_ENTRY(label, sect)         \
+label##2:                                              \
+       .pushsection sect,"a";                          \
+       .align 2;                                       \
+label##3:                                              \
+       .long label##1b-label##3b;                      \
+       .popsection;
+
 #endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */