* elf32-spu.c (struct spu_link_hash_table): Add fromelem_size_log2.
	(spu_elf_setup): Initialize it.
	(spu_elf_size_stubs): Move .ovtab into .bss for software i-cache.
	Update to new-sytle cache manager data structures.
	(spu_elf_build_stubs): Generate new-style cache manager data
	structures and symbols.
	(spu_elf_auto_overlay): Update size computation.

ld/testsuite/
	* ld-spu/icache1.d: Update all addresses to accomodate icache
	buffer shifted down 0x800 bytes.
This commit is contained in:
Ulrich Weigand 2009-05-14 16:04:02 +00:00
parent 452de53c12
commit 97fc8d845e
4 changed files with 209 additions and 140 deletions

View file

@ -1,3 +1,13 @@
2009-05-14 Ulrich Weigand <uweigand@de.ibm.com>
* elf32-spu.c (struct spu_link_hash_table): Add fromelem_size_log2.
(spu_elf_setup): Initialize it.
(spu_elf_size_stubs): Move .ovtab into .bss for software i-cache.
Update to new-sytle cache manager data structures.
(spu_elf_build_stubs): Generate new-style cache manager data
structures and symbols.
(spu_elf_auto_overlay): Update size computation.
2009-05-14 Ulrich Weigand <uweigand@de.ibm.com>
* elf32-spu.c (spu_elf_modify_segment_map): Move all PF_OVERLAY

View file

