4106101c44
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 Cortex A53 erratum 843419. 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.
68 lines
2.3 KiB
C
68 lines
2.3 KiB
C
/* AArch64-specific backend routines.
|
|
Copyright (C) 2009-2015 Free Software Foundation, Inc.
|
|
Contributed by ARM Ltd.
|
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; see the file COPYING3. If not,
|
|
see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "bfd.h"
|
|
#include "elf-bfd.h"
|
|
#include "stdint.h"
|
|
|
|
/* Take the PAGE component of an address or offset. */
|
|
#define PG(x) ((x) & ~ (bfd_vma) 0xfff)
|
|
#define PG_OFFSET(x) ((x) & (bfd_vma) 0xfff)
|
|
|
|
#define AARCH64_ADR_OP 0x10000000
|
|
#define AARCH64_ADRP_OP 0x90000000
|
|
#define AARCH64_ADRP_OP_MASK 0x9F000000
|
|
|
|
extern bfd_signed_vma
|
|
_bfd_aarch64_sign_extend (bfd_vma, int);
|
|
|
|
extern uint32_t
|
|
_bfd_aarch64_decode_adrp_imm (uint32_t);
|
|
|
|
extern uint32_t
|
|
_bfd_aarch64_reencode_adr_imm (uint32_t, uint32_t);
|
|
|
|
extern bfd_reloc_status_type
|
|
_bfd_aarch64_elf_put_addend (bfd *, bfd_byte *, bfd_reloc_code_real_type,
|
|
reloc_howto_type *, bfd_signed_vma);
|
|
|
|
extern bfd_vma
|
|
_bfd_aarch64_elf_resolve_relocation (bfd_reloc_code_real_type, bfd_vma, bfd_vma,
|
|
bfd_vma, bfd_boolean);
|
|
|
|
extern bfd_boolean
|
|
_bfd_aarch64_elf_add_symbol_hook (bfd *, struct bfd_link_info *,
|
|
Elf_Internal_Sym *, const char **,
|
|
flagword *, asection **, bfd_vma *);
|
|
|
|
extern bfd_boolean
|
|
_bfd_aarch64_elf_grok_prstatus (bfd *, Elf_Internal_Note *);
|
|
|
|
extern bfd_boolean
|
|
_bfd_aarch64_elf_grok_psinfo (bfd *, Elf_Internal_Note *);
|
|
|
|
extern char *
|
|
_bfd_aarch64_elf_write_core_note (bfd *, char *, int *, int, ...);
|
|
|
|
#define elf_backend_add_symbol_hook _bfd_aarch64_elf_add_symbol_hook
|
|
#define elf_backend_grok_prstatus _bfd_aarch64_elf_grok_prstatus
|
|
#define elf_backend_grok_psinfo _bfd_aarch64_elf_grok_psinfo
|
|
#define elf_backend_write_core_note _bfd_aarch64_elf_write_core_note
|