[AArch64] Workaround for cortex-a53 erratum 843419

Marcus Shawcroft marcus.shawcroft@arm.com
Mon Mar 30 14:22:00 GMT 2015


Hi,

Some early revisions of the Cortex-A53 have an erratum (843419).  The 
details of the erratum are quite complex and involve dynamic conditions. 
  For the purposes of the workaround we have simplified the static 
conditions to an ADRP in the last two instructions of a 4KByte page, 
followed within four instructions by a load/store dependent on the ADRP.

This patch adds support to conservatively scan for and workaround the 
erratum.  There are two different workaround strategies used.  The first 
is to rewrite ADRP instructions which form part of an erratum sequence 
with an ADR instruction.  In situations where the ADR provides 
insufficient offset the dependent load or store instruction from the 
sequence is moved to a stub section and branches are inserted from the 
original sequence to the relocated instruction and back again.

Stub section sizes are rounded up to a multiple of 4096 in order to 
ensure that the act of inserting work around stubs does not create more 
errata sequences.

Workaround stubs are always inserted into the stub section associated 
with the input section containing the erratum sequence.  This ensures 
that the fully relocated form of the veneered load store instruction is 
available at the point in time when the stub section is written.

Cheers
/Marcus


bfd:

2015-03-30  Tejas Belagod  <tejas.belagod@arm.com>
	    Marcus Shawcroft  <marcus.shawcroft@arm.com>
	    Jiong Wang  <jiong.wang@arm.com>

	* bfd-in.h (bfd_elf64_aarch64_set_options)
	(bfd_elf32_aarch64_set_options): Add parameter.
	* bfd-in2.h: Regenerated.
	* elfnn-aarch64.c (aarch64_erratum_843419_stub)
	(_bfd_aarch64_adrp_p, _bfd_aarch64_erratum_843419_sequence_p)
	(_bfd_aarch64_erratum_843419_stub_name)
	(_bfd_aarch64_erratum_843419_fixup)
	(_bfd_aarch64_erratum_843419_scan)
	(_bfd_aarch64_erratum_843419_branch_to_stub)
	(_bfd_aarch64_erratum_843419_p): Define.
	(enum elf_aarch64_stub_type): Define
	aarch64_stub_erratum_843419_veneer.
	(struct elf_aarch64_stub_hash_entry): Define adrp_offset.
	(struct elf_aarch64_link_hash_table): Define fix_erratum_843419
	and fix_erratum_843419_adr.
	(stub_hash_newfunc): Initialize adrp_offset;
	(_bfd_aarch64_add_stub_entry_after): Define.
	(aarch64_map_one_stub, aarch64_build_one_stub)
	(aarch64_size_one_stub): Handle
	aarch64_stub_erratum_843419_veneer.
	(_bfd_aarch64_resize_stubs): Round stub section size.
	(elfNN_aarch64_size_stubs): Add scan for 843419.
	(bfd_elfNN_aarch64_set_options): Add parameter. Initialize
	fix_erratum_843419 and fix_erratum_843419_adr.
	(struct erratum_835769_branch_to_stub_data): Add info.
	(elfNN_aarch64_write_section): Initialise info.  Handle 843419.
	(elfNN_aarch64_size_dynamic_sections): Handle 843419.
	* elfxx-aarch64.c (_bfd_aarch64_decode_adrp_imm)
	(_bfd_aarch64_sign_extend): Define.
	(reencode_adr_imm): Remove static. Rename to:
	(_bfd_aarch64_reencode_adr_imm): Define.
	(_bfd_aarch64_elf_put_addend): Call _bfd_aarch64_reencode_adr_imm.
	* elfxx-aarch64.h (AARCH64_ADR_OP, AARCH64_ADRP_OP)
	(AARCH64_ADRP_OP_MASK, _bfd_aarch64_sign_extend)
	(_bfd_aarch64_decode_adrp_imm, _bfd_aarch64_reencode_adr_imm):
	Define.

ld/testsuite:

2015-03-24  Tejas Belagod  <tejas.belagod@arm.com>

	* emultempl/aarch64elf.em
	(aarch64_elf_create_output_section_statements): Add parameter in
	bfd_elf${ELFSIZE}_aarch64_set_options call.
	(OPTION_FIX_ERRATUM_843419): Define.
	(PARSE_AND_LIST_LONGOPTS): Add fix-cortex-a53-843419.
	(PARSE_AND_LIST_ARGS_CASES): Add OPTION_FIX_ERRATUM_843419.



-------------- next part --------------
A non-text attachment was scrubbed...
Name: e843419.diff
Type: text/x-patch
Size: 28532 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20150330/96311c4b/attachment.bin>


More information about the Binutils mailing list