bug-hurd
[Top][All Lists]
Advanced

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

Re: Xen domU vs. more than 652 MiB of RAM


From: Thomas Schwinge
Subject: Re: Xen domU vs. more than 652 MiB of RAM
Date: Thu, 1 Oct 2009 17:59:22 +0200
User-agent: Mutt/1.5.11

Hello!

On Thu, Oct 01, 2009 at 05:25:17PM +0200, Samuel Thibault wrote:
> Thomas Schwinge, le Thu 01 Oct 2009 17:00:43 +0200, a écrit :
> > > Attached is a patch I've found in my xen checkout, I can't remember
> > > whether it works.
> > 
> > Unfortunately not.  I rebooted blubber with a kernel containing this
> > patch; see the attached log file.
> 
> Please also see xm dmesg, where the precise IP where the kernel crashed
> should be (maybe only with debug options), and then you can addr2line
> it.

Unfortunately I don't have the time at the moment to dive into this
issue, but here is all the data.  If you have ideas what to try and it
doesn't take too much time, then I can try.  Or, as I said, you can log
into the machine.


    (XEN) Unhandled page fault in domain 203 on VCPU 0 (ec=0000)
    (XEN) Pagetable walk from 00003000:
    (XEN)  L3[0x000] = 000000005a1d0001 000001dd
    (XEN)  L2[0x000] = 0000000000000000 ffffffff 
    (XEN) domain_crash_sync called from entry.S (ff1888be)
    (XEN) Domain 203 (vcpu#0) crashed on cpu#0:
    (XEN) ----[ Xen-3.2-1  x86_32p  debug=n  Not tainted ]----
    (XEN) CPU:    0
    (XEN) EIP:    e019:[<2000a0af>]
    (XEN) EFLAGS: 00000207   CONTEXT: guest
    (XEN) eax: 00000600   ebx: c01e4000   ecx: 00000200   edx: 00000000
    (XEN) esi: 00003000   edi: 201e4000   ebp: 200837a4   esp: 2008372c
    (XEN) cr0: 8005003b   cr4: 000006f0   cr3: 5a1d1000   cr2: 00003000
    (XEN) ds: e021   es: e021   fs: e021   gs: e021   ss: e021   cs: e019
    (XEN) Guest stack trace from esp=2008372c:
    (XEN)    00000000 2000a0af 0001e019 00010007 0000000a 00000000 00000000 
00000000
    (XEN)    20065546 2008376c 200837d4 200245b6 0000000a 00000000 00003000 
00000000
    (XEN)    201dd000 00000000 00000000 00000000 00000000 00000000 200837a4 
200050f1
    (XEN)    200837a0 00000000 fffffff9 00000200 00007ff0 001e4000 20083824 
2000b949
    (XEN)    201e4000 00000000 200837d4 200398eb 0000000a 201e4000 30303030 
0001080a
    (XEN)    00000000 201dd000 200837f4 20024e20 20065518 20083800 200398c0 
00000010
    (XEN)    00000000 dff7c7b9 20083804 20024e48 20065518 20083818 20083824 
200051ea
    (XEN)    20065518 00000000 0de00000 0001080a 00007ff0 20083854 20083884 
20005320
    (XEN)    00000000 00000000 00000000 00000000 00000000 38303032 30343131 
00000000
    (XEN)    201d9454 2007ed94 20083874 20024e20 200699a5 20083880 200398c0 
00000010
    (XEN)    00000000 2007ed94 20083884 0001080a 0000000f 2007ed94 200838a4 
20005707
    (XEN)    200699a5 20084000 00000474 00000000 001d9000 00000000 00000000 
20000016
    (XEN)    001d9000 00000000 3e400000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
    (XEN)    00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000


    tschwinge@zenhost:~/tmp/gnumach/gnumach-xen.build $ addr2line -i -f -e 
gnumach 0x2000a0af
    pmap_set_page_readonly_init
    
/home/tschwinge/tmp/gnumach/gnumach-xen.build/../gnumach-xen/i386/intel/pmap.c:812


       798      /* This needs to be called instead of pmap_set_page_readonly as 
long as RC3
       799       * still points to the bootstrap dirbase.  */
       800      void pmap_set_page_readonly_init(void *_vaddr) {
       801              vm_offset_t vaddr = (vm_offset_t) _vaddr;
       802      #if PAE
       803              pt_entry_t *pdpbase = (void*) boot_info.pt_base;
       804              vm_offset_t dirbase = ptetokv(pdpbase[0]);
       805      #else
       806              vm_offset_t dirbase = boot_info.pt_base;
       807      #endif
       808              struct pmap linear_pmap = {
       809                      .dirbase = (void*) dirbase,
       810              };
       811              /* Modify our future kernel map (can't use 
update_va_mapping for this)... */
       812              if (*pmap_pde(kernel_pmap, vaddr) & INTEL_PTE_VALID)
       813                      if (!hyp_mmu_update_la (kvtolin(vaddr), 
pa_to_pte (kv_to_ma(vaddr)) | INTEL_PTE_VALID))
       814                              panic("couldn't set hiMMU readonly for 
vaddr %p(%p)\n", vaddr, kv_to_ma (vaddr));
       815              /* ... and the bootstrap map.  */
       816              if (*pmap_pde(&linear_pmap, vaddr) & INTEL_PTE_VALID)
       817                      if (hyp_do_update_va_mapping (vaddr, pa_to_pte 
(kv_to_ma(vaddr)) | INTEL_PTE_VALID, UVMF_NONE))
       818                              panic("couldn't set MMU readonly for 
vaddr %p(%p)\n", vaddr, kv_to_ma (vaddr));
       819      }


    /* This needs to be called instead of pmap_set_page_readonly as long as RC3
     * still points to the bootstrap dirbase.  */
    void pmap_set_page_readonly_init(void *_vaddr) {
    2000a050:       55                      push   %ebp
    2000a051:       89 e5                   mov    %esp,%ebp
    2000a053:       57                      push   %edi
    2000a054:       56                      push   %esi
    2000a055:       53                      push   %ebx
    2000a056:       83 ec 5c                sub    $0x5c,%esp
    #else
            vm_offset_t dirbase = boot_info.pt_base;
    #endif
            struct pmap linear_pmap = {
                    .dirbase = (void*) dirbase,
            };
    2000a059:       a1 7c e9 07 20          mov    0x2007e97c,%eax
    2000a05e:       8b 15 00 e0 06 20       mov    0x2006e000,%edx
            }
    }
    
    /* This needs to be called instead of pmap_set_page_readonly as long as RC3
     * still points to the bootstrap dirbase.  */
    void pmap_set_page_readonly_init(void *_vaddr) {
    2000a064:       8b 7d 08                mov    0x8(%ebp),%edi
    #else
            vm_offset_t dirbase = boot_info.pt_base;
    #endif
            struct pmap linear_pmap = {
                    .dirbase = (void*) dirbase,
            };
    2000a067:       8b 00                   mov    (%eax),%eax
    2000a069:       c1 e8 0c                shr    $0xc,%eax
    2000a06c:       8b 04 82                mov    (%edx,%eax,4),%eax
    2000a06f:       8d 55 c8                lea    -0x38(%ebp),%edx
    2000a072:       89 55 ac                mov    %edx,-0x54(%ebp)
    2000a075:       31 d2                   xor    %edx,%edx
    2000a077:       c1 e0 0c                shl    $0xc,%eax
    2000a07a:       05 00 00 00 20          add    $0x20000000,%eax
    2000a07f:       c7 44 15 c8 00 00 00    movl   $0x0,-0x38(%ebp,%edx,1)
    2000a086:       00 
    2000a087:       83 c2 04                add    $0x4,%edx
    2000a08a:       83 fa 18                cmp    $0x18,%edx
    2000a08d:       72 f0                   jb     2000a07f 
<pmap_set_page_readonly_init+0x2f>
    
    static inline pt_entry_t *
    pmap_pde(pmap_t pmap, vm_offset_t addr)
    {
            if (pmap == kernel_pmap)
                    addr = kvtolin(addr);
    2000a08f:       8d 9f 00 00 00 a0       lea    -0x60000000(%edi),%ebx
    #endif
            struct pmap linear_pmap = {
                    .dirbase = (void*) dirbase,
            };
            /* Modify our future kernel map (can't use update_va_mapping for 
this)... */
            if (*pmap_pde(kernel_pmap, vaddr) & INTEL_PTE_VALID)
    2000a095:       8b 15 0c f8 07 20       mov    0x2007f80c,%edx
    #else
            vm_offset_t dirbase = boot_info.pt_base;
    #endif
            struct pmap linear_pmap = {
                    .dirbase = (void*) dirbase,
            };
    2000a09b:       89 45 c8                mov    %eax,-0x38(%ebp)
    static inline pt_entry_t *
    pmap_pde(pmap_t pmap, vm_offset_t addr)
    {
            if (pmap == kernel_pmap)
                    addr = kvtolin(addr);
            return &pmap->dirbase[lin2pdenum(addr)];
    2000a09e:       89 d8                   mov    %ebx,%eax
    2000a0a0:       c1 e8 15                shr    $0x15,%eax
    2000a0a3:       8d 34 c5 00 00 00 00    lea    0x0(,%eax,8),%esi
    2000a0aa:       89 75 c0                mov    %esi,-0x40(%ebp)
    #endif
            struct pmap linear_pmap = {
                    .dirbase = (void*) dirbase,
            };
            /* Modify our future kernel map (can't use update_va_mapping for 
this)... */
            if (*pmap_pde(kernel_pmap, vaddr) & INTEL_PTE_VALID)
    2000a0ad:       8b 12                   mov    (%edx),%edx
    2000a0af:       8b 0c c2                mov    (%edx,%eax,8),%ecx
    2000a0b2:       f6 c1 01                test   $0x1,%cl
    2000a0b5:       75 61                   jne    2000a118 
<pmap_set_page_readonly_init+0xc8>
    #endif  /* NCPUS > 1 */
    
    static inline pt_entry_t *
    pmap_pde(pmap_t pmap, vm_offset_t addr)
    {
            if (pmap == kernel_pmap)
    2000a0b7:       8b 75 ac                mov    -0x54(%ebp),%esi
    2000a0ba:       39 35 0c f8 07 20       cmp    %esi,0x2007f80c
    2000a0c0:       74 0b                   je     2000a0cd 
<pmap_set_page_readonly_init+0x7d>
    2000a0c2:       89 f8                   mov    %edi,%eax
    2000a0c4:       c1 e8 15                shr    $0x15,%eax
    2000a0c7:       c1 e0 03                shl    $0x3,%eax
    2000a0ca:       89 45 c0                mov    %eax,-0x40(%ebp)
            /* Modify our future kernel map (can't use update_va_mapping for 
this)... */
            if (*pmap_pde(kernel_pmap, vaddr) & INTEL_PTE_VALID)
                    if (!hyp_mmu_update_la (kvtolin(vaddr), pa_to_pte 
(kv_to_ma(vaddr)) | INTEL_PTE_VALID))
                            panic("couldn't set hiMMU readonly for vaddr 
%p(%p)\n", vaddr, kv_to_ma (vaddr));
            /* ... and the bootstrap map.  */
            if (*pmap_pde(&linear_pmap, vaddr) & INTEL_PTE_VALID)
    2000a0cd:       8b 45 c8                mov    -0x38(%ebp),%eax
    2000a0d0:       8b 55 c0                mov    -0x40(%ebp),%edx
    2000a0d3:       f6 04 10 01             testb  $0x1,(%eax,%edx,1)
    2000a0d7:       74 37                   je     2000a110 
<pmap_set_page_readonly_init+0xc0>
                    if (hyp_do_update_va_mapping (vaddr, pa_to_pte 
(kv_to_ma(vaddr)) | INTEL_PTE_VALID, UVMF_NONE))
    2000a0d9:       8d 87 00 00 00 e0       lea    -0x20000000(%edi),%eax
            reservation.domid = DOMID_SELF;
            if (hyp_memory_op(XENMEM_decrease_reservation, 
kvtolin(&reservation)) != 1)
                    panic("couldn't free page %d\n", mfn);
    }
    
    _hypcall4(int, update_va_mapping, unsigned long, va, unsigned long, val_lo, 
unsigned long, val_hi, unsigned long, flags);
    2000a0df:       31 d2                   xor    %edx,%edx
    2000a0e1:       89 c6                   mov    %eax,%esi
    2000a0e3:       25 ff 0f 00 00          and    $0xfff,%eax
    2000a0e8:       89 45 b8                mov    %eax,-0x48(%ebp)
    2000a0eb:       a1 54 e7 07 20          mov    0x2007e754,%eax
    2000a0f0:       c1 ee 0c                shr    $0xc,%esi
    2000a0f3:       89 75 a8                mov    %esi,-0x58(%ebp)
    2000a0f6:       89 fb                   mov    %edi,%ebx
    2000a0f8:       8b 0c b0                mov    (%eax,%esi,4),%ecx
    2000a0fb:       89 d6                   mov    %edx,%esi
    2000a0fd:       c1 e1 0c                shl    $0xc,%ecx
    2000a100:       83 c9 01                or     $0x1,%ecx
    2000a103:       e8 b8 80 ff ff          call   200021c0 
<__hyp_update_va_mapping>
    2000a108:       85 c0                   test   %eax,%eax
    2000a10a:       0f 85 a3 00 00 00       jne    2000a1b3 
<pmap_set_page_readonly_init+0x163>
                            panic("couldn't set MMU readonly for vaddr 
%p(%p)\n", vaddr, kv_to_ma (vaddr));
    }
    2000a110:       83 c4 5c                add    $0x5c,%esp
    2000a113:       5b                      pop    %ebx
    2000a114:       5e                      pop    %esi
    2000a115:       5f                      pop    %edi
    2000a116:       5d                      pop    %ebp
    2000a117:       c3                      ret    
            struct pmap linear_pmap = {
                    .dirbase = (void*) dirbase,
            };
            /* Modify our future kernel map (can't use update_va_mapping for 
this)... */
            if (*pmap_pde(kernel_pmap, vaddr) & INTEL_PTE_VALID)
                    if (!hyp_mmu_update_la (kvtolin(vaddr), pa_to_pte 
(kv_to_ma(vaddr)) | INTEL_PTE_VALID))
    2000a118:       8d 87 00 00 00 e0       lea    -0x20000000(%edi),%eax
    {
            struct mmu_update update =
            {
                    .ptr = pte,
                    .val = val,
            };
    2000a11e:       81 e1 00 f0 ff ff       and    $0xfffff000,%ecx
    2000a124:       89 c2                   mov    %eax,%edx
    2000a126:       25 ff 0f 00 00          and    $0xfff,%eax
    2000a12b:       89 45 b4                mov    %eax,-0x4c(%ebp)
    2000a12e:       a1 54 e7 07 20          mov    0x2007e754,%eax
    2000a133:       c1 eb 09                shr    $0x9,%ebx
    2000a136:       c1 ea 0c                shr    $0xc,%edx
    2000a139:       81 e3 f8 0f 00 00       and    $0xff8,%ebx
    2000a13f:       89 55 b0                mov    %edx,-0x50(%ebp)
     * kvtolin when giving pointers as parameters for the hypercall to read data
     * at. Use kv_to_la when they may be used before GDT got set up. */
    
    _hypcall1(long, set_trap_table, vm_offset_t /* struct trap_info * */, 
traps);
    
    _hypcall4(int, mmu_update, vm_offset_t /* struct mmu_update * */, req, int, 
count, vm_offset_t /* int * */, success_count, domid_t, domid)
    2000a142:       be f0 7f 00 00          mov    $0x7ff0,%esi
    2000a147:       8b 14 90                mov    (%eax,%edx,4),%edx
    {
            struct mmu_update update =
            {
                    .ptr = pte,
                    .val = val,
            };
    2000a14a:       8d 04 19                lea    (%ecx,%ebx,1),%eax
     * kvtolin when giving pointers as parameters for the hypercall to read data
     * at. Use kv_to_la when they may be used before GDT got set up. */
    
    _hypcall1(long, set_trap_table, vm_offset_t /* struct trap_info * */, 
traps);
    
    _hypcall4(int, mmu_update, vm_offset_t /* struct mmu_update * */, req, int, 
count, vm_offset_t /* int * */, success_count, domid_t, domid)
    2000a14d:       b9 01 00 00 00          mov    $0x1,%ecx


Regards,
 Thomas

Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]