File tree Expand file tree Collapse file tree 6 files changed +38
-1
lines changed Expand file tree Collapse file tree 6 files changed +38
-1
lines changed Original file line number Diff line number Diff 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 | \
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 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))
Original file line number Diff line number Diff 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 ));
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
534554BEGIN_FTR_SECTION
535555 ld r0,THREAD_VRSAVE(r4)
You can’t perform that action at this time.
0 commit comments