Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Add support for context switching the TAR register

This patch adds support for enabling and context switching the Target
Address Register in Power8. The TAR is a new special purpose register
that can be used for computed branches with the bctar[l] (branch
conditional to TAR) instruction in the same manner as the count and link
registers.

Signed-off-by: Ian Munsie <imunsie@au1.ibm.com>
Signed-off-by: Matt Evans <matt@ozlabs.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Ian Munsie and committed by
Benjamin Herrenschmidt
2468dcf6 14b6f00f

+38 -1
+1 -1
arch/powerpc/include/asm/cputable.h
··· 414 414 CPU_FTR_DSCR | CPU_FTR_SAO | \ 415 415 CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ 416 416 CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | CPU_FTR_VMX_COPY | \ 417 - CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR) 417 + CPU_FTR_DBELL | CPU_FTR_HAS_PPR | CPU_FTR_DAWR | CPU_FTR_BCTAR) 418 418 #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ 419 419 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ 420 420 CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
+3
arch/powerpc/include/asm/processor.h
··· 257 257 int dscr_inherit; 258 258 unsigned long ppr; /* used to save/restore SMT priority */ 259 259 #endif 260 + #ifdef CONFIG_PPC_BOOK3S_64 261 + unsigned long tar; 262 + #endif 260 263 }; 261 264 262 265 #define ARCH_MIN_TASKALIGN 16
+3
arch/powerpc/include/asm/reg.h
··· 237 237 #define SPRN_HRMOR 0x139 /* Real mode offset register */ 238 238 #define SPRN_HSRR0 0x13A /* Hypervisor Save/Restore 0 */ 239 239 #define SPRN_HSRR1 0x13B /* Hypervisor Save/Restore 1 */ 240 + #define SPRN_FSCR 0x099 /* Facility Status & Control Register */ 241 + #define FSCR_TAR (1<<8) /* Enable Target Adress Register */ 242 + #define SPRN_TAR 0x32f /* Target Address Register */ 240 243 #define SPRN_LPCR 0x13E /* LPAR Control Register */ 241 244 #define LPCR_VPM0 (1ul << (63-0)) 242 245 #define LPCR_VPM1 (1ul << (63-1))
+4
arch/powerpc/kernel/asm-offsets.c
··· 122 122 DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu)); 123 123 #endif 124 124 125 + #ifdef CONFIG_PPC_BOOK3S_64 126 + DEFINE(THREAD_TAR, offsetof(struct thread_struct, tar)); 127 + #endif 128 + 125 129 DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); 126 130 DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags)); 127 131 DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
+7
arch/powerpc/kernel/cpu_setup_power.S
··· 56 56 mfspr r3,SPRN_LPCR 57 57 oris r3, r3, LPCR_AIL_3@h 58 58 bl __init_LPCR 59 + bl __init_FSCR 59 60 bl __init_TLB 60 61 mtlr r11 61 62 blr ··· 111 110 rldimi r3,r5, LPCR_VRMASD_SH, 64-LPCR_VRMASD_SH-5 112 111 mtspr SPRN_LPCR,r3 113 112 isync 113 + blr 114 + 115 + __init_FSCR: 116 + mfspr r3,SPRN_FSCR 117 + ori r3,r3,FSCR_TAR 118 + mtspr SPRN_FSCR,r3 114 119 blr 115 120 116 121 __init_TLB:
+20
arch/powerpc/kernel/entry_64.S
··· 448 448 std r23,_CCR(r1) 449 449 std r1,KSP(r3) /* Set old stack pointer */ 450 450 451 + #ifdef CONFIG_PPC_BOOK3S_64 452 + BEGIN_FTR_SECTION 453 + /* 454 + * Back up the TAR across context switches. Note that the TAR is not 455 + * available for use in the kernel. (To provide this, the TAR should 456 + * be backed up/restored on exception entry/exit instead, and be in 457 + * pt_regs. FIXME, this should be in pt_regs anyway (for debug).) 458 + */ 459 + mfspr r0,SPRN_TAR 460 + std r0,THREAD_TAR(r3) 461 + END_FTR_SECTION_IFSET(CPU_FTR_BCTAR) 462 + #endif 463 + 451 464 #ifdef CONFIG_SMP 452 465 /* We need a sync somewhere here to make sure that if the 453 466 * previous task gets rescheduled on another CPU, it sees all ··· 542 529 543 530 mr r1,r8 /* start using new stack pointer */ 544 531 std r7,PACAKSAVE(r13) 532 + 533 + #ifdef CONFIG_PPC_BOOK3S_64 534 + BEGIN_FTR_SECTION 535 + ld r0,THREAD_TAR(r4) 536 + mtspr SPRN_TAR,r0 537 + END_FTR_SECTION_IFSET(CPU_FTR_BCTAR) 538 + #endif 545 539 546 540 #ifdef CONFIG_ALTIVEC 547 541 BEGIN_FTR_SECTION