diff options
Diffstat (limited to 'arch/powerpc/include')
| -rw-r--r-- | arch/powerpc/include/asm/elf.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/hvcall.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/pgalloc-32.h | 6 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/pgalloc-64.h | 7 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/plpar_wrappers.h | 26 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/ppc_asm.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/reg.h | 7 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/smp.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/thread_info.h | 9 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/timex.h | 8 |
10 files changed, 64 insertions, 9 deletions
diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index cc0655a702a7..935b5e7a1436 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | extern unsigned long randomize_et_dyn(unsigned long base); | 31 | extern unsigned long randomize_et_dyn(unsigned long base); |
| 32 | #define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000)) | 32 | #define ELF_ET_DYN_BASE (randomize_et_dyn(0x20000000)) |
| 33 | 33 | ||
| 34 | #define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0) | ||
| 35 | |||
| 34 | /* | 36 | /* |
| 35 | * Our registers are always unsigned longs, whether we're a 32 bit | 37 | * Our registers are always unsigned longs, whether we're a 32 bit |
| 36 | * process or 64 bit, on either a 64 bit or 32 bit kernel. | 38 | * process or 64 bit, on either a 64 bit or 32 bit kernel. |
| @@ -86,6 +88,8 @@ typedef elf_vrregset_t elf_fpxregset_t; | |||
| 86 | #ifdef __powerpc64__ | 88 | #ifdef __powerpc64__ |
| 87 | # define SET_PERSONALITY(ex) \ | 89 | # define SET_PERSONALITY(ex) \ |
| 88 | do { \ | 90 | do { \ |
| 91 | if (((ex).e_flags & 0x3) == 2) \ | ||
| 92 | set_thread_flag(TIF_ELF2ABI); \ | ||
| 89 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ | 93 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ |
| 90 | set_thread_flag(TIF_32BIT); \ | 94 | set_thread_flag(TIF_32BIT); \ |
| 91 | else \ | 95 | else \ |
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index 0c7f2bfcf134..d8b600b3f058 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
| @@ -403,6 +403,8 @@ static inline unsigned long cmo_get_page_size(void) | |||
| 403 | extern long pSeries_enable_reloc_on_exc(void); | 403 | extern long pSeries_enable_reloc_on_exc(void); |
| 404 | extern long pSeries_disable_reloc_on_exc(void); | 404 | extern long pSeries_disable_reloc_on_exc(void); |
| 405 | 405 | ||
| 406 | extern long pseries_big_endian_exceptions(void); | ||
| 407 | |||
| 406 | #else | 408 | #else |
| 407 | 409 | ||
| 408 | #define pSeries_enable_reloc_on_exc() do {} while (0) | 410 | #define pSeries_enable_reloc_on_exc() do {} while (0) |
diff --git a/arch/powerpc/include/asm/pgalloc-32.h b/arch/powerpc/include/asm/pgalloc-32.h index 27b2386f738a..842846c1b711 100644 --- a/arch/powerpc/include/asm/pgalloc-32.h +++ b/arch/powerpc/include/asm/pgalloc-32.h | |||
| @@ -84,10 +84,8 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, | |||
| 84 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, | 84 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, |
| 85 | unsigned long address) | 85 | unsigned long address) |
| 86 | { | 86 | { |
| 87 | struct page *page = page_address(table); | ||
| 88 | |||
| 89 | tlb_flush_pgtable(tlb, address); | 87 | tlb_flush_pgtable(tlb, address); |
| 90 | pgtable_page_dtor(page); | 88 | pgtable_page_dtor(table); |
| 91 | pgtable_free_tlb(tlb, page, 0); | 89 | pgtable_free_tlb(tlb, page_address(table), 0); |
| 92 | } | 90 | } |
| 93 | #endif /* _ASM_POWERPC_PGALLOC_32_H */ | 91 | #endif /* _ASM_POWERPC_PGALLOC_32_H */ |
diff --git a/arch/powerpc/include/asm/pgalloc-64.h b/arch/powerpc/include/asm/pgalloc-64.h index 16cb92d215d2..4b0be20fcbfd 100644 --- a/arch/powerpc/include/asm/pgalloc-64.h +++ b/arch/powerpc/include/asm/pgalloc-64.h | |||
| @@ -16,6 +16,7 @@ struct vmemmap_backing { | |||
| 16 | unsigned long phys; | 16 | unsigned long phys; |
| 17 | unsigned long virt_addr; | 17 | unsigned long virt_addr; |
| 18 | }; | 18 | }; |
| 19 | extern struct vmemmap_backing *vmemmap_list; | ||
| 19 | 20 | ||
| 20 | /* | 21 | /* |
| 21 | * Functions that deal with pagetables that could be at any level of | 22 | * Functions that deal with pagetables that could be at any level of |
| @@ -147,11 +148,9 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, | |||
| 147 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, | 148 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, |
| 148 | unsigned long address) | 149 | unsigned long address) |
| 149 | { | 150 | { |
| 150 | struct page *page = page_address(table); | ||
| 151 | |||
| 152 | tlb_flush_pgtable(tlb, address); | 151 | tlb_flush_pgtable(tlb, address); |
| 153 | pgtable_page_dtor(page); | 152 | pgtable_page_dtor(table); |
| 154 | pgtable_free_tlb(tlb, page, 0); | 153 | pgtable_free_tlb(tlb, page_address(table), 0); |
| 155 | } | 154 | } |
| 156 | 155 | ||
| 157 | #else /* if CONFIG_PPC_64K_PAGES */ | 156 | #else /* if CONFIG_PPC_64K_PAGES */ |
diff --git a/arch/powerpc/include/asm/plpar_wrappers.h b/arch/powerpc/include/asm/plpar_wrappers.h index a63b045e707c..12c32c5f533d 100644 --- a/arch/powerpc/include/asm/plpar_wrappers.h +++ b/arch/powerpc/include/asm/plpar_wrappers.h | |||
| @@ -287,6 +287,32 @@ static inline long disable_reloc_on_exceptions(void) { | |||
| 287 | return plpar_set_mode(0, 3, 0, 0); | 287 | return plpar_set_mode(0, 3, 0, 0); |
| 288 | } | 288 | } |
| 289 | 289 | ||
| 290 | /* | ||
| 291 | * Take exceptions in big endian mode on this partition | ||
| 292 | * | ||
| 293 | * Note: this call has a partition wide scope and can take a while to complete. | ||
| 294 | * If it returns H_LONG_BUSY_* it should be retried periodically until it | ||
| 295 | * returns H_SUCCESS. | ||
| 296 | */ | ||
| 297 | static inline long enable_big_endian_exceptions(void) | ||
| 298 | { | ||
| 299 | /* mflags = 0: big endian exceptions */ | ||
| 300 | return plpar_set_mode(0, 4, 0, 0); | ||
| 301 | } | ||
| 302 | |||
| 303 | /* | ||
| 304 | * Take exceptions in little endian mode on this partition | ||
| 305 | * | ||
| 306 | * Note: this call has a partition wide scope and can take a while to complete. | ||
| 307 | * If it returns H_LONG_BUSY_* it should be retried periodically until it | ||
| 308 | * returns H_SUCCESS. | ||
| 309 | */ | ||
| 310 | static inline long enable_little_endian_exceptions(void) | ||
| 311 | { | ||
| 312 | /* mflags = 1: little endian exceptions */ | ||
| 313 | return plpar_set_mode(1, 4, 0, 0); | ||
| 314 | } | ||
| 315 | |||
| 290 | static inline long plapr_set_ciabr(unsigned long ciabr) | 316 | static inline long plapr_set_ciabr(unsigned long ciabr) |
| 291 | { | 317 | { |
| 292 | return plpar_set_mode(0, 1, ciabr, 0); | 318 | return plpar_set_mode(0, 1, ciabr, 0); |
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 3c1acc31a092..f595b98079ee 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
| @@ -366,6 +366,8 @@ BEGIN_FTR_SECTION_NESTED(96); \ | |||
| 366 | cmpwi dest,0; \ | 366 | cmpwi dest,0; \ |
| 367 | beq- 90b; \ | 367 | beq- 90b; \ |
| 368 | END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) | 368 | END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) |
| 369 | #elif defined(CONFIG_8xx) | ||
| 370 | #define MFTB(dest) mftb dest | ||
| 369 | #else | 371 | #else |
| 370 | #define MFTB(dest) mfspr dest, SPRN_TBRL | 372 | #define MFTB(dest) mfspr dest, SPRN_TBRL |
| 371 | #endif | 373 | #endif |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 5c45787d551e..fa8388ed94c5 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
| @@ -1174,12 +1174,19 @@ | |||
| 1174 | 1174 | ||
| 1175 | #else /* __powerpc64__ */ | 1175 | #else /* __powerpc64__ */ |
| 1176 | 1176 | ||
| 1177 | #if defined(CONFIG_8xx) | ||
| 1178 | #define mftbl() ({unsigned long rval; \ | ||
| 1179 | asm volatile("mftbl %0" : "=r" (rval)); rval;}) | ||
| 1180 | #define mftbu() ({unsigned long rval; \ | ||
| 1181 | asm volatile("mftbu %0" : "=r" (rval)); rval;}) | ||
| 1182 | #else | ||
| 1177 | #define mftbl() ({unsigned long rval; \ | 1183 | #define mftbl() ({unsigned long rval; \ |
| 1178 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ | 1184 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ |
| 1179 | "i" (SPRN_TBRL)); rval;}) | 1185 | "i" (SPRN_TBRL)); rval;}) |
| 1180 | #define mftbu() ({unsigned long rval; \ | 1186 | #define mftbu() ({unsigned long rval; \ |
| 1181 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ | 1187 | asm volatile("mfspr %0, %1" : "=r" (rval) : \ |
| 1182 | "i" (SPRN_TBRU)); rval;}) | 1188 | "i" (SPRN_TBRU)); rval;}) |
| 1189 | #endif | ||
| 1183 | #endif /* !__powerpc64__ */ | 1190 | #endif /* !__powerpc64__ */ |
| 1184 | 1191 | ||
| 1185 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) | 1192 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) |
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 98da78e0c2c0..084e0807db98 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h | |||
| @@ -33,6 +33,7 @@ extern int boot_cpuid; | |||
| 33 | extern int spinning_secondaries; | 33 | extern int spinning_secondaries; |
| 34 | 34 | ||
| 35 | extern void cpu_die(void); | 35 | extern void cpu_die(void); |
| 36 | extern int cpu_to_chip_id(int cpu); | ||
| 36 | 37 | ||
| 37 | #ifdef CONFIG_SMP | 38 | #ifdef CONFIG_SMP |
| 38 | 39 | ||
| @@ -112,7 +113,6 @@ static inline struct cpumask *cpu_core_mask(int cpu) | |||
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | extern int cpu_to_core_id(int cpu); | 115 | extern int cpu_to_core_id(int cpu); |
| 115 | extern int cpu_to_chip_id(int cpu); | ||
| 116 | 116 | ||
| 117 | /* Since OpenPIC has only 4 IPIs, we use slightly different message numbers. | 117 | /* Since OpenPIC has only 4 IPIs, we use slightly different message numbers. |
| 118 | * | 118 | * |
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 8fd6cf6dcee8..9854c564ac52 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
| @@ -105,6 +105,9 @@ static inline struct thread_info *current_thread_info(void) | |||
| 105 | #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation | 105 | #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation |
| 106 | for stack store? */ | 106 | for stack store? */ |
| 107 | #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ | 107 | #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ |
| 108 | #if defined(CONFIG_PPC64) | ||
| 109 | #define TIF_ELF2ABI 18 /* function descriptors must die! */ | ||
| 110 | #endif | ||
| 108 | 111 | ||
| 109 | /* as above, but as bit values */ | 112 | /* as above, but as bit values */ |
| 110 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 113 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
| @@ -183,6 +186,12 @@ static inline bool test_thread_local_flags(unsigned int flags) | |||
| 183 | #define is_32bit_task() (1) | 186 | #define is_32bit_task() (1) |
| 184 | #endif | 187 | #endif |
| 185 | 188 | ||
| 189 | #if defined(CONFIG_PPC64) | ||
| 190 | #define is_elf2_task() (test_thread_flag(TIF_ELF2ABI)) | ||
| 191 | #else | ||
| 192 | #define is_elf2_task() (0) | ||
| 193 | #endif | ||
| 194 | |||
| 186 | #endif /* !__ASSEMBLY__ */ | 195 | #endif /* !__ASSEMBLY__ */ |
| 187 | 196 | ||
| 188 | #endif /* __KERNEL__ */ | 197 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/timex.h b/arch/powerpc/include/asm/timex.h index 18908caa1f3b..2cf846edb3fc 100644 --- a/arch/powerpc/include/asm/timex.h +++ b/arch/powerpc/include/asm/timex.h | |||
| @@ -29,7 +29,11 @@ static inline cycles_t get_cycles(void) | |||
| 29 | ret = 0; | 29 | ret = 0; |
| 30 | 30 | ||
| 31 | __asm__ __volatile__( | 31 | __asm__ __volatile__( |
| 32 | #ifdef CONFIG_8xx | ||
| 33 | "97: mftb %0\n" | ||
| 34 | #else | ||
| 32 | "97: mfspr %0, %2\n" | 35 | "97: mfspr %0, %2\n" |
| 36 | #endif | ||
| 33 | "99:\n" | 37 | "99:\n" |
| 34 | ".section __ftr_fixup,\"a\"\n" | 38 | ".section __ftr_fixup,\"a\"\n" |
| 35 | ".align 2\n" | 39 | ".align 2\n" |
| @@ -41,7 +45,11 @@ static inline cycles_t get_cycles(void) | |||
| 41 | " .long 0\n" | 45 | " .long 0\n" |
| 42 | " .long 0\n" | 46 | " .long 0\n" |
| 43 | ".previous" | 47 | ".previous" |
| 48 | #ifdef CONFIG_8xx | ||
| 49 | : "=r" (ret) : "i" (CPU_FTR_601)); | ||
| 50 | #else | ||
| 44 | : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL)); | 51 | : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL)); |
| 52 | #endif | ||
| 45 | return ret; | 53 | return ret; |
| 46 | #endif | 54 | #endif |
| 47 | } | 55 | } |
