Re: i386/165561: K8N890M-M Boot Hang The hang happens on the boot machine (console=vidconsole) at the instruction as indicated in the listing from the pci_cfgreg.c snippit and the VIDCONSOLE OUTPUT. If booting via console=comconsole only, the boot continues, as shown in BEGIN COMCONSOLE BOOT CONTINUE listing. =====BEGIN VIDCONSOLE OUTPUT======================= OK boot -d KDB: debugger backends: ddb KDB: current backend: ddb KDB: enter: Boot flags requested debugger [ thread pid 0 tid 0 ] Stopped at kdb_enter+0x3a: movl $0,kdb_why db> b pcib_alloc_window db> cont Copyright (c) 1992-2012 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD is a registered trademark of The FreeBSD Foundation. FreeBSD 9.0-RELEASE #2: Thu Mar 1 11:11:06 PST 2012 root@butler.bkyoung.com:/usr/obj/usr/src/sys/BUTLER i386 CPU: AMD Athlon(tm) 64 Processor 3800+ (2394.05-MHz 686-class CPU) Origin = "AuthenticAMD" Id = 0x50ff2 Family = f Model = 5f Stepping = 2 Features=0x78bfbff Features2=0x2001 AMD Features=0xea500800 AMD Features2=0x1d real memory = 2147483648 (2048 MB) avail memory = 1822670848 (1738 MB) Event timer "LAPIC" quality 400 ACPI APIC Table: ioapic0 irqs 0-23 on motherboard ioapic1 irqs 24-47 on motherboard kbd1 at kbdmux0 acpi0: on motherboard acpi0: Power Button (fixed) acpi0: reservation of 0, a0000 (3) failed acpi0: reservation of 100000, 7ff00000 (3) failed Timecounter "ACPI-fast" frequency 3579545 Hz quality 900 acpi_timer0: <24-bit timer at 3.579545MHz> port 0x808-0x80b on acpi0 cpu0: on acpi0 pcib0: port 0xcf8-0xcff on acpi0 pci0: on pcib0 pcib1: at device 1.0 on pci0 [ thread pid 0 tid 100000 ] Breakpoint at pcib_alloc_window: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pcib_alloc_window: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pcib_alloc_window: pushl %ebp db> b pci_write_config_method db> cont pcib1: failed to allocate initial prefetch window: 0xd0000000-0xdfffffff [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> pci1: on pcib1 [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> [ thread pid 0 tid 100000 ] Breakpoint at pci_write_config_method: pushl %ebp db> b pci_cfgregwrite db> cont [ thread pid 0 tid 100000 ] Breakpoint at pci_cfgregwrite: pushl %ebp db> s [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x1: movl %esp,%ebp db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x3: subl $0x30,%esp db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x6: movl %ebx,0xfffffff4(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x9: movl %esi,0xfffffff8(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xc: movl %edi,0xfffffffc(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xf: movl 0x8(%ebp),%esi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x12: movl 0x1c(%ebp),%edi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x15: cmpl $0x3,cfgmech db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x1c: jnz pci_cfgregwrite+0x1b0 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x22: cmpl %esi,pcie_minbus db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x28: jnle pci_cfgregwrite+0x1b0 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x2e: cmpl pcie_maxbus,%esi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x34: jnle pci_cfgregwrite+0x1b0 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x3a: testl %esi,%esi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x3c: jnz pci_cfgregwrite+0x55 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x55: cmpl $0x1f,0xc(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x59: jnbe pci_cfgregwrite+0x288 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x5f: cmpl $0x7,0x10(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x63: jnbe pci_cfgregwrite+0x288 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x69: cmpl $0xfff,0x14(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x70: jnbe pci_cfgregwrite+0x288 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x76: call critical_enter db> [ thread pid 0 tid 100000 ] Stopped at critical_enter: pushl %ebp db> n After 7 instructions (0 loads, 0 stores), [ thread pid 0 tid 100000 ] Stopped at critical_enter+0x1a: ret db> s [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x7b: movl %esi,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x7d: andl $0xff,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x83: shll $0x14,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x86: orl pcie_base,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x8c: movl 0xc(%ebp),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x8f: andl $0x1f,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x92: shll $0xf,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x95: orl %eax,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x97: movl 0x10(%ebp),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x9a: andl $0x7,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x9d: shll $0xc,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xa0: orl %eax,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xa2: movl 0x14(%ebp),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xa5: andl $0xfff,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xaa: orl %eax,%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xac: movl %edx,0xffffffe4(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xaf: movl %edx,%esi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xb1: andl $0xfffff000,%esi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xb7: movl %fs:0x20,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xbd: movl %eax,0xffffffec(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xc0: shll $0x3,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xc3: leal pcie_list(%eax),%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xc9: movl %edx,0xffffffe8(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xcc: movl pcie_list(%eax),%ebx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xd2: testl %ebx,%ebx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xd4: jz pci_cfgregwrite+0xeb db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xd6: cmpl 0xc(%ebx),%esi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xd9: jnz pci_cfgregwrite+0xe5 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0xdb: jmp pci_cfgregwrite+0x11f db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x11f: movl 0xffffffe8(%ebp),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x122: cmpl %ebx,0(%eax) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x124: jz pci_cfgregwrite+0x164 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x164: movl 0x18(%ebp),%edx db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x167: movl 0xffffffe4(%ebp),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x16a: andl $0xfff,%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x16f: orl 0x8(%ebx),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x172: movl %eax,0xfffffff0(%ebp) db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x175: cmpl $0x2,%edi db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x178: jz pci_cfgregwrite+0x192 db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x192: movl 0xfffffff0(%ebp),%eax db> [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x195: movw %dx,0(%eax) db> =====END VIDCONSOLE OUTPUT======================= =====BEGIN COMCONSOLE BOOT CONTINUE============== print %eax c0d66855 db> x/wx 0xc0d66855 pci_cfgregwrite+0x195: eb108966 db> s [ thread pid 0 tid 100000 ] Stopped at pci_cfgregwrite+0x198: jmp pci_cfgregwrite+0x19f db> pint %dx No such command db> print %dx c0d66858 db> ====END COMCONSOLE BOOT CONTINUE====================================== ====BEGIN SNIPPIT FROM pci_cfgreg.c 00000380 : /* * Write configuration space register */ void pci_cfgregwrite(int bus, int slot, int func, int reg, u_int32_t data, int bytes) { 380: 55 push %ebp 381: 89 e5 mov %esp,%ebp 383: 83 ec 30 sub $0x30,%esp 386: 89 5d f4 mov %ebx,-0xc(%ebp) 389: 89 75 f8 mov %esi,-0x8(%ebp) 38c: 89 7d fc mov %edi,-0x4(%ebp) 38f: 8b 75 08 mov 0x8(%ebp),%esi 392: 8b 7d 1c mov 0x1c(%ebp),%edi if (cfgmech == CFGMECH_PCIE && 395: 83 3d 34 01 00 00 03 cmpl $0x3,0x134 39c: 0f 85 8e 01 00 00 jne 530 3a2: 39 35 28 01 00 00 cmp %esi,0x128 3a8: 0f 8f 82 01 00 00 jg 530 3ae: 3b 35 2c 01 00 00 cmp 0x12c,%esi 3b4: 0f 8f 76 01 00 00 jg 530 3ba: 85 f6 test %esi,%esi 3bc: 75 17 jne 3d5 3be: b8 01 00 00 00 mov $0x1,%eax 3c3: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx 3c7: d3 e0 shl %cl,%eax 3c9: 85 05 30 01 00 00 test %eax,0x130 3cf: 0f 85 5b 01 00 00 jne 530 { struct pcie_cfg_elem *elem; volatile vm_offset_t va; vm_paddr_t pa, papage; if (bus < pcie_minbus || bus > pcie_maxbus || slot > PCI_SLOTMAX || 3d5: 83 7d 0c 1f cmpl $0x1f,0xc(%ebp) 3d9: 0f 87 29 02 00 00 ja 608 3df: 83 7d 10 07 cmpl $0x7,0x10(%ebp) 3e3: 0f 87 1f 02 00 00 ja 608 3e9: 81 7d 14 ff 0f 00 00 cmpl $0xfff,0x14(%ebp) 3f0: 0f 87 12 02 00 00 ja 608 func > PCI_FUNCMAX || reg > PCIE_REGMAX) return; critical_enter(); 3f6: e8 fc ff ff ff call 3f7 pa = PCIE_PADDR(pcie_base, reg, bus, slot, func); 3fb: 89 f2 mov %esi,%edx 3fd: 81 e2 ff 00 00 00 and $0xff,%edx 403: c1 e2 14 shl $0x14,%edx 406: 0b 15 20 01 00 00 or 0x120,%edx 40c: 8b 45 0c mov 0xc(%ebp),%eax 40f: 83 e0 1f and $0x1f,%eax 412: c1 e0 0f shl $0xf,%eax 415: 09 c2 or %eax,%edx 417: 8b 45 10 mov 0x10(%ebp),%eax 41a: 83 e0 07 and $0x7,%eax 41d: c1 e0 0c shl $0xc,%eax 420: 09 c2 or %eax,%edx 422: 8b 45 14 mov 0x14(%ebp),%eax 425: 25 ff 0f 00 00 and $0xfff,%eax 42a: 09 c2 or %eax,%edx 42c: 89 55 e4 mov %edx,-0x1c(%ebp) papage = pa & ~PAGE_MASK; 42f: 89 d6 mov %edx,%esi 431: 81 e6 00 f0 ff ff and $0xfffff000,%esi pciereg_findelem(vm_paddr_t papage) { struct pcie_cfg_list *pcielist; struct pcie_cfg_elem *elem; pcielist = &pcie_list[PCPU_GET(cpuid)]; 437: 64 a1 20 00 00 00 mov %fs:0x20,%eax 43d: 89 45 ec mov %eax,-0x14(%ebp) 440: c1 e0 03 shl $0x3,%eax 443: 8d 90 20 00 00 00 lea 0x20(%eax),%edx 449: 89 55 e8 mov %edx,-0x18(%ebp) TAILQ_FOREACH(elem, pcielist, elem) { 44c: 8b 98 20 00 00 00 mov 0x20(%eax),%ebx 452: 85 db test %ebx,%ebx 454: 74 15 je 46b if (elem->papage == papage) 456: 3b 73 0c cmp 0xc(%ebx),%esi 459: 75 0a jne 465 45b: eb 42 jmp 49f 45d: 8d 76 00 lea 0x0(%esi),%esi 460: 3b 73 0c cmp 0xc(%ebx),%esi 463: 74 3a je 49f { struct pcie_cfg_list *pcielist; struct pcie_cfg_elem *elem; pcielist = &pcie_list[PCPU_GET(cpuid)]; TAILQ_FOREACH(elem, pcielist, elem) { 465: 8b 1b mov (%ebx),%ebx 467: 85 db test %ebx,%ebx 469: 75 f5 jne 460 if (elem->papage == papage) break; } if (elem == NULL) { elem = TAILQ_LAST(pcielist, pcie_cfg_list); 46b: 8b 4d e8 mov -0x18(%ebp),%ecx 46e: 8b 41 04 mov 0x4(%ecx),%eax 471: 8b 40 04 mov 0x4(%eax),%eax 474: 8b 18 mov (%eax),%ebx if (elem->papage != 0) { 476: 83 7b 0c 00 cmpl $0x0,0xc(%ebx) 47a: 74 11 je 48d pmap_kremove(elem->vapage); 47c: 8b 43 08 mov 0x8(%ebx),%eax 47f: 89 04 24 mov %eax,(%esp) 482: e8 fc ff ff ff call 483 { #ifdef XEN xen_invlpg(addr); #else __asm __volatile("invlpg %0" : : "m" (*(char *)addr) : "memory"); 487: 8b 43 08 mov 0x8(%ebx),%eax 48a: 0f 01 38 invlpg (%eax) invlpg(elem->vapage); } pmap_kenter(elem->vapage, papage); 48d: 8b 43 08 mov 0x8(%ebx),%eax 490: 89 74 24 04 mov %esi,0x4(%esp) 494: 89 04 24 mov %eax,(%esp) 497: e8 fc ff ff ff call 498 elem->papage = papage; 49c: 89 73 0c mov %esi,0xc(%ebx) } if (elem != TAILQ_FIRST(pcielist)) { 49f: 8b 45 e8 mov -0x18(%ebp),%eax 4a2: 39 18 cmp %ebx,(%eax) 4a4: 74 3e je 4e4 TAILQ_REMOVE(pcielist, elem, elem); 4a6: 8b 13 mov (%ebx),%edx 4a8: 85 d2 test %edx,%edx 4aa: 74 08 je 4b4 4ac: 8b 43 04 mov 0x4(%ebx),%eax 4af: 89 42 04 mov %eax,0x4(%edx) 4b2: eb 09 jmp 4bd 4b4: 8b 43 04 mov 0x4(%ebx),%eax 4b7: 8b 55 e8 mov -0x18(%ebp),%edx 4ba: 89 42 04 mov %eax,0x4(%edx) 4bd: 8b 43 04 mov 0x4(%ebx),%eax 4c0: 8b 13 mov (%ebx),%edx 4c2: 89 10 mov %edx,(%eax) TAILQ_INSERT_HEAD(pcielist, elem, elem); 4c4: 8b 4d e8 mov -0x18(%ebp),%ecx 4c7: 8b 01 mov (%ecx),%eax 4c9: 89 03 mov %eax,(%ebx) 4cb: 85 c0 test %eax,%eax 4cd: 74 07 je 4d6 4cf: 8b 01 mov (%ecx),%eax 4d1: 89 58 04 mov %ebx,0x4(%eax) 4d4: eb 06 jmp 4dc 4d6: 8b 45 e8 mov -0x18(%ebp),%eax 4d9: 89 58 04 mov %ebx,0x4(%eax) 4dc: 8b 55 e8 mov -0x18(%ebp),%edx 4df: 89 1a mov %ebx,(%edx) 4e1: 89 53 04 mov %edx,0x4(%ebx) { if (cfgmech == CFGMECH_PCIE && (bus >= pcie_minbus && bus <= pcie_maxbus) && (bus != 0 || !(1 << slot & pcie_badslots))) pciereg_cfgwrite(bus, slot, func, reg, data, bytes); 4e4: 8b 55 18 mov 0x18(%ebp),%edx critical_enter(); pa = PCIE_PADDR(pcie_base, reg, bus, slot, func); papage = pa & ~PAGE_MASK; elem = pciereg_findelem(papage); va = elem->vapage | (pa & PAGE_MASK); 4e7: 8b 45 e4 mov -0x1c(%ebp),%eax 4ea: 25 ff 0f 00 00 and $0xfff,%eax 4ef: 0b 43 08 or 0x8(%ebx),%eax 4f2: 89 45 f0 mov %eax,-0x10(%ebp) switch (bytes) { 4f5: 83 ff 02 cmp $0x2,%edi 4f8: 74 18 je 512 4fa: 83 ff 04 cmp $0x4,%edi 4fd: 74 07 je 506 4ff: 83 ff 01 cmp $0x1,%edi 502: 75 1b jne 51f 504: eb 14 jmp 51a case 4: *(volatile uint32_t *)(va) = data; 506: 8b 45 f0 mov -0x10(%ebp),%eax 509: 8b 4d 18 mov 0x18(%ebp),%ecx 50c: 89 08 mov %ecx,(%eax) 50e: 66 90 xchg %ax,%ax 510: eb 0d jmp 51f break; case 2: *(volatile uint16_t *)(va) = data; 512: 8b 45 f0 mov -0x10(%ebp),%eax ===================================================================== == VIDCONSOLE BOOT HANGS HERE AT mov %dx,(%eax) ===================================================================== 515: 66 89 10 mov %dx,(%eax) 518: eb 05 jmp 51f break; case 1: *(volatile uint8_t *)(va) = data; 51a: 8b 45 f0 mov -0x10(%ebp),%eax 51d: 88 10 mov %dl,(%eax) break; } critical_exit(); 51f: e8 fc ff ff ff call 520 524: e9 df 00 00 00 jmp 608 529: 8d b4 26 00 00 00 00 lea 0x0(%esi),%esi ====END SNIPPIT FROM pci_cfgreg.c