Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7df76e6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -368,7 +368,9 @@

#define __IGNORE_select		/* newselect */
#define __IGNORE_fadvise64	/* fadvise64_64 */

#define __IGNORE_pkey_mprotect
#define __IGNORE_pkey_alloc
#define __IGNORE_pkey_free

#define LINUX_GATEWAY_ADDR      0x100

+3 −3
Original line number Diff line number Diff line
@@ -873,11 +873,11 @@ static void print_parisc_device(struct parisc_device *dev)

	if (dev->num_addrs) {
		int k;
		printk(", additional addresses: ");
		pr_cont(", additional addresses: ");
		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");
}

/**
+34 −32
Original line number Diff line number Diff line
@@ -100,14 +100,12 @@ set_thread_pointer:
	.endr

/* This address must remain fixed at 0x100 for glibc's syscalls to work */
	.align 256
	.align LINUX_GATEWAY_ADDR
linux_gateway_entry:
	gate	.+8, %r0			/* become privileged */
	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
@@ -474,11 +481,6 @@ lws_start:
	comiclr,>>	__NR_lws_entries, %r20, %r0
	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 */
	ldil	L%lws_table, %r1
	ldo	R%lws_table(%r1), %r28	/* Scratch use of r28 */
@@ -627,9 +629,9 @@ cas_action:
	stw	%r1, 4(%sr2,%r20)
#endif
	/* The load and store could fail */
1:	ldw,ma	0(%sr3,%r26), %r28
1:	ldw,ma	0(%r26), %r28
	sub,<>	%r28, %r25, %r0
2:	stw,ma	%r24, 0(%sr3,%r26)
2:	stw,ma	%r24, 0(%r26)
	/* Free lock */
	stw,ma	%r20, 0(%sr2,%r20)
#if ENABLE_LWS_DEBUG
@@ -706,9 +708,9 @@ lws_compare_and_swap_2:
	nop

	/* 8bit load */
4:	ldb	0(%sr3,%r25), %r25
4:	ldb	0(%r25), %r25
	b	cas2_lock_start
5:	ldb	0(%sr3,%r24), %r24
5:	ldb	0(%r24), %r24
	nop
	nop
	nop
@@ -716,9 +718,9 @@ lws_compare_and_swap_2:
	nop

	/* 16bit load */
6:	ldh	0(%sr3,%r25), %r25
6:	ldh	0(%r25), %r25
	b	cas2_lock_start
7:	ldh	0(%sr3,%r24), %r24
7:	ldh	0(%r24), %r24
	nop
	nop
	nop
@@ -726,9 +728,9 @@ lws_compare_and_swap_2:
	nop

	/* 32bit load */
8:	ldw	0(%sr3,%r25), %r25
8:	ldw	0(%r25), %r25
	b	cas2_lock_start
9:	ldw	0(%sr3,%r24), %r24
9:	ldw	0(%r24), %r24
	nop
	nop
	nop
@@ -737,14 +739,14 @@ lws_compare_and_swap_2:

	/* 64bit load */
#ifdef CONFIG_64BIT
10:	ldd	0(%sr3,%r25), %r25
11:	ldd	0(%sr3,%r24), %r24
10:	ldd	0(%r25), %r25
11:	ldd	0(%r24), %r24
#else
	/* Load new value into r22/r23 - high/low */
10:	ldw	0(%sr3,%r25), %r22
11:	ldw	4(%sr3,%r25), %r23
10:	ldw	0(%r25), %r22
11:	ldw	4(%r25), %r23
	/* Load new value into fr4 for atomic store later */
12:	flddx	0(%sr3,%r24), %fr4
12:	flddx	0(%r24), %fr4
#endif

cas2_lock_start:
@@ -794,30 +796,30 @@ cas2_action:
	ldo	1(%r0),%r28

	/* 8bit CAS */
13:	ldb,ma	0(%sr3,%r26), %r29
13:	ldb,ma	0(%r26), %r29
	sub,=	%r29, %r25, %r0
	b,n	cas2_end
14:	stb,ma	%r24, 0(%sr3,%r26)
14:	stb,ma	%r24, 0(%r26)
	b	cas2_end
	copy	%r0, %r28
	nop
	nop

	/* 16bit CAS */
15:	ldh,ma	0(%sr3,%r26), %r29
15:	ldh,ma	0(%r26), %r29
	sub,=	%r29, %r25, %r0
	b,n	cas2_end
16:	sth,ma	%r24, 0(%sr3,%r26)
16:	sth,ma	%r24, 0(%r26)
	b	cas2_end
	copy	%r0, %r28
	nop
	nop

	/* 32bit CAS */
17:	ldw,ma	0(%sr3,%r26), %r29
17:	ldw,ma	0(%r26), %r29
	sub,=	%r29, %r25, %r0
	b,n	cas2_end
18:	stw,ma	%r24, 0(%sr3,%r26)
18:	stw,ma	%r24, 0(%r26)
	b	cas2_end
	copy	%r0, %r28
	nop
@@ -825,22 +827,22 @@ cas2_action:

	/* 64bit CAS */
#ifdef CONFIG_64BIT
19:	ldd,ma	0(%sr3,%r26), %r29
19:	ldd,ma	0(%r26), %r29
	sub,*=	%r29, %r25, %r0
	b,n	cas2_end
20:	std,ma	%r24, 0(%sr3,%r26)
20:	std,ma	%r24, 0(%r26)
	copy	%r0, %r28
#else
	/* Compare first word */
19:	ldw,ma	0(%sr3,%r26), %r29
19:	ldw,ma	0(%r26), %r29
	sub,=	%r29, %r22, %r0
	b,n	cas2_end
	/* Compare second word */
20:	ldw,ma	4(%sr3,%r26), %r29
20:	ldw,ma	4(%r26), %r29
	sub,=	%r29, %r23, %r0
	b,n	cas2_end
	/* Perform the store */
21:	fstdx	%fr4, 0(%sr3,%r26)
21:	fstdx	%fr4, 0(%r26)
	copy	%r0, %r28
#endif