Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Apr 2017 12:34:28 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r316732 - head/sys/arm64/arm64
Message-ID:  <201704121234.v3CCYScL027204@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Wed Apr 12 12:34:27 2017
New Revision: 316732
URL: https://svnweb.freebsd.org/changeset/base/316732

Log:
  Use the unprivileged variant of the load and store instructions most
  places possible in the kernel. This forces these functions to fail if
  userspace is unable to access a given memory location, even if it is in
  the user memory range.
  
  This will simplify adding Privileged Access Never support later.
  
  MFC after:	1 week
  Sponsored by:	DARPA, AFRL

Modified:
  head/sys/arm64/arm64/copyinout.S
  head/sys/arm64/arm64/support.S

Modified: head/sys/arm64/arm64/copyinout.S
==============================================================================
--- head/sys/arm64/arm64/copyinout.S	Wed Apr 12 11:41:35 2017	(r316731)
+++ head/sys/arm64/arm64/copyinout.S	Wed Apr 12 12:34:27 2017	(r316732)
@@ -103,7 +103,8 @@ ENTRY(copyinstr)
 	ldr	x7, =VM_MAXUSER_ADDRESS
 1:	cmp	x0, x7
 	b.cs	copyio_fault
-	ldrb	w4, [x0], #1	/* Load from uaddr */
+	ldtrb	w4, [x0]	/* Load from uaddr */
+	add	x0, x0, #1	/* Next char */
 	strb	w4, [x1], #1	/* Store in kaddr */
 	add	x5, x5, #1	/* count++ */
 	cbz	w4, 2f		/* Break when NUL-terminated */

Modified: head/sys/arm64/arm64/support.S
==============================================================================
--- head/sys/arm64/arm64/support.S	Wed Apr 12 11:41:35 2017	(r316731)
+++ head/sys/arm64/arm64/support.S	Wed Apr 12 12:34:27 2017	(r316732)
@@ -97,7 +97,7 @@ ENTRY(fubyte)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x1)	/* And set it */
-	ldrb	w0, [x0]		/* Try loading the data */
+	ldtrb	w0, [x0]		/* Try loading the data */
 	SET_FAULT_HANDLER(xzr, x1)	/* Reset the fault handler */
 	ret				/* Return */
 END(fubyte)
@@ -111,7 +111,7 @@ ENTRY(fuword16)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x1)	/* And set it */
-	ldrh	w0, [x0]		/* Try loading the data */
+	ldtrh	w0, [x0]		/* Try loading the data */
 	SET_FAULT_HANDLER(xzr, x1)	/* Reset the fault handler */
 	ret				/* Return */
 END(fuword16)
@@ -125,7 +125,7 @@ ENTRY(fueword32)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	ldr	w0, [x0]		/* Try loading the data */
+	ldtr	w0, [x0]		/* Try loading the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	str	w0, [x1]		/* Save the data in kernel space */
 	mov	w0, #0			/* Success */
@@ -143,7 +143,7 @@ EENTRY(fueword64)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	ldr	x0, [x0]		/* Try loading the data */
+	ldtr	x0, [x0]		/* Try loading the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	str	x0, [x1]		/* Save the data in kernel space */
 	mov	x0, #0			/* Success */
@@ -160,7 +160,7 @@ ENTRY(subyte)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	strb	w1, [x0]		/* Try storing the data */
+	sttrb	w1, [x0]		/* Try storing the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	mov	x0, #0			/* Success */
 	ret				/* Return */
@@ -175,7 +175,7 @@ ENTRY(suword16)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	strh	w1, [x0]		/* Try storing the data */
+	sttrh	w1, [x0]		/* Try storing the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	mov	x0, #0			/* Success */
 	ret				/* Return */
@@ -190,7 +190,7 @@ ENTRY(suword32)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	str	w1, [x0]		/* Try storing the data */
+	sttr	w1, [x0]		/* Try storing the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	mov	x0, #0			/* Success */
 	ret				/* Return */
@@ -206,7 +206,7 @@ EENTRY(suword64)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_fault		/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	str	x1, [x0]		/* Try storing the data */
+	sttr	x1, [x0]		/* Try storing the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	mov	x0, #0			/* Success */
 	ret				/* Return */
@@ -237,7 +237,7 @@ ENTRY(fuswintr)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_intr_fault	/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x1)	/* And set it */
-	ldr	w0, [x0]		/* Try loading the data */
+	ldtr	w0, [x0]		/* Try loading the data */
 	SET_FAULT_HANDLER(xzr, x1)	/* Reset the fault handler */
 	ret				/* Return */
 END(fuswintr)
@@ -251,7 +251,7 @@ ENTRY(suswintr)
 	b.cs	fsu_fault_nopcb
 	adr	x6, fsu_intr_fault	/* Load the fault handler */
 	SET_FAULT_HANDLER(x6, x2)	/* And set it */
-	str	w1, [x0]		/* Try storing the data */
+	sttr	w1, [x0]		/* Try storing the data */
 	SET_FAULT_HANDLER(xzr, x2)	/* Reset the fault handler */
 	mov	x0, #0			/* Success */
 	ret				/* Return */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704121234.v3CCYScL027204>