[OpenBIOS] [PATCH] a.out header copy
Olivier Danet
odanet at caramail.com
Wed Feb 5 23:51:29 CET 2014
On 05/02/2014 00:40, Mark Cave-Ayland wrote:
> On 01/02/14 20:54, Olivier Danet wrote:
>
>> NextSTEP's bootloader for Sparc32 expects that the 32 bytes a.out header
>> is copied just before the start address.
>>
>> Signed-off-by: Olivier Danet <odanet at caramail.com>
>> ===================================================================
>> --- libopenbios/aout_load.c (révision 1257)
>> +++ libopenbios/aout_load.c (copie de travail)
>> @@ -139,6 +139,8 @@
>> goto out;
>> }
>> }
>> + seek_io(fd, offset);
>> + read_io(fd, (char *)(start-0x20), 0x20);
>>
>> debug("Loaded %lu bytes\n", size);
>> debug("entry point is %#lx\n", start);
>> ===================================================================
>
> Hmmmm I'm not sure that anything below load-base is supposed to be
> mapped. Is it possible to load the header at start, and then simply
> add N_TXTOFF(ehdr) to the read_io() destination offsets? Or are the
> addresses in the a.out binary absolute?
>
>
> ATB,
>
> Mark.
>
Here is the beginning of the NextSTEP bootloader :
Dump of assembler code from 0x4000 to 0x4100:
=> 0x00004000: tst %o0
0x00004004: be 0x404c
0x00004008: nop
0x0000400c: mov %o0, %g7
0x00004010: sethi %hi(0x4000), %o1
0x00004014: mov %o1, %o1 ! 0x4000
0x00004018: sub %o1, 0x1c, %o2
0x0000401c: ld [ %o2 ], %o2 <<<<<<< HERE : $O2=*(0x4000-0x1C)
0x00004020: add %o2, %o1, %o2
0x00004024: sethi %hi(0x5800), %g1
0x00004028: st %g7, [ %g1 + 0x110 ] ! 0x5910
0x0000402c: ld [ %o0 + 4 ], %o4
0x00004030: mov %o1, %l0
0x00004034: add %o1, 0x20, %l1
0x00004038: call 0x4088
0x0000403c: sub %o2, %o1, %l2
0x00004040: tst %o4
0x00004044: be 0x404c
0x00004048: nop
0x0000404c: save %o1, -96, %sp
0x00004050: call 0x432c
Addresses are absolute. This code is directly copied from the ISO's sector 1
It accesses the a.out header very early (which helped _a lot_
to find the bug) to get the a_text field, which is the lenght of the
TEXT segment.
Sun's OpenBOOT copies the whole header at 0x3FE0, not the .a_text only.
Are there SunOS version using a.out ?
Of course, we could add #ifdef CONFIG_SPARC32 fences.
Regards
More information about the OpenBIOS
mailing list