Commit f7df76e6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'parisc-4.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux

Pull parisc updates from Helge Deller:
 "The first three patches are trivial and add some required KERN_CONT,
  ignore the new pkey syscalls on parisc and use the LINUX_GATEWAY_ADDR
  define instead of hardcoded values.

  The two patches from Dave Anglin are important.

  The first one avoids trashing the sr2 and sr3 space registers in the
  Light-weight syscall path. Especially the usage of sr3 is critical
  since it may get trashed by the interrupt handler.

  The second patch is even more important and tagged for stable series.
  It protects one critical section in the syscall entry path by
  disabling local interrupts. Without disabling interrupts, the sr7
  space register may not be in sync with the current stack setup and
  thus an incoming hardware interrupt may destroy memory in random
  userspace areas"

* 'parisc-4.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
  parisc: Ignore the pkey system calls for now
  parisc: Use LINUX_GATEWAY_ADDR define instead of hardcoded value
  parisc: Ensure consistent state when switching to kernel stack at syscall entry
  parisc: Avoid trashing sr2 and sr3 in LWS code
  parisc: use KERN_CONT when printing device inventory
parents 577f12c0 18088db0
...@@ -368,7 +368,9 @@ ...@@ -368,7 +368,9 @@
#define __IGNORE_select /* newselect */ #define __IGNORE_select /* newselect */
#define __IGNORE_fadvise64 /* fadvise64_64 */ #define __IGNORE_fadvise64 /* fadvise64_64 */
#define __IGNORE_pkey_mprotect
#define __IGNORE_pkey_alloc
#define __IGNORE_pkey_free
#define LINUX_GATEWAY_ADDR 0x100 #define LINUX_GATEWAY_ADDR 0x100
......
...@@ -873,11 +873,11 @@ static void print_parisc_device(struct parisc_device *dev) ...@@ -873,11 +873,11 @@ static void print_parisc_device(struct parisc_device *dev)
if (dev->num_addrs) { if (dev->num_addrs) {
int k; int k;
printk(", additional addresses: "); pr_cont(", additional addresses: ");
for (k = 0; k < dev->num_addrs; k++) for (k = 0; k < dev->num_addrs; k++)
printk("0x%lx ", dev->addr[k]); pr_cont("0x%lx ", dev->addr[k]);
} }
printk("\n"); pr_cont("\n");
} }
/** /**
......
...@@ -100,14 +100,12 @@ set_thread_pointer: ...@@ -100,14 +100,12 @@ set_thread_pointer:
.endr .endr
/* This address must remain fixed at 0x100 for glibc's syscalls to work */ /* This address must remain fixed at 0x100 for glibc's syscalls to work */
.align 256 .align LINUX_GATEWAY_ADDR
linux_gateway_entry: linux_gateway_entry:
gate .+8, %r0 /* become privileged */ gate .+8, %r0 /* become privileged */
mtsp %r0,%sr4 /* get kernel space into sr4 */ mtsp %r0,%sr4 /* get kernel space into sr4 */
mtsp %r0,%sr5 /* get kernel space into sr5 */ mtsp %r0,%sr5 /* get kernel space into sr5 */
mtsp %r0,%sr6 /* get kernel space into sr6 */ 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 #ifdef CONFIG_64BIT
/* for now we can *always* set the W bit on entry to the syscall /* for now we can *always* set the W bit on entry to the syscall
...@@ -133,6 +131,14 @@ linux_gateway_entry: ...@@ -133,6 +131,14 @@ linux_gateway_entry:
depdi 0, 31, 32, %r21 depdi 0, 31, 32, %r21
1: 1:
#endif #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 mfctl %cr30,%r1
xor %r1,%r30,%r30 /* ye olde xor trick */ xor %r1,%r30,%r30 /* ye olde xor trick */
xor %r1,%r30,%r1 xor %r1,%r30,%r1
...@@ -147,6 +153,7 @@ linux_gateway_entry: ...@@ -147,6 +153,7 @@ linux_gateway_entry:
*/ */
mtsp %r0,%sr7 /* get kernel space into sr7 */ 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 */ STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */
mfctl %cr30,%r1 /* get task ptr in %r1 */ mfctl %cr30,%r1 /* get task ptr in %r1 */
LDREG TI_TASK(%r1),%r1 LDREG TI_TASK(%r1),%r1
...@@ -474,11 +481,6 @@ lws_start: ...@@ -474,11 +481,6 @@ lws_start:
comiclr,>> __NR_lws_entries, %r20, %r0 comiclr,>> __NR_lws_entries, %r20, %r0
b,n lws_exit_nosys b,n lws_exit_nosys
/* WARNING: Trashing sr2 and sr3 */
mfsp %sr7,%r1 /* get userspace into sr3 */
mtsp %r1,%sr3
mtsp %r0,%sr2 /* get kernel space into sr2 */
/* Load table start */ /* Load table start */
ldil L%lws_table, %r1 ldil L%lws_table, %r1
ldo R%lws_table(%r1), %r28 /* Scratch use of r28 */ ldo R%lws_table(%r1), %r28 /* Scratch use of r28 */
...@@ -627,9 +629,9 @@ cas_action: ...@@ -627,9 +629,9 @@ cas_action:
stw %r1, 4(%sr2,%r20) stw %r1, 4(%sr2,%r20)
#endif #endif
/* The load and store could fail */ /* The load and store could fail */
1: ldw,ma 0(%sr3,%r26), %r28 1: ldw,ma 0(%r26), %r28
sub,<> %r28, %r25, %r0 sub,<> %r28, %r25, %r0
2: stw,ma %r24, 0(%sr3,%r26) 2: stw,ma %r24, 0(%r26)
/* Free lock */ /* Free lock */
stw,ma %r20, 0(%sr2,%r20) stw,ma %r20, 0(%sr2,%r20)
#if ENABLE_LWS_DEBUG #if ENABLE_LWS_DEBUG
...@@ -706,9 +708,9 @@ lws_compare_and_swap_2: ...@@ -706,9 +708,9 @@ lws_compare_and_swap_2:
nop nop
/* 8bit load */ /* 8bit load */
4: ldb 0(%sr3,%r25), %r25 4: ldb 0(%r25), %r25
b cas2_lock_start b cas2_lock_start
5: ldb 0(%sr3,%r24), %r24 5: ldb 0(%r24), %r24
nop nop
nop nop
nop nop
...@@ -716,9 +718,9 @@ lws_compare_and_swap_2: ...@@ -716,9 +718,9 @@ lws_compare_and_swap_2:
nop nop
/* 16bit load */ /* 16bit load */
6: ldh 0(%sr3,%r25), %r25 6: ldh 0(%r25), %r25
b cas2_lock_start b cas2_lock_start
7: ldh 0(%sr3,%r24), %r24 7: ldh 0(%r24), %r24
nop nop
nop nop
nop nop
...@@ -726,9 +728,9 @@ lws_compare_and_swap_2: ...@@ -726,9 +728,9 @@ lws_compare_and_swap_2:
nop nop
/* 32bit load */ /* 32bit load */
8: ldw 0(%sr3,%r25), %r25 8: ldw 0(%r25), %r25
b cas2_lock_start b cas2_lock_start
9: ldw 0(%sr3,%r24), %r24 9: ldw 0(%r24), %r24
nop nop
nop nop
nop nop
...@@ -737,14 +739,14 @@ lws_compare_and_swap_2: ...@@ -737,14 +739,14 @@ lws_compare_and_swap_2:
/* 64bit load */ /* 64bit load */
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
10: ldd 0(%sr3,%r25), %r25 10: ldd 0(%r25), %r25
11: ldd 0(%sr3,%r24), %r24 11: ldd 0(%r24), %r24
#else #else
/* Load new value into r22/r23 - high/low */ /* Load new value into r22/r23 - high/low */
10: ldw 0(%sr3,%r25), %r22 10: ldw 0(%r25), %r22
11: ldw 4(%sr3,%r25), %r23 11: ldw 4(%r25), %r23
/* Load new value into fr4 for atomic store later */ /* Load new value into fr4 for atomic store later */
12: flddx 0(%sr3,%r24), %fr4 12: flddx 0(%r24), %fr4
#endif #endif
cas2_lock_start: cas2_lock_start:
...@@ -794,30 +796,30 @@ cas2_action: ...@@ -794,30 +796,30 @@ cas2_action:
ldo 1(%r0),%r28 ldo 1(%r0),%r28
/* 8bit CAS */ /* 8bit CAS */
13: ldb,ma 0(%sr3,%r26), %r29 13: ldb,ma 0(%r26), %r29
sub,= %r29, %r25, %r0 sub,= %r29, %r25, %r0
b,n cas2_end b,n cas2_end
14: stb,ma %r24, 0(%sr3,%r26) 14: stb,ma %r24, 0(%r26)
b cas2_end b cas2_end
copy %r0, %r28 copy %r0, %r28
nop nop
nop nop
/* 16bit CAS */ /* 16bit CAS */
15: ldh,ma 0(%sr3,%r26), %r29 15: ldh,ma 0(%r26), %r29
sub,= %r29, %r25, %r0 sub,= %r29, %r25, %r0
b,n cas2_end b,n cas2_end
16: sth,ma %r24, 0(%sr3,%r26) 16: sth,ma %r24, 0(%r26)
b cas2_end b cas2_end
copy %r0, %r28 copy %r0, %r28
nop nop
nop nop
/* 32bit CAS */ /* 32bit CAS */
17: ldw,ma 0(%sr3,%r26), %r29 17: ldw,ma 0(%r26), %r29
sub,= %r29, %r25, %r0 sub,= %r29, %r25, %r0
b,n cas2_end b,n cas2_end
18: stw,ma %r24, 0(%sr3,%r26) 18: stw,ma %r24, 0(%r26)
b cas2_end b cas2_end
copy %r0, %r28 copy %r0, %r28
nop nop
...@@ -825,22 +827,22 @@ cas2_action: ...@@ -825,22 +827,22 @@ cas2_action:
/* 64bit CAS */ /* 64bit CAS */
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
19: ldd,ma 0(%sr3,%r26), %r29 19: ldd,ma 0(%r26), %r29
sub,*= %r29, %r25, %r0 sub,*= %r29, %r25, %r0
b,n cas2_end b,n cas2_end
20: std,ma %r24, 0(%sr3,%r26) 20: std,ma %r24, 0(%r26)
copy %r0, %r28 copy %r0, %r28
#else #else
/* Compare first word */ /* Compare first word */
19: ldw,ma 0(%sr3,%r26), %r29 19: ldw,ma 0(%r26), %r29
sub,= %r29, %r22, %r0 sub,= %r29, %r22, %r0
b,n cas2_end b,n cas2_end
/* Compare second word */ /* Compare second word */
20: ldw,ma 4(%sr3,%r26), %r29 20: ldw,ma 4(%r26), %r29
sub,= %r29, %r23, %r0 sub,= %r29, %r23, %r0
b,n cas2_end b,n cas2_end
/* Perform the store */ /* Perform the store */
21: fstdx %fr4, 0(%sr3,%r26) 21: fstdx %fr4, 0(%r26)
copy %r0, %r28 copy %r0, %r28
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment