Skip to content

Commit 28e61cc

Browse files
mikeyozbenh
authored andcommitted
powerpc/tm: Fix context switching TAR, PPR and DSCR SPRs
If a transaction is rolled back, the Target Address Register (TAR), Processor Priority Register (PPR) and Data Stream Control Register (DSCR) should be restored to the checkpointed values before the transaction began. Any changes to these SPRs inside the transaction should not be visible in the abort handler. Currently Linux doesn't save or restore the checkpointed TAR, PPR or DSCR. If we preempt a processes inside a transaction which has modified any of these, on process restore, that same transaction may be aborted we but we won't see the checkpointed versions of these SPRs. This adds checkpointed versions of these SPRs to the thread_struct and adds the save/restore of these three SPRs to the treclaim/trechkpt code. Without this if any of these SPRs are modified during a transaction, users may incorrectly see a speculated SPR value even if the transaction is aborted. Signed-off-by: Michael Neuling <[email protected]> Cc: <[email protected]> [v3.10] Signed-off-by: Benjamin Herrenschmidt <[email protected]>
1 parent c2d5264 commit 28e61cc

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

arch/powerpc/include/asm/processor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,10 @@ struct thread_struct {
247247
unsigned long tm_orig_msr; /* Thread's MSR on ctx switch */
248248
struct pt_regs ckpt_regs; /* Checkpointed registers */
249249

250+
unsigned long tm_tar;
251+
unsigned long tm_ppr;
252+
unsigned long tm_dscr;
253+
250254
/*
251255
* Transactional FP and VSX 0-31 register set.
252256
* NOTE: the sense of these is the opposite of the integer ckpt_regs!

arch/powerpc/kernel/asm-offsets.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ int main(void)
138138
DEFINE(THREAD_TM_TFHAR, offsetof(struct thread_struct, tm_tfhar));
139139
DEFINE(THREAD_TM_TEXASR, offsetof(struct thread_struct, tm_texasr));
140140
DEFINE(THREAD_TM_TFIAR, offsetof(struct thread_struct, tm_tfiar));
141+
DEFINE(THREAD_TM_TAR, offsetof(struct thread_struct, tm_tar));
142+
DEFINE(THREAD_TM_PPR, offsetof(struct thread_struct, tm_ppr));
143+
DEFINE(THREAD_TM_DSCR, offsetof(struct thread_struct, tm_dscr));
141144
DEFINE(PT_CKPT_REGS, offsetof(struct thread_struct, ckpt_regs));
142145
DEFINE(THREAD_TRANSACT_VR0, offsetof(struct thread_struct,
143146
transact_vr[0]));

arch/powerpc/kernel/tm.S

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,16 @@ dont_backup_fp:
233233
std r5, _CCR(r7)
234234
std r6, _XER(r7)
235235

236+
237+
/* ******************** TAR, PPR, DSCR ********** */
238+
mfspr r3, SPRN_TAR
239+
mfspr r4, SPRN_PPR
240+
mfspr r5, SPRN_DSCR
241+
242+
std r3, THREAD_TM_TAR(r12)
243+
std r4, THREAD_TM_PPR(r12)
244+
std r5, THREAD_TM_DSCR(r12)
245+
236246
/* MSR and flags: We don't change CRs, and we don't need to alter
237247
* MSR.
238248
*/
@@ -347,6 +357,16 @@ dont_restore_fp:
347357
mtmsr r6 /* FP/Vec off again! */
348358

349359
restore_gprs:
360+
361+
/* ******************** TAR, PPR, DSCR ********** */
362+
ld r4, THREAD_TM_TAR(r3)
363+
ld r5, THREAD_TM_PPR(r3)
364+
ld r6, THREAD_TM_DSCR(r3)
365+
366+
mtspr SPRN_TAR, r4
367+
mtspr SPRN_PPR, r5
368+
mtspr SPRN_DSCR, r6
369+
350370
/* ******************** CR,LR,CCR,MSR ********** */
351371
ld r3, _CTR(r7)
352372
ld r4, _LINK(r7)

0 commit comments

Comments
 (0)