[OpenBIOS] Help with libopenbios/ofmem_common.c line 175 "insert in the freelist"

Mark Cave-Ayland mark.cave-ayland at siriusit.co.uk
Mon Aug 15 14:20:24 CEST 2011


On 10/08/11 23:23, Kenneth Salerno wrote:

> Thanks for the information, Mark.
>
> I'm having issues getting OpenBIOS to work properly when I disable optimization, and I'm sure it's something I'm doing wrong or my compiler has a bug (GCC 4.6.1).
>
> If I change -O2 to -O0 in Makefile.target, execution in QEMU will hang with a next instruction pointer of 0x0000000000000004 while reading the IDE device inside the Forth code... If I compile with -02, as you already know, I am told by GDB that ofmem->mfree was optimized out and cannot set a watchpoint:
>
> #0  0x00000000fff91a84 in ofmem_free (ptr=0x3fca1774)
>      at ../libopenbios/ofmem_common.c:175
> #1  0x00000000fff8862c in free (ptr=<optimized out>)
>      at ../arch/ppc/qemu/ofmem.c:258
> #2  0x00000000fff93798 in deblk_close (di=<optimized out>)
>      at ../packages/deblocker.c:66
> #3  0x00000000fff8d950 in call1_func () at ../libopenbios/bindings.c:431
> #4  0x00000000fff8b62c in call () at ../kernel/forth.c:244
> #5  0x00000000fff8b4e8 in processxt (xt=<optimized out>)
>      at ../kernel/forth.c:106
> #6  next () at ../kernel/forth.c:127
> #7  0x00000000fff8d288 in enterforth (xt=<optimized out>)
>      at ../kernel/forth.c:156
> #8  0x00000000fff8de7c in _selfword (method=0xfffb7d26 "close-deblocker",
>      cache_xt=0xfffc0088) at ../libopenbios/bindings.c:83
> #9  0x00000000fff98478 in ob_ide_close (drive=<optimized out>)
>      at ../drivers/ide.c:1289
> #10 0x00000000fff8d950 in call1_func () at ../libopenbios/bindings.c:431
> #11 0x00000000fff8b62c in call () at ../kernel/forth.c:244
> #12 0x00000000fff8b4e8 in processxt (xt=<optimized out>)
>      at ../kernel/forth.c:106
> #13 next () at ../kernel/forth.c:127
> #14 0x00000000fff8d288 in enterforth (xt=<optimized out>)
>      at ../kernel/forth.c:156
> #15 0x00000000fff8daec in _fword (word=<optimized out>, cache_xt=0xfffbfec0)
>      at ../libopenbios/bindings.c:71
> #16 0x00000000fff8f20c in of_client_interface (params=0x44200)
>      at ../libopenbios/client.c:318
> #17 0x00000000fff019fc in of_client_callback ()
>      at ../arch/ppc/qemu/start.S:614
> Backtrace stopped: frame did not save the PC
>
> Sorry to bug you but why can't I get a working OpenBIOS ELF with compiler optimization disabled?

Gosh that's a tricky one :/

The only time I've ever seen bugs like this in OpenBIOS, i.e. where 
non-opimised and optimised binaries have different behaviour, is in the 
following cases:

i) there is a memory clobbering issue, e.g. Forth dictionary overwriting 
memory it shouldn't

ii) not enough stack space on SPARC before executing the client image

iii) an MMU bug in OpenBIOS

iv) a QEMU emulation bug

I think you'll need to dig deeper with gdb/qemu with you optimised build 
in order to try and work out what's happening here - sorry I can't offer 
any more useful tips :(


ATB,

Mark.

-- 
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063

Sirius Labs: http://www.siriusit.co.uk/labs



More information about the OpenBIOS mailing list