Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge

* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge:
powerpc: Fix various syscall/signal/swapcontext bugs
[PATCH] powerpc: incorrect rmo_top handling in prom_init
[PATCH] powerpc: Fix incorrect pud_ERROR() message
[PATCH] powerpc: Expose SMT and L1 icache snoop userland features
[PATCH] powerpc: Fix windfarm_pm112 not starting all control loops
[PATCH] powerpc: Fix old g5 issues with windfarm
powerpc32: Fix timebase synchronization on 32-bit powermacs
powerpc: Turn off verbose debug output in powermac platform functions
powerpc: Fix might-sleep warning in program check exception handler

+163 -276
-1
arch/powerpc/kernel/asm-offsets.c
··· 92 92 93 93 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); 94 94 DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); 95 - DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame)); 96 95 DEFINE(TI_TASK, offsetof(struct thread_info, task)); 97 96 #ifdef CONFIG_PPC32 98 97 DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
+6 -3
arch/powerpc/kernel/cputable.c
··· 53 53 PPC_FEATURE_HAS_MMU) 54 54 #define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64) 55 55 #define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4) 56 - #define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5) 57 - #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS) 56 + #define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\ 57 + PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) 58 + #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\ 59 + PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) 58 60 #define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \ 59 61 PPC_FEATURE_BOOKE) 60 62 ··· 269 267 .cpu_name = "Cell Broadband Engine", 270 268 .cpu_features = CPU_FTRS_CELL, 271 269 .cpu_user_features = COMMON_USER_PPC64 | 272 - PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP, 270 + PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP | 271 + PPC_FEATURE_SMT, 273 272 .icache_bsize = 128, 274 273 .dcache_bsize = 128, 275 274 .cpu_setup = __setup_cpu_be,
+24 -71
arch/powerpc/kernel/entry_32.S
··· 227 227 MTMSRD(r10) 228 228 lwz r9,TI_FLAGS(r12) 229 229 li r8,-_LAST_ERRNO 230 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK) 230 + andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) 231 231 bne- syscall_exit_work 232 232 cmplw 0,r3,r8 233 233 blt+ syscall_exit_cont ··· 287 287 288 288 syscall_exit_work: 289 289 andi. r0,r9,_TIF_RESTOREALL 290 - bne- 2f 291 - cmplw 0,r3,r8 290 + beq+ 0f 291 + REST_NVGPRS(r1) 292 + b 2f 293 + 0: cmplw 0,r3,r8 292 294 blt+ 1f 293 295 andi. r0,r9,_TIF_NOERROR 294 296 bne- 1f ··· 304 302 2: andi. r0,r9,(_TIF_PERSYSCALL_MASK) 305 303 beq 4f 306 304 307 - /* Clear per-syscall TIF flags if any are set, but _leave_ 308 - _TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that 309 - yet. */ 305 + /* Clear per-syscall TIF flags if any are set. */ 310 306 311 307 li r11,_TIF_PERSYSCALL_MASK 312 308 addi r12,r12,TI_FLAGS ··· 318 318 subi r12,r12,TI_FLAGS 319 319 320 320 4: /* Anything which requires enabling interrupts? */ 321 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS) 322 - beq 7f 321 + andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) 322 + beq ret_from_except 323 + 324 + /* Re-enable interrupts */ 325 + ori r10,r10,MSR_EE 326 + SYNC 327 + MTMSRD(r10) 323 328 324 329 /* Save NVGPRS if they're not saved already */ 325 330 lwz r4,_TRAP(r1) ··· 333 328 SAVE_NVGPRS(r1) 334 329 li r4,0xc00 335 330 stw r4,_TRAP(r1) 336 - 337 - /* Re-enable interrupts */ 338 - 5: ori r10,r10,MSR_EE 339 - SYNC 340 - MTMSRD(r10) 341 - 342 - andi. r0,r9,_TIF_SAVE_NVGPRS 343 - bne save_user_nvgprs 344 - 345 - save_user_nvgprs_cont: 346 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) 347 - beq 7f 348 - 331 + 5: 349 332 addi r3,r1,STACK_FRAME_OVERHEAD 350 333 bl do_syscall_trace_leave 351 - REST_NVGPRS(r1) 334 + b ret_from_except_full 352 335 353 - 6: lwz r3,GPR3(r1) 354 - LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */ 355 - SYNC 356 - MTMSRD(r10) /* disable interrupts again */ 357 - rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ 358 - lwz r9,TI_FLAGS(r12) 359 - 7: 360 - andi. r0,r9,_TIF_NEED_RESCHED 361 - bne 8f 362 - lwz r5,_MSR(r1) 363 - andi. r5,r5,MSR_PR 364 - beq ret_from_except 365 - andi. r0,r9,_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK 366 - beq ret_from_except 367 - b do_user_signal 368 - 8: 369 - ori r10,r10,MSR_EE 370 - SYNC 371 - MTMSRD(r10) /* re-enable interrupts */ 372 - bl schedule 373 - b 6b 374 - 375 - save_user_nvgprs: 376 - lwz r8,TI_SIGFRAME(r12) 377 - 378 - .macro savewords start, end 379 - 1: stw \start,4*(\start)(r8) 380 - .section __ex_table,"a" 381 - .align 2 382 - .long 1b,save_user_nvgprs_fault 383 - .previous 384 - .if \end - \start 385 - savewords "(\start+1)",\end 386 - .endif 387 - .endm 388 - savewords 14,31 389 - b save_user_nvgprs_cont 390 - 391 - 392 - save_user_nvgprs_fault: 393 - li r3,11 /* SIGSEGV */ 394 - lwz r4,TI_TASK(r12) 395 - bl force_sigsegv 396 - 397 - rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ 398 - lwz r9,TI_FLAGS(r12) 399 - b save_user_nvgprs_cont 400 - 401 336 #ifdef SHOW_SYSCALLS 402 337 do_show_syscall: 403 338 #ifdef SHOW_SYSCALLS_TASK ··· 434 489 rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */ 435 490 stw r0,_TRAP(r1) /* register set saved */ 436 491 b sys_clone 492 + 493 + .globl ppc_swapcontext 494 + ppc_swapcontext: 495 + SAVE_NVGPRS(r1) 496 + lwz r0,_TRAP(r1) 497 + rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */ 498 + stw r0,_TRAP(r1) /* register set saved */ 499 + b sys_swapcontext 437 500 438 501 /* 439 502 * Top-level page fault handling. ··· 636 683 /* Check current_thread_info()->flags */ 637 684 rlwinm r9,r1,0,0,(31-THREAD_SHIFT) 638 685 lwz r9,TI_FLAGS(r9) 639 - andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK) 686 + andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED) 640 687 bne do_work 641 688 642 689 restore_user:
+21 -73
arch/powerpc/kernel/entry_64.S
··· 160 160 mtmsrd r10,1 161 161 ld r9,TI_FLAGS(r12) 162 162 li r11,-_LAST_ERRNO 163 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_SAVE_NVGPRS|_TIF_NOERROR|_TIF_RESTORE_SIGMASK) 163 + andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) 164 164 bne- syscall_exit_work 165 165 cmpld r3,r11 166 166 ld r5,_CCR(r1) ··· 216 216 If TIF_NOERROR is set, just save r3 as it is. */ 217 217 218 218 andi. r0,r9,_TIF_RESTOREALL 219 - bne- 2f 220 - cmpld r3,r11 /* r10 is -LAST_ERRNO */ 219 + beq+ 0f 220 + REST_NVGPRS(r1) 221 + b 2f 222 + 0: cmpld r3,r11 /* r10 is -LAST_ERRNO */ 221 223 blt+ 1f 222 224 andi. r0,r9,_TIF_NOERROR 223 225 bne- 1f ··· 231 229 2: andi. r0,r9,(_TIF_PERSYSCALL_MASK) 232 230 beq 4f 233 231 234 - /* Clear per-syscall TIF flags if any are set, but _leave_ 235 - _TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that 236 - yet. */ 232 + /* Clear per-syscall TIF flags if any are set. */ 237 233 238 234 li r11,_TIF_PERSYSCALL_MASK 239 235 addi r12,r12,TI_FLAGS ··· 240 240 stdcx. r10,0,r12 241 241 bne- 3b 242 242 subi r12,r12,TI_FLAGS 243 - 244 - 4: bl .save_nvgprs 245 - /* Anything else left to do? */ 246 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS) 243 + 244 + 4: /* Anything else left to do? */ 245 + andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) 247 246 beq .ret_from_except_lite 248 247 249 248 /* Re-enable interrupts */ ··· 250 251 ori r10,r10,MSR_EE 251 252 mtmsrd r10,1 252 253 253 - andi. r0,r9,_TIF_SAVE_NVGPRS 254 - bne save_user_nvgprs 255 - 256 - /* If tracing, re-enable interrupts and do it */ 257 - save_user_nvgprs_cont: 258 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) 259 - beq 5f 260 - 254 + bl .save_nvgprs 261 255 addi r3,r1,STACK_FRAME_OVERHEAD 262 256 bl .do_syscall_trace_leave 263 - REST_NVGPRS(r1) 264 - clrrdi r12,r1,THREAD_SHIFT 265 - 266 - /* Disable interrupts again and handle other work if any */ 267 - 5: mfmsr r10 268 - rldicl r10,r10,48,1 269 - rotldi r10,r10,16 270 - mtmsrd r10,1 271 - 272 - b .ret_from_except_lite 257 + b .ret_from_except 273 258 274 259 /* Save non-volatile GPRs, if not already saved. */ 275 260 _GLOBAL(save_nvgprs) ··· 265 282 std r0,_TRAP(r1) 266 283 blr 267 284 268 - 269 - save_user_nvgprs: 270 - ld r10,TI_SIGFRAME(r12) 271 - andi. r0,r9,_TIF_32BIT 272 - beq- save_user_nvgprs_64 273 - 274 - /* 32-bit save to userspace */ 275 - 276 - .macro savewords start, end 277 - 1: stw \start,4*(\start)(r10) 278 - .section __ex_table,"a" 279 - .align 3 280 - .llong 1b,save_user_nvgprs_fault 281 - .previous 282 - .if \end - \start 283 - savewords "(\start+1)",\end 284 - .endif 285 - .endm 286 - savewords 14,31 287 - b save_user_nvgprs_cont 288 - 289 - save_user_nvgprs_64: 290 - /* 64-bit save to userspace */ 291 - 292 - .macro savelongs start, end 293 - 1: std \start,8*(\start)(r10) 294 - .section __ex_table,"a" 295 - .align 3 296 - .llong 1b,save_user_nvgprs_fault 297 - .previous 298 - .if \end - \start 299 - savelongs "(\start+1)",\end 300 - .endif 301 - .endm 302 - savelongs 14,31 303 - b save_user_nvgprs_cont 304 - 305 - save_user_nvgprs_fault: 306 - li r3,11 /* SIGSEGV */ 307 - ld r4,TI_TASK(r12) 308 - bl .force_sigsegv 309 - 310 - clrrdi r12,r1,THREAD_SHIFT 311 - ld r9,TI_FLAGS(r12) 312 - b save_user_nvgprs_cont 313 285 314 286 /* 315 287 * The sigsuspend and rt_sigsuspend system calls can call do_signal ··· 288 350 _GLOBAL(ppc_clone) 289 351 bl .save_nvgprs 290 352 bl .sys_clone 353 + b syscall_exit 354 + 355 + _GLOBAL(ppc32_swapcontext) 356 + bl .save_nvgprs 357 + bl .compat_sys_swapcontext 358 + b syscall_exit 359 + 360 + _GLOBAL(ppc64_swapcontext) 361 + bl .save_nvgprs 362 + bl .sys_swapcontext 291 363 b syscall_exit 292 364 293 365 _GLOBAL(ret_from_fork)
+1 -1
arch/powerpc/kernel/prom_init.c
··· 978 978 if (size == 0) 979 979 continue; 980 980 prom_debug(" %x %x\n", base, size); 981 - if (base == 0) 981 + if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR)) 982 982 RELOC(rmo_top) = size; 983 983 if ((base + size) > RELOC(ram_top)) 984 984 RELOC(ram_top) = base + size;
+1 -4
arch/powerpc/kernel/ptrace.c
··· 561 561 regs->result); 562 562 563 563 if ((test_thread_flag(TIF_SYSCALL_TRACE) 564 - #ifdef CONFIG_PPC64 565 - || test_thread_flag(TIF_SINGLESTEP) 566 - #endif 567 - ) 564 + || test_thread_flag(TIF_SINGLESTEP)) 568 565 && (current->ptrace & PT_PTRACED)) 569 566 do_syscall_trace(); 570 567 }
+4 -15
arch/powerpc/kernel/signal_32.c
··· 151 151 elf_greg_t64 *gregs = (elf_greg_t64 *)regs; 152 152 int i; 153 153 154 - if (!FULL_REGS(regs)) { 155 - set_thread_flag(TIF_SAVE_NVGPRS); 156 - current_thread_info()->nvgprs_frame = frame->mc_gregs; 157 - } 154 + WARN_ON(!FULL_REGS(regs)); 158 155 159 156 for (i = 0; i <= PT_RESULT; i ++) { 160 157 if (i == 14 && !FULL_REGS(regs)) ··· 212 215 static inline int save_general_regs(struct pt_regs *regs, 213 216 struct mcontext __user *frame) 214 217 { 215 - if (!FULL_REGS(regs)) { 216 - /* Zero out the unsaved GPRs to avoid information 217 - leak, and set TIF_SAVE_NVGPRS to ensure that the 218 - registers do actually get saved later. */ 219 - memset(&regs->gpr[14], 0, 18 * sizeof(unsigned long)); 220 - current_thread_info()->nvgprs_frame = &frame->mc_gregs; 221 - set_thread_flag(TIF_SAVE_NVGPRS); 222 - } 223 - 218 + WARN_ON(!FULL_REGS(regs)); 224 219 return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE); 225 220 } 226 221 ··· 815 826 } 816 827 817 828 long sys_swapcontext(struct ucontext __user *old_ctx, 818 - struct ucontext __user *new_ctx, 819 - int ctx_size, int r6, int r7, int r8, struct pt_regs *regs) 829 + struct ucontext __user *new_ctx, 830 + int ctx_size, int r6, int r7, int r8, struct pt_regs *regs) 820 831 { 821 832 unsigned char tmp; 822 833
+1 -8
arch/powerpc/kernel/signal_64.c
··· 118 118 err |= __put_user(0, &sc->v_regs); 119 119 #endif /* CONFIG_ALTIVEC */ 120 120 err |= __put_user(&sc->gp_regs, &sc->regs); 121 - if (!FULL_REGS(regs)) { 122 - /* Zero out the unsaved GPRs to avoid information 123 - leak, and set TIF_SAVE_NVGPRS to ensure that the 124 - registers do actually get saved later. */ 125 - memset(&regs->gpr[14], 0, 18 * sizeof(unsigned long)); 126 - set_thread_flag(TIF_SAVE_NVGPRS); 127 - current_thread_info()->nvgprs_frame = &sc->gp_regs; 128 - } 121 + WARN_ON(!FULL_REGS(regs)); 129 122 err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE); 130 123 err |= __copy_to_user(&sc->fp_regs, &current->thread.fpr, FP_REGS_SIZE); 131 124 err |= __put_user(signr, &sc->signal);
+1 -1
arch/powerpc/kernel/systbl.S
··· 288 288 COMPAT_SYS(clock_gettime) 289 289 COMPAT_SYS(clock_getres) 290 290 COMPAT_SYS(clock_nanosleep) 291 - COMPAT_SYS(swapcontext) 291 + SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext) 292 292 COMPAT_SYS(tgkill) 293 293 COMPAT_SYS(utimes) 294 294 COMPAT_SYS(statfs64)
+2
arch/powerpc/kernel/traps.c
··· 814 814 return; 815 815 } 816 816 817 + local_irq_enable(); 818 + 817 819 /* Try to emulate it if we should. */ 818 820 if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) { 819 821 switch (emulate_instruction(regs)) {
+5
arch/powerpc/platforms/powermac/pfunc_base.c
··· 9 9 #include <asm/pmac_feature.h> 10 10 #include <asm/pmac_pfunc.h> 11 11 12 + #undef DEBUG 13 + #ifdef DEBUG 12 14 #define DBG(fmt...) printk(fmt) 15 + #else 16 + #define DBG(fmt...) 17 + #endif 13 18 14 19 static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs) 15 20 {
+6
arch/powerpc/platforms/powermac/pfunc_core.c
··· 20 20 #define LOG_PARSE(fmt...) 21 21 #define LOG_ERROR(fmt...) printk(fmt) 22 22 #define LOG_BLOB(t,b,c) 23 + 24 + #undef DEBUG 25 + #ifdef DEBUG 23 26 #define DBG(fmt...) printk(fmt) 27 + #else 28 + #define DBG(fmt...) 29 + #endif 24 30 25 31 /* Command numbers */ 26 32 #define PMF_CMD_LIST 0
+1 -1
arch/powerpc/platforms/powermac/smp.c
··· 435 435 */ 436 436 437 437 static void (*pmac_tb_freeze)(int freeze); 438 - static unsigned long timebase; 438 + static u64 timebase; 439 439 static int tb_req; 440 440 441 441 static void smp_core99_give_timebase(void)
-1
arch/ppc/kernel/asm-offsets.c
··· 131 131 DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features)); 132 132 DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup)); 133 133 134 - DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame)); 135 134 DEFINE(TI_TASK, offsetof(struct thread_info, task)); 136 135 DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain)); 137 136 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
+24 -71
arch/ppc/kernel/entry.S
··· 227 227 MTMSRD(r10) 228 228 lwz r9,TI_FLAGS(r12) 229 229 li r8,-_LAST_ERRNO 230 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL) 230 + andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK) 231 231 bne- syscall_exit_work 232 232 cmplw 0,r3,r8 233 233 blt+ syscall_exit_cont ··· 287 287 288 288 syscall_exit_work: 289 289 andi. r0,r9,_TIF_RESTOREALL 290 - bne- 2f 291 - cmplw 0,r3,r8 290 + beq+ 0f 291 + REST_NVGPRS(r1) 292 + b 2f 293 + 0: cmplw 0,r3,r8 292 294 blt+ 1f 293 295 andi. r0,r9,_TIF_NOERROR 294 296 bne- 1f ··· 304 302 2: andi. r0,r9,(_TIF_PERSYSCALL_MASK) 305 303 beq 4f 306 304 307 - /* Clear per-syscall TIF flags if any are set, but _leave_ 308 - _TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that 309 - yet. */ 305 + /* Clear per-syscall TIF flags if any are set. */ 310 306 311 307 li r11,_TIF_PERSYSCALL_MASK 312 308 addi r12,r12,TI_FLAGS ··· 318 318 subi r12,r12,TI_FLAGS 319 319 320 320 4: /* Anything which requires enabling interrupts? */ 321 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS) 322 - beq 7f 321 + andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) 322 + beq ret_from_except 323 + 324 + /* Re-enable interrupts */ 325 + ori r10,r10,MSR_EE 326 + SYNC 327 + MTMSRD(r10) 323 328 324 329 /* Save NVGPRS if they're not saved already */ 325 330 lwz r4,TRAP(r1) ··· 333 328 SAVE_NVGPRS(r1) 334 329 li r4,0xc00 335 330 stw r4,TRAP(r1) 336 - 337 - /* Re-enable interrupts */ 338 - 5: ori r10,r10,MSR_EE 339 - SYNC 340 - MTMSRD(r10) 341 - 342 - andi. r0,r9,_TIF_SAVE_NVGPRS 343 - bne save_user_nvgprs 344 - 345 - save_user_nvgprs_cont: 346 - andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP) 347 - beq 7f 348 - 331 + 5: 349 332 addi r3,r1,STACK_FRAME_OVERHEAD 350 333 bl do_syscall_trace_leave 351 - REST_NVGPRS(r1) 334 + b ret_from_except_full 352 335 353 - 6: lwz r3,GPR3(r1) 354 - LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */ 355 - SYNC 356 - MTMSRD(r10) /* disable interrupts again */ 357 - rlwinm r12,r1,0,0,18 /* current_thread_info() */ 358 - lwz r9,TI_FLAGS(r12) 359 - 7: 360 - andi. r0,r9,_TIF_NEED_RESCHED 361 - bne 8f 362 - lwz r5,_MSR(r1) 363 - andi. r5,r5,MSR_PR 364 - beq ret_from_except 365 - andi. r0,r9,_TIF_SIGPENDING 366 - beq ret_from_except 367 - b do_user_signal 368 - 8: 369 - ori r10,r10,MSR_EE 370 - SYNC 371 - MTMSRD(r10) /* re-enable interrupts */ 372 - bl schedule 373 - b 6b 374 - 375 - save_user_nvgprs: 376 - lwz r8,TI_SIGFRAME(r12) 377 - 378 - .macro savewords start, end 379 - 1: stw \start,4*(\start)(r8) 380 - .section __ex_table,"a" 381 - .align 2 382 - .long 1b,save_user_nvgprs_fault 383 - .previous 384 - .if \end - \start 385 - savewords "(\start+1)",\end 386 - .endif 387 - .endm 388 - savewords 14,31 389 - b save_user_nvgprs_cont 390 - 391 - 392 - save_user_nvgprs_fault: 393 - li r3,11 /* SIGSEGV */ 394 - lwz r4,TI_TASK(r12) 395 - bl force_sigsegv 396 - 397 - rlwinm r12,r1,0,0,18 /* current_thread_info() */ 398 - lwz r9,TI_FLAGS(r12) 399 - b save_user_nvgprs_cont 400 - 401 336 #ifdef SHOW_SYSCALLS 402 337 do_show_syscall: 403 338 #ifdef SHOW_SYSCALLS_TASK ··· 434 489 rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */ 435 490 stw r0,TRAP(r1) /* register set saved */ 436 491 b sys_clone 492 + 493 + .globl ppc_swapcontext 494 + ppc_swapcontext: 495 + SAVE_NVGPRS(r1) 496 + lwz r0,TRAP(r1) 497 + rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */ 498 + stw r0,TRAP(r1) /* register set saved */ 499 + b sys_swapcontext 437 500 438 501 /* 439 502 * Top-level page fault handling. ··· 636 683 /* Check current_thread_info()->flags */ 637 684 rlwinm r9,r1,0,0,18 638 685 lwz r9,TI_FLAGS(r9) 639 - andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL) 686 + andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED) 640 687 bne do_work 641 688 642 689 restore_user:
+7
drivers/macintosh/windfarm_core.c
··· 35 35 #include <linux/platform_device.h> 36 36 #include <linux/mutex.h> 37 37 38 + #include <asm/prom.h> 39 + 38 40 #include "windfarm.h" 39 41 40 42 #define VERSION "0.2" ··· 467 465 { 468 466 DBG("wf: core loaded\n"); 469 467 468 + /* Don't register on old machines that use therm_pm72 for now */ 469 + if (machine_is_compatible("PowerMac7,2") || 470 + machine_is_compatible("PowerMac7,3") || 471 + machine_is_compatible("RackMac3,1")) 472 + return -ENODEV; 470 473 platform_device_register(&wf_platform_device); 471 474 return 0; 472 475 }
+8
drivers/macintosh/windfarm_cpufreq_clamp.c
··· 8 8 #include <linux/wait.h> 9 9 #include <linux/cpufreq.h> 10 10 11 + #include <asm/prom.h> 12 + 11 13 #include "windfarm.h" 12 14 13 15 #define VERSION "0.3" ··· 75 73 static int __init wf_cpufreq_clamp_init(void) 76 74 { 77 75 struct wf_control *clamp; 76 + 77 + /* Don't register on old machines that use therm_pm72 for now */ 78 + if (machine_is_compatible("PowerMac7,2") || 79 + machine_is_compatible("PowerMac7,3") || 80 + machine_is_compatible("RackMac3,1")) 81 + return -ENODEV; 78 82 79 83 clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL); 80 84 if (clamp == NULL)
+23 -9
drivers/macintosh/windfarm_lm75_sensor.c
··· 25 25 26 26 #include "windfarm.h" 27 27 28 - #define VERSION "0.1" 28 + #define VERSION "0.2" 29 29 30 30 #undef DEBUG 31 31 ··· 113 113 const char *loc) 114 114 { 115 115 struct wf_lm75_sensor *lm; 116 + int rc; 116 117 117 118 DBG("wf_lm75: creating %s device at address 0x%02x\n", 118 119 ds1775 ? "ds1775" : "lm75", addr); ··· 140 139 lm->i2c.driver = &wf_lm75_driver; 141 140 strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1); 142 141 143 - if (i2c_attach_client(&lm->i2c)) { 144 - printk(KERN_ERR "windfarm: failed to attach %s %s to i2c\n", 145 - ds1775 ? "ds1775" : "lm75", lm->i2c.name); 142 + rc = i2c_attach_client(&lm->i2c); 143 + if (rc) { 144 + printk(KERN_ERR "windfarm: failed to attach %s %s to i2c," 145 + " err %d\n", ds1775 ? "ds1775" : "lm75", 146 + lm->i2c.name, rc); 146 147 goto fail; 147 148 } 148 149 ··· 178 175 (dev = of_get_next_child(busnode, dev)) != NULL;) { 179 176 const char *loc = 180 177 get_property(dev, "hwsensor-location", NULL); 181 - u32 *reg = (u32 *)get_property(dev, "reg", NULL); 182 - DBG(" dev: %s... (loc: %p, reg: %p)\n", dev->name, loc, reg); 183 - if (loc == NULL || reg == NULL) 178 + u8 addr; 179 + 180 + /* We must re-match the adapter in order to properly check 181 + * the channel on multibus setups 182 + */ 183 + if (!pmac_i2c_match_adapter(dev, adapter)) 184 + continue; 185 + addr = pmac_i2c_get_dev_addr(dev); 186 + if (loc == NULL || addr == 0) 184 187 continue; 185 188 /* real lm75 */ 186 189 if (device_is_compatible(dev, "lm75")) 187 - wf_lm75_create(adapter, *reg, 0, loc); 190 + wf_lm75_create(adapter, addr, 0, loc); 188 191 /* ds1775 (compatible, better resolution */ 189 192 else if (device_is_compatible(dev, "ds1775")) 190 - wf_lm75_create(adapter, *reg, 1, loc); 193 + wf_lm75_create(adapter, addr, 1, loc); 191 194 } 192 195 return 0; 193 196 } ··· 215 206 216 207 static int __init wf_lm75_sensor_init(void) 217 208 { 209 + /* Don't register on old machines that use therm_pm72 for now */ 210 + if (machine_is_compatible("PowerMac7,2") || 211 + machine_is_compatible("PowerMac7,3") || 212 + machine_is_compatible("RackMac3,1")) 213 + return -ENODEV; 218 214 return i2c_add_driver(&wf_lm75_driver); 219 215 } 220 216
+18 -7
drivers/macintosh/windfarm_max6690_sensor.c
··· 17 17 18 18 #include "windfarm.h" 19 19 20 - #define VERSION "0.1" 20 + #define VERSION "0.2" 21 21 22 22 /* This currently only exports the external temperature sensor, 23 23 since that's all the control loops need. */ ··· 81 81 static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr) 82 82 { 83 83 struct wf_6690_sensor *max; 84 - char *name = "u4-temp"; 84 + char *name = "backside-temp"; 85 85 86 86 max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL); 87 87 if (max == NULL) { ··· 118 118 struct device_node *busnode, *dev = NULL; 119 119 struct pmac_i2c_bus *bus; 120 120 const char *loc; 121 - u32 *reg; 122 121 123 122 bus = pmac_i2c_adapter_to_bus(adapter); 124 123 if (bus == NULL) ··· 125 126 busnode = pmac_i2c_get_bus_node(bus); 126 127 127 128 while ((dev = of_get_next_child(busnode, dev)) != NULL) { 129 + u8 addr; 130 + 131 + /* We must re-match the adapter in order to properly check 132 + * the channel on multibus setups 133 + */ 134 + if (!pmac_i2c_match_adapter(dev, adapter)) 135 + continue; 128 136 if (!device_is_compatible(dev, "max6690")) 129 137 continue; 138 + addr = pmac_i2c_get_dev_addr(dev); 130 139 loc = get_property(dev, "hwsensor-location", NULL); 131 - reg = (u32 *) get_property(dev, "reg", NULL); 132 - if (!loc || !reg) 140 + if (loc == NULL || addr == 0) 133 141 continue; 134 - printk("found max6690, loc=%s reg=%x\n", loc, *reg); 142 + printk("found max6690, loc=%s addr=0x%02x\n", loc, addr); 135 143 if (strcmp(loc, "BACKSIDE")) 136 144 continue; 137 - wf_max6690_create(adapter, *reg); 145 + wf_max6690_create(adapter, addr); 138 146 } 139 147 140 148 return 0; ··· 159 153 160 154 static int __init wf_max6690_sensor_init(void) 161 155 { 156 + /* Don't register on old machines that use therm_pm72 for now */ 157 + if (machine_is_compatible("PowerMac7,2") || 158 + machine_is_compatible("PowerMac7,3") || 159 + machine_is_compatible("RackMac3,1")) 160 + return -ENODEV; 162 161 return i2c_add_driver(&wf_max6690_driver); 163 162 } 164 163
+5 -3
drivers/macintosh/windfarm_pm112.c
··· 358 358 return; 359 359 if (!backside_tick) { 360 360 /* first time; initialize things */ 361 + printk(KERN_INFO "windfarm: Backside control loop started.\n"); 361 362 backside_param.min = backside_fan->ops->get_min(backside_fan); 362 363 backside_param.max = backside_fan->ops->get_max(backside_fan); 363 364 wf_pid_init(&backside_pid, &backside_param); ··· 408 407 return; 409 408 if (!drive_bay_tick) { 410 409 /* first time; initialize things */ 410 + printk(KERN_INFO "windfarm: Drive bay control loop started.\n"); 411 411 drive_bay_prm.min = drive_bay_fan->ops->get_min(drive_bay_fan); 412 412 drive_bay_prm.max = drive_bay_fan->ops->get_max(drive_bay_fan); 413 413 wf_pid_init(&drive_bay_pid, &drive_bay_prm); ··· 460 458 return; 461 459 if (!slots_started) { 462 460 /* first time; initialize things */ 461 + printk(KERN_INFO "windfarm: Slots control loop started.\n"); 463 462 wf_pid_init(&slots_pid, &slots_param); 464 463 slots_started = 1; 465 464 } ··· 507 504 508 505 if (!started) { 509 506 started = 1; 507 + printk(KERN_INFO "windfarm: CPUs control loops started.\n"); 510 508 for (i = 0; i < nr_cores; ++i) { 511 509 if (create_cpu_loop(i) < 0) { 512 510 failure_state = FAILURE_PERM; ··· 598 594 { 599 595 unsigned int i; 600 596 601 - if (have_all_sensors) 602 - return; 603 597 if (!strncmp(sr->name, "cpu-temp-", 9)) { 604 598 i = sr->name[9] - '0'; 605 599 if (sr->name[10] == 0 && i < NR_CORES && ··· 615 613 } else if (!strcmp(sr->name, "slots-power")) { 616 614 if (slots_power == NULL && wf_get_sensor(sr) == 0) 617 615 slots_power = sr; 618 - } else if (!strcmp(sr->name, "u4-temp")) { 616 + } else if (!strcmp(sr->name, "backside-temp")) { 619 617 if (u4_temp == NULL && wf_get_sensor(sr) == 0) 620 618 u4_temp = sr; 621 619 } else
+2
include/asm-powerpc/cputable.h
··· 20 20 #define PPC_FEATURE_POWER5_PLUS 0x00020000 21 21 #define PPC_FEATURE_CELL 0x00010000 22 22 #define PPC_FEATURE_BOOKE 0x00008000 23 + #define PPC_FEATURE_SMT 0x00004000 24 + #define PPC_FEATURE_ICACHE_SNOOP 0x00002000 23 25 24 26 #ifdef __KERNEL__ 25 27 #ifndef __ASSEMBLY__
+1 -1
include/asm-powerpc/pgtable-4k.h
··· 88 88 (((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1))) 89 89 90 90 #define pud_ERROR(e) \ 91 - printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pud_val(e)) 91 + printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pud_val(e))
+2 -6
include/asm-powerpc/thread_info.h
··· 37 37 int preempt_count; /* 0 => preemptable, 38 38 <0 => BUG */ 39 39 struct restart_block restart_block; 40 - void __user *nvgprs_frame; 41 40 /* low level flags - has atomic operations done on it */ 42 41 unsigned long flags ____cacheline_aligned_in_smp; 43 42 }; ··· 119 120 #define TIF_MEMDIE 10 120 121 #define TIF_SECCOMP 11 /* secure computing */ 121 122 #define TIF_RESTOREALL 12 /* Restore all regs (implies NOERROR) */ 122 - #define TIF_SAVE_NVGPRS 13 /* Save r14-r31 in signal frame */ 123 123 #define TIF_NOERROR 14 /* Force successful syscall return */ 124 124 #define TIF_RESTORE_SIGMASK 15 /* Restore signal mask in do_signal */ 125 125 ··· 135 137 #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) 136 138 #define _TIF_SECCOMP (1<<TIF_SECCOMP) 137 139 #define _TIF_RESTOREALL (1<<TIF_RESTOREALL) 138 - #define _TIF_SAVE_NVGPRS (1<<TIF_SAVE_NVGPRS) 139 140 #define _TIF_NOERROR (1<<TIF_NOERROR) 140 141 #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) 141 142 #define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP) 142 143 143 144 #define _TIF_USER_WORK_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \ 144 - _TIF_NEED_RESCHED | _TIF_RESTOREALL | \ 145 - _TIF_RESTORE_SIGMASK) 146 - #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR|_TIF_SAVE_NVGPRS) 145 + _TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK) 146 + #define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR) 147 147 148 148 #endif /* __KERNEL__ */ 149 149