2004-02-15 20:46:45 +00:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* (c) 2004 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2004-08-18 23:14:55 +00:00
|
|
|
.macro SysError
|
|
|
|
.short 0xA9C9
|
|
|
|
.endm
|
|
|
|
|
2004-05-25 20:12:52 +00:00
|
|
|
.macro NewPtr
|
|
|
|
.short 0xA11E
|
|
|
|
.endm
|
|
|
|
|
2004-05-19 00:09:58 +00:00
|
|
|
.equ cmdline_length, 256 /* see CL_SIZE in bootinfo.c */
|
|
|
|
|
2004-05-26 23:05:35 +00:00
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* second level arguments
|
|
|
|
*
|
|
|
|
***************************************************************************/
|
|
|
|
|
2004-06-22 21:24:54 +00:00
|
|
|
_start: bra setup
|
|
|
|
_signature: .dc.b 'E','M','0','2'
|
2004-06-04 22:29:43 +00:00
|
|
|
_kernel_image_offset: .long 0
|
|
|
|
_kernel_image_size: .long 0
|
|
|
|
_kernel_size: .long 0
|
|
|
|
_ramdisk_offset: .long 0
|
|
|
|
_ramdisk_size: .long 0
|
|
|
|
_command_line: .skip cmdline_length, 0
|
2004-06-22 21:24:54 +00:00
|
|
|
_console_mask: .long 1
|
|
|
|
_serial0_bitrate: .long 9600
|
|
|
|
_serial0_datasize: .byte 8
|
|
|
|
_serial0_parity: .byte 0
|
|
|
|
_serial0_stopbits: .byte 1
|
|
|
|
_pad0: .byte 0
|
|
|
|
_serial1_bitrate: .long 9600
|
|
|
|
_serial1_datasize: .byte 8
|
|
|
|
_serial1_parity: .byte 0
|
|
|
|
_serial1_stopbits: .byte 1
|
|
|
|
_pad1: .byte 0
|
2004-05-19 00:09:58 +00:00
|
|
|
|
|
|
|
.align 4
|
|
|
|
setup:
|
2004-05-25 20:12:52 +00:00
|
|
|
/* relocate C code, need to be compiled with -fpic */
|
2004-05-24 23:59:13 +00:00
|
|
|
|
|
|
|
bsr relocate
|
|
|
|
|
2004-05-25 23:16:56 +00:00
|
|
|
/* initialize console, so we can debug ;-) */
|
2004-05-25 20:12:52 +00:00
|
|
|
|
2004-06-22 21:24:54 +00:00
|
|
|
lea _start(%pc), %a0
|
|
|
|
move.l %a0, -(%sp)
|
2004-05-25 23:16:56 +00:00
|
|
|
bsr console_init@PLTPC
|
2004-05-25 20:12:52 +00:00
|
|
|
|
2004-02-15 20:46:45 +00:00
|
|
|
/* begin to work */
|
|
|
|
|
2004-06-22 21:24:54 +00:00
|
|
|
lea _start(%pc), %a0
|
2004-06-03 19:30:26 +00:00
|
|
|
move.l %a0, -(%sp)
|
|
|
|
bsr start@PLTPC
|
2004-02-15 20:46:45 +00:00
|
|
|
|
|
|
|
/* We guess to never come here */
|
|
|
|
loop:
|
|
|
|
bra loop
|
2004-05-24 23:59:13 +00:00
|
|
|
|
|
|
|
relocate:
|
2004-05-25 20:12:52 +00:00
|
|
|
/* Allocate BSS section */
|
|
|
|
|
|
|
|
move.l #__bss_size, %d0 /* size */
|
|
|
|
NewPtr /* result in %a0 */
|
2004-08-18 23:14:55 +00:00
|
|
|
move.l %a0, %d0
|
|
|
|
bne malloc_ok
|
|
|
|
SysError
|
|
|
|
malloc_ok:
|
2004-05-25 20:12:52 +00:00
|
|
|
move.l %a0,%d3
|
|
|
|
move.l #__bss_start, %d0
|
|
|
|
sub.l %d0,%d3 /* %d3 is the offset to add for BSS */
|
|
|
|
|
2004-05-24 23:59:13 +00:00
|
|
|
/* real address of GOT */
|
|
|
|
|
|
|
|
lea (%pc, _GLOBAL_OFFSET_TABLE_@GOTPC), %a0
|
|
|
|
|
|
|
|
/* linked address of GOT */
|
|
|
|
|
|
|
|
move.l #_GLOBAL_OFFSET_TABLE_, %d0
|
|
|
|
|
2004-05-25 20:12:52 +00:00
|
|
|
/* %d2 is the offset to add for all other sections */
|
2004-05-24 23:59:13 +00:00
|
|
|
|
|
|
|
move.l %a0,%d2
|
|
|
|
sub.l %d0,%d2
|
|
|
|
|
2004-05-25 20:12:52 +00:00
|
|
|
/* relocate BSS section */
|
|
|
|
|
|
|
|
move.l #__got_size, %d0
|
2004-05-24 23:59:13 +00:00
|
|
|
beq exit_relocate
|
|
|
|
|
|
|
|
got_loop:
|
|
|
|
move.l (%a0), %d1
|
2004-05-25 20:12:52 +00:00
|
|
|
|
2004-05-25 23:16:56 +00:00
|
|
|
cmp.l #__bss_start.l, %d1
|
2004-05-25 20:12:52 +00:00
|
|
|
blt other_section
|
2004-05-25 23:16:56 +00:00
|
|
|
cmp.l #_end.l, %d1
|
2004-05-25 20:12:52 +00:00
|
|
|
bgt other_section
|
|
|
|
|
|
|
|
/* symbol in section BSS */
|
|
|
|
|
|
|
|
add.l %d3, %d1
|
|
|
|
bra got_store
|
|
|
|
|
|
|
|
other_section:
|
2004-05-24 23:59:13 +00:00
|
|
|
add.l %d2, %d1
|
2004-05-25 20:12:52 +00:00
|
|
|
|
|
|
|
got_store:
|
2004-05-24 23:59:13 +00:00
|
|
|
move.l %d1, (%a0)+
|
2004-05-25 20:12:52 +00:00
|
|
|
|
2004-05-24 23:59:13 +00:00
|
|
|
subq.l #4, %d0
|
|
|
|
bgt got_loop
|
|
|
|
|
|
|
|
exit_relocate:
|
|
|
|
rts
|