svn commit: r216846 - head/sys/i386/i386

Colin Percival cperciva at FreeBSD.org
Fri Dec 31 17:41:14 UTC 2010


Author: cperciva
Date: Fri Dec 31 17:41:14 2010
New Revision: 216846
URL: http://svn.freebsd.org/changeset/base/216846

Log:
  Make i386_set_ldt work on i386/XEN, step 4/5.
  
  Use xen_update_descriptor to update the LDT rather than bcopy.  Under Xen,
  pages used for holding LDTs must be read-only, so we can't make the change
  ourselves.
  
  Ths obvious alternative of "remap the page read-write, make the change, then
  map it read-only again" doesn't work since Xen won't allow an LDT page to be
  remapped as R/W.  An arguably better solution is used by NetBSD: They don't
  modify LDTs in-place at all, but instead copy the entire LDT, modify the new
  version, then atomically swap.
  
  MFC after:	3 days

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

Modified: head/sys/i386/i386/sys_machdep.c
==============================================================================
--- head/sys/i386/i386/sys_machdep.c	Fri Dec 31 17:40:30 2010	(r216845)
+++ head/sys/i386/i386/sys_machdep.c	Fri Dec 31 17:41:14 2010	(r216846)
@@ -761,10 +761,14 @@ i386_set_ldt_data(struct thread *td, int
 
 	mtx_assert(&dt_lock, MA_OWNED);
 
-	/* Fill in range */
-	bcopy(descs,
-	    &((union descriptor *)(pldt->ldt_base))[start],
-	    num * sizeof(union descriptor));
+	while (num) {
+		xen_update_descriptor(
+		    &((union descriptor *)(pldt->ldt_base))[start],
+		    descs);
+		num--;
+		start++;
+		descs++;
+	}
 	return (0);
 }
 #else


More information about the svn-src-all mailing list