mirror of
https://github.com/vivier/EMILE.git
synced 2025-01-18 06:31:23 +00:00
Add relocation code
This commit is contained in:
parent
68e219e402
commit
0b90ff25b3
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user