Re: ddb(4) spoils kernel stack in CURRENT?



On Wednesday 20 December 2006 15:41, Kip Macy wrote:
I worried that gdb probably had workaround for the large stack argument.
I'll have to dig it up, thanks for the heads up.

Both kgdb and ddb have explicit knowledge of trapframes and interrupt frames
and know how to step across them, so both of those will need to be updated.
For ddb, you'll have to update the 'db_nextframe()' function in
sys/{amd64,i386}/{amd64,i386}/db_trace.c. Specifically this section:

/*
* Point to base of trapframe which is just above the
* current frame.
*/
if (frame_type == INTERRUPT)
tf = (struct trapframe *)((int)*fp + 12);
else
tf = (struct trapframe *)((int)*fp + 8);

The easy change is to just bump those up by 4 (by 8 on amd64). Similarly,
for kgdb you'll have to update src/gnu/usr.bin/gdb/kgdb/trgt_{amd64,i386}.c.

NB: kgdb doesn't properly distinguish interrupt frames from other trap
frames. It treats nearly all trap frames as interrupt frames (though its
handling of interrupt frames is more like a trap frame I think).

-Kip

On 12/20/06, Dmitry Pryanishnikov <dmitry@xxxxxxxxxxxxxx> wrote:


Hello!

On Wed, 20 Dec 2006, Kostik Belousov wrote:
So it looks like a regression in CURRENT vs RELENG_6 (either ddb
'spoils'
the stack somehow, or kgdb fails to unwind it).

Could you further localize the problem, i.e. try to backtrace CURRENT
dump

Good news: I've managed to localize the bug! I'm Feeling Lucky (TM) ;)
just because CURRENT on my notebook was updated approx. at 17-Dec 00:00,
and it didn't manifest such a behaviour! So it was easy to identify the
regression - it comes with the following commit:

-----------------------------------------------------------------------

Date: Sun, 17 Dec 2006 05:07:01 +0000 (UTC)
From: Kip Macy <kmacy@xxxxxxxxxxx>
To: src-committers@xxxxxxxxxxx, cvs-src@xxxxxxxxxxx, cvs-all@xxxxxxxxxxx
Subject: cvs commit: src/sys/i386/i386 apic_vector.s exception.slocal_apic.c
trap.c vm86.c vm86bios.s src/sys/i386/include apicvar.h
src/sys/i386/isa atpic.c atpic_vector.s icu.h

kmacy 2006-12-17 05:07:01 UTC

FreeBSD src repository

Modified files:
sys/i386/i386 apic_vector.s exception.s local_apic.c
trap.c vm86.c vm86bios.s
sys/i386/include apicvar.h
sys/i386/isa atpic.c atpic_vector.s icu.h
Log:
Evidently FreeBSD has long relied on the compiler to treat structures
passed by value (trap frames) as if they were in fact being passed by
reference. For better or worse, this incorrect behaviour is no longer
present in gcc 4.1. In this patch I convert all trapframe arguments to
be explicitly pass by reference. I also remove vm86_initflags, pushing
the very little work that it actually does up into vm86_prepcall.

-----------------------------------------------------------------------

So kernel built from sources as of date=2006.12.17.05.00.00 gives dump
with analyzable backtrace, and kernel built from sources as of
date=2006.12.17.05.10.00 (which include this commit) gives dump
which confuses kgdb. I believe that commit itself is correct,
but kgdb contains some workaround against the old (incorrect) behaviour
of the kernel, so it's the kgdb that should be fixed.

Sincerely, Dmitry
--
Atlantis ISP, System Administrator
e-mail: dmitry@xxxxxxxxxxxxxx
nic-hdl: LYNX-RIPE
_______________________________________________
freebsd-current@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe@xxxxxxxxxxx"

_______________________________________________
freebsd-current@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe@xxxxxxxxxxx"


--
John Baldwin
_______________________________________________
freebsd-current@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscribe@xxxxxxxxxxx"



Relevant Pages

  • Re: 2.6.0-test3-mm1 and the -g thing.
    ... > I do not agree that this should be dependent on KGDB. ... the new gdb uses the dwarf2 call frames and thus avoids the "bt" ... send the line "unsubscribe linux-kernel" in ...
    (Linux-Kernel)
  • Re: 6.0 random freezes
    ... last line or did you cut the backtrace off? ... # make gdbinit [this just copies a few config files for kgdb] ... Hopefully this will decode #7 and you can provide a few more frames. ... Peter Jeremy ...
    (freebsd-stable)