powerpc: Save the TAR register earlier
This moves us to save the Target Address Register (TAR) a earlier in __switch_to. It introduces a new function save_tar() to do this. We need to save the TAR earlier as we will overwrite it in the transactional memory reclaim/recheckpoint path. We are going to do this in a subsequent patch which will fix saving the TAR register when it's modified inside a transaction. Signed-off-by: Michael Neuling <mikey@neuling.org> Cc: <stable@vger.kernel.org> [v3.10] Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
2517617e0d
commit
c2d52644e2
|
@ -15,6 +15,15 @@ extern struct task_struct *__switch_to(struct task_struct *,
|
||||||
struct thread_struct;
|
struct thread_struct;
|
||||||
extern struct task_struct *_switch(struct thread_struct *prev,
|
extern struct task_struct *_switch(struct thread_struct *prev,
|
||||||
struct thread_struct *next);
|
struct thread_struct *next);
|
||||||
|
#ifdef CONFIG_PPC_BOOK3S_64
|
||||||
|
static inline void save_tar(struct thread_struct *prev)
|
||||||
|
{
|
||||||
|
if (cpu_has_feature(CPU_FTR_ARCH_207S))
|
||||||
|
prev->tar = mfspr(SPRN_TAR);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void save_tar(struct thread_struct *prev) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void giveup_fpu(struct task_struct *);
|
extern void giveup_fpu(struct task_struct *);
|
||||||
extern void load_up_fpu(void);
|
extern void load_up_fpu(void);
|
||||||
|
|
|
@ -449,15 +449,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_DSCR)
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_BOOK3S_64
|
#ifdef CONFIG_PPC_BOOK3S_64
|
||||||
BEGIN_FTR_SECTION
|
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 */
|
/* Event based branch registers */
|
||||||
mfspr r0, SPRN_BESCR
|
mfspr r0, SPRN_BESCR
|
||||||
std r0, THREAD_BESCR(r3)
|
std r0, THREAD_BESCR(r3)
|
||||||
|
|
|
@ -600,6 +600,16 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||||
struct ppc64_tlb_batch *batch;
|
struct ppc64_tlb_batch *batch;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* 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).)
|
||||||
|
* Save the TAR here before we do treclaim/trecheckpoint as these
|
||||||
|
* will change the TAR.
|
||||||
|
*/
|
||||||
|
save_tar(&prev->thread);
|
||||||
|
|
||||||
__switch_to_tm(prev);
|
__switch_to_tm(prev);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
Loading…
Reference in New Issue