Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.25-rc5 118 lines 3.3 kB view raw
1#ifndef _ASM_POWERPC_ASM_COMPAT_H 2#define _ASM_POWERPC_ASM_COMPAT_H 3 4#include <asm/types.h> 5 6#ifdef __ASSEMBLY__ 7# define stringify_in_c(...) __VA_ARGS__ 8# define ASM_CONST(x) x 9#else 10/* This version of stringify will deal with commas... */ 11# define __stringify_in_c(...) #__VA_ARGS__ 12# define stringify_in_c(...) __stringify_in_c(__VA_ARGS__) " " 13# define __ASM_CONST(x) x##UL 14# define ASM_CONST(x) __ASM_CONST(x) 15#endif 16 17 18/* 19 * Feature section common macros 20 * 21 * Note that the entries now contain offsets between the table entry 22 * and the code rather than absolute code pointers in order to be 23 * useable with the vdso shared library. There is also an assumption 24 * that values will be negative, that is, the fixup table has to be 25 * located after the code it fixes up. 26 */ 27#ifdef CONFIG_PPC64 28#ifdef __powerpc64__ 29/* 64 bits kernel, 64 bits code */ 30#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ 3199: \ 32 .section sect,"a"; \ 33 .align 3; \ 3498: \ 35 .llong msk; \ 36 .llong val; \ 37 .llong label##b-98b; \ 38 .llong 99b-98b; \ 39 .previous 40#else /* __powerpc64__ */ 41/* 64 bits kernel, 32 bits code (ie. vdso32) */ 42#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ 4399: \ 44 .section sect,"a"; \ 45 .align 3; \ 4698: \ 47 .llong msk; \ 48 .llong val; \ 49 .long 0xffffffff; \ 50 .long label##b-98b; \ 51 .long 0xffffffff; \ 52 .long 99b-98b; \ 53 .previous 54#endif /* !__powerpc64__ */ 55#else /* CONFIG_PPC64 */ 56/* 32 bits kernel, 32 bits code */ 57#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ 5899: \ 59 .section sect,"a"; \ 60 .align 2; \ 6198: \ 62 .long msk; \ 63 .long val; \ 64 .long label##b-98b; \ 65 .long 99b-98b; \ 66 .previous 67#endif /* !CONFIG_PPC64 */ 68 69#ifdef __powerpc64__ 70 71/* operations for longs and pointers */ 72#define PPC_LL stringify_in_c(ld) 73#define PPC_STL stringify_in_c(std) 74#define PPC_LCMPI stringify_in_c(cmpdi) 75#define PPC_LONG stringify_in_c(.llong) 76#define PPC_TLNEI stringify_in_c(tdnei) 77#define PPC_LLARX stringify_in_c(ldarx) 78#define PPC_STLCX stringify_in_c(stdcx.) 79#define PPC_CNTLZL stringify_in_c(cntlzd) 80 81/* Move to CR, single-entry optimized version. Only available 82 * on POWER4 and later. 83 */ 84#ifdef CONFIG_POWER4_ONLY 85#define PPC_MTOCRF stringify_in_c(mtocrf) 86#else 87#define PPC_MTOCRF stringify_in_c(mtcrf) 88#endif 89 90#else /* 32-bit */ 91 92/* operations for longs and pointers */ 93#define PPC_LL stringify_in_c(lwz) 94#define PPC_STL stringify_in_c(stw) 95#define PPC_LCMPI stringify_in_c(cmpwi) 96#define PPC_LONG stringify_in_c(.long) 97#define PPC_TLNEI stringify_in_c(twnei) 98#define PPC_LLARX stringify_in_c(lwarx) 99#define PPC_STLCX stringify_in_c(stwcx.) 100#define PPC_CNTLZL stringify_in_c(cntlzw) 101#define PPC_MTOCRF stringify_in_c(mtcrf) 102 103#endif 104 105#ifdef __KERNEL__ 106#ifdef CONFIG_IBM405_ERR77 107/* Erratum #77 on the 405 means we need a sync or dcbt before every 108 * stwcx. The old ATOMIC_SYNC_FIX covered some but not all of this. 109 */ 110#define PPC405_ERR77(ra,rb) stringify_in_c(dcbt ra, rb;) 111#define PPC405_ERR77_SYNC stringify_in_c(sync;) 112#else 113#define PPC405_ERR77(ra,rb) 114#define PPC405_ERR77_SYNC 115#endif 116#endif 117 118#endif /* _ASM_POWERPC_ASM_COMPAT_H */