Add relocation code

This commit is contained in:
Laurent Vivier 2007-02-02 20:03:40 +00:00
parent 68e219e402
commit 0b90ff25b3

View File

@ -7,9 +7,16 @@
*/
.chip 68000
.align 4
.global _start
.macro SysError
.short 0xA9C9
.endm
.macro NewPtrClear
.short 0xA31E
.endm
.align 4
_start:
primary_entry_point:
bra.w primary_setup
@ -19,13 +26,13 @@ secondary_entry_point:
bra.w secondary_setup
_driver_name:
.string ".DebianCD"
.string ".EMILE"
_version:
dc.w 0x001
_id:
.string "Debian SCSI 0.0.1"
.string "EMILE SCSI 0.0.1"
.string "Dummy AppleDriver for Debian boot CD"
.string "APPLE_DRIVER for EMILE"
.string "(c) 2006 Laurent Vivier <Laurent@lvivier.info>"
.string "All files are distributed under the terms of GPLv2 license."
@ -37,11 +44,74 @@ secondary_setup:
movem.l %d1-%a4,%sp@-
move.l %d5, %sp@-
jsr %pc@(driver_entry)
bsr driver_entry
add.l #4, %sp
movem.l %sp@+, %d1-%a4
rts
driver_entry:
moveq.l #0, %d0
bsr relocate
bsr console_init@PLTPC
move.l %d5, -(%sp)
bsr start@PLTPC
rts
relocate:
/* Allocate BSS section */
move.l #__bss_size, %d0 /* size */
/* Alloc and clear memory (needed by GCC 3) */
NewPtrClear /* result in %a0 */
move.l %a0, %d0
bne malloc_ok
SysError
malloc_ok:
move.l %a0,%d3
move.l #__bss_start, %d0
sub.l %d0,%d3 /* %d3 is the offset to add for BSS */
/* real address of GOT */
lea _GLOBAL_OFFSET_TABLE_-.-8,%a0
lea (%pc, %a0), %a0
/* linked address of GOT */
move.l #_GLOBAL_OFFSET_TABLE_, %d0
/* %d2 is the offset to add for all other sections */
move.l %a0,%d2
sub.l %d0,%d2
/* relocate BSS section */
move.l #__got_size, %d0
beq exit_relocate
got_loop:
move.l (%a0), %d1
cmp.l #__bss_start.l, %d1
blt other_section
cmp.l #_end.l, %d1
bgt other_section
/* symbol in section BSS */
add.l %d3, %d1
bra got_store
other_section:
add.l %d2, %d1
got_store:
move.l %d1, (%a0)+
subq.l #4, %d0
bgt got_loop
exit_relocate:
rts