Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Oct 2017 12:16:45 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r324307 - head/sys/amd64/amd64
Message-ID:  <201710051216.v95CGjoe035745@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



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