(root)/
binutils-2.41/
bfd/
elf32-m68hc1x.h
       1  /* Motorola 68HC11/68HC12-specific support for 32-bit ELF
       2     Copyright (C) 2003-2023 Free Software Foundation, Inc.
       3     Contributed by Stephane Carrez (stcarrez@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 bool _bfd_m68hc11_elf_merge_private_bfd_data
      37    (bfd *, struct bfd_link_info *);
      38  extern bool _bfd_m68hc11_elf_set_private_flags (bfd*,flagword);
      39  extern bool _bfd_m68hc11_elf_print_private_bfd_data (bfd*, void*);
      40  
      41  /* This hash entry is used to record a trampoline that must be generated
      42     to call a far function using a normal calling convention ('jsr').
      43     The trampoline is used when a pointer to a far function is used.
      44     It takes care of installing the proper memory bank as well as creating
      45     the 'call/rtc' calling convention.  */
      46  struct elf32_m68hc11_stub_hash_entry
      47  {
      48    /* Base hash table entry structure.  */
      49    struct bfd_hash_entry root;
      50  
      51    /* The stub section.  */
      52    asection *stub_sec;
      53  
      54    /* Offset within stub_sec of the beginning of this stub.  */
      55    bfd_vma stub_offset;
      56  
      57    /* Given the symbol's value and its section we can determine its final
      58       value when building the stubs (so the stub knows where to jump.  */
      59    bfd_vma target_value;
      60    asection *target_section;
      61  };
      62  
      63  /* Placeholder for the parameters to compute memory page and physical address.
      64     The following formulas are used:
      65  
      66     sym > bank_virtual =>
      67       %addr(sym) = (((sym - bank_virtual) & bank_mask) + bank_physical
      68       %page(sym) = (((sym - bank_virtual) >> bank_shift) % 256
      69  
      70     sym < bank_virtual =>
      71       %addr(sym) = sym
      72       %page(sym) = 0
      73  
      74  
      75     These parameters are obtained from the symbol table by looking
      76     at the following:
      77  
      78     __bank_start		Symbol marking the start of memory bank window
      79  			(bank_physical)
      80     __bank_virtual	Logical address of symbols for which the transformation
      81  			must be computed
      82     __bank_page_size	Size in bytes of page size (this is *NOT* the memory
      83  			bank window size and the window size is always
      84  			less or equal to the page size)
      85  
      86     For 68HC12, the window is at 0x8000 and the page size is 16K (full window).
      87     For 68HC11 this is board specific (implemented by external hardware).  */
      88  
      89  struct m68hc11_page_info
      90  {
      91    bfd_vma bank_virtual;
      92    bfd_vma bank_physical;
      93    bfd_vma bank_physical_end;
      94    bfd_vma bank_mask;
      95    bfd_vma bank_size;
      96    int bank_shift;
      97    int bank_param_initialized;
      98    bfd_vma trampoline_addr;
      99  };
     100  
     101  struct m68hc11_elf_link_hash_table
     102  {
     103    struct elf_link_hash_table root;
     104    struct m68hc11_page_info pinfo;
     105  
     106    /* The stub hash table.  */
     107    struct bfd_hash_table* stub_hash_table;
     108  
     109    /* Linker stub bfd.  */
     110    bfd *stub_bfd;
     111  
     112    asection* stub_section;
     113    asection* tramp_section;
     114  
     115    /* Linker call-backs.  */
     116    asection * (*add_stub_section) (const char *, asection *);
     117  
     118    /* Assorted information used by elf32_hppa_size_stubs.  */
     119    unsigned int bfd_count;
     120    int top_index;
     121    asection **input_list;
     122  
     123    bool (* size_one_stub)  (struct bfd_hash_entry*, void*);
     124    bool (* build_one_stub) (struct bfd_hash_entry*, void*);
     125  };
     126  
     127  /* Get the Sparc64 ELF linker hash table from a link_info structure.  */
     128  
     129  #define m68hc11_elf_hash_table(p) \
     130    ((is_elf_hash_table ((p)->hash)					\
     131      && elf_hash_table_id (elf_hash_table (p)) == M68HC11_ELF_DATA)	\
     132     ? (struct m68hc11_elf_link_hash_table *) (p)->hash : NULL)
     133  
     134  /* Create a 68HC11/68HC12 ELF linker hash table.  */
     135  
     136  extern struct m68hc11_elf_link_hash_table* m68hc11_elf_hash_table_create
     137    (bfd*);
     138  
     139  extern void m68hc11_elf_get_bank_parameters (struct bfd_link_info*);
     140  
     141  /* Return 1 if the address is in banked memory.
     142     This can be applied to a virtual address and to a physical address.  */
     143  extern int m68hc11_addr_is_banked (struct m68hc11_page_info*, bfd_vma);
     144  
     145  /* Return the physical address seen by the processor, taking
     146     into account banked memory.  */
     147  extern bfd_vma m68hc11_phys_addr (struct m68hc11_page_info*, bfd_vma);
     148  
     149  /* Return the page number corresponding to an address in banked memory.  */
     150  extern bfd_vma m68hc11_phys_page (struct m68hc11_page_info*, bfd_vma);
     151  
     152  bfd_reloc_status_type m68hc11_elf_ignore_reloc
     153    (bfd *abfd, arelent *reloc_entry,
     154     asymbol *symbol, void *data, asection *input_section,
     155     bfd *output_bfd, char **error_message);
     156  bfd_reloc_status_type m68hc11_elf_special_reloc
     157    (bfd *abfd, arelent *reloc_entry,
     158      asymbol *symbol, void *data, asection *input_section,
     159      bfd *output_bfd, char **error_message);
     160  
     161  bool elf32_m68hc11_check_relocs
     162    (bfd * abfd, struct bfd_link_info * info,
     163     asection * sec, const Elf_Internal_Rela * relocs);
     164  int elf32_m68hc11_relocate_section
     165    (bfd *output_bfd, struct bfd_link_info *info,
     166     bfd *input_bfd, asection *input_section,
     167     bfd_byte *contents, Elf_Internal_Rela *relocs,
     168     Elf_Internal_Sym *local_syms, asection **local_sections);
     169  
     170  bool elf32_m68hc11_add_symbol_hook
     171    (bfd *abfd, struct bfd_link_info *info,
     172     Elf_Internal_Sym *sym, const char **namep,
     173     flagword *flagsp, asection **secp,
     174     bfd_vma *valp);
     175  
     176  void elf32_m68hc11_merge_symbol_attribute
     177    (struct elf_link_hash_entry *, unsigned int, bool, bool);
     178  
     179  /* Tweak the OSABI field of the elf header.  */
     180  
     181  extern bool elf32_m68hc11_init_file_header (bfd*, struct bfd_link_info*);
     182  
     183  int elf32_m68hc11_setup_section_lists (bfd *, struct bfd_link_info *);
     184  
     185  bool elf32_m68hc11_size_stubs
     186    (bfd *, bfd *, struct bfd_link_info *,
     187     asection * (*) (const char *, asection *));
     188  
     189  bool elf32_m68hc11_build_stubs (bfd* abfd, struct bfd_link_info *);
     190  #endif