Subject: [PATCH v2 3/4] powerpc: Save the TAR register earlier

From: Michael Neuling <[email-masked]>
Date: Thu, 8 Aug 2013 12:33:56 +1000

This moves us to use the save_tar() function to save the Target Address
Register (TAR) a lot earlier in __switch_to.

We need to save the TAR earlier as we may overwrite it in the transactional
memory reclaim/recheckpoint path.

Signed-off-by: Michael Neuling <[email-masked]>
Cc: <[email-masked]>
---
 arch/powerpc/kernel/entry_64.S | 9 ---------
 arch/powerpc/kernel/process.c  | 5 +++++
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index cfb6de4..08f2e2e 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -448,15 +448,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_DSCR)
 
 #ifdef CONFIG_PPC_BOOK3S_64
 BEGIN_FTR_SECTION
-	/*
-	 * Back up the TAR across context switches.  Note that the TAR is not
-	 * available for use in the kernel.  (To provide this, the TAR should
-	 * be backed up/restored on exception entry/exit instead, and be in
-	 * pt_regs.  FIXME, this should be in pt_regs anyway (for debug).)
-	 */
-	mfspr	r0,SPRN_TAR
-	std	r0,THREAD_TAR(r3)
-
 	/* Event based branch registers */
 	mfspr	r0, SPRN_BESCR
 	std	r0, THREAD_BESCR(r3)
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index c517dbe..4ef77df 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -600,6 +600,11 @@ struct task_struct *__switch_to(struct task_struct *prev,
 	struct ppc64_tlb_batch *batch;
 #endif
 
+	/* Save the tar before we do treclaim/trecheckpoint as these
+	 * will change the TAR
+	 */
+	save_tar(&prev->thread);
+
 	__switch_to_tm(prev);
 
 #ifdef CONFIG_SMP
-- 
1.8.1.2