Rewrite SPU overlay handling code. Put overlay calls stubs in the
overlays where possible. Use a faster call stub, or optionally at compile time, a more compact stub. Double size of _ovly_buf_table so that low bit of _ovly_table.buf can be used as a "present" bit. Reserve an extra _ovly_table entry for index zero.
This commit is contained in:
parent
8693ff0ffb
commit
47f6dab9a3
10 changed files with 1147 additions and 1292 deletions
|
@ -1,3 +1,46 @@
|
|||
2008-01-28 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
Rewrite SPU overlay handling code. Put overlay calls stubs in the
|
||||
overlays where possible. Use a faster call stub, or optionally at
|
||||
compile time, a more compact stub. Double size of _ovly_buf_table
|
||||
so that low bit of _ovly_table.buf can be used as a "present" bit.
|
||||
Reserve an extra _ovly_table entry for index zero.
|
||||
* elf32-spu.c: (struct spu_link_hash_table): Delete a number of fields,
|
||||
add new ones.
|
||||
(struct got_entry): New.
|
||||
(struct spu_stub_hash_entry): Delete.
|
||||
(stub_hash_newfunc, spu_elf_link_hash_table_free): Delete.
|
||||
(spu_elf_link_hash_table_create): Adjust for struct changes.
|
||||
(spu_stub_name): Delete.
|
||||
(spu_elf_find_overlays): Don't track sections from overlay regions.
|
||||
Instead set ovl_buf number in spu elf section data. Error if
|
||||
overlays in one region don't start at the same address. Adjust
|
||||
for struct _spu_elf_section_data changes.
|
||||
(SIZEOF_STUB1, SIZEOF_STUB2, ILA_79, ILA_78): Delete.
|
||||
(OVL_STUB_SIZE, BRSL, LNOP, ILA): Define.
|
||||
(needs_ovl_stub): Adjust for struct _spu_elf_section_data changes.
|
||||
(enum _insn_type): New.
|
||||
(count_stub, build_stub): New functions.
|
||||
(allocate_spuear_stubs): Use count_stub.
|
||||
(build_spuear_stubs): Use build_stub.
|
||||
(populate_stubs, sort_stubs): Delete.
|
||||
(process_stubs): New function.
|
||||
(write_one_stub): Delete.
|
||||
(spu_elf_size_stubs, spu_elf_build_stubs): Rewrite.
|
||||
(alloc_stack_info): Adjust for struct _spu_elf_section_data changes.
|
||||
(maybe_insert_function, check_function_ranges): Likewise.
|
||||
(find_function, pasted_function, build_call_tree): Likewise.
|
||||
(spu_elf_stack_analysis, spu_elf_modify_segment_map): Likewise.
|
||||
(spu_elf_modify_program_headers): Likewise.
|
||||
(interesting_section): Detect stub sections differently. Delete
|
||||
htab param, adjust all callers.
|
||||
(spu_elf_relocate_section): Rewrite stub handling.
|
||||
(spu_elf_output_symbol_hook): Likewise.
|
||||
(bfd_elf32_bfd_link_hash_table_free): Delete.
|
||||
* elf32-spu.h (struct _spu_elf_section_data): Move input-only and
|
||||
output-only fields into a union. Add ovl_buf.
|
||||
(spu_elf_size_stubs, spu_elf_build_stubs): Update prototypes.
|
||||
|
||||
2008-01-25 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* elf32-m32c.c (_bfd_m32c_elf_eh_frame_address_size): New.
|
||||
|
|
1148
bfd/elf32-spu.c
1148
bfd/elf32-spu.c
File diff suppressed because it is too large
Load diff
|
@ -26,12 +26,20 @@ struct _spu_elf_section_data
|
|||
{
|
||||
struct bfd_elf_section_data elf;
|
||||
|
||||
/* Stack analysis info kept for this section. */
|
||||
union {
|
||||
/* Info kept for input sections. */
|
||||
struct {
|
||||
/* Stack analysis info kept for this section. */
|
||||
struct spu_elf_stack_info *stack_info;
|
||||
} i;
|
||||
|
||||
struct spu_elf_stack_info *stack_info;
|
||||
|
||||
/* Non-zero for overlay output sections. */
|
||||
unsigned int ovl_index;
|
||||
/* Info kept for output sections. */
|
||||
struct {
|
||||
/* Non-zero for overlay output sections. */
|
||||
unsigned int ovl_index;
|
||||
unsigned int ovl_buf;
|
||||
} o;
|
||||
} u;
|
||||
};
|
||||
|
||||
#define spu_elf_section_data(sec) \
|
||||
|
@ -49,9 +57,8 @@ extern bfd_boolean spu_elf_open_builtin_lib (bfd **,
|
|||
extern bfd_boolean spu_elf_create_sections (bfd *,
|
||||
struct bfd_link_info *, int, int);
|
||||
extern bfd_boolean spu_elf_find_overlays (bfd *, struct bfd_link_info *);
|
||||
extern bfd_boolean spu_elf_size_stubs (bfd *, struct bfd_link_info *, int, int,
|
||||
asection **, asection **,
|
||||
asection **);
|
||||
extern bfd_boolean spu_elf_build_stubs (struct bfd_link_info *, int,
|
||||
asection *);
|
||||
extern int spu_elf_size_stubs (bfd *, struct bfd_link_info *,
|
||||
void (*) (asection *, asection *, const char *),
|
||||
int);
|
||||
extern bfd_boolean spu_elf_build_stubs (struct bfd_link_info *, int);
|
||||
extern asection *spu_elf_check_vma (bfd *, bfd_vma, bfd_vma);
|
||||
|
|
12
ld/ChangeLog
12
ld/ChangeLog
|
@ -1,3 +1,15 @@
|
|||
2008-01-28 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* emultempl/spu_ovl.S: Rewrite.
|
||||
* emultempl/spu_ovl.o: Regenerate.
|
||||
* emultempl/spuelf.em (toe): Delete.
|
||||
(spu_place_special_section): Add param to control section placement.
|
||||
Adjust callers.
|
||||
(spu_elf_load_ovl_mgr): Adjust for struct _spu_elf_section_data
|
||||
changes.
|
||||
(spu_before_allocation): Adjust spu_elf_size_stubs call.
|
||||
(gld${EMULATION_NAME}_finish): Adjust spu_elf_build_stubs call.
|
||||
|
||||
2008-01-25 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/5670
|
||||
|
|
|
@ -19,295 +19,242 @@
|
|||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||
MA 02110-1301, USA. */
|
||||
|
||||
/**
|
||||
* MFC DMA defn's.
|
||||
*/
|
||||
/* MFC DMA defn's. */
|
||||
#define MFC_GET_CMD 0x40
|
||||
#define MFC_MAX_DMA_SIZE 0x4000
|
||||
#define MFC_TAG_UPDATE_ALL 2
|
||||
#define MFC_TAG_ID 0
|
||||
|
||||
/* Register usage. */
|
||||
#define reserved1 $75
|
||||
#define parm $75
|
||||
#define tab1 reserved1
|
||||
#define tab2 reserved1
|
||||
#define vma reserved1
|
||||
#define oldvma reserved1
|
||||
#define newmask reserved1
|
||||
#define map reserved1
|
||||
|
||||
/**
|
||||
* Temporary register allocations.
|
||||
* These are saved/restored here.
|
||||
*/
|
||||
#define tab $75
|
||||
#define cgbits $75
|
||||
#define add64 $75
|
||||
#define ealo $75
|
||||
#define newmask $75
|
||||
#define tagstat $75
|
||||
#define bchn $75
|
||||
#define rv1 $75
|
||||
#define reserved2 $76
|
||||
#define off1 reserved2
|
||||
#define off2 reserved2
|
||||
#define present1 reserved2
|
||||
#define present2 reserved2
|
||||
#define sz reserved2
|
||||
#define cmp reserved2
|
||||
#define add64 reserved2
|
||||
#define cgbits reserved2
|
||||
#define off3 reserved2
|
||||
#define off4 reserved2
|
||||
#define off5 reserved2
|
||||
#define tagstat reserved2
|
||||
|
||||
#define off $76
|
||||
#define off64 $76
|
||||
#define maxsize $76
|
||||
#define oldmask $76
|
||||
#define sz $76
|
||||
#define lnkr $76
|
||||
#define rv2 $76
|
||||
#define reserved3 $77
|
||||
#define buf1 reserved3
|
||||
#define buf2 reserved3
|
||||
#define rv3 reserved3
|
||||
#define ealo reserved3
|
||||
#define cmd reserved3
|
||||
#define off64 reserved3
|
||||
#define tab3 reserved3
|
||||
#define tab4 reserved3
|
||||
#define tab5 reserved3
|
||||
|
||||
#define cur $77
|
||||
#define cmp $77
|
||||
#define buf $77
|
||||
#define genwi $77
|
||||
#define tagid $77
|
||||
#define cmd $77
|
||||
#define rv3 $77
|
||||
#define reserved4 $78
|
||||
#define ovl reserved4
|
||||
#define rv2 reserved4
|
||||
#define rv5 reserved4
|
||||
#define cgshuf reserved4
|
||||
#define newovl reserved4
|
||||
|
||||
#define cgshuf $78
|
||||
#define reserved5 $79
|
||||
#define target reserved5
|
||||
|
||||
#define vma $6
|
||||
#define save1 $72
|
||||
#define rv4 save1
|
||||
#define rv7 save1
|
||||
#define tagid save1
|
||||
#define maxsize save1
|
||||
#define pbyte save1
|
||||
#define pbit save1
|
||||
|
||||
#define map $7
|
||||
#define osize $7
|
||||
#define cmp2 $7
|
||||
#define save2 $73
|
||||
#define cur save2
|
||||
#define rv6 save2
|
||||
#define osize save2
|
||||
#define zovl save2
|
||||
#define oldovl save2
|
||||
#define newvma save2
|
||||
|
||||
#define ea64 $8
|
||||
#define retval $8
|
||||
#define save3 $74
|
||||
#define rv1 save3
|
||||
#define ea64 save3
|
||||
#define buf3 save3
|
||||
#define genwi save3
|
||||
#define newmap save3
|
||||
#define oldmask save3
|
||||
|
||||
#ifdef OVLY_IRQ_SAVE
|
||||
#define irqtmp $8
|
||||
#define irq_stat $9
|
||||
#endif
|
||||
|
||||
# Stack quadword minux N
|
||||
#define SQWM1 -16*1
|
||||
#define SQWM2 -16*2
|
||||
#define SQWM3 -16*3
|
||||
#define SQWM4 -16*4
|
||||
#define SQWM5 -16*5
|
||||
#define SQWM6 -16*6
|
||||
#define SQWM7 -16*7
|
||||
#define SQWM8 -16*8
|
||||
#define SQWM9 -16*9
|
||||
#define SQWM10 -16*10
|
||||
#define SQWM11 -16*11
|
||||
#define SQWM12 -16*12
|
||||
#define SQWM13 -16*13
|
||||
#define SQWM14 -16*14
|
||||
#define SQWM15 -16*15
|
||||
#define SQWM16 -16*16
|
||||
|
||||
.extern _ovly_table
|
||||
.extern _ovly_buf_table
|
||||
|
||||
#ifdef OVLY_PRINTFS
|
||||
#define SPE_C99_VPRINTF 37
|
||||
__entry_event_format:
|
||||
.string "In entry_event_hook segment=0x%08x entry-address=0x%08x\n"
|
||||
__debug_event_format:
|
||||
.string "In debug_event_hook link-register=0x%08x %08x %08x %08x\n"
|
||||
__dma_event_format:
|
||||
.string "In dma_event_hook vma=0x%08x ea=%08x%08x sz=%08x\n"
|
||||
__ovly_buf_table_format:
|
||||
.string "_ovly_buf_table[%08x]=%08x\n"
|
||||
#endif
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.type __rv_pattern, @object
|
||||
.size __rv_pattern, 16
|
||||
.align 4
|
||||
.type __rv_pattern, @object
|
||||
.size __rv_pattern, 16
|
||||
__rv_pattern:
|
||||
.word 0x00010203, 0x1c1d1e1f, 0x00010203, 0x10111213
|
||||
.type __cg_pattern, @object
|
||||
.size __cg_pattern, 16
|
||||
__cg_pattern:
|
||||
.word 0x04050607, 0x80808080, 0x80808080, 0x80808080
|
||||
.word 0x00010203, 0x10111213, 0x80808080, 0x80808080
|
||||
|
||||
/**
|
||||
.type __cg_pattern, @object
|
||||
.size __cg_pattern, 16
|
||||
__cg_pattern:
|
||||
.word 0x04050607, 0x80808080, 0x80808080, 0x80808080
|
||||
|
||||
.type __ovly_current, @object
|
||||
.size __ovly_current, 16
|
||||
__ovly_current:
|
||||
.space 16
|
||||
|
||||
/*
|
||||
* __ovly_return - stub for returning from overlay functions.
|
||||
*
|
||||
* inputs:
|
||||
* $lr link register
|
||||
* On entry the four slots of $lr are:
|
||||
* __ovly_return, prev ovl index, caller return addr, undefined.
|
||||
*
|
||||
* outputs:
|
||||
* $78 old partition number, to be reloaded
|
||||
* $79 return address in old partion number
|
||||
* Load the previous overlay and jump to the caller return address.
|
||||
* Updates __ovly_current.
|
||||
*/
|
||||
.global __ovly_return
|
||||
.type __ovly_return, @function
|
||||
|
||||
.word 0
|
||||
.align 4
|
||||
.global __ovly_return
|
||||
.type __ovly_return, @function
|
||||
__ovly_return:
|
||||
shlqbyi $78, $lr, 4
|
||||
shlqbyi $79, $lr, 8
|
||||
biz $78, $79
|
||||
.size __ovly_return, . - __ovly_return
|
||||
ila tab1, _ovly_table - 16 # 0,2 0
|
||||
shlqbyi ovl, $lr, 4 # 1,4 0
|
||||
#nop
|
||||
shlqbyi target, $lr, 8 # 1,4 1
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
shli off1, ovl, 4 # 0,4 4
|
||||
#lnop
|
||||
#nop
|
||||
hbr ovly_ret9, target # 1,15 5
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
lqx vma, tab1, off1 # 1,6 8
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
rotqbyi buf1, vma, 12 # 1,4 14
|
||||
#nop
|
||||
stqd save3, -48($sp) # 1,6 15
|
||||
#nop
|
||||
stqd save2, -32($sp) # 1,6 16
|
||||
#nop
|
||||
stqd save1, -16($sp) # 1,6 17
|
||||
andi present1, buf1, 1 # 0,2 18
|
||||
stqd ovl, (__ovly_current - __ovly_return)($lr) # 1,6 18
|
||||
#nop; lnop
|
||||
#nop
|
||||
brz present1, __ovly_load_event # 1,4 20
|
||||
ovly_ret9:
|
||||
#nop
|
||||
bi target # 1,4 21
|
||||
|
||||
/**
|
||||
/*
|
||||
* __ovly_load - copy an overlay partion to local store.
|
||||
*
|
||||
* inputs:
|
||||
* $78 partition number to be loaded.
|
||||
* $79 branch target in new partition.
|
||||
* $lr link register, containing return addr.
|
||||
* On entry $75 points to a word consisting of the overlay index in
|
||||
* the top 14 bits, and the target address in the bottom 18 bits.
|
||||
*
|
||||
* outputs:
|
||||
* $lr new link register, returning through __ovly_return.
|
||||
*
|
||||
* Copy a new overlay partition into local store, or return
|
||||
* immediately if the partition is already resident.
|
||||
* Sets up $lr to return via __ovly_return.
|
||||
* Updates __ovly_current.
|
||||
*/
|
||||
.global __ovly_load
|
||||
.type __ovly_load, @function
|
||||
|
||||
.align 3
|
||||
.global __ovly_load
|
||||
.type __ovly_load, @function
|
||||
__ovly_load:
|
||||
/* Save temporary registers to stack. */
|
||||
stqd $6, -16($sp)
|
||||
stqd $7, -32($sp)
|
||||
stqd $8, -48($sp)
|
||||
|
||||
#ifdef OVLY_IRQ_SAVE
|
||||
/* Save irq state, then disable interrupts. */
|
||||
stqd $9, -64($sp)
|
||||
ila irqtmp, __ovly_irq_save
|
||||
rdch irq_stat, $SPU_RdMachStat
|
||||
bid irqtmp
|
||||
__ovly_irq_save:
|
||||
#if OVL_STUB_SIZE == 8
|
||||
########
|
||||
#nop
|
||||
lqd target, 0(parm) # 1,6 -11
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
rotqby target, target, parm # 1,4 -5
|
||||
ila tab2, _ovly_table - 16 # 0,2 -4
|
||||
stqd save3, -48($sp) # 1,6 -4
|
||||
#nop
|
||||
stqd save2, -32($sp) # 1,6 -3
|
||||
#nop
|
||||
stqd save1, -16($sp) # 1,6 -2
|
||||
rotmi ovl, target, -18 # 0,4 -1
|
||||
hbr ovly_load9, target # 1,15 -1
|
||||
ila rv1, __ovly_return # 0,2 0
|
||||
#lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
lqd cur, (__ovly_current - __ovly_return)(rv1) # 1,6 2
|
||||
shli off2, ovl, 4 # 0,4 3
|
||||
stqd ovl, (__ovly_current - __ovly_return)(rv1) # 1,6 3
|
||||
ceq rv2, $lr, rv1 # 0,2 4
|
||||
lqd rv3, (__rv_pattern - __ovly_return)(rv1) # 1,6 4
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
lqx vma, tab2, off2 # 1,6 7
|
||||
########
|
||||
#else /* OVL_STUB_SIZE == 16 */
|
||||
########
|
||||
ila tab2, _ovly_table - 16 # 0,2 0
|
||||
stqd save3, -48($sp) # 1,6 0
|
||||
ila rv1, __ovly_return # 0,2 1
|
||||
stqd save2, -32($sp) # 1,6 1
|
||||
shli off2, ovl, 4 # 0,4 2
|
||||
lqa cur, __ovly_current # 1,6 2
|
||||
nop
|
||||
stqa ovl, __ovly_current # 1,6 3
|
||||
ceq rv2, $lr, rv1 # 0,2 4
|
||||
lqd rv3, (__rv_pattern - __ovly_return)(rv1) # 1,6 4
|
||||
#nop
|
||||
hbr ovly_load9, target # 1,15 5
|
||||
#nop
|
||||
lqx vma, tab2, off2 # 1,6 6
|
||||
#nop
|
||||
stqd save1, -16($sp) # 1,6 7
|
||||
########
|
||||
#endif
|
||||
|
||||
#ifdef OVLY_PRINTFS
|
||||
//==============================================
|
||||
// In entry_event_hook segment=0x%08x entry-address=0x%08x
|
||||
//==============================================
|
||||
# save registers
|
||||
stqd $10, SQWM5($sp)
|
||||
stqd $11, SQWM6($sp)
|
||||
stqd $12, SQWM7($sp)
|
||||
# Place input parameters onto the stack to form the
|
||||
# local storage memory image.
|
||||
ila $10, __entry_event_format
|
||||
stqd $10, SQWM12($sp)
|
||||
ai $10, $sp, SQWM9
|
||||
stqd $10, SQWM11($sp)
|
||||
stqd $sp, SQWM10($sp)
|
||||
stqd $78, SQWM9($sp)
|
||||
stqd $79, SQWM8($sp)
|
||||
# Construct a message consisting of the 8-bit opcode
|
||||
# and 24-bit local store pointer to the input
|
||||
# parameters and place it forllowing the stop and signal
|
||||
ila $10, 0x3ffff # address mask
|
||||
ilhu $11, SPE_C99_VPRINTF << 8
|
||||
ai $12, $sp, SQWM12 # parameter pointer
|
||||
selb $11, $11, $12, $10 # combine command & address ptr
|
||||
brsl $10, next1a
|
||||
next1a:
|
||||
.type next1a, @function
|
||||
lqr $12, message1a
|
||||
cwd $10, message1a-next1a($10)
|
||||
shufb $11, $11, $12, $10 # insert msg into inst word
|
||||
stqr $11, message1a # store cmd/ptr into msg word
|
||||
dsync
|
||||
# Notify the PPE to perform the assisted call request
|
||||
# by issing a stop and signal with a signal code
|
||||
# of 0x2100 (C99 class)
|
||||
stop 0x2100
|
||||
message1a:
|
||||
.word 0
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
shufb rv4, rv1, cur, rv3 # 1,4 10
|
||||
#nop
|
||||
fsmb rv5, rv2 # 1,4 11
|
||||
#nop
|
||||
rotqmbyi rv6, $lr, -8 # 1,4 12
|
||||
#nop
|
||||
rotqbyi buf2, vma, 12 # 1,4 13
|
||||
#nop
|
||||
lqd save3, -48($sp) # 1,6 14
|
||||
#nop; lnop
|
||||
or rv7, rv4, rv6 # 0,2 16
|
||||
lqd save2, -32($sp) # 1,6 16
|
||||
andi present2, buf2, 1 # 0,2 17
|
||||
lnop # 1,0 17
|
||||
selb $lr, rv7, $lr, rv5 # 0,2 18
|
||||
lqd save1, -16($sp) # 1,6 18
|
||||
#nop
|
||||
brz present2, __ovly_load_event # 1,4 19
|
||||
ovly_load9:
|
||||
#nop
|
||||
bi target # 1,4 20
|
||||
|
||||
# save registers
|
||||
stqd $13, SQWM8($sp)
|
||||
stqd $14, SQWM9($sp)
|
||||
stqd $15, SQWM10($sp)
|
||||
stqd $16, SQWM11($sp)
|
||||
|
||||
# initialize loop
|
||||
il $13, 1
|
||||
ila $14, _ovly_buf_table
|
||||
ila $15, _ovly_buf_table_end
|
||||
|
||||
loop_start1:
|
||||
# Place input parameters onto the stack to form the
|
||||
# local storage memory image.
|
||||
ila $10, __ovly_buf_table_format
|
||||
stqd $10, SQWM16($sp)
|
||||
ai $10, $sp, SQWM13
|
||||
stqd $10, SQWM15($sp)
|
||||
stqd $sp, SQWM14($sp)
|
||||
stqd $13, SQWM13($sp)
|
||||
lqd $16, 0($14)
|
||||
rotqby $16, $16, $14
|
||||
stqd $16, SQWM12($sp)
|
||||
# Construct a message consisting of the 8-bit opcode
|
||||
# and 24-bit local store pointer to the input
|
||||
# parameters and place it forllowing the stop and signal
|
||||
ila $10, 0x3ffff # address mask
|
||||
ilhu $11, SPE_C99_VPRINTF << 8
|
||||
ai $12, $sp, SQWM16 # parameter pointer
|
||||
selb $11, $11, $12, $10 # combine command & address ptr
|
||||
brsl $10, next1b
|
||||
next1b:
|
||||
.type next1b, @function
|
||||
lqr $12, message1b
|
||||
cwd $10, message1b-next1b($10)
|
||||
shufb $11, $11, $12, $10 # insert msg into inst word
|
||||
stqr $11, message1b # store cmd/ptr into msg word
|
||||
dsync
|
||||
# Notify the PPE to perform the assisted call request
|
||||
# by issing a stop and signal with a signal code
|
||||
# of 0x2100 (C99 class)
|
||||
stop 0x2100
|
||||
message1b:
|
||||
.word 0
|
||||
|
||||
# move to next entry
|
||||
ai $13, $13, 1
|
||||
ai $14, $14, 4
|
||||
clgt $16, $15, $14
|
||||
brnz $16, loop_start1
|
||||
|
||||
# restore registers
|
||||
lqd $16, SQWM11($sp)
|
||||
lqd $15, SQWM10($sp)
|
||||
lqd $14, SQWM9($sp)
|
||||
lqd $13, SQWM8($sp)
|
||||
lqd $12, SQWM7($sp)
|
||||
lqd $11, SQWM6($sp)
|
||||
lqd $10, SQWM5($sp)
|
||||
//==============================================
|
||||
#endif
|
||||
|
||||
/* Set branch hint to overlay target. */
|
||||
hbr __ovly_load_ret, $79
|
||||
|
||||
/* Get caller's overlay index by back chaining through stack frames.
|
||||
* Loop until end of stack (back chain all-zeros) or
|
||||
* encountered a link register we set here. */
|
||||
lqd bchn, 0($sp)
|
||||
ila retval, __ovly_return
|
||||
|
||||
__ovly_backchain_loop:
|
||||
lqd lnkr, 16(bchn)
|
||||
lqd bchn, 0(bchn)
|
||||
ceq cmp, lnkr, retval
|
||||
ceqi cmp2, bchn, 0
|
||||
or cmp, cmp, cmp2
|
||||
brz cmp, __ovly_backchain_loop
|
||||
|
||||
/* If we reached the zero back-chain, then lnkr is bogus. Clear the
|
||||
* part of lnkr that we use later (slot 3). */
|
||||
rotqbyi cmp2, cmp2, 4
|
||||
andc lnkr, lnkr, cmp2
|
||||
|
||||
/* Set lr = {__ovly_return, prev ovl ndx, caller return adr, callee ovl ndx}. */
|
||||
lqd rv1, (__rv_pattern-__ovly_return+4)(retval)
|
||||
shufb rv2, retval, lnkr, rv1
|
||||
shufb rv3, $lr, $78, rv1
|
||||
fsmbi rv1, 0xff
|
||||
selb rv2, rv2, rv3, rv1
|
||||
/* If we have a tail call from one overlay function to another overlay,
|
||||
then lr is already set up. Don't change it. */
|
||||
ceq rv1, $lr, retval
|
||||
fsmb rv1, rv1
|
||||
selb $lr, rv2, $lr, rv1
|
||||
|
||||
/* Branch to $79 if non-overlay */
|
||||
brz $78, __ovly_load_restore
|
||||
|
||||
/* Load values from _ovly_table[$78].
|
||||
/* If we get here, we are about to load a new overlay.
|
||||
* "vma" contains the relevant entry from _ovly_table[].
|
||||
* extern struct {
|
||||
* u32 vma;
|
||||
* u32 size;
|
||||
|
@ -315,265 +262,166 @@ __ovly_backchain_loop:
|
|||
* u32 buf;
|
||||
* } _ovly_table[];
|
||||
*/
|
||||
shli off, $78, 4
|
||||
ila tab, _ovly_table - 16
|
||||
lqx vma, tab, off
|
||||
rotqbyi buf, vma, 12
|
||||
|
||||
/* Load values from _ovly_buf_table[buf].
|
||||
* extern struct {
|
||||
* u32 mapped;
|
||||
* } _ovly_buf_table[];
|
||||
*/
|
||||
ila tab, _ovly_buf_table
|
||||
ai off, buf, -1
|
||||
shli off, off, 2
|
||||
lqx map, tab, off
|
||||
rotqby cur, map, off
|
||||
|
||||
/* Branch to $79 now if overlay is already mapped. */
|
||||
ceq cmp, $78, cur
|
||||
brnz cmp, __ovly_load_restore
|
||||
|
||||
/* Marker for profiling code. If we get here, we are about to load
|
||||
* a new overlay.
|
||||
*/
|
||||
.global __ovly_load_event
|
||||
.type __ovly_load_event, @function
|
||||
.align 3
|
||||
.global __ovly_load_event
|
||||
.type __ovly_load_event, @function
|
||||
__ovly_load_event:
|
||||
#nop
|
||||
rotqbyi sz, vma, 8 # 1,4 0
|
||||
#nop
|
||||
rotqbyi osize, vma, 4 # 1,4 1
|
||||
#nop
|
||||
lqa ea64, _EAR_ # 1,6 2
|
||||
#nop
|
||||
lqd cgshuf, (__cg_pattern - __ovly_return)($lr) # 1,6 3
|
||||
|
||||
/* Set _ovly_buf_table[buf].mapped = $78. */
|
||||
cwx genwi, tab, off
|
||||
shufb map, $78, map, genwi
|
||||
stqx map, tab, off
|
||||
|
||||
/* A new partition needs to be loaded. Prepare for DMA loop.
|
||||
* _EAR_ is the 64b base EA, filled in at run time by the
|
||||
* loader, and indicating the value for SPU executable image start.
|
||||
*/
|
||||
lqd cgshuf, (__cg_pattern-__ovly_return+4)(retval)
|
||||
rotqbyi osize, vma, 4
|
||||
rotqbyi sz, vma, 8
|
||||
lqa ea64, _EAR_
|
||||
|
||||
/* We could predict the branch at the end of this loop by adding a few
|
||||
instructions, and there are plenty of free cycles to do so without
|
||||
impacting loop execution time. However, it doesn't make a great
|
||||
deal of sense since we need to wait for the dma to complete anyway. */
|
||||
__ovly_xfer_loop:
|
||||
/* 64b add to compute next ea64. */
|
||||
rotqmbyi off64, sz, -4
|
||||
cg cgbits, ea64, off64
|
||||
shufb add64, cgbits, cgbits, cgshuf
|
||||
addx add64, ea64, off64
|
||||
ori ea64, add64, 0
|
||||
#nop
|
||||
rotqmbyi off64, sz, -4 # 1,4 4
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
cg cgbits, ea64, off64 # 0,2 8
|
||||
#lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
shufb add64, cgbits, cgbits, cgshuf # 1,4 10
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
addx add64, ea64, off64 # 0,2 14
|
||||
#lnop
|
||||
ila maxsize, MFC_MAX_DMA_SIZE # 0,2 15
|
||||
lnop
|
||||
ori ea64, add64, 0 # 0,2 16
|
||||
rotqbyi ealo, add64, 4 # 1,4 16
|
||||
cgt cmp, osize, maxsize # 0,2 17
|
||||
wrch $MFC_LSA, vma # 1,6 17
|
||||
#nop; lnop
|
||||
selb sz, osize, maxsize, cmp # 0,2 19
|
||||
wrch $MFC_EAH, ea64 # 1,6 19
|
||||
ila tagid, MFC_TAG_ID # 0,2 20
|
||||
wrch $MFC_EAL, ealo # 1,6 20
|
||||
ila cmd, MFC_GET_CMD # 0,2 21
|
||||
wrch $MFC_Size, sz # 1,6 21
|
||||
sf osize, sz, osize # 0,2 22
|
||||
wrch $MFC_TagId, tagid # 1,6 22
|
||||
a vma, vma, sz # 0,2 23
|
||||
wrch $MFC_Cmd, cmd # 1,6 23
|
||||
#nop
|
||||
brnz osize, __ovly_xfer_loop # 1,4 24
|
||||
|
||||
/* Setup DMA parameters, then issue DMA request. */
|
||||
rotqbyi ealo, add64, 4
|
||||
ila maxsize, MFC_MAX_DMA_SIZE
|
||||
cgt cmp, osize, maxsize
|
||||
selb sz, osize, maxsize, cmp
|
||||
ila tagid, MFC_TAG_ID
|
||||
wrch $MFC_LSA, vma
|
||||
wrch $MFC_EAH, ea64
|
||||
wrch $MFC_EAL, ealo
|
||||
wrch $MFC_Size, sz
|
||||
wrch $MFC_TagId, tagid
|
||||
ila cmd, MFC_GET_CMD
|
||||
wrch $MFC_Cmd, cmd
|
||||
|
||||
#ifdef OVLY_PRINTFS
|
||||
//==============================================
|
||||
// In dma_event_hook vma=0x%08x ea=%08x%08x sz=%08x
|
||||
//==============================================
|
||||
# save registers
|
||||
stqd $10, SQWM5($sp)
|
||||
stqd $11, SQWM6($sp)
|
||||
stqd $12, SQWM7($sp)
|
||||
# Place input parameters onto the stack to form the
|
||||
# local storage memory image.
|
||||
ila $10, __dma_event_format
|
||||
stqd $10, SQWM14($sp)
|
||||
ai $10, $sp, SQWM11
|
||||
stqd $10, SQWM13($sp)
|
||||
stqd $sp, SQWM12($sp)
|
||||
stqd vma, SQWM11($sp)
|
||||
stqd ea64, SQWM10($sp)
|
||||
stqd ealo, SQWM9($sp)
|
||||
stqd sz, SQWM8($sp)
|
||||
# Construct a message consisting of the 8-bit opcode
|
||||
# and 24-bit local store pointer to the input
|
||||
# parameters and place it forllowing the stop and signal
|
||||
ila $10, 0x3ffff # address mask
|
||||
ilhu $11, SPE_C99_VPRINTF << 8
|
||||
ai $12, $sp, SQWM14 # parameter pointer
|
||||
selb $11, $11, $12, $10 # combine command & address ptr
|
||||
brsl $10, next3a
|
||||
next3a:
|
||||
.type next3a, @function
|
||||
lqr $12, message3a
|
||||
cwd $10, message3a-next3a($10)
|
||||
shufb $11, $11, $12, $10 # insert msg into inst word
|
||||
stqr $11, message3a # store cmd/ptr into msg word
|
||||
dsync
|
||||
# Notify the PPE to perform the assisted call request
|
||||
# by issing a stop and signal with a signal code
|
||||
# of 0x2100 (C99 class)
|
||||
stop 0x2100
|
||||
message3a:
|
||||
.word 0
|
||||
|
||||
# restore registers
|
||||
lqd $12, SQWM7($sp)
|
||||
lqd $11, SQWM6($sp)
|
||||
lqd $10, SQWM5($sp)
|
||||
//==============================================
|
||||
#endif
|
||||
|
||||
/* Increment vma, decrement size, branch back as needed. */
|
||||
a vma, vma, sz
|
||||
sf osize, sz, osize
|
||||
brnz osize, __ovly_xfer_loop
|
||||
|
||||
/* Save app's tagmask, wait for DMA complete, restore mask. */
|
||||
rdch oldmask, $MFC_RdTagMask
|
||||
#if MFC_TAG_ID < 16
|
||||
ilh newmask, 1 << MFC_TAG_ID
|
||||
#else
|
||||
ilhu newmask, 1 << (MFC_TAG_ID - 16)
|
||||
#endif
|
||||
wrch $MFC_WrTagMask, newmask
|
||||
ila tagstat, MFC_TAG_UPDATE_ALL
|
||||
wrch $MFC_WrTagUpdate, tagstat
|
||||
rdch tagstat, $MFC_RdTagStat
|
||||
sync
|
||||
wrch $MFC_WrTagMask, oldmask
|
||||
|
||||
#ifdef OVLY_PRINTFS
|
||||
//==============================================
|
||||
// In debug_event_hook link-register=0x%08x %08x %08x %08x
|
||||
//==============================================
|
||||
# save registers
|
||||
stqd $10, SQWM5($sp)
|
||||
stqd $11, SQWM6($sp)
|
||||
stqd $12, SQWM7($sp)
|
||||
# Place input parameters onto the stack to form the
|
||||
# local storage memory image.
|
||||
ila $10, __debug_event_format
|
||||
stqd $10, SQWM14($sp)
|
||||
ai $10, $sp, SQWM11
|
||||
stqd $10, SQWM13($sp)
|
||||
stqd $sp, SQWM12($sp)
|
||||
stqd $lr, SQWM11($sp)
|
||||
rotqbyi $10, $lr, 4
|
||||
stqd $10, SQWM10($sp)
|
||||
rotqbyi $10, $10, 4
|
||||
stqd $10, SQWM9($sp)
|
||||
rotqbyi $10, $10, 4
|
||||
stqd $10, SQWM8($sp)
|
||||
# Construct a message consisting of the 8-bit opcode
|
||||
# and 24-bit local store pointer to the input
|
||||
# parameters and place it forllowing the stop and signal
|
||||
ila $10, 0x3ffff # address mask
|
||||
ilhu $11, SPE_C99_VPRINTF << 8
|
||||
ai $12, $sp, SQWM14 # parameter pointer
|
||||
selb $11, $11, $12, $10 # combine command & address ptr
|
||||
brsl $10, next2a
|
||||
next2a:
|
||||
.type next2a, @function
|
||||
lqr $12, message2a
|
||||
cwd $10, message2a-next2a($10)
|
||||
shufb $11, $11, $12, $10 # insert msg into inst word
|
||||
stqr $11, message2a # store cmd/ptr into msg word
|
||||
dsync
|
||||
# Notify the PPE to perform the assisted call request
|
||||
# by issing a stop and signal with a signal code
|
||||
# of 0x2100 (C99 class)
|
||||
stop 0x2100
|
||||
message2a:
|
||||
.word 0
|
||||
|
||||
# save registers
|
||||
stqd $13, SQWM8($sp)
|
||||
stqd $14, SQWM9($sp)
|
||||
stqd $15, SQWM10($sp)
|
||||
stqd $16, SQWM11($sp)
|
||||
|
||||
# initialize loop
|
||||
il $13, 1
|
||||
ila $14, _ovly_buf_table
|
||||
ila $15, _ovly_buf_table_end
|
||||
|
||||
loop_start2:
|
||||
# Place input parameters onto the stack to form the
|
||||
# local storage memory image.
|
||||
ila $10, __ovly_buf_table_format
|
||||
stqd $10, SQWM16($sp)
|
||||
ai $10, $sp, SQWM13
|
||||
stqd $10, SQWM15($sp)
|
||||
stqd $sp, SQWM14($sp)
|
||||
stqd $13, SQWM13($sp)
|
||||
lqd $16, 0($14)
|
||||
rotqby $16, $16, $14
|
||||
stqd $16, SQWM12($sp)
|
||||
# Construct a message consisting of the 8-bit opcode
|
||||
# and 24-bit local store pointer to the input
|
||||
# parameters and place it forllowing the stop and signal
|
||||
ila $10, 0x3ffff # address mask
|
||||
ilhu $11, SPE_C99_VPRINTF << 8
|
||||
ai $12, $sp, SQWM16 # parameter pointer
|
||||
selb $11, $11, $12, $10 # combine command & address ptr
|
||||
brsl $10, next2b
|
||||
next2b:
|
||||
.type next2b, @function
|
||||
lqr $12, message2b
|
||||
cwd $10, message2b-next2b($10)
|
||||
shufb $11, $11, $12, $10 # insert msg into inst word
|
||||
stqr $11, message2b # store cmd/ptr into msg word
|
||||
dsync
|
||||
# Notify the PPE to perform the assisted call request
|
||||
# by issing a stop and signal with a signal code
|
||||
# of 0x2100 (C99 class)
|
||||
stop 0x2100
|
||||
message2b:
|
||||
.word 0
|
||||
|
||||
# move to next entry
|
||||
ai $13, $13, 1
|
||||
ai $14, $14, 4
|
||||
clgt $16, $15, $14
|
||||
brnz $16, loop_start2
|
||||
|
||||
# restore registers
|
||||
lqd $16, SQWM11($sp)
|
||||
lqd $15, SQWM10($sp)
|
||||
lqd $14, SQWM9($sp)
|
||||
lqd $13, SQWM8($sp)
|
||||
lqd $12, SQWM7($sp)
|
||||
lqd $11, SQWM6($sp)
|
||||
lqd $10, SQWM5($sp)
|
||||
//==============================================
|
||||
#endif
|
||||
|
||||
.global _ovly_debug_event
|
||||
.type _ovly_debug_event, @function
|
||||
_ovly_debug_event:
|
||||
/* GDB inserts debugger trap here. */
|
||||
/* Now update our data structions while waiting for DMA to complete.
|
||||
Low bit of .buf needs to be cleared on the _ovly_table entry
|
||||
corresponding to the evicted overlay, and set on the entry for the
|
||||
newly loaded overlay. Note that no overlay may in fact be evicted
|
||||
as _ovly_buf_table[] starts with all zeros. Don't zap .buf entry
|
||||
for zero index! Also of course update the _ovly_buf_table entry. */
|
||||
#nop
|
||||
lqd newovl, (__ovly_current - __ovly_return)($lr) # 1,6 25
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
shli off3, newovl, 4 # 0,4 31
|
||||
#lnop
|
||||
ila tab3, _ovly_table - 16 # 0,2 32
|
||||
#lnop
|
||||
#nop
|
||||
fsmbi pbyte, 1 # 1,4 33
|
||||
#nop; lnop
|
||||
#nop
|
||||
lqx vma, tab3, off3 # 1,6 35
|
||||
#nop; lnop
|
||||
andi pbit, pbyte, 1 # 0,2 37
|
||||
lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
or newvma, vma, pbit # 0,2 41
|
||||
rotqbyi buf3, vma, 12 # 1,4 41
|
||||
#nop; lnop
|
||||
#nop
|
||||
stqx newvma, tab3, off3 # 1,6 43
|
||||
#nop; lnop
|
||||
shli off4, buf3, 2 # 1,4 45
|
||||
#lnop
|
||||
ila tab4, _ovly_buf_table # 0,2 46
|
||||
#lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
lqx map, tab4, off4 # 1,6 49
|
||||
#nop
|
||||
cwx genwi, tab4, off4 # 1,4 50
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
rotqby oldovl, map, off4 # 1,4 55
|
||||
nop
|
||||
|
||||
__ovly_load_restore:
|
||||
#ifdef OVLY_IRQ_SAVE
|
||||
/* Conditionally re-enable interrupts. */
|
||||
andi irq_stat, irq_stat, 1
|
||||
ila irqtmp, __ovly_irq_restore
|
||||
binze irq_stat, irqtmp
|
||||
__ovly_irq_restore:
|
||||
lqd $9, -64($sp)
|
||||
shufb newmap, newovl, map, genwi # 0,4 56
|
||||
#if MFC_TAG_ID < 16
|
||||
ila newmask, 1 << MFC_TAG_ID # 0,2 57
|
||||
#else
|
||||
ilhu newmask, 1 << (MFC_TAG_ID - 16) # 0,2 57
|
||||
#endif
|
||||
#lnop
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
stqx newmap, tab4, off4 # 1,6 60
|
||||
|
||||
/* Restore saved registers. */
|
||||
lqd $8, -48($sp)
|
||||
lqd $7, -32($sp)
|
||||
lqd $6, -16($sp)
|
||||
/* Save app's tagmask, wait for DMA complete, restore mask. */
|
||||
ila tagstat, MFC_TAG_UPDATE_ALL # 0,2 61
|
||||
rdch oldmask, $MFC_RdTagMask # 1,6 61
|
||||
#nop
|
||||
wrch $MFC_WrTagMask, newmask # 1,6 62
|
||||
#nop
|
||||
wrch $MFC_WrTagUpdate, tagstat # 1,6 63
|
||||
#nop
|
||||
rdch tagstat, $MFC_RdTagStat # 1,6 64
|
||||
#nop
|
||||
sync # 1,4 65
|
||||
/* Any hint prior to the sync is lost. A hint here allows the branch
|
||||
to complete 15 cycles after the hint. With no hint the branch will
|
||||
take 18 or 19 cycles. */
|
||||
ila tab5, _ovly_table - 16 # 0,2 66
|
||||
hbr do_load99, target # 1,15 66
|
||||
shli off5, oldovl, 4 # 0,4 67
|
||||
wrch $MFC_WrTagMask, oldmask # 1,6 67
|
||||
ceqi zovl, oldovl, 0 # 0,2 68
|
||||
#lnop
|
||||
#nop; lnop
|
||||
#nop
|
||||
fsm zovl, zovl # 1,4 70
|
||||
#nop
|
||||
lqx oldvma, tab5, off5 # 1,6 71
|
||||
#nop
|
||||
lqd save3, -48($sp) # 1,6 72
|
||||
#nop; lnop
|
||||
andc pbit, pbit, zovl # 0,2 74
|
||||
lqd save2, -32($sp) # 1,6 74
|
||||
#nop; lnop
|
||||
#nop; lnop
|
||||
andc oldvma, oldvma, pbit # 0,2 77
|
||||
lqd save1, -16($sp) # 1,6 77
|
||||
#nop; lnop
|
||||
nop
|
||||
stqx oldvma, tab5, off5 # 1,6 79
|
||||
#nop; lnop
|
||||
|
||||
__ovly_load_ret:
|
||||
.global _ovly_debug_event
|
||||
.type _ovly_debug_event, @function
|
||||
_ovly_debug_event:
|
||||
nop
|
||||
/* Branch to target address. */
|
||||
bi $79
|
||||
do_load99:
|
||||
bi target # 1,4 81
|
||||
|
||||
.size __ovly_load, . - __ovly_load
|
||||
.size __ovly_load, . - __ovly_load
|
||||
|
|
Binary file not shown.
|
@ -58,8 +58,6 @@ static const struct _ovl_stream ovl_mgr_stream = {
|
|||
ovl_mgr + sizeof (ovl_mgr)
|
||||
};
|
||||
|
||||
static asection *toe = NULL;
|
||||
|
||||
|
||||
static int
|
||||
is_spu_target (void)
|
||||
|
@ -84,7 +82,8 @@ spu_after_open (void)
|
|||
gld${EMULATION_NAME}_after_open ();
|
||||
}
|
||||
|
||||
/* Add section S at the end of output section OUTPUT_NAME.
|
||||
/* If O is NULL, add section S at the end of output section OUTPUT_NAME.
|
||||
If O is not NULL, add section S at the beginning of output section O.
|
||||
|
||||
Really, we should be duplicating ldlang.c map_input_to_output_sections
|
||||
logic here, ie. using the linker script to find where the section
|
||||
|
@ -95,11 +94,11 @@ spu_after_open (void)
|
|||
overlay manager code somewhere else. */
|
||||
|
||||
static void
|
||||
spu_place_special_section (asection *s, const char *output_name)
|
||||
spu_place_special_section (asection *s, asection *o, const char *output_name)
|
||||
{
|
||||
lang_output_section_statement_type *os;
|
||||
|
||||
os = lang_output_section_find (output_name);
|
||||
os = lang_output_section_find (o != NULL ? o->name : output_name);
|
||||
if (os == NULL)
|
||||
{
|
||||
const char *save = s->name;
|
||||
|
@ -107,6 +106,15 @@ spu_place_special_section (asection *s, const char *output_name)
|
|||
gld${EMULATION_NAME}_place_orphan (s);
|
||||
s->name = save;
|
||||
}
|
||||
else if (o != NULL && os->children.head != NULL)
|
||||
{
|
||||
lang_statement_list_type add;
|
||||
|
||||
lang_list_init (&add);
|
||||
lang_add_section (&add, s, os);
|
||||
*add.tail = os->children.head;
|
||||
os->children.head = add.head;
|
||||
}
|
||||
else
|
||||
lang_add_section (&os->children, s, os);
|
||||
|
||||
|
@ -154,7 +162,7 @@ spu_elf_load_ovl_mgr (void)
|
|||
for (in = ovl_is->the_bfd->sections; in != NULL; in = in->next)
|
||||
if ((in->flags & (SEC_ALLOC | SEC_LOAD))
|
||||
== (SEC_ALLOC | SEC_LOAD))
|
||||
spu_place_special_section (in, ".text");
|
||||
spu_place_special_section (in, NULL, ".text");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -164,7 +172,7 @@ spu_elf_load_ovl_mgr (void)
|
|||
os = os->next)
|
||||
if (os->bfd_section != NULL
|
||||
&& spu_elf_section_data (os->bfd_section) != NULL
|
||||
&& spu_elf_section_data (os->bfd_section)->ovl_index != 0)
|
||||
&& spu_elf_section_data (os->bfd_section)->u.o.ovl_index != 0)
|
||||
{
|
||||
if (os->bfd_section->alignment_power < 4)
|
||||
os->bfd_section->alignment_power = 4;
|
||||
|
@ -192,20 +200,15 @@ spu_before_allocation (void)
|
|||
/* Find overlays by inspecting section vmas. */
|
||||
if (spu_elf_find_overlays (output_bfd, &link_info))
|
||||
{
|
||||
asection *stub, *ovtab;
|
||||
int ret;
|
||||
|
||||
if (!spu_elf_size_stubs (output_bfd, &link_info, non_overlay_stubs,
|
||||
stack_analysis, &stub, &ovtab, &toe))
|
||||
ret = spu_elf_size_stubs (output_bfd, &link_info,
|
||||
spu_place_special_section,
|
||||
non_overlay_stubs);
|
||||
if (ret == 0)
|
||||
einfo ("%X%P: can not size overlay stubs: %E\n");
|
||||
|
||||
if (stub != NULL)
|
||||
{
|
||||
spu_place_special_section (stub, ".text");
|
||||
spu_place_special_section (ovtab, ".data");
|
||||
spu_place_special_section (toe, ".toe");
|
||||
|
||||
spu_elf_load_ovl_mgr ();
|
||||
}
|
||||
else if (ret == 2)
|
||||
spu_elf_load_ovl_mgr ();
|
||||
}
|
||||
|
||||
/* We must not cache anything from the preliminary sizing. */
|
||||
|
@ -235,10 +238,8 @@ gld${EMULATION_NAME}_finish (void)
|
|||
einfo ("%X%P: %A exceeds local store range\n", s);
|
||||
}
|
||||
|
||||
if (toe != NULL
|
||||
&& !spu_elf_build_stubs (&link_info,
|
||||
emit_stub_syms || link_info.emitrelocations,
|
||||
toe))
|
||||
if (!spu_elf_build_stubs (&link_info,
|
||||
emit_stub_syms || link_info.emitrelocations))
|
||||
einfo ("%X%P: can not build overlay stubs: %E\n");
|
||||
|
||||
finish_default ();
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2008-01-28 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ld-spu/ovl.d: Update.
|
||||
* ld-spu/ovl2.d: Update.
|
||||
|
||||
2008-01-26 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ld-elf/loadaddr.t: New, extracted from..
|
||||
|
|
|
@ -7,65 +7,90 @@
|
|||
Disassembly of section \.text:
|
||||
|
||||
00000100 <_start>:
|
||||
100: 1c f8 00 81 ai \$1,\$1,-32
|
||||
104: 48 20 00 00 xor \$0,\$0,\$0
|
||||
108: 24 00 00 80 stqd \$0,0\(\$1\)
|
||||
10c: 24 00 40 80 stqd \$0,16\(\$1\)
|
||||
110: 33 00 04 00 brsl \$0,130 <00000000\.ovl_call\.f1_a1> # 130
|
||||
110: SPU_REL16 f1_a1
|
||||
114: 33 00 04 80 brsl \$0,138 <00000000\.ovl_call\.f2_a1> # 138
|
||||
114: SPU_REL16 f2_a1
|
||||
118: 33 00 07 00 brsl \$0,150 <00000000\.ovl_call\.f1_a2> # 150
|
||||
118: SPU_REL16 f1_a2
|
||||
11c: 42 00 ac 09 ila \$9,344 # 158
|
||||
11c: SPU_ADDR18 f2_a2
|
||||
120: 35 20 04 80 bisl \$0,\$9
|
||||
124: 1c 08 00 81 ai \$1,\$1,32 # 20
|
||||
128: 32 7f fb 00 br 100 <_start> # 100
|
||||
128: SPU_REL16 _start
|
||||
.* ai \$1,\$1,-32
|
||||
.* xor \$0,\$0,\$0
|
||||
.* stqd \$0,0\(\$1\)
|
||||
.* stqd \$0,16\(\$1\)
|
||||
.* brsl \$0,.* <00000000\.ovl_call\.f1_a1>.*
|
||||
.*SPU_REL16 f1_a1
|
||||
.* brsl \$0,.* <00000000\.ovl_call\.f2_a1>.*
|
||||
.*SPU_REL16 f2_a1
|
||||
.* brsl \$0,.* <00000000\.ovl_call\.f1_a2>.*
|
||||
.*SPU_REL16 f1_a2
|
||||
#.* ila \$9,328 # 148
|
||||
.* ila \$9,352 # 160
|
||||
.*SPU_ADDR18 f2_a2
|
||||
.* bisl \$0,\$9
|
||||
.* ai \$1,\$1,32 # 20
|
||||
.* br 100 <_start> # 100
|
||||
.*SPU_REL16 _start
|
||||
|
||||
0000012c <f0>:
|
||||
12c: 35 00 00 00 bi \$0
|
||||
.* bi \$0
|
||||
|
||||
#00000130 <00000000\.ovl_call\.f1_a1>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 04 04 00.*
|
||||
#
|
||||
#00000138 <00000000\.ovl_call\.f2_a1>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 04 04 04.*
|
||||
#
|
||||
#00000140 <00000000\.ovl_call\.f1_a2>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 08 04 00.*
|
||||
#
|
||||
#00000148 <00000000\.ovl_call\.f2_a2>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 08 04 24.*
|
||||
#
|
||||
#00000150 <00000000\.ovl_call\.f4_a1>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 04 04 10.*
|
||||
#
|
||||
#00000158 <00000000.ovl_call.14:8>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 08 04 34.*
|
||||
|
||||
00000130 <00000000\.ovl_call\.f1_a1>:
|
||||
130: 42 02 00 4f ila \$79,1024 # 400
|
||||
134: 32 00 02 80 br 148 .*
|
||||
134: SPU_REL16 \*ABS\*\+0x148
|
||||
.* ila \$78,1
|
||||
.* lnop
|
||||
.* ila \$79,1024 # 400
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000138 <00000000\.ovl_call\.f2_a1>:
|
||||
138: 42 02 02 4f ila \$79,1028 # 404
|
||||
13c: 32 00 01 80 br 148 .*
|
||||
13c: SPU_REL16 \*ABS\*\+0x148
|
||||
00000140 <00000000\.ovl_call\.f2_a1>:
|
||||
.* ila \$78,1
|
||||
.* lnop
|
||||
.* ila \$79,1028 # 404
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000140 <00000000\.ovl_call\.f4_a1>:
|
||||
140: 42 02 08 4f ila \$79,1040 # 410
|
||||
144: 40 20 00 00 nop \$0
|
||||
148: 42 00 00 ce ila \$78,1
|
||||
14c: 32 00 0a 80 br 1a0 <__ovly_load> # 1a0
|
||||
14c: SPU_REL16 __ovly_load
|
||||
00000150 <00000000.ovl_call.f1_a2>:
|
||||
.* ila \$78,2
|
||||
.* lnop
|
||||
.* ila \$79,1024 # 400
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000150 <00000000\.ovl_call\.f1_a2>:
|
||||
150: 42 02 00 4f ila \$79,1024 # 400
|
||||
154: 32 00 02 80 br 168 .*
|
||||
154: SPU_REL16 \*ABS\*\+0x168
|
||||
00000160 <00000000\.ovl_call\.f2_a2>:
|
||||
.* ila \$78,2
|
||||
.* lnop
|
||||
.* ila \$79,1060 # 424
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000158 <00000000\.ovl_call\.f2_a2>:
|
||||
158: 42 02 12 4f ila \$79,1060 # 424
|
||||
15c: 32 00 01 80 br 168 .*
|
||||
15c: SPU_REL16 \*ABS\*\+0x168
|
||||
00000170 <00000000\.ovl_call\.f4_a1>:
|
||||
.* ila \$78,1
|
||||
.* lnop
|
||||
.* ila \$79,1040 # 410
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000180 <00000000.ovl_call.14:8>:
|
||||
.* ila \$78,2
|
||||
.* lnop
|
||||
.* ila \$79,1076 # 434
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000160 <00000000\.ovl_call\.14:8>:
|
||||
160: 42 02 1a 4f ila \$79,1076 # 434
|
||||
164: 40 20 00 00 nop \$0
|
||||
168: 42 00 01 4e ila \$78,2
|
||||
16c: 32 00 06 80 br 1a0 <__ovly_load> # 1a0
|
||||
16c: SPU_REL16 __ovly_load
|
||||
#...
|
||||
[0-9a-f]+ <__ovly_return>:
|
||||
[0-9a-f ]+: 3f e1 00 4e shlqbyi \$78,\$0,4
|
||||
[0-9a-f ]+: 3f e2 00 4f shlqbyi \$79,\$0,8
|
||||
[0-9a-f ]+: 25 00 27 ce biz \$78,\$79
|
||||
|
||||
#...
|
||||
[0-9a-f]+ <__ovly_load>:
|
||||
#...
|
||||
[0-9a-f]+ <_ovly_debug_event>:
|
||||
|
@ -73,67 +98,75 @@ Disassembly of section \.text:
|
|||
Disassembly of section \.ov_a1:
|
||||
|
||||
00000400 <f1_a1>:
|
||||
400: 32 00 01 80 br 40c <f3_a1> # 40c
|
||||
400: SPU_REL16 f3_a1
|
||||
.* br .* <f3_a1>.*
|
||||
.*SPU_REL16 f3_a1
|
||||
|
||||
00000404 <f2_a1>:
|
||||
404: 42 00 a0 03 ila \$3,320 # 140
|
||||
404: SPU_ADDR18 f4_a1
|
||||
408: 35 00 00 00 bi \$0
|
||||
#.* ila \$3,336 # 150
|
||||
.* ila \$3,368 # 170
|
||||
.*SPU_ADDR18 f4_a1
|
||||
.* bi \$0
|
||||
|
||||
0000040c <f3_a1>:
|
||||
40c: 35 00 00 00 bi \$0
|
||||
.* bi \$0
|
||||
|
||||
00000410 <f4_a1>:
|
||||
410: 35 00 00 00 bi \$0
|
||||
.* bi \$0
|
||||
\.\.\.
|
||||
Disassembly of section \.ov_a2:
|
||||
|
||||
00000400 <f1_a2>:
|
||||
400: 24 00 40 80 stqd \$0,16\(\$1\)
|
||||
404: 24 ff 80 81 stqd \$1,-32\(\$1\)
|
||||
408: 1c f8 00 81 ai \$1,\$1,-32
|
||||
40c: 33 7f a4 00 brsl \$0,12c <f0> # 12c
|
||||
40c: SPU_REL16 f0
|
||||
410: 33 7f a4 00 brsl \$0,130 <00000000\.ovl_call\.f1_a1> # 130
|
||||
410: SPU_REL16 f1_a1
|
||||
414: 33 00 03 80 brsl \$0,430 <f3_a2> # 430
|
||||
414: SPU_REL16 f3_a2
|
||||
418: 34 00 c0 80 lqd \$0,48\(\$1\) # 30
|
||||
41c: 1c 08 00 81 ai \$1,\$1,32 # 20
|
||||
420: 35 00 00 00 bi \$0
|
||||
.* stqd \$0,16\(\$1\)
|
||||
.* stqd \$1,-32\(\$1\)
|
||||
.* ai \$1,\$1,-32
|
||||
.* brsl \$0,12c <f0> # 12c
|
||||
.*SPU_REL16 f0
|
||||
.* brsl \$0,130 <00000000\.ovl_call\.f1_a1> # 130
|
||||
.*SPU_REL16 f1_a1
|
||||
.* brsl \$0,430 <f3_a2> # 430
|
||||
.*SPU_REL16 f3_a2
|
||||
.* lqd \$0,48\(\$1\) # 30
|
||||
.* ai \$1,\$1,32 # 20
|
||||
.* bi \$0
|
||||
|
||||
00000424 <f2_a2>:
|
||||
424: 41 00 00 03 ilhu \$3,0
|
||||
424: SPU_ADDR16_HI f4_a2
|
||||
428: 60 80 b0 03 iohl \$3,352 # 160
|
||||
428: SPU_ADDR16_LO f4_a2
|
||||
42c: 35 00 00 00 bi \$0
|
||||
.* ilhu \$3,0
|
||||
.*SPU_ADDR16_HI f4_a2
|
||||
#.* iohl \$3,344 # 158
|
||||
.* iohl \$3,384 # 180
|
||||
.*SPU_ADDR16_LO f4_a2
|
||||
.* bi \$0
|
||||
|
||||
00000430 <f3_a2>:
|
||||
430: 35 00 00 00 bi \$0
|
||||
.* bi \$0
|
||||
|
||||
00000434 <f4_a2>:
|
||||
434: 32 7f ff 80 br 430 <f3_a2> # 430
|
||||
434: SPU_REL16 f3_a2
|
||||
.* br .* <f3_a2>.*
|
||||
.*SPU_REL16 f3_a2
|
||||
\.\.\.
|
||||
Disassembly of section .data:
|
||||
|
||||
00000440 <_ovly_table>:
|
||||
440: 00 00 04 00 .*
|
||||
444: 00 00 00 20 .*
|
||||
448: 00 00 02 f0 .*
|
||||
00000440 <_ovly_table-0x10>:
|
||||
\.\.\.
|
||||
44c: 00 00 00 01 .*
|
||||
00000450 <_ovly_table>:
|
||||
450: 00 00 04 00 .*
|
||||
454: 00 00 00 40 .*
|
||||
458: 00 00 03 10 .*
|
||||
45c: 00 00 00 01 .*
|
||||
454: 00 00 00 20 .*
|
||||
# 458: 00 00 03 40 .*
|
||||
458: 00 00 03 70 .*
|
||||
45c: 00 00 00 02 .*
|
||||
460: 00 00 04 00 .*
|
||||
464: 00 00 00 40 .*
|
||||
# 468: 00 00 03 60 .*
|
||||
468: 00 00 03 90 .*
|
||||
46c: 00 00 00 02 .*
|
||||
|
||||
00000470 <_ovly_buf_table>:
|
||||
\.\.\.
|
||||
|
||||
00000460 <_ovly_buf_table>:
|
||||
460: 00 00 00 00 .*
|
||||
Disassembly of section \.toe:
|
||||
|
||||
00000470 <_EAR_>:
|
||||
00000480 <_EAR_>:
|
||||
\.\.\.
|
||||
Disassembly of section \.note\.spu_name:
|
||||
|
||||
|
|
|
@ -7,40 +7,50 @@
|
|||
Disassembly of section \.text:
|
||||
|
||||
00000100 <_start>:
|
||||
100: 33 00 06 00 brsl \$0,130 <00000000\.ovl_call\.f1_a1> # 130
|
||||
100: SPU_REL16 f1_a1
|
||||
104: 33 00 03 80 brsl \$0,120 <00000000\.ovl_call\.10:4> # 120
|
||||
104: SPU_REL16 setjmp
|
||||
108: 32 7f ff 00 br 100 <_start> # 100
|
||||
108: SPU_REL16 _start
|
||||
.* brsl \$0,.* <00000000\.ovl_call\.f1_a1>.*
|
||||
.*SPU_REL16 f1_a1
|
||||
.* brsl \$0,.* <00000000\.ovl_call\.10:4>.*
|
||||
.*SPU_REL16 setjmp
|
||||
.* br 100 <_start> # 100
|
||||
.*SPU_REL16 _start
|
||||
|
||||
0000010c <setjmp>:
|
||||
10c: 35 00 00 00 bi \$0
|
||||
.* bi \$0
|
||||
|
||||
00000110 <longjmp>:
|
||||
110: 35 00 00 00 bi \$0
|
||||
...
|
||||
.* bi \$0
|
||||
.*
|
||||
|
||||
00000120 <00000000\.ovl_call.10:4>:
|
||||
120: 42 00 86 4f ila \$79,268 # 10c
|
||||
124: 40 20 00 00 nop \$0
|
||||
128: 42 00 00 4e ila \$78,0
|
||||
12c: 32 00 0a 80 br 180 <__ovly_load> # 180
|
||||
12c: SPU_REL16 __ovly_load
|
||||
#00000118 <00000000\.ovl_call.f1_a1>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 04 04 00.*
|
||||
#
|
||||
#00000120 <00000000\.ovl_call.10:4>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 00 01 0c.*
|
||||
#
|
||||
#00000128 <_SPUEAR_f1_a2>:
|
||||
#.* brsl \$75,.* <__ovly_load>.*
|
||||
#.*00 08 04 00.*
|
||||
|
||||
00000130 <00000000\.ovl_call.f1_a1>:
|
||||
130: 42 02 00 4f ila \$79,1024 # 400
|
||||
134: 40 20 00 00 nop \$0
|
||||
138: 42 00 00 ce ila \$78,1
|
||||
13c: 32 00 08 80 br 180 <__ovly_load> # 180
|
||||
13c: SPU_REL16 __ovly_load
|
||||
00000120 <00000000\.ovl_call.f1_a1>:
|
||||
.* ila \$78,1
|
||||
.* lnop
|
||||
.* ila \$79,1024 # 400
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000130 <00000000\.ovl_call.10:4>:
|
||||
.* ila \$78,0
|
||||
.* lnop
|
||||
.* ila \$79,268 # 10c
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
00000140 <_SPUEAR_f1_a2>:
|
||||
140: 42 02 00 4f ila \$79,1024 # 400
|
||||
144: 40 20 00 00 nop \$0
|
||||
148: 42 00 01 4e ila \$78,2
|
||||
14c: 32 00 06 80 br 180 <__ovly_load> # 180
|
||||
14c: SPU_REL16 __ovly_load
|
||||
.* ila \$78,2
|
||||
.* lnop
|
||||
.* ila \$79,1024 # 400
|
||||
.* br .* <__ovly_load>.*
|
||||
|
||||
#...
|
||||
Disassembly of section \.ov_a1:
|
||||
|
||||
|
@ -55,21 +65,27 @@ Disassembly of section \.ov_a2:
|
|||
\.\.\.
|
||||
Disassembly of section \.data:
|
||||
|
||||
00000410 <_ovly_table>:
|
||||
410: 00 00 04 00 .*
|
||||
414: 00 00 00 10 .*
|
||||
418: 00 00 02 d0 .*
|
||||
00000410 <_ovly_table-0x10>:
|
||||
\.\.\.
|
||||
41c: 00 00 00 01 .*
|
||||
00000420 <_ovly_table>:
|
||||
420: 00 00 04 00 .*
|
||||
424: 00 00 00 10 .*
|
||||
428: 00 00 02 e0 .*
|
||||
42c: 00 00 00 01 .*
|
||||
# 428: 00 00 03 10 .*
|
||||
428: 00 00 03 30 .*
|
||||
42c: 00 00 00 02 .*
|
||||
430: 00 00 04 00 .*
|
||||
434: 00 00 00 10 .*
|
||||
# 438: 00 00 03 20 .*
|
||||
438: 00 00 03 40 .*
|
||||
43c: 00 00 00 02 .*
|
||||
|
||||
00000440 <_ovly_buf_table>:
|
||||
\.\.\.
|
||||
|
||||
00000430 <_ovly_buf_table>:
|
||||
430: 00 00 00 00 .*
|
||||
Disassembly of section \.toe:
|
||||
|
||||
00000440 <_EAR_>:
|
||||
00000450 <_EAR_>:
|
||||
\.\.\.
|
||||
Disassembly of section \.note\.spu_name:
|
||||
|
||||
|
|
Loading…
Reference in a new issue