summaryrefslogtreecommitdiff
path: root/arch/parisc
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2016-11-15 17:02:38 -0800
committerDmitry Shmidt <dimitrysh@google.com>2016-11-15 17:02:38 -0800
commit324e88de4aba3b6d4e0453fb2adb094e4a53754c (patch)
treef961e8c1eb2bcdefec062e0b86d4b5f307caee1e /arch/parisc
parent93e3336909d88c3afca7ccdc8b009c435f37a70a (diff)
parent4dab3e4df9944782cb3c229bd37f5ea8b5f52bac (diff)
Merge tag 'v4.4.32' into android-4.4.y
This is the 4.4.32 stable release Change-Id: I5028402eadfcf055ac44a5e67abc6da75b2068b3
Diffstat (limited to 'arch/parisc')
-rw-r--r--arch/parisc/kernel/syscall.S11
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S
index fbafa0d0e2bf..a86b19fccb63 100644
--- a/arch/parisc/kernel/syscall.S
+++ b/arch/parisc/kernel/syscall.S
@@ -106,8 +106,6 @@ linux_gateway_entry:
mtsp %r0,%sr4 /* get kernel space into sr4 */
mtsp %r0,%sr5 /* get kernel space into sr5 */
mtsp %r0,%sr6 /* get kernel space into sr6 */
- mfsp %sr7,%r1 /* save user sr7 */
- mtsp %r1,%sr3 /* and store it in sr3 */
#ifdef CONFIG_64BIT
/* for now we can *always* set the W bit on entry to the syscall
@@ -133,6 +131,14 @@ linux_gateway_entry:
depdi 0, 31, 32, %r21
1:
#endif
+
+ /* We use a rsm/ssm pair to prevent sr3 from being clobbered
+ * by external interrupts.
+ */
+ mfsp %sr7,%r1 /* save user sr7 */
+ rsm PSW_SM_I, %r0 /* disable interrupts */
+ mtsp %r1,%sr3 /* and store it in sr3 */
+
mfctl %cr30,%r1
xor %r1,%r30,%r30 /* ye olde xor trick */
xor %r1,%r30,%r1
@@ -147,6 +153,7 @@ linux_gateway_entry:
*/
mtsp %r0,%sr7 /* get kernel space into sr7 */
+ ssm PSW_SM_I, %r0 /* enable interrupts */
STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */
mfctl %cr30,%r1 /* get task ptr in %r1 */
LDREG TI_TASK(%r1),%r1