Re: NULL pointer dereference panic

From: Andrew R. Reiter <arr_at_watson.org>
Date: Mon, 19 Jun 2006 18:20:54 -0400 (EDT)
On Tue, 20 Jun 2006, Yar Tikhiy wrote:

:On Tue, Jun 20, 2006 at 05:08:22AM +1000, Peter Jeremy wrote:
:> On Mon, 2006-Jun-19 22:45:41 +0400, Yar Tikhiy wrote:
:> >Peter, what gcc options did you build the kernel with?  My question
:> >is unrelated to the panic, I'd just like to make stack traces look
:> >sane in common cases :-)
:> 
:> In /etc/make.conf:
:> CPUTYPE?=athlon-xp
:> CFLAGS=-O -pipe
:> COPTFLAGS=-O -pipe
:
:Indeed, gcc in athlon-xp mode handles function calls in a manner
:different from the i386 default one.  The old backtrace would be
:confused, too, by the code generated so.
:
:Technical details for curious folks:
:
:When in basic i386 mode, gcc calls functions in the traditional
:way.  E.g., the "foo(1, 2)" call will look as follows in asm:
:
:	pushl	$2
:	pushl	$1
:	call	foo
:	addl	$8, %esp
:
:By merely decoding the addl instruction at the return pointer we
:can find how many words of arguments the called function takes.  In
:the example, it takes 8 / 4 = 2 words, where 4 is the size of a
:machine word.
:
:In athlon-xp mode, the parent function reserves once, at its prologue,
:stack space enough for the arguments to any of its child functions.
:Then the same "foo(1, 2)" call is made in a "RISCy" way:
:
:	movl	$2, 0x4(%esp)
:	movl	$1, (%esp)
:	call	foo
:
:Since the stack pointer no longer needs to be adjusted after each
:call, we cannot guess the number of arguments by decoding the
:instruction at the return address.
:
:The fdrop() call is a case of particular confusion.  The C source
:essentially reads:
:
:closef()
:{
:	...
:	return (fdrop(...));
:}
:
:In athlon-xp mode, it becomes:
:
:	call	fdrop
:	addl	$0x6c, %esp
:	pop	%ebx
:	leave
:	ret
:
:The addl there is not to adjust the stack after the call to fdrop(),
:it's the epilogue of closef() freeing the space reserved for local
:vars and child function arguments.  Alas, we cannot tell it from
:addl in the traditional case, as though fdrop() took 27 words of
:arguments.
:

Thanks for the information regarding athlon-xp.  Have other OSes done 
anything (special casing?) for this hardware so as to make it more easy 
for "better" traces to be done?

Thanks for any info.

Cheers,
Andrew

--
arr_at_watson.org
Received on Mon Jun 19 2006 - 20:21:44 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:57 UTC