bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/24373] Arm Cortex-A53 Errata 843419 workaround inserts 4K stub e


From: cvs-commit at gcc dot gnu.org
Subject: [Bug ld/24373] Arm Cortex-A53 Errata 843419 workaround inserts 4K stub even when unnecessary
Date: Tue, 21 May 2019 12:12:12 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=24373

--- Comment #4 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot 
gnu.org> ---
The master branch has been updated by Tamar Christina
<address@hidden>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=739b5c9c778dee9e2f54d864f83a81ecb0639535

commit 739b5c9c778dee9e2f54d864f83a81ecb0639535
Author: Tamar Christina <address@hidden>
Date:   Tue May 21 13:04:08 2019 +0100

    AArch64: Implement choice between Cortex-A53 erratum workarounds. (PR
ld/24373)

    The Cortex-A53 erratum currently has two ways it can resolve the erratum
when
    using the flag --fix-cortex-a53-843419:

    1) If the address is within the range of an ADR instruction it rewrites the
ADRP
       into an ADR, and those doesn't need the use of a veneer.

    2) If the address is not within range, it adds a branch to a veneer which
will
       execute the final bit of the erratum workaround and branch back to the
call
       site.

    When we do this we always generate the veneers and we always align the size
of
    the text section to 4KB.  This is because we only know which workaround we
can
    use after all linking has finished and all addresses are known.  This means
even
    though the veneers are not used, we still generate the section and we still
    change the size of the input section.

    This is problematic for small memory devices as this would require the user
to
    take about a ~4KB hit in memory even though it's not even used.

    Since there's no real way to restart the linking process from the final
write
    phase this patch solves the issue by allowing the user more control over
which
    erratum workaround gets used.

    Concretely this changes the option --fix-cortex-a53-843419 to take optional
    arguments --fix-cortex-a53-843419[=full|adr|adrp]

    - full (default): Use both ADRP and ADR workaround. This is equivalent to
not
                  specifying any options and is the default behavior before
this
                  patch.

    - adr: Only use the ADR workaround, this will not cause any increase in
binary
           size but linking will fail if the referenced address is out of range
of
           an ADR instruction.

    - adrp: Use only the ADRP workaround, this will never rewrite your ADRP.

    In the cases where the user knows how big their binaries are the `adr`
option
    would prevent the unneeded overhead.

    bfd/ChangeLog:

        PR ld/24373
        * bfd-in.h (enum erratum_84319_opts): New
        (bfd_elf64_aarch64_set_options, bfd_elf32_aarch64_set_options): Change
        int to enum erratum_84319_opts.
        * bfd-in2.h: Regenerate.
        * elfnn-aarch64.c (struct elf_aarch64_link_hash_table): Change
        fix_erratum_843419 to use new enum, remove fix_erratum_843419_adr.
        (_bfd_aarch64_add_stub_entry_after): Conditionally create erratum stub.
        (aarch64_size_one_stub): Conditionally size erratum 843419 stubs.
        (_bfd_aarch64_resize_stubs): Amend comment.
        (elfNN_aarch64_size_stubs): Don't generate stubs when no workaround
        requested.
        (bfd_elfNN_aarch64_set_options): Use new fix_erratum_843419 enum.
        (_bfd_aarch64_erratum_843419_branch_to_stub): Implement selection of
        erratum workaround.
        (clear_erratum_843419_entry): Update erratum conditional.

    ld/ChangeLog:

        PR ld/24373
        * emultempl/aarch64elf.em (PARSE_AND_LIST_LONGOPTS): Add optional args
        to flags.
        * NEWS: Add changes to flag.
        (PARSE_AND_LIST_OPTIONS): Update help descriptions.
        (PARSE_AND_LIST_ARGS_CASES): Add new options to parser.
        * testsuite/ld-aarch64/aarch64-elf.exp: Add new run_dump_tests.
        * testsuite/ld-aarch64/erratum843419-adr.d: New test.
        * testsuite/ld-aarch64/erratum843419-adrp.d: New test.
        * testsuite/ld-aarch64/erratum843419-far-adr.d: New test.
        * testsuite/ld-aarch64/erratum843419-far-full.d: New test.
        * testsuite/ld-aarch64/erratum843419-far.s: New test.
        * testsuite/ld-aarch64/erratum843419-full.d: New test.
        * testsuite/ld-aarch64/erratum843419-near.s: New test.
        * testsuite/ld-aarch64/erratum843419-no-args.d: New test.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]