Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Jul 2011 09:19:58 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        Doug Barton <dougb@freebsd.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: cardbus panic: end address is not aligned
Message-ID:  <201107080919.58210.jhb@freebsd.org>
In-Reply-To: <4E16C463.9020604@FreeBSD.org>
References:  <4E100086.7080105@FreeBSD.org> <201107071720.50203.jhb@freebsd.org> <4E16C463.9020604@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday, July 08, 2011 4:48:35 am Doug Barton wrote:
> On 07/07/2011 14:20, John Baldwin wrote:
> > On Sunday, July 03, 2011 1:39:18 am Doug Barton wrote:
> >> I have 2 ath-based pc-card adapters. If I put either one of them in the 
> >> slot while the system is up, or if I try booting with them in the slot, 
> >> I get an instant panic. The cards previously worked in -current, and 
> >> continue to work in 8-stable and windows xp. I don't have any other 
> >> pc-cards to compare with. Full core.txt.0 file is in my home directory 
> >> on freefall.
> >>
> >> This problem persists on r223732 but happened to me for the first time a 
> >> week or 2 ago (haven't had time to report it previously, apologies). It 
> >> likely originated a while before though, I don't use these cards very 
> >> often.
> >>
> >> panic: end address is not aligned
> >>
> >> #1  0xffffffff80426a8a in kern_reboot (howto=260)
> >>      at /home/svn/head/sys/kern/kern_shutdown.c:430
> >> #2  0xffffffff80426521 in panic (fmt=Variable "fmt" is not available.
> >> )
> >>      at /home/svn/head/sys/kern/kern_shutdown.c:604
> >> #3  0xffffffff8032c648 in pcib_grow_window (sc=0xfffffe0002603400,
> >>      w=0xfffffe0002603498, type=3, start=0, end=4294967295, count=65536, 
> >> flags=Variable "flags" is not available.
> > 
> > The line is here:
> > 
> > 	KASSERT((w->limit & ((1ul << w->step) - 1)) == (1ul << w->step) - 1,
> > 	    ("end address is not aligned"));
> > 
> > Can you run kgdb and do 'frame 3' and 'p/x *w'?
> 
> (kgdb) frame 3
> #3  0xffffffff8032c648 in pcib_grow_window (sc=0xfffffe0002603400,
>     w=0xfffffe0002603498, type=3, start=0, end=4294967295, count=65536,
> flags=Variable "flags" is not available.
> )
>     at /home/svn/head/sys/dev/pci/pci_pci.c:1018
> 1018		KASSERT((w->limit & ((1ul << w->step) - 1)) == (1ul << w->step) - 1,
> (kgdb) p/x *w
> $1 = {base = 0x80000000, limit = 0x8800ffff, rman = {rm_list = {
>       tqh_first = 0xfffffe0002702a00, tqh_last = 0xfffffe0002702a98},
>     rm_mtx = 0xfffffe00024e20e0, rm_link = {tqe_next = 0xfffffe0002603520,
>       tqe_prev = 0xfffffe0002603448}, rm_start = 0x0, rm_end = 0xffffffff,
>     rm_type = 0x2, rm_descr = 0xfffffe0002608060}, res =
> 0xfffffe0002702b00,
>   reg = 0x20, valid = 0x1, mask = 0x2, step = 0x14, name =
> 0xffffffff8071b77c}

Hmm, well that's odd.  It didn't grow it enough it seems.

> > Also, can you boot your machine, then do 'sysctl debug.bootverbose=1', insert 
> > the card and record the messages in dmesg when it does?  (You can likely get 
> > those out of kgdb.)
> 
> The system panics instantly when I insert the cards. Would a verbose
> dmesg entry from 8.2-stable work? I can do that on the same hardware.
> If not I can try it on -current and see if anything gets logged.

Err, if you can get a crashdump, you can use 'printf "%s", msgbufp->msg_ptr'
in kgdb to output all of dmseg.  You can also use the 'dmesg' command against
a crash dump directly, and if you have crashinfo enabled, the tail of the
core.txt.N file in /var/crash will have the full dmesg in it as well.

The real messages I will want to see are in the dmesg.   Also, getting the
output of 'devinfo -r' before you insert the card would also be helpful so
I can see what it is growing from.

Actually, forgo all that.  Try this patch:

Index: pci_pci.c
===================================================================
--- pci_pci.c	(revision 223847)
+++ pci_pci.c	(working copy)
@@ -954,7 +954,7 @@ pcib_grow_window(struct pcib_softc *sc, struct pci
 			if (bootverbose)
 				printf("\tback candidate range: %#lx-%#lx\n",
 				    start_free, back);
-			back = roundup2(back + 1, w->step) - 1;
+			back = roundup2(back + 1, 1ul << w->step) - 1;
 			back -= rman_get_end(w->res);
 		} else
 			back = 0;

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107080919.58210.jhb>