diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-08-11 15:12:39 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-08-11 15:12:39 -0400 |
| commit | 77f63b4da4b69f65c17c45e797ddb3013b889df9 (patch) | |
| tree | a3156a3bb0dc464bbed41fa289991aa8a38103e9 | |
| parent | 30b229bdd88445c550efbeb076ffaa251eb05364 (diff) | |
| parent | 28e61cc466d8daace4b0f04ba2b83e0bd68f5832 (diff) | |
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
Pull powerpc fixes from Ben Herrenschmidt:
"This includes small series from Michael Neuling to fix a couple of
nasty remaining problems with the new Power8 support, also targeted at
stable 3.10, without which some new userspace accessible registers
aren't properly context switched, and in some case, can be clobbered
by the user of transactional memory.
Along with that, a few slightly more minor things, such as a missing
Kconfig option to enable handling of denorm exceptions when not
running under a hypervisor (or userspace will randomly crash when
hitting denorms with the vector unit), some nasty bugs in the new
pstore oops code, and other simple bug fixes worth having in now.
Note: I picked up the two powerpc KVM fixes as Alex Graf asked me to
handle KVM bits while he is on vacation. However I'll let him decide
whether they should go to -stable or not when he is back"
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
powerpc/tm: Fix context switching TAR, PPR and DSCR SPRs
powerpc: Save the TAR register earlier
powerpc: Fix context switch DSCR on POWER8
powerpc: Rework setting up H/FSCR bit definitions
powerpc: Fix hypervisor facility unavaliable vector number
powerpc/kvm/book3s_pr: Return appropriate error when allocation fails
powerpc/kvm: Add signed type cast for comparation
powerpc/eeh: Add missing procfs entry for PowerNV
powerpc/pseries: Add backward compatibilty to read old kernel oops-log
powerpc/pseries: Fix buffer overflow when reading from pstore
powerpc: On POWERNV enable PPC_DENORMALISATION by default
| -rw-r--r-- | arch/powerpc/Kconfig | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/processor.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/reg.h | 31 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/switch_to.h | 9 | ||||
| -rw-r--r-- | arch/powerpc/kernel/asm-offsets.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/eeh.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/entry_64.S | 36 | ||||
| -rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/process.c | 10 | ||||
| -rw-r--r-- | arch/powerpc/kernel/tm.S | 20 | ||||
| -rw-r--r-- | arch/powerpc/kernel/traps.c | 58 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/kvm/book3s_pr.c | 5 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/nvram.c | 80 |
14 files changed, 170 insertions, 99 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 3bf72cd2c8fc..dbd9d3c991e8 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -566,7 +566,7 @@ config SCHED_SMT | |||
| 566 | config PPC_DENORMALISATION | 566 | config PPC_DENORMALISATION |
| 567 | bool "PowerPC denormalisation exception handling" | 567 | bool "PowerPC denormalisation exception handling" |
| 568 | depends on PPC_BOOK3S_64 | 568 | depends on PPC_BOOK3S_64 |
| 569 | default "n" | 569 | default "y" if PPC_POWERNV |
| 570 | ---help--- | 570 | ---help--- |
| 571 | Add support for handling denormalisation of single precision | 571 | Add support for handling denormalisation of single precision |
| 572 | values. Useful for bare metal only. If unsure say Y here. | 572 | values. Useful for bare metal only. If unsure say Y here. |
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 47a35b08b963..e378cccfca55 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
| @@ -247,6 +247,10 @@ struct thread_struct { | |||
| 247 | unsigned long tm_orig_msr; /* Thread's MSR on ctx switch */ | 247 | unsigned long tm_orig_msr; /* Thread's MSR on ctx switch */ |
| 248 | struct pt_regs ckpt_regs; /* Checkpointed registers */ | 248 | struct pt_regs ckpt_regs; /* Checkpointed registers */ |
| 249 | 249 | ||
| 250 | unsigned long tm_tar; | ||
| 251 | unsigned long tm_ppr; | ||
| 252 | unsigned long tm_dscr; | ||
| 253 | |||
| 250 | /* | 254 | /* |
| 251 | * Transactional FP and VSX 0-31 register set. | 255 | * Transactional FP and VSX 0-31 register set. |
| 252 | * NOTE: the sense of these is the opposite of the integer ckpt_regs! | 256 | * NOTE: the sense of these is the opposite of the integer ckpt_regs! |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index a6840e4e24f7..99222e27f173 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
| @@ -254,19 +254,28 @@ | |||
| 254 | #define SPRN_HRMOR 0x139 /* Real mode offset register */ | 254 | #define SPRN_HRMOR 0x139 /* Real mode offset register */ |
| 255 | #define SPRN_HSRR0 0x13A /* Hypervisor Save/Restore 0 */ | 255 | #define SPRN_HSRR0 0x13A /* Hypervisor Save/Restore 0 */ |
| 256 | #define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */ | 256 | #define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */ |
| 257 | /* HFSCR and FSCR bit numbers are the same */ | ||
| 258 | #define FSCR_TAR_LG 8 /* Enable Target Address Register */ | ||
| 259 | #define FSCR_EBB_LG 7 /* Enable Event Based Branching */ | ||
| 260 | #define FSCR_TM_LG 5 /* Enable Transactional Memory */ | ||
| 261 | #define FSCR_PM_LG 4 /* Enable prob/priv access to PMU SPRs */ | ||
| 262 | #define FSCR_BHRB_LG 3 /* Enable Branch History Rolling Buffer*/ | ||
| 263 | #define FSCR_DSCR_LG 2 /* Enable Data Stream Control Register */ | ||
| 264 | #define FSCR_VECVSX_LG 1 /* Enable VMX/VSX */ | ||
| 265 | #define FSCR_FP_LG 0 /* Enable Floating Point */ | ||
| 257 | #define SPRN_FSCR 0x099 /* Facility Status & Control Register */ | 266 | #define SPRN_FSCR 0x099 /* Facility Status & Control Register */ |
| 258 | #define FSCR_TAR (1 << (63-55)) /* Enable Target Address Register */ | 267 | #define FSCR_TAR __MASK(FSCR_TAR_LG) |
| 259 | #define FSCR_EBB (1 << (63-56)) /* Enable Event Based Branching */ | 268 | #define FSCR_EBB __MASK(FSCR_EBB_LG) |
| 260 | #define FSCR_DSCR (1 << (63-61)) /* Enable Data Stream Control Register */ | 269 | #define FSCR_DSCR __MASK(FSCR_DSCR_LG) |
| 261 | #define SPRN_HFSCR 0xbe /* HV=1 Facility Status & Control Register */ | 270 | #define SPRN_HFSCR 0xbe /* HV=1 Facility Status & Control Register */ |
| 262 | #define HFSCR_TAR (1 << (63-55)) /* Enable Target Address Register */ | 271 | #define HFSCR_TAR __MASK(FSCR_TAR_LG) |
| 263 | #define HFSCR_EBB (1 << (63-56)) /* Enable Event Based Branching */ | 272 | #define HFSCR_EBB __MASK(FSCR_EBB_LG) |
| 264 | #define HFSCR_TM (1 << (63-58)) /* Enable Transactional Memory */ | 273 | #define HFSCR_TM __MASK(FSCR_TM_LG) |
| 265 | #define HFSCR_PM (1 << (63-60)) /* Enable prob/priv access to PMU SPRs */ | 274 | #define HFSCR_PM __MASK(FSCR_PM_LG) |
| 266 | #define HFSCR_BHRB (1 << (63-59)) /* Enable Branch History Rolling Buffer*/ | 275 | #define HFSCR_BHRB __MASK(FSCR_BHRB_LG) |
| 267 | #define HFSCR_DSCR (1 << (63-61)) /* Enable Data Stream Control Register */ | 276 | #define HFSCR_DSCR __MASK(FSCR_DSCR_LG) |
| 268 | #define HFSCR_VECVSX (1 << (63-62)) /* Enable VMX/VSX */ | 277 | #define HFSCR_VECVSX __MASK(FSCR_VECVSX_LG) |
| 269 | #define HFSCR_FP (1 << (63-63)) /* Enable Floating Point */ | 278 | #define HFSCR_FP __MASK(FSCR_FP_LG) |
| 270 | #define SPRN_TAR 0x32f /* Target Address Register */ | 279 | #define SPRN_TAR 0x32f /* Target Address Register */ |
| 271 | #define SPRN_LPCR 0x13E /* LPAR Control Register */ | 280 | #define SPRN_LPCR 0x13E /* LPAR Control Register */ |
| 272 | #define LPCR_VPM0 (1ul << (63-0)) | 281 | #define LPCR_VPM0 (1ul << (63-0)) |
diff --git a/arch/powerpc/include/asm/switch_to.h b/arch/powerpc/include/asm/switch_to.h index 49a13e0ef234..294c2cedcf7a 100644 --- a/arch/powerpc/include/asm/switch_to.h +++ b/arch/powerpc/include/asm/switch_to.h | |||
| @@ -15,6 +15,15 @@ extern struct task_struct *__switch_to(struct task_struct *, | |||
| 15 | struct thread_struct; | 15 | struct thread_struct; |
| 16 | extern struct task_struct *_switch(struct thread_struct *prev, | 16 | extern struct task_struct *_switch(struct thread_struct *prev, |
| 17 | struct thread_struct *next); | 17 | struct thread_struct *next); |
| 18 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
| 19 | static inline void save_tar(struct thread_struct *prev) | ||
| 20 | { | ||
| 21 | if (cpu_has_feature(CPU_FTR_ARCH_207S)) | ||
| 22 | prev->tar = mfspr(SPRN_TAR); | ||
| 23 | } | ||
| 24 | #else | ||
| 25 | static inline void save_tar(struct thread_struct *prev) {} | ||
| 26 | #endif | ||
| 18 | 27 | ||
| 19 | extern void giveup_fpu(struct task_struct *); | 28 | extern void giveup_fpu(struct task_struct *); |
| 20 | extern void load_up_fpu(void); | 29 | extern void load_up_fpu(void); |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index c7e8afc2ead0..8207459efe56 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
| @@ -138,6 +138,9 @@ int main(void) | |||
| 138 | DEFINE(THREAD_TM_TFHAR, offsetof(struct thread_struct, tm_tfhar)); | 138 | DEFINE(THREAD_TM_TFHAR, offsetof(struct thread_struct, tm_tfhar)); |
| 139 | DEFINE(THREAD_TM_TEXASR, offsetof(struct thread_struct, tm_texasr)); | 139 | DEFINE(THREAD_TM_TEXASR, offsetof(struct thread_struct, tm_texasr)); |
| 140 | DEFINE(THREAD_TM_TFIAR, offsetof(struct thread_struct, tm_tfiar)); | 140 | DEFINE(THREAD_TM_TFIAR, offsetof(struct thread_struct, tm_tfiar)); |
| 141 | DEFINE(THREAD_TM_TAR, offsetof(struct thread_struct, tm_tar)); | ||
| 142 | DEFINE(THREAD_TM_PPR, offsetof(struct thread_struct, tm_ppr)); | ||
| 143 | DEFINE(THREAD_TM_DSCR, offsetof(struct thread_struct, tm_dscr)); | ||
| 141 | DEFINE(PT_CKPT_REGS, offsetof(struct thread_struct, ckpt_regs)); | 144 | DEFINE(PT_CKPT_REGS, offsetof(struct thread_struct, ckpt_regs)); |
| 142 | DEFINE(THREAD_TRANSACT_VR0, offsetof(struct thread_struct, | 145 | DEFINE(THREAD_TRANSACT_VR0, offsetof(struct thread_struct, |
| 143 | transact_vr[0])); | 146 | transact_vr[0])); |
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index ea9414c8088d..55593ee2d5aa 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c | |||
| @@ -1061,7 +1061,7 @@ static const struct file_operations proc_eeh_operations = { | |||
| 1061 | 1061 | ||
| 1062 | static int __init eeh_init_proc(void) | 1062 | static int __init eeh_init_proc(void) |
| 1063 | { | 1063 | { |
| 1064 | if (machine_is(pseries)) | 1064 | if (machine_is(pseries) || machine_is(powernv)) |
| 1065 | proc_create("powerpc/eeh", 0, NULL, &proc_eeh_operations); | 1065 | proc_create("powerpc/eeh", 0, NULL, &proc_eeh_operations); |
| 1066 | return 0; | 1066 | return 0; |
| 1067 | } | 1067 | } |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index ab15b8d057ad..2bd0b885b0fe 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -449,15 +449,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_DSCR) | |||
| 449 | 449 | ||
| 450 | #ifdef CONFIG_PPC_BOOK3S_64 | 450 | #ifdef CONFIG_PPC_BOOK3S_64 |
| 451 | BEGIN_FTR_SECTION | 451 | BEGIN_FTR_SECTION |
| 452 | /* | ||
| 453 | * Back up the TAR across context switches. Note that the TAR is not | ||
| 454 | * available for use in the kernel. (To provide this, the TAR should | ||
| 455 | * be backed up/restored on exception entry/exit instead, and be in | ||
| 456 | * pt_regs. FIXME, this should be in pt_regs anyway (for debug).) | ||
| 457 | */ | ||
| 458 | mfspr r0,SPRN_TAR | ||
| 459 | std r0,THREAD_TAR(r3) | ||
| 460 | |||
| 461 | /* Event based branch registers */ | 452 | /* Event based branch registers */ |
| 462 | mfspr r0, SPRN_BESCR | 453 | mfspr r0, SPRN_BESCR |
| 463 | std r0, THREAD_BESCR(r3) | 454 | std r0, THREAD_BESCR(r3) |
| @@ -584,9 +575,34 @@ BEGIN_FTR_SECTION | |||
| 584 | ld r7,DSCR_DEFAULT@toc(2) | 575 | ld r7,DSCR_DEFAULT@toc(2) |
| 585 | ld r0,THREAD_DSCR(r4) | 576 | ld r0,THREAD_DSCR(r4) |
| 586 | cmpwi r6,0 | 577 | cmpwi r6,0 |
| 578 | li r8, FSCR_DSCR | ||
| 587 | bne 1f | 579 | bne 1f |
| 588 | ld r0,0(r7) | 580 | ld r0,0(r7) |
| 589 | 1: cmpd r0,r25 | ||
