Port-xen archive

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

Dom0 PAE panic when starting xend



Hi,


I can boot i386 Dom0 PAE with Xen 3.3.1.
When I launch xend, I get a panic:

# xend start
Feb 18 13:22:59 fricka xenstored: Checking store ...
Feb 18 13:23:02 fricka xenstored: Checking store complete.
(XEN) mm.c:1777:d0 Error pfn 55555: rd=ff2b8100, od=00000000, caf=00000000, 
taf=0000000
0
(XEN) mm.c:708:d0 Error getting mfn 55555 (pfn 55555555) from L1 entry 
0000000055555067 for dom0
xpq_flush_queue: 1 entries
0x0000000102fd1608: 0x0000000055555067
panic: HYPERVISOR_mmu_update failed

fatal breakpoint trap in supervisor mode
trap type 1 code 0 eip c02125c4 cs 9 eflags 246 cr2 bb6c1800 ilevel 6
Stopped in pid 415.1 (xenstored) at     netbsd:breakpoint+0x4:  popl    %ebp
db> bt
breakpoint(c09987fe,cdfe9988,c09b7080,c05fce0b,c099f49d,5,0,0,cdfe9998,ffffffea)
 at netbsd:breakpoint+0x4
panic(c099f4b3,2fd1608,1,55555067,0,cdfe99ac,0,c07619c6,cabfd484,c0a9105c) at 
netbsd:panic+0x1a4
xpq_update_foreign(2fd1608,1,55555067,0,cdb6bce0,0,cdfe9a1c,c05f5b0c,cdb48910,cd
b6bce0) at netbsd:xpq_update_foreign
pmap_enter_ma(cda80934,bb6c1000,55555000,0,55555000,0,3,23,7ff0,3) at 
netbsd:pmap_enter_ma+0x580
pmap_enter(cda80934,bb6c1000,55555000,0,3,23,ce0f7f50,0,c16fa640,bb6c1000) at 
netbsd:pmap_enter+0xd3
udv_fault(cdfe9c70,bb6c1000,cdfe9c30,1,0,1,5,ffffffff,c06fb56b,0) at 
netbsd:udv_fault+0x491
uvm_fault_internal(ca89f4e0,bb6c1000,1,0,0,0,0,cdf9aa20,0,c09f7ff0) at 
netbsd:uvm_fault_internal+0x8e5
trap() at netbsd:trap+0x6e0
--- trap (number 6) ---
0x804d53a:
db>


In Xen, said function in mm.c:1777 is this:

int get_page(struct page_info *page, struct domain *domain)
{
    u32 x, nx, y = page->count_info;
    u32 d, nd = page->u.inuse._domain;
    u32 _domain = pickle_domptr(domain);

    do {
        x  = y;
        nx = x + 1;
        d  = nd;
        if ( unlikely((x & PGC_count_mask) == 0) ||  /* Not allocated? */
             unlikely((nx & PGC_count_mask) == 0) || /* Count overflow? */
             unlikely(d != _domain) )                /* Wrong owner? */
        {
            if ( !_shadow_mode_refcounts(domain) && !domain->is_dying )
                gdprintk(XENLOG_INFO,
                         "Error pfn %lx: rd=%p, od=%p, caf=%08x, taf=%"
                         PRtype_info "\n",
                         page_to_mfn(page), domain, unpickle_domptr(d),
                         x, page->u.inuse.type_info);
            return 0;
        }
        asm volatile (
            LOCK_PREFIX "cmpxchg8b %2"
            : "=d" (nd), "=a" (y),
            "=m" (*(volatile u64 *)(&page->count_info))
            : "0" (d), "1" (x), "c" (d), "b" (nx) );
    }
    while ( unlikely(nd != d) || unlikely(y != x) );

    return 1;
}

I added additional debug output to see why get_page()
returns 0:

(XEN) get_page: (x & PGC_count_mask) = 0
(XEN) get_page: (nx & PGC_count_mask) = 1
(XEN) get_page: wrong owner

So the accessed page is a) allocated, b) overlows and c) doesn't belong to 
Dom0.

I added a BUG();  right before 'return 0;' to get a backstrace:

(XEN) Xen call trace:
(XEN)    [<ff13d169>] get_page+0x11e/0x15a
(XEN)    [<ff13b5d2>] get_page_from_l1e+0x284/0x43f
(XEN)    [<ff13c98a>] mod_l1_entry+0x3c5/0x4a3
(XEN)    [<ff13eb74>] do_mmu_update+0x44d/0x76a
(XEN)    [<ff1a58a8>] hypercall+0xb8/0xd8

I'm not sure, if I hit a bug in Xen or in NetBSD/Xen.

Christoph


Home | Main Index | Thread Index | Old Index