@ -322,6 +322,7 @@ struct spu_link_hash_table
/* For soft icache. */
unsigned int line_size_log2;
unsigned int num_lines_log2;
unsigned int fromelem_size_log2;
/* How much memory we have. */
unsigned int local_store;
@ -461,10 +462,18 @@ spu_elf_link_hash_table_create (bfd *abfd)
void
spu_elf_setup (struct bfd_link_info *info, struct spu_elf_params *params)
{
bfd_vma max_branch_log2;
struct spu_link_hash_table *htab = spu_hash_table (info);
htab->params = params;
htab->line_size_log2 = bfd_log2 (htab->params->line_size);
htab->num_lines_log2 = bfd_log2 (htab->params->num_lines);
/* For the software i-cache, we provide a "from" list whose size
is a power-of-two number of quadwords, big enough to hold one
byte per outgoing branch. Compute this number here. */
max_branch_log2 = bfd_log2 (htab->params->max_branch);
htab->fromelem_size_log2 = max_branch_log2 > 4 ? max_branch_log2 - 4 : 0;
}
/* Find the symbol for the given R_SYMNDX in IBFD and set *HP and *SYMP
@ -1704,21 +1713,24 @@ spu_elf_size_stubs (struct bfd_link_info *info)
stub->size = htab->stub_count[ovl] * ovl_stub_size (htab->params);
}
flags = (SEC_ALLOC | SEC_LOAD
| SEC_HAS_CONTENTS | SEC_IN_MEMORY);
if (htab->params->ovly_flavour == ovly_soft_icache)
{
/* Space for icache manager tables.
a) Tag array, one quadword per cache line.
b) Rewrite "to" list, one quadword per cache line.
c) Rewrite "from" list, one byte per outgoing branch (rounded up to
a power-of-two number of full quadwords) per cache line. */
flags = SEC_ALLOC;
htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
if (htab->ovtab == NULL
|| !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
return 0;
if (htab->params->ovly_flavour == ovly_soft_icache)
{
/* Space for icache manager tables.
a) Tag array, one quadword per cache line.
b) Linked list elements, max_branch per line quadwords. */
htab->ovtab->size = 16 * ((1 + htab->params->max_branch)
<< htab->num_lines_log2);
htab->ovtab->size = (16 + 16 + (16 << htab->fromelem_size_log2))
<< htab->num_lines_log2;
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
htab->init = bfd_make_section_anyway_with_flags (ibfd, ".ovini", flags);
if (htab->init == NULL
|| !bfd_set_section_alignment (ibfd, htab->init, 4))
@ -1741,6 +1753,12 @@ spu_elf_size_stubs (struct bfd_link_info *info)
. } _ovly_buf_table[];
. */
flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
if (htab->ovtab == NULL
|| !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
return 0;
htab->ovtab->size = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
}
@ -1782,7 +1800,7 @@ spu_elf_place_overlay_data (struct bfd_link_info *info)
ovout = ".data";
if (htab->params->ovly_flavour == ovly_soft_icache)
ovout = ".data.icache";
ovout = ".bss";
(*htab->params->place_spu_section) (htab->ovtab, NULL, ovout);
(*htab->params->place_spu_section) (htab->toe, NULL, ".toe");
@ -1965,7 +1983,7 @@ spu_elf_build_stubs (struct bfd_link_info *info)
p = htab->ovtab->contents;
if (htab->params->ovly_flavour == ovly_soft_icache)
{
bfd_vma off, icache_base, linklist;
bfd_vma off;
h = define_ovtab_symbol (htab, "__icache_tag_array");
if (h == NULL)
@ -1980,32 +1998,38 @@ spu_elf_build_stubs (struct bfd_link_info *info)
h->root.u.def.value = 16 << htab->num_lines_log2;
h->root.u.def.section = bfd_abs_section_ptr;
icache_base = htab->ovl_sec[0]->vma;
linklist = (htab->ovtab->output_section->vma
+ htab->ovtab->output_offset
+ off);
for (i = 0; i < htab->params->num_lines; i++)
{
bfd_vma line_end = icache_base + ((i + 1) << htab->line_size_log2);
bfd_vma stub_base = line_end - htab->params->max_branch * 32;
bfd_vma link_elem = linklist + i * htab->params->max_branch * 16;
bfd_vma locator = link_elem - stub_base / 2;
bfd_put_32 (htab->ovtab->owner, locator, p + 4);
bfd_put_16 (htab->ovtab->owner, link_elem, p + 8);
bfd_put_16 (htab->ovtab->owner, link_elem, p + 10);
bfd_put_16 (htab->ovtab->owner, link_elem, p + 12);
bfd_put_16 (htab->ovtab->owner, link_elem, p + 14);
p += 16;
}
h = define_ovtab_symbol (htab, "__icache_linked_list");
h = define_ovtab_symbol (htab, "__icache_rewrite_to");
if (h == NULL)
return FALSE;
h->root.u.def.value = off;
h->size = htab->params->max_branch << (htab->num_lines_log2 + 4);
h->size = 16 << htab->num_lines_log2;
off += h->size;
p += h->size;
h = define_ovtab_symbol (htab, "__icache_rewrite_to_size");
if (h == NULL)
return FALSE;
h->root.u.def.value = 16 << htab->num_lines_log2;
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_rewrite_from");
if (h == NULL)
return FALSE;
h->root.u.def.value = off;
h->size = 16 << (htab->fromelem_size_log2 + htab->num_lines_log2);
off += h->size;
h = define_ovtab_symbol (htab, "__icache_rewrite_from_size");
if (h == NULL)
return FALSE;
h->root.u.def.value = 16 << (htab->fromelem_size_log2
+ htab->num_lines_log2);
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_log2_fromelemsize");
if (h == NULL)
return FALSE;
h->root.u.def.value = htab->fromelem_size_log2;
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_base");
if (h == NULL)
@ -2014,12 +2038,42 @@ spu_elf_build_stubs (struct bfd_link_info *info)
h->root.u.def.section = bfd_abs_section_ptr;
h->size = htab->num_buf << htab->line_size_log2;
h = define_ovtab_symbol (htab, "__icache_linesize");
if (h == NULL)
return FALSE;
h->root.u.def.value = 1 << htab->line_size_log2;
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_log2_linesize");
if (h == NULL)
return FALSE;
h->root.u.def.value = htab->line_size_log2;
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_neg_log2_linesize");
if (h == NULL)
return FALSE;
h->root.u.def.value = -htab->line_size_log2;
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_cachesize");
if (h == NULL)
return FALSE;
h->root.u.def.value = 1 << (htab->num_lines_log2 + htab->line_size_log2);
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_log2_cachesize");
if (h == NULL)
return FALSE;
h->root.u.def.value = htab->num_lines_log2 + htab->line_size_log2;
h->root.u.def.section = bfd_abs_section_ptr;
h = define_ovtab_symbol (htab, "__icache_neg_log2_cachesize");
if (h == NULL)
return FALSE;
h->root.u.def.value = -(htab->num_lines_log2 + htab->line_size_log2);
h->root.u.def.section = bfd_abs_section_ptr;
if (htab->init != NULL && htab->init->size != 0)
{
htab->init->contents = bfd_zalloc (htab->init->owner,
@ -4271,14 +4325,14 @@ spu_elf_auto_overlay (struct bfd_link_info *info)
fixed_size += htab->non_ovly_stub * 16;
/* Space for icache manager tables.
a) Tag array, one quadword per cache line.
- word 0: ia address of present line, init to zero.
- word 1: link locator. link_elem=stub_addr/2+locator
- halfwords 4-7: head/tail pointers for linked lists. */
- word 0: ia address of present line, init to zero. */
fixed_size += 16 << htab->num_lines_log2;
/* b) Linked list elements, max_branch per line. */
fixed_size += htab->params->max_branch << (htab->num_lines_log2 + 4);
/* c) Indirect branch descriptors, 8 quadwords. */
fixed_size += 8 * 16;
/* b) Rewrite "to" list, one quadword per cache line. */
fixed_size += 16 << htab->num_lines_log2;
/* c) Rewrite "from" list, one byte per outgoing branch (rounded up
to a power-of-two number of full quadwords) per cache line. */
fixed_size += 16 << (htab->fromelem_size_log2
+ htab->num_lines_log2);
/* d) Pointer to __ea backing store (toe), 1 quadword. */
fixed_size += 16;
}

View file

@ -1,3 +1,8 @@
2009-05-14 Ulrich Weigand <uweigand@de.ibm.com>
* ld-spu/icache1.d: Update all addresses to accomodate icache
buffer shifted down 0x800 bytes.
2009-05-14 Ulrich Weigand <uweigand@de.ibm.com>
* ld-spu/icache.d: Update file offsets.

View file

@ -6,14 +6,14 @@
Disassembly of section .ovl.init:
00000800 <__icache_fileoff>:
00000000 <__icache_fileoff>:
.* 00 00 00 00.*
.* 00 00 02 00.*
\.\.\.
Disassembly of section \.ovly1:
00000800 <\.ovly1>:
00000000 <\.ovly1>:
.* ai \$1,\$1,64 # 40
.* lqd \$0,16\(\$1\)
.* bi \$0
@ -21,43 +21,43 @@ Disassembly of section \.ovly1:
Disassembly of section \.ovly2:
00000c00 <f1>:
00000400 <f1>:
.* 40 20 00 00 nop \$0
.* 24 00 40 80 stqd \$0,16\(\$1\)
.* 1c f0 00 81 ai \$1,\$1,-64
.* 24 00 00 81 stqd \$1,0\(\$1\)
.* 33 00 73 80 brsl \$0,fac .*
.* 33 00 77 00 brsl \$0,fcc .*
.* 33 00 73 80 brsl \$0,7ac .*
.* 33 00 77 00 brsl \$0,7cc .*
\.\.\.
.* 32 00 16 80 br fec .*
.* 32 00 16 80 br 7ec .*
\.\.\.
fa0: 00 00 00 02.*
fa4: 00 04 11 04.*
fa8: a0 00 0c 10.*
fac: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
fb0: 00 00 ed 00.*
7a0: 00 00 00 02.*
7a4: 00 04 09 04.*
7a8: a0 00 04 10.*
7ac: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
7b0: 00 00 ed 00.*
\.\.\.
fc0: 00 00 00 02.*
fc4: 00 04 10 00.*
fc8: a0 00 0c 14.*
fcc: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
fd0: 00 00 00 00.*
fd4: 00 00 0a 80.*
7c0: 00 00 00 02.*
7c4: 00 04 08 00.*
7c8: a0 00 04 14.*
7cc: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
7d0: 00 00 00 00.*
7d4: 00 00 0a 80.*
\.\.\.
fe4: 00 04 08 00.*
fe8: 20 00 0f 38.*
fec: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
7e4: 00 04 00 00.*
7e8: 20 00 07 38.*
7ec: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
\.\.\.
ff8: 00 7f 0f 80.*
ffc: 00 00 00 00.*
7f8: 00 7f 0f 80.*
7fc: 00 00 00 00.*
Disassembly of section \.ovly3:
00001000 <f3>:
00000800 <f3>:
\.\.\.
.* 35 00 00 00 bi \$0
00001104 <f2>:
00000904 <f2>:
.* 1c e0 00 81 ai \$1,\$1,-128
.* 24 00 00 81 stqd \$1,0\(\$1\)
\.\.\.
@ -67,11 +67,11 @@ Disassembly of section \.ovly3:
Disassembly of section \.ovly4:
00001400 <f5>:
00000c00 <f5>:
.* 24 00 40 80 stqd \$0,16\(\$1\)
.* 24 f8 00 81 stqd \$1,-512\(\$1\)
.* 1c 80 00 81 ai \$1,\$1,-512
.* 33 7f fe 80 brsl \$0,1400 <f5> # 1400
.* 33 7f fe 80 brsl \$0,c00 <f5> # c00
\.\.\.
.* 42 01 00 03 ila \$3,200.*
.* 18 00 c0 81 a \$1,\$1,\$3
@ -81,124 +81,124 @@ Disassembly of section \.ovly4:
Disassembly of section \.ovly5:
00000800 <\.ovly5>:
00000000 <\.ovly5>:
\.\.\.
.* 42 01 00 03 ila \$3,200 .*
.* 18 00 c0 81 a \$1,\$1,\$3
.* 34 00 40 80 lqd \$0,16\(\$1\)
.* 30 01 7d 80 bra bec .*
.* 30 00 7d 80 bra 3ec .*
\.\.\.
be0: 00 00 00 03.*
be4: 00 04 14 00.*
be8: a0 00 0b 2c.*
bec: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
3e0: 00 00 00 03.*
3e4: 00 04 0c 00.*
3e8: a0 00 03 2c.*
3ec: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
\.\.\.
bfc: 00 03 fd 80.*
3fc: 00 01 fd 80.*
Disassembly of section \.ovly6:
00000c00 <\.ovly6>:
.* 31 01 f5 80 brasl \$0,fac .*
.* 33 00 79 00 brsl \$0,fcc .*
00000400 <\.ovly6>:
.* 31 00 f5 80 brasl \$0,7ac .*
.* 33 00 79 00 brsl \$0,7cc .*
\.\.\.
.* 32 00 18 80 br fec .*
.* 32 00 18 80 br 7ec .*
\.\.\.
fa0: 00 00 00 07.*
fa4: 00 08 14 00.*
fa8: a0 00 0c 00.*
fac: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
fb0: 00 03 75 80.*
7a0: 00 00 00 07.*
7a4: 00 08 0c 00.*
7a8: a0 00 04 00.*
7ac: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
7b0: 00 01 75 80.*
\.\.\.
fc0: 00 00 00 07.*
fc4: 00 08 14 00.*
fc8: a0 00 0c 04.*
fcc: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
fd0: 00 00 00 00.*
fd4: 00 00 86 80.*
7c0: 00 00 00 07.*
7c4: 00 08 0c 00.*
7c8: a0 00 04 04.*
7cc: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
7d0: 00 00 00 00.*
7d4: 00 00 86 80.*
\.\.\.
fe0: 00 00 00 04.*
fe4: 00 08 08 00.*
fe8: 20 00 0f 28.*
fec: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
7e0: 00 00 00 04.*
7e4: 00 08 00 00.*
7e8: 20 00 07 28.*
7ec: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
\.\.\.
ff8: 00 7f 03 80.*
ffc: 00 00 00 00.*
7f8: 00 7f 03 80.*
7fc: 00 00 00 00.*
Disassembly of section \.ovly7:
00001000 <\.ovly7>:
00000800 <\.ovly7>:
.* 41 7f ff 83 ilhu \$3,65535 # ffff
.* 60 f8 30 03 iohl \$3,61536 # f060
.* 18 00 c0 84 a \$4,\$1,\$3
.* 00 20 00 00 lnop
.* 04 00 02 01 ori \$1,\$4,0
.* 24 00 02 04 stqd \$4,0\(\$4\)
.* 33 00 72 80 brsl \$0,13ac .*
.* 33 00 76 00 brsl \$0,13cc .*
.* 33 00 72 80 brsl \$0,bac .*
.* 33 00 76 00 brsl \$0,bcc .*
.* 34 00 00 81 lqd \$1,0\(\$1\)
\.\.\.
.* 32 00 15 00 br 13ec .*
.* 32 00 15 00 br bec .*
\.\.\.
13a0: 00 00 00 03.*
13a4: 00 04 14 00.*
13a8: a0 00 10 18.*
13ac: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
ba0: 00 00 00 03.*
ba4: 00 04 0c 00.*
ba8: a0 00 08 18.*
bac: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
\.\.\.
13b8: 00 00 0f 80.*
13bc: 00 00 00 00.*
13c0: 00 00 00 07.*
13c4: 00 08 14 00.*
13c8: a0 00 10 1c.*
13cc: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
bb8: 00 00 0f 80.*
bbc: 00 00 00 00.*
bc0: 00 00 00 07.*
bc4: 00 08 0c 00.*
bc8: a0 00 08 1c.*
bcc: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
\.\.\.
13dc: 00 00 0a 80.*
13e0: 00 00 00 05.*
13e4: 00 08 0c 00.*
13e8: 20 00 13 44.*
13ec: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
13f0: 00 00 00 00.*
13f4: 00 7f 02 80.*
bdc: 00 00 0a 80.*
be0: 00 00 00 05.*
be4: 00 08 04 00.*
be8: 20 00 0b 44.*
bec: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
bf0: 00 00 00 00.*
bf4: 00 7f 02 80.*
\.\.\.
Disassembly of section \.ovly8:
00001400 <f4>:
00000c00 <f4>:
.* 24 00 40 80 stqd \$0,16\(\$1\)
.* 24 f8 00 81 stqd \$1,-512\(\$1\)
.* 1c 80 00 81 ai \$1,\$1,-512
.* 31 02 f9 80 brasl \$0,17cc .*
.* 31 01 f9 80 brasl \$0,fcc .*
\.\.\.
.* 32 00 17 80 br 17ec .*
.* 32 00 17 80 br fec .*
\.\.\.
17c0: 00 00 00 02.*
17c4: 00 04 11 04.*
17c8: a0 00 14 0c.*
17cc: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
fc0: 00 00 00 02.*
fc4: 00 04 09 04.*
fc8: a0 00 0c 0c.*
fcc: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
\.\.\.
17dc: 00 00 d9 00.*
17e0: 00 00 00 06.*
17e4: 00 08 10 00.*
17e8: 20 00 17 30.*
17ec: 31 03 01 cb brasl \$75,180c <__icache_br_handler>
17f0: 00 7f 0d 80.*
fdc: 00 00 d9 00.*
fe0: 00 00 00 06.*
fe4: 00 08 08 00.*
fe8: 20 00 0f 30.*
fec: 31 02 01 cb brasl \$75,100c <__icache_br_handler>
ff0: 00 7f 0d 80.*
\.\.\.
Disassembly of section \.text:
00001800 <_start>:
00001000 <_start>:
.* 41 00 02 03 ilhu \$3,4
.* 60 8a 00 03 iohl \$3,5120 # 1400
.* 32 00 04 80 br 182c.*
0000180c <__icache_br_handler>:
180c: 00 00 00 00 stop
00001810 <__icache_call_handler>:
.* 60 86 00 03 iohl \$3,3072 # c00
.* 32 00 04 80 br 102c.*
0000100c <__icache_br_handler>:
100c: 00 00 00 00 stop
00001010 <__icache_call_handler>:
\.\.\.
1820: 00 00 00 01.*
1824: 00 04 0c 00.*
1828: a0 00 18 08.*
182c: 31 03 02 4b brasl \$75,1810 <__icache_call_handler>
1020: 00 00 00 01.*
1024: 00 04 04 00.*
1028: a0 00 10 08.*
102c: 31 02 02 4b brasl \$75,1010 <__icache_call_handler>
\.\.\.
1838: 00 7e 7b 80.*
1038: 00 7e 7b 80.*
\.\.\.
#pass