svn commit: r217056 - in stable/8/sys/i386: i386 include xen
Colin Percival
cperciva at FreeBSD.org
Thu Jan 6 15:26:07 UTC 2011
Author: cperciva
Date: Thu Jan 6 15:26:06 2011
New Revision: 217056
URL: http://svn.freebsd.org/changeset/base/217056
Log:
MFC r216843-216847: Fix i386_set_ldt on i386/XEN.
Modified:
stable/8/sys/i386/i386/sys_machdep.c
stable/8/sys/i386/include/pmap.h
stable/8/sys/i386/include/segments.h
stable/8/sys/i386/xen/pmap.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/i386/i386/sys_machdep.c
==============================================================================
--- stable/8/sys/i386/i386/sys_machdep.c Thu Jan 6 14:19:29 2011 (r217055)
+++ stable/8/sys/i386/i386/sys_machdep.c Thu Jan 6 15:26:06 2011 (r217056)
@@ -450,6 +450,7 @@ user_ldt_alloc(struct mdproc *mdp, int l
new_ldt->ldt_refcnt = 1;
new_ldt->ldt_active = 0;
+ mtx_lock_spin(&dt_lock);
if ((pldt = mdp->md_ldt)) {
if (len > pldt->ldt_len)
len = pldt->ldt_len;
@@ -458,8 +459,10 @@ user_ldt_alloc(struct mdproc *mdp, int l
} else {
bcopy(ldt, new_ldt->ldt_base, PAGE_SIZE);
}
+ mtx_unlock_spin(&dt_lock); /* XXX kill once pmap locking fixed. */
pmap_map_readonly(kernel_pmap, (vm_offset_t)new_ldt->ldt_base,
new_ldt->ldt_len*sizeof(union descriptor));
+ mtx_lock_spin(&dt_lock); /* XXX kill once pmap locking fixed. */
return (new_ldt);
}
#else
@@ -520,8 +523,13 @@ user_ldt_free(struct thread *td)
}
if (td == PCPU_GET(curthread)) {
+#ifdef XEN
+ i386_reset_ldt(&default_proc_ldt);
+ PCPU_SET(currentldt, (int)&default_proc_ldt);
+#else
lldt(_default_ldt);
PCPU_SET(currentldt, _default_ldt);
+#endif
}
mdp->md_ldt = NULL;
@@ -758,10 +766,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
Modified: stable/8/sys/i386/include/pmap.h
==============================================================================
--- stable/8/sys/i386/include/pmap.h Thu Jan 6 14:19:29 2011 (r217055)
+++ stable/8/sys/i386/include/pmap.h Thu Jan 6 15:26:06 2011 (r217056)
@@ -251,7 +251,6 @@ pte_load_store(pt_entry_t *ptep, pt_entr
{
pt_entry_t r;
- v = xpmap_ptom(v);
r = *ptep;
PT_SET_VA(ptep, v, TRUE);
return (r);
Modified: stable/8/sys/i386/include/segments.h
==============================================================================
--- stable/8/sys/i386/include/segments.h Thu Jan 6 14:19:29 2011 (r217055)
+++ stable/8/sys/i386/include/segments.h Thu Jan 6 15:26:06 2011 (r217056)
@@ -249,6 +249,7 @@ struct region_descriptor {
#ifdef _KERNEL
extern int _default_ldt;
#ifdef XEN
+extern struct proc_ldt default_proc_ldt;
extern union descriptor *gdt;
extern union descriptor *ldt;
#else
Modified: stable/8/sys/i386/xen/pmap.c
==============================================================================
--- stable/8/sys/i386/xen/pmap.c Thu Jan 6 14:19:29 2011 (r217055)
+++ stable/8/sys/i386/xen/pmap.c Thu Jan 6 15:26:06 2011 (r217056)
@@ -3711,7 +3711,9 @@ pmap_map_readonly(pmap_t pmap, vm_offset
for (i = 0; i < npages; i++) {
pt_entry_t *pte;
pte = pmap_pte(pmap, (vm_offset_t)(va + i*PAGE_SIZE));
+ vm_page_lock_queues();
pte_store(pte, xpmap_mtop(*pte & ~(PG_RW|PG_M)));
+ vm_page_unlock_queues();
PMAP_MARK_PRIV(xpmap_mtop(*pte));
pmap_pte_release(pte);
}
@@ -3725,7 +3727,9 @@ pmap_map_readwrite(pmap_t pmap, vm_offse
pt_entry_t *pte;
pte = pmap_pte(pmap, (vm_offset_t)(va + i*PAGE_SIZE));
PMAP_MARK_UNPRIV(xpmap_mtop(*pte));
+ vm_page_lock_queues();
pte_store(pte, xpmap_mtop(*pte) | (PG_RW|PG_M));
+ vm_page_unlock_queues();
pmap_pte_release(pte);
}
}
More information about the svn-src-stable-8
mailing list