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
This commit is contained in:
Colin Percival 2010-12-31 17:41:14 +00:00
parent de187b8df2
commit 698cc19d6b

View File

@ -761,10 +761,14 @@ i386_set_ldt_data(struct thread *td, int start, int num,
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