diff options
| -rw-r--r-- | arch/parisc/kernel/syscall.S | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 40190dbecdc0..deec1f8465e5 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
| @@ -106,8 +106,6 @@ linux_gateway_entry: | |||
| 106 | mtsp %r0,%sr4 /* get kernel space into sr4 */ | 106 | mtsp %r0,%sr4 /* get kernel space into sr4 */ |
| 107 | mtsp %r0,%sr5 /* get kernel space into sr5 */ | 107 | mtsp %r0,%sr5 /* get kernel space into sr5 */ |
| 108 | mtsp %r0,%sr6 /* get kernel space into sr6 */ | 108 | mtsp %r0,%sr6 /* get kernel space into sr6 */ |
| 109 | mfsp %sr7,%r1 /* save user sr7 */ | ||
| 110 | mtsp %r1,%sr3 /* and store it in sr3 */ | ||
| 111 | 109 | ||
| 112 | #ifdef CONFIG_64BIT | 110 | #ifdef CONFIG_64BIT |
| 113 | /* for now we can *always* set the W bit on entry to the syscall | 111 | /* for now we can *always* set the W bit on entry to the syscall |
| @@ -133,6 +131,14 @@ linux_gateway_entry: | |||
| 133 | depdi 0, 31, 32, %r21 | 131 | depdi 0, 31, 32, %r21 |
| 134 | 1: | 132 | 1: |
| 135 | #endif | 133 | #endif |
| 134 | |||
| 135 | /* We use a rsm/ssm pair to prevent sr3 from being clobbered | ||
| 136 | * by external interrupts. | ||
| 137 | */ | ||
| 138 | mfsp %sr7,%r1 /* save user sr7 */ | ||
| 139 | rsm PSW_SM_I, %r0 /* disable interrupts */ | ||
| 140 | mtsp %r1,%sr3 /* and store it in sr3 */ | ||
| 141 | |||
| 136 | mfctl %cr30,%r1 | 142 | mfctl %cr30,%r1 |
| 137 | xor %r1,%r30,%r30 /* ye olde xor trick */ | 143 | xor %r1,%r30,%r30 /* ye olde xor trick */ |
| 138 | xor %r1,%r30,%r1 | 144 | xor %r1,%r30,%r1 |
| @@ -147,6 +153,7 @@ linux_gateway_entry: | |||
| 147 | */ | 153 | */ |
| 148 | 154 | ||
| 149 | mtsp %r0,%sr7 /* get kernel space into sr7 */ | 155 | mtsp %r0,%sr7 /* get kernel space into sr7 */ |
| 156 | ssm PSW_SM_I, %r0 /* enable interrupts */ | ||
| 150 | STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */ | 157 | STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */ |
| 151 | mfctl %cr30,%r1 /* get task ptr in %r1 */ | 158 | mfctl %cr30,%r1 /* get task ptr in %r1 */ |
| 152 | LDREG TI_TASK(%r1),%r1 | 159 | LDREG TI_TASK(%r1),%r1 |
