NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-xen/47057: Xen NetBSD DomU file system trash under Linux Dom0
On Sun, Oct 21, 2012 at 08:10:36PM +0200, Roger Pau Monné wrote:
> On Sun, Oct 21, 2012 at 8:00 PM, Manuel Bouyer
> <bouyer%antioche.eu.org@localhost> wrote:
> > Does linux do this silently, or does it complain when the ring
> > corruption occurs ?
>
> With the patch attached in the previous post, we will do the same as
> Linux (reset indexes and printk). I've never seen that happen in
> Linux, so I'm not sure if there's anything else.
>
> >> Is it possible that someone writes to the machine address
> >> xen_start_info.store_mfn and is there anyway to check that nobody is
> >> mapping this ma to another va?
> >
> > I've been thinking about checking this, but it's harder to do.
> > Maybe it's easier to do this check in the hypervisor ?
>
> Will check that, not sure if there's an easy way to this in the hypervisor.
You can also try the attached patch, which should catch a mapping to
the same store's ma via regular pmap functons. If it's something more
clever, we'll need a more clever checks ...
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Index: x86/x86/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/pmap.c,v
retrieving revision 1.178
diff -u -p -u -r1.178 pmap.c
--- x86/x86/pmap.c 15 Jun 2012 13:53:40 -0000 1.178
+++ x86/x86/pmap.c 21 Oct 2012 18:26:43 -0000
@@ -325,6 +325,8 @@ kmutex_t pmaps_lock;
static vaddr_t pmap_maxkvaddr;
+extern void *xenstore_interface;
+
/*
* XXX kludge: dummy locking to make KASSERTs in uvm_page.c comfortable.
* actual locking is done by pm_lock.
@@ -994,6 +996,9 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v
} else
#endif /* DOM0OPS */
npte = pmap_pa2pte(pa);
+
+ if (xenstore_interface != NULL)
+ KASSERT(npte != (xen_start_info.store_mfn << PAGE_SHIFT));
npte |= protection_codes[prot] | PG_k | PG_V | pmap_pg_g;
npte |= pmap_pat_flags(flags);
opte = pmap_pte_testset(pte, npte); /* zap! */
@@ -1026,6 +1031,8 @@ pmap_emap_enter(vaddr_t va, paddr_t pa,
#endif
npte = pmap_pa2pte(pa);
+ if (xenstore_interface != NULL)
+ KASSERT(npte != (xen_start_info.store_mfn << PAGE_SHIFT));
npte = pmap_pa2pte(pa);
npte |= protection_codes[prot] | PG_k | PG_V;
pmap_pte_set(pte, npte);
@@ -3900,6 +3907,8 @@ pmap_enter_ma(struct pmap *pmap, vaddr_t
bool wired = (flags & PMAP_WIRED) != 0;
struct pmap *pmap2;
+ if (xenstore_interface != NULL)
+ KASSERT(ma != (xen_start_info.store_mfn << PAGE_SHIFT));
KASSERT(pmap_initialized);
KASSERT(curlwp->l_md.md_gc_pmap != pmap);
KASSERT(va < VM_MAX_KERNEL_ADDRESS);
Index: xen/x86/xen_pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/xen/x86/xen_pmap.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 xen_pmap.c
--- xen/x86/xen_pmap.c 24 Jun 2012 18:31:53 -0000 1.22
+++ xen/x86/xen_pmap.c 21 Oct 2012 18:26:43 -0000
@@ -174,12 +174,16 @@ void
pmap_kenter_ma(vaddr_t va, paddr_t ma, vm_prot_t prot, u_int flags)
{
pt_entry_t *pte, opte, npte;
+ extern void *xenstore_interface;
if (va < VM_MIN_KERNEL_ADDRESS)
pte = vtopte(va);
else
pte = kvtopte(va);
+ if (xenstore_interface != NULL)
+ KASSERT(ma != (xen_start_info.store_mfn << PAGE_SHIFT) ||
+ va == (vaddr_t)xenstore_interface);
npte = ma | ((prot & VM_PROT_WRITE) ? PG_RW : PG_RO) |
PG_V | PG_k;
if (flags & PMAP_NOCACHE)
Home |
Main Index |
Thread Index |
Old Index