Approved-By: bdragon (in IRC)

On Wed, Dec 30, 2020, at 4:45 PM, Piotr Kubaj wrote:
> The branch main has been updated by pkubaj (ports committer):
> 
> URL: 
> https://cgit.FreeBSD.org/src/commit/?id=76ff03aef7411e601673dfc997bd6d691bd9a14e
> 
> commit 76ff03aef7411e601673dfc997bd6d691bd9a14e
> Author:     Justin Hibbits <[email protected]>
> AuthorDate: 2020-12-08 22:49:25 +0000
> Commit:     Piotr Kubaj <[email protected]>
> 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)
>  
>

-- 
  Brandon Bergren
  [email protected]
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to