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