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 tschwi...@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
signature.asc
Description: Digital signature