diff options
Diffstat (limited to 'include/asm-powerpc')
-rw-r--r-- | include/asm-powerpc/asm-compat.h | 52 | ||||
-rw-r--r-- | include/asm-powerpc/cputable.h | 31 | ||||
-rw-r--r-- | include/asm-powerpc/firmware.h | 15 | ||||
-rw-r--r-- | include/asm-powerpc/timex.h | 8 |
4 files changed, 67 insertions, 39 deletions
diff --git a/include/asm-powerpc/asm-compat.h b/include/asm-powerpc/asm-compat.h index 8e64be0cc47d..c89bd58ee283 100644 --- a/include/asm-powerpc/asm-compat.h +++ b/include/asm-powerpc/asm-compat.h | |||
@@ -14,6 +14,58 @@ | |||
14 | # define ASM_CONST(x) __ASM_CONST(x) | 14 | # define ASM_CONST(x) __ASM_CONST(x) |
15 | #endif | 15 | #endif |
16 | 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) \ | ||
31 | 99: \ | ||
32 | .section sect,"a"; \ | ||
33 | .align 3; \ | ||
34 | 98: \ | ||
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) \ | ||
43 | 99: \ | ||
44 | .section sect,"a"; \ | ||
45 | .align 3; \ | ||
46 | 98: \ | ||
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) \ | ||
58 | 99: \ | ||
59 | .section sect,"a"; \ | ||
60 | .align 2; \ | ||
61 | 98: \ | ||
62 | .long msk; \ | ||
63 | .long val; \ | ||
64 | .long label##b-98b; \ | ||
65 | .long 99b-98b; \ | ||
66 | .previous | ||
67 | #endif /* !CONFIG_PPC64 */ | ||
68 | |||
17 | #ifdef __powerpc64__ | 69 | #ifdef __powerpc64__ |
18 | 70 | ||
19 | /* operations for longs and pointers */ | 71 | /* operations for longs and pointers */ |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 65faf322ace0..02e52d68cbbe 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
@@ -92,8 +92,8 @@ extern struct cpu_spec *cur_cpu_spec; | |||
92 | extern unsigned int __start___ftr_fixup, __stop___ftr_fixup; | 92 | extern unsigned int __start___ftr_fixup, __stop___ftr_fixup; |
93 | 93 | ||
94 | extern struct cpu_spec *identify_cpu(unsigned long offset); | 94 | extern struct cpu_spec *identify_cpu(unsigned long offset); |
95 | extern void do_feature_fixups(unsigned long offset, unsigned long value, | 95 | extern void do_feature_fixups(unsigned long value, void *fixup_start, |
96 | void *fixup_start, void *fixup_end); | 96 | void *fixup_end); |
97 | 97 | ||
98 | #endif /* __ASSEMBLY__ */ | 98 | #endif /* __ASSEMBLY__ */ |
99 | 99 | ||
@@ -435,32 +435,11 @@ static inline int cpu_has_feature(unsigned long feature) | |||
435 | #ifdef __ASSEMBLY__ | 435 | #ifdef __ASSEMBLY__ |
436 | 436 | ||
437 | #define BEGIN_FTR_SECTION_NESTED(label) label: | 437 | #define BEGIN_FTR_SECTION_NESTED(label) label: |
438 | #define BEGIN_FTR_SECTION BEGIN_FTR_SECTION_NESTED(98) | 438 | #define BEGIN_FTR_SECTION BEGIN_FTR_SECTION_NESTED(97) |
439 | |||
440 | #ifndef __powerpc64__ | ||
441 | #define END_FTR_SECTION_NESTED(msk, val, label) \ | ||
442 | 99: \ | ||
443 | .section __ftr_fixup,"a"; \ | ||
444 | .align 2; \ | ||
445 | .long msk; \ | ||
446 | .long val; \ | ||
447 | .long label##b; \ | ||
448 | .long 99b; \ | ||
449 | .previous | ||
450 | #else /* __powerpc64__ */ | ||
451 | #define END_FTR_SECTION_NESTED(msk, val, label) \ | 439 | #define END_FTR_SECTION_NESTED(msk, val, label) \ |
452 | 99: \ | 440 | MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup) |
453 | .section __ftr_fixup,"a"; \ | ||
454 | .align 3; \ | ||
455 | .llong msk; \ | ||
456 | .llong val; \ | ||
457 | .llong label##b; \ | ||
458 | .llong 99b; \ | ||
459 | .previous | ||
460 | #endif /* __powerpc64__ */ | ||
461 | |||
462 | #define END_FTR_SECTION(msk, val) \ | 441 | #define END_FTR_SECTION(msk, val) \ |
463 | END_FTR_SECTION_NESTED(msk, val, 98) | 442 | END_FTR_SECTION_NESTED(msk, val, 97) |
464 | 443 | ||
465 | #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) | 444 | #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) |
466 | #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) | 445 | #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) |
diff --git a/include/asm-powerpc/firmware.h b/include/asm-powerpc/firmware.h index c16e0a6b9dab..fdf9aff71150 100644 --- a/include/asm-powerpc/firmware.h +++ b/include/asm-powerpc/firmware.h | |||
@@ -100,17 +100,12 @@ extern unsigned int __start___fw_ftr_fixup, __stop___fw_ftr_fixup; | |||
100 | 100 | ||
101 | #else /* __ASSEMBLY__ */ | 101 | #else /* __ASSEMBLY__ */ |
102 | 102 | ||
103 | #define BEGIN_FW_FTR_SECTION 96: | 103 | #define BEGIN_FW_FTR_SECTION_NESTED(label) label: |
104 | 104 | #define BEGIN_FW_FTR_SECTION BEGIN_FW_FTR_SECTION_NESTED(97) | |
105 | #define END_FW_FTR_SECTION_NESTED(msk, val, label) \ | ||
106 | MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup) | ||
105 | #define END_FW_FTR_SECTION(msk, val) \ | 107 | #define END_FW_FTR_SECTION(msk, val) \ |
106 | 97: \ | 108 | END_FW_FTR_SECTION_NESTED(msk, val, 97) |
107 | .section __fw_ftr_fixup,"a"; \ | ||
108 | .align 3; \ | ||
109 | .llong msk; \ | ||
110 | .llong val; \ | ||
111 | .llong 96b; \ | ||
112 | .llong 97b; \ | ||
113 | .previous | ||
114 | 109 | ||
115 | #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) | 110 | #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) |
116 | #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) | 111 | #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) |
diff --git a/include/asm-powerpc/timex.h b/include/asm-powerpc/timex.h index 3b9a8e786806..e3f08cf91486 100644 --- a/include/asm-powerpc/timex.h +++ b/include/asm-powerpc/timex.h | |||
@@ -30,13 +30,15 @@ static inline cycles_t get_cycles(void) | |||
30 | ret = 0; | 30 | ret = 0; |
31 | 31 | ||
32 | __asm__ __volatile__( | 32 | __asm__ __volatile__( |
33 | "98: mftb %0\n" | 33 | "97: mftb %0\n" |
34 | "99:\n" | 34 | "99:\n" |
35 | ".section __ftr_fixup,\"a\"\n" | 35 | ".section __ftr_fixup,\"a\"\n" |
36 | ".align 2\n" | ||
37 | "98:\n" | ||
36 | " .long %1\n" | 38 | " .long %1\n" |
37 | " .long 0\n" | 39 | " .long 0\n" |
38 | " .long 98b\n" | 40 | " .long 97b-98b\n" |
39 | " .long 99b\n" | 41 | " .long 99b-98b\n" |
40 | ".previous" | 42 | ".previous" |
41 | : "=r" (ret) : "i" (CPU_FTR_601)); | 43 | : "=r" (ret) : "i" (CPU_FTR_601)); |
42 | #endif | 44 | #endif |