Home | History | Annotate | Download | only in bfd
      1 /* Motorola 68HC11/68HC12-specific support for 32-bit ELF
      2    Copyright (C) 2003-2016 Free Software Foundation, Inc.
      3    Contributed by Stephane Carrez (stcarrez (at) nerim.fr)
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20    MA 02110-1301, USA.  */
     21 
     22 #ifndef _ELF32_M68HC1X_H
     23 #define _ELF32_M68HC1X_H
     24 
     25 #include "elf-bfd.h"
     26 #include "bfdlink.h"
     27 #include "elf/m68hc11.h"
     28 
     29 /* Name of symbols exported by HC11/HC12 linker when there is a memory
     30    bank window.  */
     31 #define BFD_M68HC11_BANK_START_NAME   "__bank_start"
     32 #define BFD_M68HC11_BANK_SIZE_NAME    "__bank_size"
     33 #define BFD_M68HC11_BANK_VIRTUAL_NAME "__bank_virtual"
     34 
     35 /* Set and control ELF flags in ELF header.  */
     36 extern bfd_boolean _bfd_m68hc11_elf_merge_private_bfd_data (bfd*,bfd*);
     37 extern bfd_boolean _bfd_m68hc11_elf_set_private_flags (bfd*,flagword);
     38 extern bfd_boolean _bfd_m68hc11_elf_print_private_bfd_data (bfd*, void*);
     39 
     40 /* This hash entry is used to record a trampoline that must be generated
     41    to call a far function using a normal calling convention ('jsr').
     42    The trampoline is used when a pointer to a far function is used.
     43    It takes care of installing the proper memory bank as well as creating
     44    the 'call/rtc' calling convention.  */
     45 struct elf32_m68hc11_stub_hash_entry
     46 {
     47   /* Base hash table entry structure.  */
     48   struct bfd_hash_entry root;
     49 
     50   /* The stub section.  */
     51   asection *stub_sec;
     52 
     53   /* Offset within stub_sec of the beginning of this stub.  */
     54   bfd_vma stub_offset;
     55 
     56   /* Given the symbol's value and its section we can determine its final
     57      value when building the stubs (so the stub knows where to jump.  */
     58   bfd_vma target_value;
     59   asection *target_section;
     60 };
     61 
     62 /* Placeholder for the parameters to compute memory page and physical address.
     63    The following formulas are used:
     64 
     65    sym > bank_virtual =>
     66      %addr(sym) = (((sym - bank_virtual) & bank_mask) + bank_physical
     67      %page(sym) = (((sym - bank_virtual) >> bank_shift) % 256
     68 
     69    sym < bank_virtual =>
     70      %addr(sym) = sym
     71      %page(sym) = 0
     72 
     73 
     74    These parameters are obtained from the symbol table by looking
     75    at the following:
     76 
     77    __bank_start         Symbol marking the start of memory bank window
     78                         (bank_physical)
     79    __bank_virtual       Logical address of symbols for which the transformation
     80                         must be computed
     81    __bank_page_size     Size in bytes of page size (this is *NOT* the memory
     82                         bank window size and the window size is always
     83                         less or equal to the page size)
     84 
     85    For 68HC12, the window is at 0x8000 and the page size is 16K (full window).
     86    For 68HC11 this is board specific (implemented by external hardware).  */
     87 
     88 struct m68hc11_page_info
     89 {
     90   bfd_vma bank_virtual;
     91   bfd_vma bank_physical;
     92   bfd_vma bank_physical_end;
     93   bfd_vma bank_mask;
     94   bfd_vma bank_size;
     95   int bank_shift;
     96   int bank_param_initialized;
     97   bfd_vma trampoline_addr;
     98 };
     99 
    100 struct m68hc11_elf_link_hash_table
    101 {
    102   struct elf_link_hash_table root;
    103   struct m68hc11_page_info pinfo;
    104 
    105   /* The stub hash table.  */
    106   struct bfd_hash_table* stub_hash_table;
    107 
    108   /* Linker stub bfd.  */
    109   bfd *stub_bfd;
    110 
    111   asection* stub_section;
    112   asection* tramp_section;
    113 
    114   /* Linker call-backs.  */
    115   asection * (*add_stub_section) (const char *, asection *);
    116 
    117   /* Assorted information used by elf32_hppa_size_stubs.  */
    118   unsigned int bfd_count;
    119   int top_index;
    120   asection **input_list;
    121 
    122   /* Small local sym cache.  */
    123   struct sym_cache sym_cache;
    124 
    125   bfd_boolean (* size_one_stub)  (struct bfd_hash_entry*, void*);
    126   bfd_boolean (* build_one_stub) (struct bfd_hash_entry*, void*);
    127 };
    128 
    129 /* Get the Sparc64 ELF linker hash table from a link_info structure.  */
    130 
    131 #define m68hc11_elf_hash_table(p) \
    132   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
    133   == M68HC11_ELF_DATA ? ((struct m68hc11_elf_link_hash_table *) ((p)->hash)) : NULL)
    134 
    135 /* Create a 68HC11/68HC12 ELF linker hash table.  */
    136 
    137 extern struct m68hc11_elf_link_hash_table* m68hc11_elf_hash_table_create
    138   (bfd*);
    139 
    140 extern void m68hc11_elf_get_bank_parameters (struct bfd_link_info*);
    141 
    142 /* Return 1 if the address is in banked memory.
    143    This can be applied to a virtual address and to a physical address.  */
    144 extern int m68hc11_addr_is_banked (struct m68hc11_page_info*, bfd_vma);
    145 
    146 /* Return the physical address seen by the processor, taking
    147    into account banked memory.  */
    148 extern bfd_vma m68hc11_phys_addr (struct m68hc11_page_info*, bfd_vma);
    149 
    150 /* Return the page number corresponding to an address in banked memory.  */
    151 extern bfd_vma m68hc11_phys_page (struct m68hc11_page_info*, bfd_vma);
    152 
    153 bfd_reloc_status_type m68hc11_elf_ignore_reloc
    154   (bfd *abfd, arelent *reloc_entry,
    155    asymbol *symbol, void *data, asection *input_section,
    156    bfd *output_bfd, char **error_message);
    157 bfd_reloc_status_type m68hc11_elf_special_reloc
    158   (bfd *abfd, arelent *reloc_entry,
    159     asymbol *symbol, void *data, asection *input_section,
    160     bfd *output_bfd, char **error_message);
    161 
    162 bfd_boolean elf32_m68hc11_check_relocs
    163   (bfd * abfd, struct bfd_link_info * info,
    164    asection * sec, const Elf_Internal_Rela * relocs);
    165 bfd_boolean elf32_m68hc11_relocate_section
    166   (bfd *output_bfd, struct bfd_link_info *info,
    167    bfd *input_bfd, asection *input_section,
    168    bfd_byte *contents, Elf_Internal_Rela *relocs,
    169    Elf_Internal_Sym *local_syms, asection **local_sections);
    170 
    171 bfd_boolean elf32_m68hc11_add_symbol_hook
    172   (bfd *abfd, struct bfd_link_info *info,
    173    Elf_Internal_Sym *sym, const char **namep,
    174    flagword *flagsp, asection **secp,
    175    bfd_vma *valp);
    176 
    177 void elf32_m68hc11_merge_symbol_attribute
    178   (struct elf_link_hash_entry *, const Elf_Internal_Sym *,
    179    bfd_boolean, bfd_boolean);
    180 
    181 /* Tweak the OSABI field of the elf header.  */
    182 
    183 extern void elf32_m68hc11_post_process_headers (bfd*, struct bfd_link_info*);
    184 
    185 int elf32_m68hc11_setup_section_lists (bfd *, struct bfd_link_info *);
    186 
    187 bfd_boolean elf32_m68hc11_size_stubs
    188   (bfd *, bfd *, struct bfd_link_info *,
    189    asection * (*) (const char *, asection *));
    190 
    191 bfd_boolean elf32_m68hc11_build_stubs (bfd* abfd, struct bfd_link_info *);
    192 #endif
    193