Author: kib
Date: Thu Oct  5 12:16:45 2017
New Revision: 324307
URL: https://svnweb.freebsd.org/changeset/base/324307

Log:
  Complete r323772 on amd64.
  
  Compilers are allowed to combine plain reads into group operations,
  e.g. 64bit element copies of one array into another can be
  legitimately optimized back to a memcpy() call, which r323772 tried to
  prevent.
  
  Qualify accesses to LDT descriptors with volatile dereference to
  ensure that each write indeed occurs.  After that, our usual claim of
  native-size aligned writes being atomic applies.
  
  This is equivalent to atomic_store(memory_order_relaxed) C11 accesses,
  but our machine/atomic.h does not provide corresponding primitive.
  
  Noted and reviewed by:        bde
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week

Modified:
  head/sys/amd64/amd64/sys_machdep.c

Modified: head/sys/amd64/amd64/sys_machdep.c
==============================================================================
--- head/sys/amd64/amd64/sys_machdep.c  Thu Oct  5 12:07:38 2017        
(r324306)
+++ head/sys/amd64/amd64/sys_machdep.c  Thu Oct  5 12:16:45 2017        
(r324307)
@@ -616,7 +616,7 @@ amd64_set_ldt(struct thread *td, struct i386_ldt_args 
                        return (EINVAL);
                mtx_lock(&dt_lock);
                for (i = uap->start; i < largest_ld; i++)
-                       ((uint64_t *)(pldt->ldt_base))[i] = 0;
+                       ((volatile uint64_t *)(pldt->ldt_base))[i] = 0;
                mtx_unlock(&dt_lock);
                return (0);
        }
@@ -734,15 +734,15 @@ amd64_set_ldt_data(struct thread *td, int start, int n
 {
        struct mdproc *mdp;
        struct proc_ldt *pldt;
-       uint64_t *dst, *src;
+       volatile uint64_t *dst, *src;
        int i;
 
        mtx_assert(&dt_lock, MA_OWNED);
 
        mdp = &td->td_proc->p_md;
        pldt = mdp->md_ldt;
-       dst = (uint64_t *)(pldt->ldt_base);
-       src = (uint64_t *)descs;
+       dst = (volatile uint64_t *)(pldt->ldt_base);
+       src = (volatile uint64_t *)descs;
        for (i = 0; i < num; i++)
                dst[start + i] = src[i];
        return (0);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to