xtensa: save and restore scompare1 SR on kernel entry
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>
This commit is contained in:
parent
2f6ea6a767
commit
733536b865
3 changed files with 15 additions and 1 deletions
|
@ -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;
|
||||
|
|
|
@ -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]));
|
||||
|
|
|
@ -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
|
||||
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue