Skip to content

Commit

Permalink
xtensa: save and restore scompare1 SR on kernel entry
Browse files Browse the repository at this point in the history
Although scompare1 may be saved/restored by xchal_ncp_{load,store}
macros, explicit save/restore of registers manipulated by the kernel
itself is considered more correct.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Chris Zankel <chris@zankel.net>
  • Loading branch information
Max Filippov authored and Chris Zankel committed Dec 19, 2012
1 parent 2f6ea6a commit 733536b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
2 changes: 1 addition & 1 deletion arch/xtensa/include/asm/ptrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ struct pt_regs {
unsigned long windowstart; /* 52 */
unsigned long syscall; /* 56 */
unsigned long icountlevel; /* 60 */
int reserved[1]; /* 64 */
unsigned long scompare1; /* 64 */

/* Additional configurable registers that are used by the compiler. */
xtregs_opt_t xtregs_opt;
Expand Down
1 change: 1 addition & 0 deletions arch/xtensa/kernel/asm-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ int main(void)
DEFINE(PT_SAR, offsetof (struct pt_regs, sar));
DEFINE(PT_ICOUNTLEVEL, offsetof (struct pt_regs, icountlevel));
DEFINE(PT_SYSCALL, offsetof (struct pt_regs, syscall));
DEFINE(PT_SCOMPARE1, offsetof(struct pt_regs, scompare1));
DEFINE(PT_AREG, offsetof (struct pt_regs, areg[0]));
DEFINE(PT_AREG0, offsetof (struct pt_regs, areg[0]));
DEFINE(PT_AREG1, offsetof (struct pt_regs, areg[1]));
Expand Down
13 changes: 13 additions & 0 deletions arch/xtensa/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,13 @@ common_exception:
s32i a2, a1, PT_LBEG
s32i a3, a1, PT_LEND

/* Save SCOMPARE1 */

#if XCHAL_HAVE_S32C1I
rsr a2, scompare1
s32i a2, a1, PT_SCOMPARE1
#endif

/* Save optional registers. */

save_xtregs_opt a1 a2 a4 a5 a6 a7 PT_XTREGS_OPT
Expand Down Expand Up @@ -433,6 +440,12 @@ common_exception_return:

load_xtregs_opt a1 a2 a4 a5 a6 a7 PT_XTREGS_OPT

/* Restore SCOMPARE1 */

#if XCHAL_HAVE_S32C1I
l32i a2, a1, PT_SCOMPARE1
wsr a2, scompare1
#endif
wsr a3, ps /* disable interrupts */

_bbci.l a3, PS_UM_BIT, kernel_exception_exit
Expand Down

0 comments on commit 733536b

Please sign in to comment.