]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/elf32-m68hc1x.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / bfd / elf32-m68hc1x.h
CommitLineData
3a65329d 1/* Motorola 68HC11/68HC12-specific support for 32-bit ELF
fd67aa11 2 Copyright (C) 2003-2024 Free Software Foundation, Inc.
3a65329d
SC
3 Contributed by Stephane Carrez (stcarrez@nerim.fr)
4
cd123cb7 5 This file is part of BFD, the Binary File Descriptor library.
3a65329d 6
cd123cb7
NC
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.
3a65329d 11
cd123cb7
NC
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.
3a65329d 16
cd123cb7
NC
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. */
3a65329d
SC
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. */
0a1b45a2 36extern bool _bfd_m68hc11_elf_merge_private_bfd_data
50e03d47 37 (bfd *, struct bfd_link_info *);
0a1b45a2
AM
38extern bool _bfd_m68hc11_elf_set_private_flags (bfd*,flagword);
39extern bool _bfd_m68hc11_elf_print_private_bfd_data (bfd*, void*);
3a65329d
SC
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. */
4dfe6ac6
NC
46struct elf32_m68hc11_stub_hash_entry
47{
3a65329d
SC
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
07d6d2b8
AM
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)
3a65329d
SC
85
86 For 68HC12, the window is at 0x8000 and the page size is 16K (full window).
4dfe6ac6 87 For 68HC11 this is board specific (implemented by external hardware). */
3a65329d 88
3a65329d
SC
89struct 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
101struct 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. */
4dfe6ac6 116 asection * (*add_stub_section) (const char *, asection *);
3a65329d
SC
117
118 /* Assorted information used by elf32_hppa_size_stubs. */
119 unsigned int bfd_count;
120 int top_index;
121 asection **input_list;
3a65329d 122
0a1b45a2
AM
123 bool (* size_one_stub) (struct bfd_hash_entry*, void*);
124 bool (* build_one_stub) (struct bfd_hash_entry*, void*);
3a65329d
SC
125};
126
127/* Get the Sparc64 ELF linker hash table from a link_info structure. */
128
129#define m68hc11_elf_hash_table(p) \
0f55320b
AM
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)
3a65329d
SC
133
134/* Create a 68HC11/68HC12 ELF linker hash table. */
135
136extern struct m68hc11_elf_link_hash_table* m68hc11_elf_hash_table_create
0a6a3ebe 137 (bfd*);
3a65329d 138
0a6a3ebe 139extern void m68hc11_elf_get_bank_parameters (struct bfd_link_info*);
3a65329d
SC
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. */
0a6a3ebe 143extern int m68hc11_addr_is_banked (struct m68hc11_page_info*, bfd_vma);
3a65329d
SC
144
145/* Return the physical address seen by the processor, taking
146 into account banked memory. */
0a6a3ebe 147extern bfd_vma m68hc11_phys_addr (struct m68hc11_page_info*, bfd_vma);
3a65329d
SC
148
149/* Return the page number corresponding to an address in banked memory. */
0a6a3ebe 150extern bfd_vma m68hc11_phys_page (struct m68hc11_page_info*, bfd_vma);
3a65329d
SC
151
152bfd_reloc_status_type m68hc11_elf_ignore_reloc
0a6a3ebe
SC
153 (bfd *abfd, arelent *reloc_entry,
154 asymbol *symbol, void *data, asection *input_section,
155 bfd *output_bfd, char **error_message);
3a65329d 156bfd_reloc_status_type m68hc11_elf_special_reloc
0a6a3ebe
SC
157 (bfd *abfd, arelent *reloc_entry,
158 asymbol *symbol, void *data, asection *input_section,
159 bfd *output_bfd, char **error_message);
3a65329d 160
0a1b45a2 161bool elf32_m68hc11_check_relocs
0a6a3ebe
SC
162 (bfd * abfd, struct bfd_link_info * info,
163 asection * sec, const Elf_Internal_Rela * relocs);
0f684201 164int elf32_m68hc11_relocate_section
0a6a3ebe
SC
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);
3a65329d 169
0a1b45a2 170bool elf32_m68hc11_add_symbol_hook
0a6a3ebe 171 (bfd *abfd, struct bfd_link_info *info,
555cd476 172 Elf_Internal_Sym *sym, const char **namep,
0a6a3ebe
SC
173 flagword *flagsp, asection **secp,
174 bfd_vma *valp);
3a65329d 175
5efbbc43 176void elf32_m68hc11_merge_symbol_attribute
0a1b45a2 177 (struct elf_link_hash_entry *, unsigned int, bool, bool);
5efbbc43 178
3a65329d
SC
179/* Tweak the OSABI field of the elf header. */
180
0a1b45a2 181extern bool elf32_m68hc11_init_file_header (bfd*, struct bfd_link_info*);
3a65329d 182
0a6a3ebe 183int elf32_m68hc11_setup_section_lists (bfd *, struct bfd_link_info *);
3a65329d 184
0a1b45a2 185bool elf32_m68hc11_size_stubs
0a6a3ebe
SC
186 (bfd *, bfd *, struct bfd_link_info *,
187 asection * (*) (const char *, asection *));
3a65329d 188
0a1b45a2 189bool elf32_m68hc11_build_stubs (bfd* abfd, struct bfd_link_info *);
3a65329d 190#endif