mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-03 13:04:01 +00:00
Xtensa patchset for v3.12-rc6
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJSXuCxAAoJEI9vqH3mFV2sdWwP/11xVQFtzoT01k9P4fZeFCMT +dGztMBY6bODMEyeC9raX6sJhuOYNivS2IBFJ4qv9p+kcCplYE0EsB3MfOQ60NdV eV2DdnHrPKgIPUutGf7mcZ5bXB8q8HEuEFn0ONsCdNTAxzrcLxaPZU3MeGhSfL0H d/RPPmSW8+vLEMWUe58EB2J8Z1DJye4O0pbxskjGA64KrLssKBG3LWBQBdTsihkE r2olYYT0j7osJ7loLbyll/CcacQTfJbQT8Xd0Y7MbLYR/G6EVMwb6PkzkFnUPMIQ zLwMAOgL8/E250p4ab0Wy8vf9rW+938qR93oZEyO8TRDdF/mYNQb+GK+ZKUrMrxg eZ/pOhKQ+xUKtt23xrvbXR3nTnI9AfiJ1nhuO4UmX5WIhyJXDcYYk+rujlEduxGm IJ7p5cRWBdqC+iIiSzQJjyW4drIXU6QJ+ureOGo0vBcBJsLRbUFYLt+08Rb60/d1 zgS8L7DpKRUZlIrbD6/HxyUimJCTGERsvTSDZYCYs1+ri/YKV4a8Ukfsl8bWLbhd Le5PyMeusWaM6MHCIOJPys2SpsKGl9UCaVr7Nz1Lr6HIqZJUN61rNVSIcUpufiqt hPSYtljmz6746Z6QvNW0OD8+qE5foplCnv94Oqj9tb24gHfINPXkjiaEKhPDICi0 6cCQj4pCsjjlzXXmn5Fp =sopZ -----END PGP SIGNATURE----- Merge tag 'xtensa-next-20131015' of git://github.com/czankel/xtensa-linux Pull Xtensa patchset from Chris Zankel: "The main patch fixes a bug that can cause a kernel panic, and was introduced in rc1. The other two have been discovered by a uclibc test and 'coccinelle'" * tag 'xtensa-next-20131015' of git://github.com/czankel/xtensa-linux: xtensa: Cocci spatch "noderef" xtensa: don't use alternate signal stack on threads xtensa: fix fast_syscall_spill_registers_fixup
This commit is contained in:
commit
c9ca72fc56
3 changed files with 33 additions and 21 deletions
|
@ -1122,7 +1122,7 @@ ENDPROC(fast_syscall_spill_registers)
|
||||||
* a3: exctable, original value in excsave1
|
* a3: exctable, original value in excsave1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fast_syscall_spill_registers_fixup:
|
ENTRY(fast_syscall_spill_registers_fixup)
|
||||||
|
|
||||||
rsr a2, windowbase # get current windowbase (a2 is saved)
|
rsr a2, windowbase # get current windowbase (a2 is saved)
|
||||||
xsr a0, depc # restore depc and a0
|
xsr a0, depc # restore depc and a0
|
||||||
|
@ -1134,22 +1134,26 @@ fast_syscall_spill_registers_fixup:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
xsr a3, excsave1 # get spill-mask
|
xsr a3, excsave1 # get spill-mask
|
||||||
slli a2, a3, 1 # shift left by one
|
slli a3, a3, 1 # shift left by one
|
||||||
|
|
||||||
slli a3, a2, 32-WSBITS
|
slli a2, a3, 32-WSBITS
|
||||||
src a2, a2, a3 # a1 = xxwww1yyxxxwww1yy......
|
src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy......
|
||||||
wsr a2, windowstart # set corrected windowstart
|
wsr a2, windowstart # set corrected windowstart
|
||||||
|
|
||||||
rsr a3, excsave1
|
srli a3, a3, 1
|
||||||
l32i a2, a3, EXC_TABLE_DOUBLE_SAVE # restore a2
|
rsr a2, excsave1
|
||||||
l32i a3, a3, EXC_TABLE_PARAM # original WB (in user task)
|
l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2
|
||||||
|
xsr a2, excsave1
|
||||||
|
s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3
|
||||||
|
l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task)
|
||||||
|
xsr a2, excsave1
|
||||||
|
|
||||||
/* Return to the original (user task) WINDOWBASE.
|
/* Return to the original (user task) WINDOWBASE.
|
||||||
* We leave the following frame behind:
|
* We leave the following frame behind:
|
||||||
* a0, a1, a2 same
|
* a0, a1, a2 same
|
||||||
* a3: trashed (saved in excsave_1)
|
* a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE)
|
||||||
* depc: depc (we have to return to that address)
|
* depc: depc (we have to return to that address)
|
||||||
* excsave_1: a3
|
* excsave_1: exctable
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wsr a3, windowbase
|
wsr a3, windowbase
|
||||||
|
@ -1159,9 +1163,9 @@ fast_syscall_spill_registers_fixup:
|
||||||
* a0: return address
|
* a0: return address
|
||||||
* a1: used, stack pointer
|
* a1: used, stack pointer
|
||||||
* a2: kernel stack pointer
|
* a2: kernel stack pointer
|
||||||
* a3: available, saved in EXCSAVE_1
|
* a3: available
|
||||||
* depc: exception address
|
* depc: exception address
|
||||||
* excsave: a3
|
* excsave: exctable
|
||||||
* Note: This frame might be the same as above.
|
* Note: This frame might be the same as above.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -1181,9 +1185,12 @@ fast_syscall_spill_registers_fixup:
|
||||||
rsr a0, exccause
|
rsr a0, exccause
|
||||||
addx4 a0, a0, a3 # find entry in table
|
addx4 a0, a0, a3 # find entry in table
|
||||||
l32i a0, a0, EXC_TABLE_FAST_USER # load handler
|
l32i a0, a0, EXC_TABLE_FAST_USER # load handler
|
||||||
|
l32i a3, a3, EXC_TABLE_DOUBLE_SAVE
|
||||||
jx a0
|
jx a0
|
||||||
|
|
||||||
fast_syscall_spill_registers_fixup_return:
|
ENDPROC(fast_syscall_spill_registers_fixup)
|
||||||
|
|
||||||
|
ENTRY(fast_syscall_spill_registers_fixup_return)
|
||||||
|
|
||||||
/* When we return here, all registers have been restored (a2: DEPC) */
|
/* When we return here, all registers have been restored (a2: DEPC) */
|
||||||
|
|
||||||
|
@ -1191,13 +1198,13 @@ fast_syscall_spill_registers_fixup_return:
|
||||||
|
|
||||||
/* Restore fixup handler. */
|
/* Restore fixup handler. */
|
||||||
|
|
||||||
xsr a3, excsave1
|
rsr a2, excsave1
|
||||||
movi a2, fast_syscall_spill_registers_fixup
|
s32i a3, a2, EXC_TABLE_DOUBLE_SAVE
|
||||||
s32i a2, a3, EXC_TABLE_FIXUP
|
movi a3, fast_syscall_spill_registers_fixup
|
||||||
s32i a0, a3, EXC_TABLE_DOUBLE_SAVE
|
s32i a3, a2, EXC_TABLE_FIXUP
|
||||||
rsr a2, windowbase
|
rsr a3, windowbase
|
||||||
s32i a2, a3, EXC_TABLE_PARAM
|
s32i a3, a2, EXC_TABLE_PARAM
|
||||||
l32i a2, a3, EXC_TABLE_KSTK
|
l32i a2, a2, EXC_TABLE_KSTK
|
||||||
|
|
||||||
/* Load WB at the time the exception occurred. */
|
/* Load WB at the time the exception occurred. */
|
||||||
|
|
||||||
|
@ -1206,8 +1213,12 @@ fast_syscall_spill_registers_fixup_return:
|
||||||
wsr a3, windowbase
|
wsr a3, windowbase
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
|
rsr a3, excsave1
|
||||||
|
l32i a3, a3, EXC_TABLE_DOUBLE_SAVE
|
||||||
|
|
||||||
rfde
|
rfde
|
||||||
|
|
||||||
|
ENDPROC(fast_syscall_spill_registers_fixup_return)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* spill all registers.
|
* spill all registers.
|
||||||
|
|
|
@ -341,7 +341,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
|
|
||||||
sp = regs->areg[1];
|
sp = regs->areg[1];
|
||||||
|
|
||||||
if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! on_sig_stack(sp)) {
|
if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && sas_ss_flags(sp) == 0) {
|
||||||
sp = current->sas_ss_sp + current->sas_ss_size;
|
sp = current->sas_ss_sp + current->sas_ss_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -737,7 +737,8 @@ static int __init iss_net_setup(char *str)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((new = alloc_bootmem(sizeof new)) == NULL) {
|
new = alloc_bootmem(sizeof(*new));
|
||||||
|
if (new == NULL) {
|
||||||
printk("Alloc_bootmem failed\n");
|
printk("Alloc_bootmem failed\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue