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:
parent
de187b8df2
commit
698cc19d6b
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user