diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-12 00:34:19 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-12 00:34:19 -0500 |
commit | 66a173b926891023e34e78cb32f4681d19777e01 (patch) | |
tree | e6018f50fbceea7c07e6e27368ee817f9adb34f2 /arch/powerpc/kernel/process.c | |
parent | 11db81a59d0b2e563e30512cd76f23d0db384780 (diff) | |
parent | 0c4888ef1d8a8b82c29075ce7e257ff795af15c7 (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
Pull powerpc updates from Benjamin Herrenschmidt:
"The bulk of this is LE updates. One should now be able to build an LE
kernel and even run some things in it.
I'm still sitting on a handful of patches to enable the new ABI that I
*might* still send this merge window around, but due to the
incertainty (they are pretty fresh) I want to keep them separate.
Other notable changes are some infrastructure bits to better handle
PCI pass-through under KVM, some bits and pieces added to the new
PowerNV platform support such as access to the CPU SCOM bus via sysfs,
and support for EEH error handling on PHB3 (Power8 PCIe).
We also grew arch_get_random_long() for both pseries and powernv when
running on P7+ and P8, exploiting the HW rng.
And finally various embedded updates from freescale"
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (154 commits)
powerpc: Fix fatal SLB miss when restoring PPR
powerpc/powernv: Reserve the correct PE number
powerpc/powernv: Add PE to its own PELTV
powerpc/powernv: Add support for indirect XSCOM via debugfs
powerpc/scom: Improve debugfs interface
powerpc/scom: Enable 64-bit addresses
powerpc/boot: Properly handle the base "of" boot wrapper
powerpc/bpf: Support MOD operation
powerpc/bpf: Fix DIVWU instruction opcode
of: Move definition of of_find_next_cache_node into common code.
powerpc: Remove big endianness assumption in of_find_next_cache_node
powerpc/tm: Remove interrupt disable in __switch_to()
powerpc: word-at-a-time optimization for 64-bit Little Endian
powerpc/bpf: BPF JIT compiler for 64-bit Little Endian
powerpc: Only save/restore SDR1 if in hypervisor mode
powerpc/pmu: Fix ADB_PMU_LED_IDE dependencies
powerpc/nvram: Fix endian issue when using the partition length
powerpc/nvram: Fix endian issue when reading the NVRAM size
powerpc/nvram: Scan partitions only once
powerpc/mpc512x: remove unnecessary #if
...
Diffstat (limited to 'arch/powerpc/kernel/process.c')
-rw-r--r-- | arch/powerpc/kernel/process.c | 67 |
1 files changed, 35 insertions, 32 deletions
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 96d2fdf3aa9e..75c2d1009985 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -314,28 +314,28 @@ static DEFINE_PER_CPU(struct arch_hw_breakpoint, current_brk); | |||
314 | */ | 314 | */ |
315 | static void set_debug_reg_defaults(struct thread_struct *thread) | 315 | static void set_debug_reg_defaults(struct thread_struct *thread) |
316 | { | 316 | { |
317 | thread->iac1 = thread->iac2 = 0; | 317 | thread->debug.iac1 = thread->debug.iac2 = 0; |
318 | #if CONFIG_PPC_ADV_DEBUG_IACS > 2 | 318 | #if CONFIG_PPC_ADV_DEBUG_IACS > 2 |
319 | thread->iac3 = thread->iac4 = 0; | 319 | thread->debug.iac3 = thread->debug.iac4 = 0; |
320 | #endif | 320 | #endif |
321 | thread->dac1 = thread->dac2 = 0; | 321 | thread->debug.dac1 = thread->debug.dac2 = 0; |
322 | #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 | 322 | #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 |
323 | thread->dvc1 = thread->dvc2 = 0; | 323 | thread->debug.dvc1 = thread->debug.dvc2 = 0; |
324 | #endif | 324 | #endif |
325 | thread->dbcr0 = 0; | 325 | thread->debug.dbcr0 = 0; |
326 | #ifdef CONFIG_BOOKE | 326 | #ifdef CONFIG_BOOKE |
327 | /* | 327 | /* |
328 | * Force User/Supervisor bits to b11 (user-only MSR[PR]=1) | 328 | * Force User/Supervisor bits to b11 (user-only MSR[PR]=1) |
329 | */ | 329 | */ |
330 | thread->dbcr1 = DBCR1_IAC1US | DBCR1_IAC2US | \ | 330 | thread->debug.dbcr1 = DBCR1_IAC1US | DBCR1_IAC2US | |
331 | DBCR1_IAC3US | DBCR1_IAC4US; | 331 | DBCR1_IAC3US | DBCR1_IAC4US; |
332 | /* | 332 | /* |
333 | * Force Data Address Compare User/Supervisor bits to be User-only | 333 | * Force Data Address Compare User/Supervisor bits to be User-only |
334 | * (0b11 MSR[PR]=1) and set all other bits in DBCR2 register to be 0. | 334 | * (0b11 MSR[PR]=1) and set all other bits in DBCR2 register to be 0. |
335 | */ | 335 | */ |
336 | thread->dbcr2 = DBCR2_DAC1US | DBCR2_DAC2US; | 336 | thread->debug.dbcr2 = DBCR2_DAC1US | DBCR2_DAC2US; |
337 | #else | 337 | #else |
338 | thread->dbcr1 = 0; | 338 | thread->debug.dbcr1 = 0; |
339 | #endif | 339 | #endif |
340 | } | 340 | } |
341 | 341 | ||
@@ -348,22 +348,22 @@ static void prime_debug_regs(struct thread_struct *thread) | |||
348 | */ | 348 | */ |
349 | mtmsr(mfmsr() & ~MSR_DE); | 349 | mtmsr(mfmsr() & ~MSR_DE); |
350 | 350 | ||
351 | mtspr(SPRN_IAC1, thread->iac1); | 351 | mtspr(SPRN_IAC1, thread->debug.iac1); |
352 | mtspr(SPRN_IAC2, thread->iac2); | 352 | mtspr(SPRN_IAC2, thread->debug.iac2); |
353 | #if CONFIG_PPC_ADV_DEBUG_IACS > 2 | 353 | #if CONFIG_PPC_ADV_DEBUG_IACS > 2 |
354 | mtspr(SPRN_IAC3, thread->iac3); | 354 | mtspr(SPRN_IAC3, thread->debug.iac3); |
355 | mtspr(SPRN_IAC4, thread->iac4); | 355 | mtspr(SPRN_IAC4, thread->debug.iac4); |
356 | #endif | 356 | #endif |
357 | mtspr(SPRN_DAC1, thread->dac1); | 357 | mtspr(SPRN_DAC1, thread->debug.dac1); |
358 | mtspr(SPRN_DAC2, thread->dac2); | 358 | mtspr(SPRN_DAC2, thread->debug.dac2); |
359 | #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 | 359 | #if CONFIG_PPC_ADV_DEBUG_DVCS > 0 |
360 | mtspr(SPRN_DVC1, thread->dvc1); | 360 | mtspr(SPRN_DVC1, thread->debug.dvc1); |
361 | mtspr(SPRN_DVC2, thread->dvc2); | 361 | mtspr(SPRN_DVC2, thread->debug.dvc2); |
362 | #endif | 362 | #endif |
363 | mtspr(SPRN_DBCR0, thread->dbcr0); | 363 | mtspr(SPRN_DBCR0, thread->debug.dbcr0); |
364 | mtspr(SPRN_DBCR1, thread->dbcr1); | 364 | mtspr(SPRN_DBCR1, thread->debug.dbcr1); |
365 | #ifdef CONFIG_BOOKE | 365 | #ifdef CONFIG_BOOKE |
366 | mtspr(SPRN_DBCR2, thread->dbcr2); | 366 | mtspr(SPRN_DBCR2, thread->debug.dbcr2); |
367 | #endif | 367 | #endif |
368 | } | 368 | } |
369 | /* | 369 | /* |
@@ -371,12 +371,13 @@ static void prime_debug_regs(struct thread_struct *thread) | |||
371 | * debug registers, set the debug registers from the values | 371 | * debug registers, set the debug registers from the values |
372 | * stored in the new thread. | 372 | * stored in the new thread. |
373 | */ | 373 | */ |
374 | static void switch_booke_debug_regs(struct thread_struct *new_thread) | 374 | void switch_booke_debug_regs(struct thread_struct *new_thread) |
375 | { | 375 | { |
376 | if ((current->thread.dbcr0 & DBCR0_IDM) | 376 | if ((current->thread.debug.dbcr0 & DBCR0_IDM) |
377 | || (new_thread->dbcr0 & DBCR0_IDM)) | 377 | || (new_thread->debug.dbcr0 & DBCR0_IDM)) |
378 | prime_debug_regs(new_thread); | 378 | prime_debug_regs(new_thread); |
379 | } | 379 | } |
380 | EXPORT_SYMBOL_GPL(switch_booke_debug_regs); | ||
380 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ | 381 | #else /* !CONFIG_PPC_ADV_DEBUG_REGS */ |
381 | #ifndef CONFIG_HAVE_HW_BREAKPOINT | 382 | #ifndef CONFIG_HAVE_HW_BREAKPOINT |
382 | static void set_debug_reg_defaults(struct thread_struct *thread) | 383 | static void set_debug_reg_defaults(struct thread_struct *thread) |
@@ -596,12 +597,13 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
596 | struct task_struct *new) | 597 | struct task_struct *new) |
597 | { | 598 | { |
598 | struct thread_struct *new_thread, *old_thread; | 599 | struct thread_struct *new_thread, *old_thread; |
599 | unsigned long flags; | ||
600 | struct task_struct *last; | 600 | struct task_struct *last; |
601 | #ifdef CONFIG_PPC_BOOK3S_64 | 601 | #ifdef CONFIG_PPC_BOOK3S_64 |
602 | struct ppc64_tlb_batch *batch; | 602 | struct ppc64_tlb_batch *batch; |
603 | #endif | 603 | #endif |
604 | 604 | ||
605 | WARN_ON(!irqs_disabled()); | ||
606 | |||
605 | /* Back up the TAR across context switches. | 607 | /* Back up the TAR across context switches. |
606 | * Note that the TAR is not available for use in the kernel. (To | 608 | * Note that the TAR is not available for use in the kernel. (To |
607 | * provide this, the TAR should be backed up/restored on exception | 609 | * provide this, the TAR should be backed up/restored on exception |
@@ -721,8 +723,6 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
721 | } | 723 | } |
722 | #endif /* CONFIG_PPC_BOOK3S_64 */ | 724 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
723 | 725 | ||
724 | local_irq_save(flags); | ||
725 | |||
726 | /* | 726 | /* |
727 | * We can't take a PMU exception inside _switch() since there is a | 727 | * We can't take a PMU exception inside _switch() since there is a |
728 | * window where the kernel stack SLB and the kernel stack are out | 728 | * window where the kernel stack SLB and the kernel stack are out |
@@ -742,8 +742,6 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
742 | } | 742 | } |
743 | #endif /* CONFIG_PPC_BOOK3S_64 */ | 743 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
744 | 744 | ||
745 | local_irq_restore(flags); | ||
746 | |||
747 | return last; | 745 | return last; |
748 | } | 746 | } |
749 | 747 | ||
@@ -1008,6 +1006,11 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
1008 | p->thread.ptrace_bps[0] = NULL; | 1006 | p->thread.ptrace_bps[0] = NULL; |
1009 | #endif | 1007 | #endif |
1010 | 1008 | ||
1009 | p->thread.fp_save_area = NULL; | ||
1010 | #ifdef CONFIG_ALTIVEC | ||
1011 | p->thread.vr_save_area = NULL; | ||
1012 | #endif | ||
1013 | |||
1011 | #ifdef CONFIG_PPC_STD_MMU_64 | 1014 | #ifdef CONFIG_PPC_STD_MMU_64 |
1012 | if (mmu_has_feature(MMU_FTR_SLB)) { | 1015 | if (mmu_has_feature(MMU_FTR_SLB)) { |
1013 | unsigned long sp_vsid; | 1016 | unsigned long sp_vsid; |
@@ -1113,12 +1116,12 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp) | |||
1113 | #ifdef CONFIG_VSX | 1116 | #ifdef CONFIG_VSX |
1114 | current->thread.used_vsr = 0; | 1117 | current->thread.used_vsr = 0; |
1115 | #endif | 1118 | #endif |
1116 | memset(current->thread.fpr, 0, sizeof(current->thread.fpr)); | 1119 | memset(¤t->thread.fp_state, 0, sizeof(current->thread.fp_state)); |
1117 | current->thread.fpscr.val = 0; | 1120 | current->thread.fp_save_area = NULL; |
1118 | #ifdef CONFIG_ALTIVEC | 1121 | #ifdef CONFIG_ALTIVEC |
1119 | memset(current->thread.vr, 0, sizeof(current->thread.vr)); | 1122 | memset(¤t->thread.vr_state, 0, sizeof(current->thread.vr_state)); |
1120 | memset(¤t->thread.vscr, 0, sizeof(current->thread.vscr)); | 1123 | current->thread.vr_state.vscr.u[3] = 0x00010000; /* Java mode disabled */ |
1121 | current->thread.vscr.u[3] = 0x00010000; /* Java mode disabled */ | 1124 | current->thread.vr_save_area = NULL; |
1122 | current->thread.vrsave = 0; | 1125 | current->thread.vrsave = 0; |
1123 | current->thread.used_vr = 0; | 1126 | current->thread.used_vr = 0; |
1124 | #endif /* CONFIG_ALTIVEC */ | 1127 | #endif /* CONFIG_ALTIVEC */ |