git: 76ff03aef741 - main - powerpc: Fix copyin/copyout race condition

Piotr Kubaj pkubaj at FreeBSD.org
Wed Dec 30 22:45:53 UTC 2020


The branch main has been updated by pkubaj (ports committer):

URL: https://cgit.FreeBSD.org/src/commit/?id=76ff03aef7411e601673dfc997bd6d691bd9a14e

commit 76ff03aef7411e601673dfc997bd6d691bd9a14e
Author:     Justin Hibbits <chmeeedalf at gmail.com>
AuthorDate: 2020-12-08 22:49:25 +0000
Commit:     Piotr Kubaj <pkubaj at FreeBSD.org>
CommitDate: 2020-12-30 22:45:44 +0000

    powerpc: Fix copyin/copyout race condition
    
    It's possible for a context switch, and CPU migration, to occur between
    fetching the PCPU context and extracting the pc_curpcb.  This can cause
    the fault handler to be installed for the wrong thread, leading to a
    panic in copyin()/copyout().  Since curthread is already in %r13, just
    use that directly, as GPRs are migrated, so there is no migration race
    risk.
---
 sys/powerpc/powerpc/support.S | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/sys/powerpc/powerpc/support.S b/sys/powerpc/powerpc/support.S
index 9ff1bcc02437..10d3192972d5 100644
--- a/sys/powerpc/powerpc/support.S
+++ b/sys/powerpc/powerpc/support.S
@@ -61,6 +61,7 @@
 /* log_2(8 * WORD) */
 #define	LOOP_LOG	6
 #define	LOG_WORD	3
+#define	CURTHREAD	%r13
 #else
 #define	LOAD	lwz
 #define	STORE	stw
@@ -70,6 +71,7 @@
 /* log_2(8 * WORD) */
 #define	LOOP_LOG	5
 #define	LOG_WORD	2
+#define	CURTHREAD	%r2
 #endif
 
 #ifdef AIM
@@ -149,32 +151,26 @@
 
 #endif
 
-#define PCPU(reg) mfsprg  reg, 0
-
 #define	SET_COPYFAULT(raddr, rpcb, len)	\
 	VALIDATE_ADDR_COPY(raddr, len)	;\
-	PCPU(%r9)			;\
 	li	%r0, COPYFAULT		;\
-	LOAD	rpcb, PC_CURPCB(%r9)	;\
+	LOAD	rpcb, TD_PCB(CURTHREAD)	;\
 	STORE	%r0, PCB_ONFAULT(rpcb)	;\
 
 #define	SET_COPYFAULT_TRUNCATE(raddr, rpcb, len)\
 	VALIDATE_TRUNCATE_ADDR_COPY(raddr, len)	;\
-	PCPU(%r9)				;\
 	li	%r0, COPYFAULT			;\
-	LOAD	rpcb, PC_CURPCB(%r9)		;\
+	LOAD	rpcb, TD_PCB(CURTHREAD)		;\
 	STORE	%r0, PCB_ONFAULT(rpcb)
 
 #define	SET_FUSUFAULT(raddr, rpcb)	\
 	VALIDATE_ADDR_FUSU(raddr)	;\
-	PCPU(%r9)			;\
 	li	%r0, FUSUFAULT		;\
-	LOAD	rpcb, PC_CURPCB(%r9)	;\
+	LOAD	rpcb, TD_PCB(CURTHREAD)	;\
 	STORE	%r0, PCB_ONFAULT(rpcb)
 
 #define	CLEAR_FAULT_NO_CLOBBER(rpcb)	\
-	PCPU(%r9)			;\
-	LOAD	rpcb, PC_CURPCB(%r9)	;\
+	LOAD	rpcb, TD_PCB(CURTHREAD)	;\
 	li	%r0, 0			;\
 	STORE	%r0, PCB_ONFAULT(rpcb)
 


More information about the dev-commits-src-all mailing list