Skip to content

Commit 2468dcf

Browse files
Ian Munsieozbenh
authored andcommitted
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>
1 parent 14b6f00 commit 2468dcf

File tree

6 files changed

+38
-1
lines changed

6 files changed

+38
-1
lines changed

arch/powerpc/include/asm/cputable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ extern const char *powerpc_base_platform;
414414
CPU_FTR_DSCR | CPU_FTR_SAO | \
415415
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
416416
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)
418418
#define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
419419
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
420420
CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \

arch/powerpc/include/asm/processor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@ struct thread_struct {
257257
int dscr_inherit;
258258
unsigned long ppr; /* used to save/restore SMT priority */
259259
#endif
260+
#ifdef CONFIG_PPC_BOOK3S_64
261+
unsigned long tar;
262+
#endif
260263
};
261264

262265
#define ARCH_MIN_TASKALIGN 16

arch/powerpc/include/asm/reg.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@
237237
#define SPRN_HRMOR 0x139 /* Real mode offset register */
238238
#define SPRN_HSRR0 0x13A /* Hypervisor Save/Restore 0 */
239239
#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 */
240243
#define SPRN_LPCR 0x13E /* LPAR Control Register */
241244
#define LPCR_VPM0 (1ul << (63-0))
242245
#define LPCR_VPM1 (1ul << (63-1))

arch/powerpc/kernel/asm-offsets.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ int main(void)
122122
DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu));
123123
#endif
124124

125+
#ifdef CONFIG_PPC_BOOK3S_64
126+
DEFINE(THREAD_TAR, offsetof(struct thread_struct, tar));
127+
#endif
128+
125129
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
126130
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
127131
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));

arch/powerpc/kernel/cpu_setup_power.S

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ _GLOBAL(__setup_cpu_power8)
5656
mfspr r3,SPRN_LPCR
5757
oris r3, r3, LPCR_AIL_3@h
5858
bl __init_LPCR
59+
bl __init_FSCR
5960
bl __init_TLB
6061
mtlr r11
6162
blr
@@ -112,6 +113,12 @@ __init_LPCR:
112113
isync
113114
blr
114115

116+
__init_FSCR:
117+
mfspr r3,SPRN_FSCR
118+
ori r3,r3,FSCR_TAR
119+
mtspr SPRN_FSCR,r3
120+
blr
121+
115122
__init_TLB:
116123
/* Clear the TLB */
117124
li r6,128

arch/powerpc/kernel/entry_64.S

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,19 @@ END_FTR_SECTION_IFSET(CPU_FTR_DSCR)
448448
std r23,_CCR(r1)
449449
std r1,KSP(r3) /* Set old stack pointer */
450450

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+
451464
#ifdef CONFIG_SMP
452465
/* We need a sync somewhere here to make sure that if the
453466
* previous task gets rescheduled on another CPU, it sees all
@@ -530,6 +543,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
530543
mr r1,r8 /* start using new stack pointer */
531544
std r7,PACAKSAVE(r13)
532545

546+
#ifdef CONFIG_PPC_BOOK3S_64
547+
BEGIN_FTR_SECTION
548+
ld r0,THREAD_TAR(r4)
549+
mtspr SPRN_TAR,r0
550+
END_FTR_SECTION_IFSET(CPU_FTR_BCTAR)
551+
#endif
552+
533553
#ifdef CONFIG_ALTIVEC
534554
BEGIN_FTR_SECTION
535555
ld r0,THREAD_VRSAVE(r4)

0 commit comments

Comments
 (0)