x86/paravirt/xen: properly fill out the ldt ops

LTP testing showed that Xen does not properly implement
sys_modify_ldt().  This patch does the final little bits needed to
make the ldt work properly.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Jeremy Fitzhardinge
2008-07-23 14:21:18 -07:00
committed by Ingo Molnar
parent 338b9bb3ad
commit 38ffbe66d5
5 changed files with 57 additions and 2 deletions

View File

@@ -325,6 +325,26 @@ static unsigned long xen_store_tr(void)
return 0;
}
static void xen_alloc_ldt(struct desc_struct *ldt, unsigned entries)
{
unsigned pages = roundup(entries * LDT_ENTRY_SIZE, PAGE_SIZE);
void *v = ldt;
int i;
for(i = 0; i < pages; i += PAGE_SIZE)
make_lowmem_page_readonly(v + i);
}
static void xen_free_ldt(struct desc_struct *ldt, unsigned entries)
{
unsigned pages = roundup(entries * LDT_ENTRY_SIZE, PAGE_SIZE);
void *v = ldt;
int i;
for(i = 0; i < pages; i += PAGE_SIZE)
make_lowmem_page_readwrite(v + i);
}
static void xen_set_ldt(const void *addr, unsigned entries)
{
struct mmuext_op *op;
@@ -1220,6 +1240,9 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
.load_gs_index = xen_load_gs_index,
#endif
.alloc_ldt = xen_alloc_ldt,
.free_ldt = xen_free_ldt,
.store_gdt = native_store_gdt,
.store_idt = native_store_idt,
.store_tr = xen_store_tr,