Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Dec 2010 17:41:14 +0000 (UTC)
From:      Colin Percival <cperciva@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r216846 - head/sys/i386/i386
Message-ID:  <201012311741.oBVHfENF083632@svn.freebsd.org>

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



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