Port-xen archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: xen3pae on 5.0_stable/i386



On Fri, Jan 22, 2010 at 01:27:54PM +0100, Christoph Egger wrote:
> 
> > > With a xen-debug.gz kernel, does anything show up in
> > > 'xm dmesg' after the core dump ?
> > 
> > This appears at the end of dmesg:
> > 
> > 
> > 
> 
> [snip]
> 
> > (XEN) mm.c:1608:d0 Error pfn 128eb: rd=ffbd4100, od=00000000, 
> > caf=00000000, taf=00000000
> > (XEN) mm.c:649:d0 Error getting mfn 128eb (pfn 55555555) from L1 entry 
> > 00000000128eb067 for dom1
> > (XEN) mm.c:1608:d0 Error pfn d45a: rd=ffbd4100, od=00000000, 
> > caf=00000000, taf=00000000
> > (XEN) mm.c:649:d0 Error getting mfn d45a (pfn 55555555) from L1 entry 
> > 000000000d45a067 for dom1
> 
> 
> Manuell: In sys/arch/xen/xen/privcmd.c I found maddr
> and mfn variables storing machine physical addresses.
> They are of type u_long, int or paddr_t.
> IMO, they should always be of type paddr_t.
We can't really change the type of mfn as it's part of the ABI (or closely
related). A 32bit value should be enough here as it's not in bytes but
in pages, a 32bit value gives us 44 bytes physical addresses which should
be enough.
But it seems there's (paddr_t) cast missing when converting mfn to paddr,
and a 'ma' variable is u_long which should be a paddr_t.
Mark, can you try the attached patch ?
-- 
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
 NetBSD: 26 ans d'experience feront toujours la difference
--
Index: xen/privcmd.c
===================================================================
RCS file: /cvsroot/src/sys/arch/xen/xen/privcmd.c,v
retrieving revision 1.39
diff -u -p -u -r1.39 privcmd.c
--- xen/privcmd.c 23 Oct 2009 02:32:34 -0000 1.39
+++ xen/privcmd.c 22 Jan 2010 14:26:40 -0000
@@ -336,7 +336,7 @@ privcmd_ioctl(void *v)
 privcmd_mmap_t *mcmd = ap->a_data;
 privcmd_mmap_entry_t mentry;
 vaddr_t va;
- u_long ma;
+ paddr_t ma;
 struct vm_map *vmm = &curlwp->l_proc->p_vmspace->vm_map;
 
 for (i = 0; i < mcmd->num; i++) {
@@ -357,7 +357,7 @@ privcmd_ioctl(void *v)
 if (maddr == NULL)
 return ENOMEM;
 va = mentry.va & ~PAGE_MASK;
- ma = mentry.mfn << PGSHIFT; /* XXX ??? */
+ ma = ((paddr_t)mentry.mfn) << PGSHIFT; /* XXX ??? */
 for (j = 0; j < mentry.npages; j++) {
 maddr[j] = ma;
 ma += PAGE_SIZE;
@@ -374,7 +374,8 @@ privcmd_ioctl(void *v)
 int i;
 privcmd_mmapbatch_t* pmb = ap->a_data;
 vaddr_t va0, va;
- u_long mfn, ma;
+ u_long mfn;
+ paddr_t ma;
 struct vm_map *vmm;
 struct vm_map_entry *entry;
 vm_prot_t prot;
@@ -420,7 +421,7 @@ privcmd_ioctl(void *v)
 UVM_KMF_VAONLY);
 return error;
 }
- ma = mfn << PGSHIFT;
+ ma = ((paddr_t)mfn) << PGSHIFT;
 if (pmap_enter_ma(pmap_kernel(), trymap, ma, 0,
 prot, PMAP_CANFAIL, pmb->dom)) {
 mfn |= 0xF0000000;


Home | Main Index | Thread Index | Old Index

AltStyle によって変換されたページ (->オリジナル) /