1*a9fa9459Szrj /* CR16C ELF support for BFD. 2*a9fa9459Szrj Copyright (C) 2004-2016 Free Software Foundation, Inc. 3*a9fa9459Szrj 4*a9fa9459Szrj This file is part of BFD, the Binary File Descriptor library. 5*a9fa9459Szrj 6*a9fa9459Szrj This program is free software; you can redistribute it and/or modify 7*a9fa9459Szrj it under the terms of the GNU General Public License as published by 8*a9fa9459Szrj the Free Software Foundation; either version 3 of the License, or 9*a9fa9459Szrj (at your option) any later version. 10*a9fa9459Szrj 11*a9fa9459Szrj This program is distributed in the hope that it will be useful, 12*a9fa9459Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 13*a9fa9459Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*a9fa9459Szrj GNU General Public License for more details. 15*a9fa9459Szrj 16*a9fa9459Szrj You should have received a copy of the GNU General Public License 17*a9fa9459Szrj along with this program; if not, write to the Free Software Foundation, 18*a9fa9459Szrj Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 19*a9fa9459Szrj 20*a9fa9459Szrj #ifndef _ELF_CR16C_H 21*a9fa9459Szrj #define _ELF_CR16C_H 22*a9fa9459Szrj 23*a9fa9459Szrj #include "bfd.h" 24*a9fa9459Szrj #include "elf/reloc-macros.h" 25*a9fa9459Szrj 26*a9fa9459Szrj /* Creating indices for reloc_map_index array. */ 27*a9fa9459Szrj START_RELOC_NUMBERS (elf_cr16c_reloc_type) 28*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_NUM08, 0) 29*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_NUM08_C, 1) 30*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_NUM16, 2) 31*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_NUM16_C, 3) 32*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_NUM32, 4) 33*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_NUM32_C, 5) 34*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP04, 6) 35*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP04_C, 7) 36*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP08, 8) 37*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP08_C, 9) 38*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP16, 10) 39*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP16_C, 11) 40*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP24, 12) 41*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP24_C, 13) 42*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP24a, 14) 43*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_DISP24a_C, 15) 44*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG04, 16) 45*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG04_C, 17) 46*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG04a, 18) 47*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG04a_C, 19) 48*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG14, 20) 49*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG14_C, 21) 50*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG16, 22) 51*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG16_C, 23) 52*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG20, 24) 53*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_REG20_C, 25) 54*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_ABS20, 26) 55*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_ABS20_C, 27) 56*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_ABS24, 28) 57*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_ABS24_C, 29) 58*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM04, 30) 59*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM04_C, 31) 60*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM16, 32) 61*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM16_C, 33) 62*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM20, 34) 63*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM20_C, 35) 64*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM24, 36) 65*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM24_C, 37) 66*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM32, 38) 67*a9fa9459Szrj RELOC_NUMBER (RINDEX_16C_IMM32_C, 39) 68*a9fa9459Szrj END_RELOC_NUMBERS (RINDEX_16C_MAX) 69*a9fa9459Szrj 70*a9fa9459Szrj /* CR16C Relocation Types ('cr_reloc_type' entry in the reloc_map structure). 71*a9fa9459Szrj The relocation constant name is determined as follows : 72*a9fa9459Szrj 73*a9fa9459Szrj R_16C_<format><size>[_C] 74*a9fa9459Szrj 75*a9fa9459Szrj Where : 76*a9fa9459Szrj 77*a9fa9459Szrj <format> is one of the following: 78*a9fa9459Szrj NUM - R_NUMBER mnemonic, 79*a9fa9459Szrj DISP - R_16C_DISPL mnemonic, 80*a9fa9459Szrj REG - R_16C_REGREL mnemonic, 81*a9fa9459Szrj ABS - R_16C_ABS mnemonic, 82*a9fa9459Szrj IMM - R_16C_IMMED mnemonic, 83*a9fa9459Szrj <size> stands for R_S_16C_<size> 84*a9fa9459Szrj _C means 'code label' and is only added when R_ADDRTYPE subfield 85*a9fa9459Szrj is of type R_CODE_ADDR. */ 86*a9fa9459Szrj 87*a9fa9459Szrj /* The table below shows what the hex digits in the definition of the 88*a9fa9459Szrj relocation type constants correspond to. 89*a9fa9459Szrj ------------------------------------------------------------------ 90*a9fa9459Szrj R_SIZESP R_FORMAT R_RELTO R_ADDRTYPE 91*a9fa9459Szrj ------------------------------------------------------------------ */ 92*a9fa9459Szrj /* R_S_16C_08 R_NUMBER R_ABS R_ADDRESS */ 93*a9fa9459Szrj #define R_16C_NUM08 0X0001 94*a9fa9459Szrj 95*a9fa9459Szrj /* R_S_16C_08 R_NUMBER R_ABS R_CODE_ADDR */ 96*a9fa9459Szrj #define R_16C_NUM08_C 0X0006 97*a9fa9459Szrj 98*a9fa9459Szrj /* R_S_16C_16 R_NUMBER R_ABS R_ADDRESS */ 99*a9fa9459Szrj #define R_16C_NUM16 0X1001 100*a9fa9459Szrj 101*a9fa9459Szrj /* R_S_16C_16 R_NUMBER R_ABS R_CODE_ADDR */ 102*a9fa9459Szrj #define R_16C_NUM16_C 0X1006 103*a9fa9459Szrj 104*a9fa9459Szrj /* R_S_16C_32 R_NUMBER R_ABS R_ADDRESS */ 105*a9fa9459Szrj #define R_16C_NUM32 0X2001 106*a9fa9459Szrj 107*a9fa9459Szrj /* R_S_16C_32 R_NUMBER R_ABS R_CODE_ADDR */ 108*a9fa9459Szrj #define R_16C_NUM32_C 0X2006 109*a9fa9459Szrj 110*a9fa9459Szrj /* R_S_16C_04 R_16C_DISPL R_PCREL R_ADDRESS */ 111*a9fa9459Szrj #define R_16C_DISP04 0X5411 112*a9fa9459Szrj 113*a9fa9459Szrj /* R_S_16C_04 R_16C_DISPL R_PCREL R_CODE_ADDR */ 114*a9fa9459Szrj #define R_16C_DISP04_C 0X5416 115*a9fa9459Szrj 116*a9fa9459Szrj /* R_S_16C_08 R_16C_DISPL R_PCREL R_ADDRESS */ 117*a9fa9459Szrj #define R_16C_DISP08 0X0411 118*a9fa9459Szrj 119*a9fa9459Szrj /* R_S_16C_08 R_16C_DISPL R_PCREL R_CODE_ADDR */ 120*a9fa9459Szrj #define R_16C_DISP08_C 0X0416 121*a9fa9459Szrj 122*a9fa9459Szrj /* R_S_16C_16 R_16C_DISPL R_PCREL R_ADDRESS */ 123*a9fa9459Szrj #define R_16C_DISP16 0X1411 124*a9fa9459Szrj 125*a9fa9459Szrj /* R_S_16C_16 R_16C_DISPL R_PCREL R_CODE_ADDR */ 126*a9fa9459Szrj #define R_16C_DISP16_C 0X1416 127*a9fa9459Szrj 128*a9fa9459Szrj /* R_S_16C_24 R_16C_DISPL R_PCREL R_ADDRESS */ 129*a9fa9459Szrj #define R_16C_DISP24 0X7411 130*a9fa9459Szrj 131*a9fa9459Szrj /* R_S_16C_24 R_16C_DISPL R_PCREL R_CODE_ADDR */ 132*a9fa9459Szrj #define R_16C_DISP24_C 0X7416 133*a9fa9459Szrj 134*a9fa9459Szrj /* R_S_16C_24a R_16C_DISPL R_PCREL R_ADDRESS */ 135*a9fa9459Szrj #define R_16C_DISP24a 0X6411 136*a9fa9459Szrj 137*a9fa9459Szrj /* R_S_16C_24a R_16C_DISPL R_PCREL R_CODE_ADDR */ 138*a9fa9459Szrj #define R_16C_DISP24a_C 0X6416 139*a9fa9459Szrj 140*a9fa9459Szrj /* R_S_16C_04 R_16C_REGREL R_ABS R_ADDRESS */ 141*a9fa9459Szrj #define R_16C_REG04 0X5201 142*a9fa9459Szrj 143*a9fa9459Szrj /* R_S_16C_04 R_16C_REGREL R_ABS R_CODE_ADDR */ 144*a9fa9459Szrj #define R_16C_REG04_C 0X5206 145*a9fa9459Szrj 146*a9fa9459Szrj /* R_S_16C_04_a R_16C_REGREL R_ABS R_ADDRESS */ 147*a9fa9459Szrj #define R_16C_REG04a 0X4201 148*a9fa9459Szrj 149*a9fa9459Szrj /* R_S_16C_04_a R_16C_REGREL R_ABS R_CODE_ADDR */ 150*a9fa9459Szrj #define R_16C_REG04a_C 0X4206 151*a9fa9459Szrj 152*a9fa9459Szrj /* R_S_16C_14 R_16C_REGREL R_ABS R_ADDRESS */ 153*a9fa9459Szrj #define R_16C_REG14 0X3201 154*a9fa9459Szrj 155*a9fa9459Szrj /* R_S_16C_14 R_16C_REGREL R_ABS R_CODE_ADDR */ 156*a9fa9459Szrj #define R_16C_REG14_C 0X3206 157*a9fa9459Szrj 158*a9fa9459Szrj /* R_S_16C_16 R_16C_REGREL R_ABS R_ADDRESS */ 159*a9fa9459Szrj #define R_16C_REG16 0X1201 160*a9fa9459Szrj 161*a9fa9459Szrj /* R_S_16C_16 R_16C_REGREL R_ABS R_CODE_ADDR */ 162*a9fa9459Szrj #define R_16C_REG16_C 0X1206 163*a9fa9459Szrj 164*a9fa9459Szrj /* R_S_16C_20 R_16C_REGREL R_ABS R_ADDRESS */ 165*a9fa9459Szrj #define R_16C_REG20 0X8201 166*a9fa9459Szrj 167*a9fa9459Szrj /* R_S_16C_20 R_16C_REGREL R_ABS R_CODE_ADDR */ 168*a9fa9459Szrj #define R_16C_REG20_C 0X8206 169*a9fa9459Szrj 170*a9fa9459Szrj /* R_S_16C_20 R_16C_ABS R_ABS R_ADDRESS */ 171*a9fa9459Szrj #define R_16C_ABS20 0X8101 172*a9fa9459Szrj 173*a9fa9459Szrj /* R_S_16C_20 R_16C_ABS R_ABS R_CODE_ADDR */ 174*a9fa9459Szrj #define R_16C_ABS20_C 0X8106 175*a9fa9459Szrj 176*a9fa9459Szrj /* R_S_16C_24 R_16C_ABS R_ABS R_ADDRESS */ 177*a9fa9459Szrj #define R_16C_ABS24 0X7101 178*a9fa9459Szrj 179*a9fa9459Szrj /* R_S_16C_24 R_16C_ABS R_ABS R_CODE_ADDR */ 180*a9fa9459Szrj #define R_16C_ABS24_C 0X7106 181*a9fa9459Szrj 182*a9fa9459Szrj /* R_S_16C_04 R_16C_IMMED R_ABS R_ADDRESS */ 183*a9fa9459Szrj #define R_16C_IMM04 0X5301 184*a9fa9459Szrj 185*a9fa9459Szrj /* R_S_16C_04 R_16C_IMMED R_ABS R_CODE_ADDR */ 186*a9fa9459Szrj #define R_16C_IMM04_C 0X5306 187*a9fa9459Szrj 188*a9fa9459Szrj /* R_S_16C_16 R_16C_IMMED R_ABS R_ADDRESS */ 189*a9fa9459Szrj #define R_16C_IMM16 0X1301 190*a9fa9459Szrj 191*a9fa9459Szrj /* R_S_16C_16 R_16C_IMMED R_ABS R_CODE_ADDR */ 192*a9fa9459Szrj #define R_16C_IMM16_C 0X1306 193*a9fa9459Szrj 194*a9fa9459Szrj /* R_S_16C_20 R_16C_IMMED R_ABS R_ADDRESS */ 195*a9fa9459Szrj #define R_16C_IMM20 0X8301 196*a9fa9459Szrj 197*a9fa9459Szrj /* R_S_16C_20 R_16C_IMMED R_ABS R_CODE_ADDR */ 198*a9fa9459Szrj #define R_16C_IMM20_C 0X8306 199*a9fa9459Szrj 200*a9fa9459Szrj /* R_S_16C_24 R_16C_IMMED R_ABS R_ADDRESS */ 201*a9fa9459Szrj #define R_16C_IMM24 0X7301 202*a9fa9459Szrj 203*a9fa9459Szrj /* R_S_16C_24 R_16C_IMMED R_ABS R_CODE_ADDR */ 204*a9fa9459Szrj #define R_16C_IMM24_C 0X7306 205*a9fa9459Szrj 206*a9fa9459Szrj /* R_S_16C_32 R_16C_IMMED R_ABS R_ADDRESS */ 207*a9fa9459Szrj #define R_16C_IMM32 0X2301 208*a9fa9459Szrj 209*a9fa9459Szrj /* R_S_16C_32 R_16C_IMMED R_ABS R_CODE_ADDR */ 210*a9fa9459Szrj #define R_16C_IMM32_C 0X2306 211*a9fa9459Szrj 212*a9fa9459Szrj 213*a9fa9459Szrj /* Relocation item type. */ 214*a9fa9459Szrj #define R_ADDRTYPE 0x000f 215*a9fa9459Szrj #define R_ADDRESS 0x0001 /* Take address of symbol. */ 216*a9fa9459Szrj #define R_CODE_ADDR 0x0006 /* Take address of symbol divided by 2. */ 217*a9fa9459Szrj 218*a9fa9459Szrj /* Relocation action. */ 219*a9fa9459Szrj #define R_RELTO 0x00f0 220*a9fa9459Szrj #define R_ABS 0x0000 /* Keep symbol's address as such. */ 221*a9fa9459Szrj #define R_PCREL 0x0010 /* Subtract the pc address of hole. */ 222*a9fa9459Szrj 223*a9fa9459Szrj /* Relocation item data format. */ 224*a9fa9459Szrj #define R_FORMAT 0x0f00 225*a9fa9459Szrj #define R_NUMBER 0x0000 /* Retain as two's complement value. */ 226*a9fa9459Szrj #define R_16C_DISPL 0x0400 /* CR16C displacement type. */ 227*a9fa9459Szrj #define R_16C_ABS 0x0100 /* CR16C absolute type. */ 228*a9fa9459Szrj #define R_16C_REGREL 0x0200 /* CR16C register-relative type. */ 229*a9fa9459Szrj #define R_16C_IMMED 0x0300 /* CR16C immediate type. */ 230*a9fa9459Szrj 231*a9fa9459Szrj /* Relocation item size. */ 232*a9fa9459Szrj #define R_SIZESP 0xf000 233*a9fa9459Szrj #define R_S_16C_04 0x5000 234*a9fa9459Szrj #define R_S_16C_04_a 0x4000 235*a9fa9459Szrj #define R_S_16C_08 0x0000 236*a9fa9459Szrj #define R_S_16C_14 0x3000 237*a9fa9459Szrj #define R_S_16C_16 0x1000 238*a9fa9459Szrj #define R_S_16C_20 0x8000 239*a9fa9459Szrj #define R_S_16C_24_a 0x6000 240*a9fa9459Szrj #define R_S_16C_24 0x7000 241*a9fa9459Szrj #define R_S_16C_32 0x2000 242*a9fa9459Szrj 243*a9fa9459Szrj 244*a9fa9459Szrj /* Processor specific section indices. These sections do not actually 245*a9fa9459Szrj exist. Symbols with a st_shndx field corresponding to one of these 246*a9fa9459Szrj values have a special meaning. */ 247*a9fa9459Szrj 248*a9fa9459Szrj /* Far common symbol. */ 249*a9fa9459Szrj #define SHN_CR16C_FCOMMON SHN_LORESERVE 250*a9fa9459Szrj #define SHN_CR16C_NCOMMON (SHN_LORESERVE + 1) 251*a9fa9459Szrj 252*a9fa9459Szrj typedef struct reloc_map 253*a9fa9459Szrj { 254*a9fa9459Szrj unsigned short cr_reloc_type; /* CR relocation type. */ 255*a9fa9459Szrj bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum. */ 256*a9fa9459Szrj } RELOC_MAP; 257*a9fa9459Szrj 258*a9fa9459Szrj #endif /* _ELF_CR16C_H */ 259