poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[COMMITTED,POKE-ELF] More work on the MIPS machine support


From: Jose E. Marchesi
Subject: [COMMITTED,POKE-ELF] More work on the MIPS machine support
Date: Sun, 29 Jan 2023 22:35:31 +0100
User-agent: Gnus/5.13 (Gnus v5.13)

---
 elf-mach-mips.pk | 510 +++++++++++++++++++++++++++++++++++++++++++++++
 poke-elf.texi    |  17 ++
 2 files changed, 527 insertions(+)

diff --git a/elf-mach-mips.pk b/elf-mach-mips.pk
index 59f5f86..9f28ba4 100644
--- a/elf-mach-mips.pk
+++ b/elf-mach-mips.pk
@@ -15,3 +15,513 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
+
+/* MIPS relocation types.  */
+
+var ELF_R_MIPS_NONE = 0,
+    ELF_R_MIPS_16 = 1,
+    ELF_R_MIPS_32 = 2,
+    ELF_R_MIPS_REL32 = 3,
+    ELF_R_MIPS_26 = 4,
+    ELF_R_MIPS_HI16 = 5,
+    ELF_R_MIPS_LO16 = 6,
+    ELF_R_MIPS_GPREL16 = 7,
+    ELF_R_MIPS_LITERAL = 8,
+    ELF_R_MIPS_GOT16 = 9,
+    ELF_R_MIPS_PC16 = 10,
+    ELF_R_MIPS_CALL16 = 11,
+    ELF_R_MIPS_GPREL32 = 12,
+    ELF_R_MIPS_UNUSED1 = 13,
+    ELF_R_MIPS_UNUSED2 = 14,
+    ELF_R_MIPS_UNUSED3 = 15,
+    ELF_R_MIPS_SHIFT5 = 16,
+    ELF_R_MIPS_SHIFT6 = 17,
+    ELF_R_MIPS_64 = 18,
+    ELF_R_MIPS_GOT_DISP = 19,
+    ELF_R_MIPS_GOT_PAGE = 20,
+    ELF_R_MIPS_GOT_OFST = 21,
+    ELF_R_MIPS_GOT_HI16 = 22,
+    ELF_R_MIPS_GOT_LO16 = 23,
+    ELF_R_MIPS_SUB = 24,
+    ELF_R_MIPS_INSERT_A = 25,
+    ELF_R_MIPS_INSERT_B = 26,
+    ELF_R_MIPS_DELETE = 27,
+    ELF_R_MIPS_HIGHER = 28,
+    ELF_R_MIPS_HIGHEST = 29,
+    ELF_R_MIPS_CALL_HI16 = 30,
+    ELF_R_MIPS_CALL_LO16 = 31,
+    ELF_R_MIPS_SCN_DISP = 32,
+    ELF_R_MIPS_REL16 = 33,
+    ELF_R_MIPS_ADD_IMMEDIATE = 34,
+    ELF_R_MIPS_PJUMP = 35,
+    ELF_R_MIPS_RELGOT = 36,
+    ELF_R_MIPS_JALR = 37,
+    ELF_R_MIPS_TLS_DTPMOD32 = 38,
+    ELF_R_MIPS_TLS_DTPREL32 = 39,
+    ELF_R_MIPS_TLS_DTPMOD64 = 40,
+    ELF_R_MIPS_TLS_DTPREL64 = 41,
+    ELF_R_MIPS_TLS_GD = 42,
+    ELF_R_MIPS_TLS_LDM = 43,
+    ELF_R_MIPS_TLS_DTPREL_HI16 = 44,
+    ELF_R_MIPS_TLS_DTPREL_LO16 = 45,
+    ELF_R_MIPS_TLS_GOTTPREL = 46,
+    ELF_R_MIPS_TLS_TPREL32 = 47,
+    ELF_R_MIPS_TLS_TPREL64 = 48,
+    ELF_R_MIPS_TLS_TPREL_HI16 = 49,
+    ELF_R_MIPS_TLS_TPREL_LO16 = 50,
+    ELF_R_MIPS_GLOB_DAT = 51,
+    ELF_R_MIPS_PC21_S2 = 60,
+    ELF_R_MIPS_PC26_S2 = 61,
+    ELF_R_MIPS_PC18_S3 = 62,
+    ELF_R_MIPS_PC19_S2 = 63,
+    ELF_R_MIPS_PCHI16 = 64,
+    ELF_R_MIPS_PCLO16 = 65,
+    ELF_R_MIPS16_26 = 100,
+    ELF_R_MIPS16_GPREL = 101,
+    ELF_R_MIPS16_GOT16 = 102,
+    ELF_R_MIPS16_CALL16 = 103,
+    ELF_R_MIPS16_HI16 = 104,
+    ELF_R_MIPS16_LO16 = 105,
+    ELF_R_MIPS16_TLS_GD = 106,
+    ELF_R_MIPS16_TLS_LDM = 107,
+    ELF_R_MIPS16_TLS_DTPREL_HI16 = 108,
+    ELF_R_MIPS16_TLS_DTPREL_LO16 = 109,
+    ELF_R_MIPS16_TLS_GOTTPREL = 110,
+    ELF_R_MIPS16_TLS_TPREL_HI16 = 111,
+    ELF_R_MIPS16_TLS_TPREL_LO16 = 112,
+    ELF_R_MIPS16_PC16_S1 = 113,
+    ELF_R_MIPS_COPY = 126,
+    ELF_R_MIPS_JUMP_SLOT = 127,
+    ELF_R_MICROMIPS_26_S1 = 133,
+    ELF_R_MICROMIPS_HI16 = 134,
+    ELF_R_MICROMIPS_LO16 = 135,
+    ELF_R_MICROMIPS_GPREL16 = 136,
+    ELF_R_MICROMIPS_LITERAL = 137,
+    ELF_R_MICROMIPS_GOT16 = 138,
+    ELF_R_MICROMIPS_PC7_S1 = 139,
+    ELF_R_MICROMIPS_PC10_S1 = 140,
+    ELF_R_MICROMIPS_PC16_S1 = 141,
+    ELF_R_MICROMIPS_CALL16 = 142,
+    ELF_R_MICROMIPS_GOT_DISP = 145,
+    ELF_R_MICROMIPS_GOT_PAGE = 146,
+    ELF_R_MICROMIPS_GOT_OFST = 147,
+    ELF_R_MICROMIPS_GOT_HI16 = 148,
+    ELF_R_MICROMIPS_GOT_LO16 = 149,
+    ELF_R_MICROMIPS_SUB = 150,
+    ELF_R_MICROMIPS_HIGHER = 151,
+    ELF_R_MICROMIPS_HIGHEST = 152,
+    ELF_R_MICROMIPS_CALL_HI16 = 153,
+    ELF_R_MICROMIPS_CALL_LO16 = 154,
+    ELF_R_MICROMIPS_SCN_DISP = 155,
+    ELF_R_MICROMIPS_JALR = 156,
+    ELF_R_MICROMIPS_HI0_LO16 = 157,
+    ELF_R_MICROMIPS_TLS_GD = 162,
+    ELF_R_MICROMIPS_TLS_LDM = 163,
+    ELF_R_MICROMIPS_TLS_DTPREL_HI16 = 164,
+    ELF_R_MICROMIPS_TLS_DTPREL_LO16 = 165,
+    ELF_R_MICROMIPS_TLS_GOTTPREL = 166,
+    ELF_R_MICROMIPS_TLS_TPREL_HI16 = 169,
+    ELF_R_MICROMIPS_TLS_TPREL_LO16 = 170,
+    ELF_R_MICROMIPS_GPREL7_S2 = 172,
+    ELF_R_MICROMIPS_PC23_S2 = 173,
+    ELF_R_MIPS_PC32 = 248,
+    ELF_R_MIPS_EH = 249,
+    ELF_R_MIPS_GNU_REL16_S2 = 250,
+    ELF_R_MIPS_GNU_VTINHERIT = 253,
+    ELF_R_MIPS_GNU_VTENTRY = 254;
+
+elf_config.add_enum
+  :machine ELF_EM_MIPS
+  :class "relocation-types"
+  :entries [Elf_Config_UInt { value = ELF_R_MIPS_NONE, name = "NONE" },
+            Elf_Config_UInt { value = ELF_R_MIPS_16, name = "16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_32, name = "32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_REL32, name = "REL32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_26, name = "26" },
+            Elf_Config_UInt { value = ELF_R_MIPS_HI16, name = "HI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_LO16, name = "LO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GPREL16, name = "GPREL16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_LITERAL, name = "LITERAL" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GOT16, name = "GOT16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PC16, name = "PC16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_CALL16, name = "CALL16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GPREL32, name = "GPREL32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_UNUSED1, name = "UNUSED1" },
+            Elf_Config_UInt { value = ELF_R_MIPS_UNUSED2, name = "UNUSED2" },
+            Elf_Config_UInt { value = ELF_R_MIPS_UNUSED3, name = "UNUSED3" },
+            Elf_Config_UInt { value = ELF_R_MIPS_SHIFT5, name = "SHIFT5" },
+            Elf_Config_UInt { value = ELF_R_MIPS_SHIFT6, name = "SHIFT6" },
+            Elf_Config_UInt { value = ELF_R_MIPS_64, name = "64" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GOT_DISP, name = "GOT_DISP" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GOT_PAGE, name = "GOT_PAGE" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GOT_OFST, name = "GOT_OFST" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GOT_HI16, name = "GOT_HI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GOT_LO16, name = "GOT_LO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_SUB, name = "SUB" },
+            Elf_Config_UInt { value = ELF_R_MIPS_INSERT_A, name = "INSERT_A" },
+            Elf_Config_UInt { value = ELF_R_MIPS_INSERT_B, name = "INSERT_B" },
+            Elf_Config_UInt { value = ELF_R_MIPS_DELETE, name = "DELETE" },
+            Elf_Config_UInt { value = ELF_R_MIPS_HIGHER, name = "HIGHER" },
+            Elf_Config_UInt { value = ELF_R_MIPS_HIGHEST, name = "HIGHEST" },
+            Elf_Config_UInt { value = ELF_R_MIPS_CALL_HI16, name = "CALL_HI16" 
},
+            Elf_Config_UInt { value = ELF_R_MIPS_CALL_LO16, name = "CALL_LO16" 
},
+            Elf_Config_UInt { value = ELF_R_MIPS_SCN_DISP, name = "SCN_DISP" },
+            Elf_Config_UInt { value = ELF_R_MIPS_REL16, name = "REL16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_ADD_IMMEDIATE, name = 
"ADD_IMMEDIATE" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PJUMP, name = "PJUMP" },
+            Elf_Config_UInt { value = ELF_R_MIPS_RELGOT, name = "RELGOT" },
+            Elf_Config_UInt { value = ELF_R_MIPS_JALR, name = "JALR" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_DTPMOD32, name = 
"TLS_DTPMOD32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_DTPREL32, name = 
"TLS_DTPREL32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_DTPMOD64, name = 
"TLS_DTPMOD64" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_DTPREL64, name = 
"TLS_DTPREL64" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_GD, name = "TLS_GD" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_LDM, name = "TLS_LDM" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_DTPREL_HI16, name = 
"TLS_DTPREL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_DTPREL_LO16, name = 
"TLS_DTPREL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_GOTTPREL, name = 
"TLS_GOTTPREL" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_TPREL32, name = 
"TLS_TPREL32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_TPREL64, name = 
"TLS_TPREL64" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_TPREL_HI16, name = 
"TLS_TPREL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_TLS_TPREL_LO16, name = 
"TLS_TPREL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GLOB_DAT, name = "GLOB_DAT" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PC21_S2, name = "PC21_S2" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PC26_S2, name = "PC26_S2" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PC18_S3, name = "PC18_S3" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PC19_S2, name = "PC19_S2" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PCHI16, name = "PCHI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PCLO16, name = "PCLO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_GPREL, name = 
"MIPS16_GPREL" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_GOT16, name = 
"MIPS16_GOT16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_CALL16, name = 
"MIPS16_CALL16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_HI16, name = "MIPS16_HI16" 
},
+            Elf_Config_UInt { value = ELF_R_MIPS16_LO16, name = "MIPS16_LO16" 
},
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_GD, name = 
"MIPS16_TLS_GD" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_LDM, name = 
"MIPS16_TLS_LDM" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_DTPREL_HI16, name = 
"MIPS16_TLS_DTPREL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_DTPREL_LO16, name = 
"MIPS16_TLS_DTPREL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_GOTTPREL, name = 
"MIPS16_TLS_GOTTPREL" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_TPREL_HI16, name = 
"MIPS16_TLS_TPREL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_TLS_TPREL_LO16, name = 
"MIPS16_TLS_TPREL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MIPS16_PC16_S1, name = 
"MIPS16_PC16_S1" },
+            Elf_Config_UInt { value = ELF_R_MIPS_COPY, name = "COPY" },
+            Elf_Config_UInt { value = ELF_R_MIPS_JUMP_SLOT, name = "JUMP_SLOT" 
},
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_26_S1, name = 
"MICROMIPS_26_S1" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_HI16, name = 
"MICROMIPS_HI16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_LO16, name = 
"MICROMIPS_LO16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GPREL16, name = 
"MICROMIPS_GPREL16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_LITERAL, name = 
"MICROMIPS_LITERAL" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GOT16, name = 
"MICROMIPS_GOT16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_PC7_S1, name = 
"MICROMIPS_PC7_S1" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_PC10_S1, name = 
"MICROMIPS_PC10_S1" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_PC16_S1, name = 
"MICROMIPS_PC16_S1" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_CALL16, name = 
"MICROMIPS_CALL16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GOT_DISP, name = 
"MICROMIPS_GOT_DISP" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GOT_PAGE, name = 
"MICROMIPS_GOT_PAGE" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GOT_OFST, name = 
"MICROMIPS_GOT_OFST" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GOT_HI16, name = 
"MICROMIPS_GOT_HI16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GOT_LO16, name = 
"MICROMIPS_GOT_LO16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_SUB, name = 
"MICROMIPS_SUB" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_HIGHER, name = 
"MICROMIPS_HIGHER" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_HIGHEST, name = 
"MICROMIPS_HIGHEST" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_CALL_HI16, name = 
"MICROMIPS_CALL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_CALL_LO16, name = 
"MICROMIPS_CALL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_SCN_DISP, name = 
"MICROMIPS_SCN_DISP" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_JALR, name = 
"MICROMIPS_JALR" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_HI0_LO16, name = 
"MICROMIPS_HI0_LO16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_GD, name = 
"MICROMIPS_TLS_GD" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_LDM, name = 
"MICROMIPS_TLS_LDM" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_DTPREL_HI16, name = 
"MICROMIPS_TLS_DTPREL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_DTPREL_LO16, name = 
"MICROMIPS_TLS_DTPREL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_GOTTPREL, name = 
"MICROMIPS_TLS_GOTTPREL" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_TPREL_HI16, name = 
"MICROMIPS_TLS_TPREL_HI16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_TLS_TPREL_LO16, name = 
"MICROMIPS_TLS_TPREL_LO16" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_GPREL7_S2, name = 
"MICROMIPS_GPREL7_S2" },
+            Elf_Config_UInt { value = ELF_R_MICROMIPS_PC23_S2, name = 
"MICROMIPS_PC23_S2" },
+            Elf_Config_UInt { value = ELF_R_MIPS_PC32, name = "PC32" },
+            Elf_Config_UInt { value = ELF_R_MIPS_EH, name = "EH" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GNU_REL16_S2, name = 
"GNU_REL16_S2" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GNU_VTINHERIT, name = 
"GNU_VTINHERIT" },
+            Elf_Config_UInt { value = ELF_R_MIPS_GNU_VTENTRY, name = 
"GNU_VTENTRY" }];
+
+/* MIPS file flags.  */
+
+var ELF_EF_MIPS_NOREORDER     = 0x0000_0001U,
+    ELF_EF_MIPS_PIC           = 0x0000_0002U,
+    ELF_EF_MIPS_CPIC          = 0x0000_0004U,
+    ELF_EF_MIPS_XGOT          = 0x0000_0008U,
+    ELF_EF_MIPS_UCODE         = 0x0000_0010U,
+    ELF_EF_MIPS_ABI2          = 0x0000_0020U,
+    ELF_EF_MIPS_OPTIONS_FIRST = 0x0000_0080U,
+    ELF_EF_MIPS_32BITMODE     = 0x0000_0010U,
+    ELF_EF_MIPS_FP64          = 0x0000_0200U,
+    EFL_EF_MIPS_NAN2008       = 0x0000_0400U,
+    ELF_EF_MIPS_ARCH_ASE      = 0x0f00_0000U,
+    ELF_EF_MIPS_ARCH_ASE_MDMX = 0x0800_0000U,
+    ELF_EF_MIPS_ARCH_ASE_M16  = 0x0400_0000U,
+    ELF_EF_MIPS_ARCH_ASE_MICROMIPS = 0x0200_0000U,
+    ELF_EF_MIPS_ARCH          = 0xf000_0000U,
+    ELF_EF_MIPS_ABI           = 0x0000_f000U,
+    ELF_EF_MIPS_MACH          = 0x00ff_0000U;
+
+elf_config.add_mask
+  :machine ELF_EM_MIPS
+  :class "file-flags"
+  :entries [Elf_Config_Mask { value = ELF_EF_MIPS_NOREORDER, name = 
"noreorder",
+                              doc = "At least one .noreorder directive appears 
in the source." }];
+
+/* MIPS architectures encoded in the ELF_EF_MIPS_ARCH bits of
+   the file flags.  */
+
+var ELF_E_MIPS_ARCH_1  = 0x0000_0000U,
+    ELF_E_MIPS_ARCH_2  = 0x1000_0000U,
+    ELF_E_MIPS_ARCH_3  = 0x2000_0000U,
+    ELF_E_MIPS_ARCH_4  = 0x3000_0000U,
+    ELF_E_MIPS_ARCH_5  = 0x4000_0000U,
+    ELF_E_MIPS_ARCH_32 = 0x5000_0000U,
+    ELF_E_MIPS_ARCH_64 = 0x6000_0000U,
+    ELF_E_MIPS_ARCH_32R2 = 0x7000_0000U,
+    ELF_E_MIPS_ARCH_64R2 = 0x8000_0000U,
+    ELF_E_MIPS_ARCH_32R6 = 0x9000_0000U,
+    ELF_E_MIPS_ARCH_64R6 = 0xa000_0000U;
+
+elf_config.add_enum
+  :machine ELF_EM_MIPS
+  :class "mips-architectures"
+  :entries [Elf_Config_UInt { value = ELF_E_MIPS_ARCH_1, name = "mips1",
+                              doc = "-mips1 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_2, name = "mips2",
+                              doc = "-mips2 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_3, name = "mips3",
+                              doc = "-mips3 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_4, name = "mips4",
+                              doc = "-mips4 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_5, name = "mips5",
+                              doc = "-mips5 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_32, name = "mips32",
+                              doc = "-mips32 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_64, name = "mips64",
+                              doc = "-mips64 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_32R2, name = "mips32r2",
+                              doc = "-mips32r2 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_64R2, name = "mips64r2",
+                              doc = "-mips64r2 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_32R6, name = "mips32r6",
+                              doc = "-mips32r6 code." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ARCH_64R6, name = "mips64r6",
+                              doc = "-mips64r6 code." }];
+
+/* MIPS machines encoded in the ELF_EF_MIPS_MACH bits of
+   the file flags.  */
+
+var ELF_E_MIPS_ABI_O32    = 0x0000_1000U,
+    ELF_E_MIPS_ABI_O64    = 0x0000_2000U,
+    ELF_E_MIPS_ABI_EABI32 = 0x0000_3000U,
+    ELF_E_MIPS_ABI_EABI64 = 0x0000_4000U;
+
+elf_config.add_enum
+  :machine ELF_EM_MIPS
+  :class "mips-abis"
+  :entries [Elf_Config_UInt { value = ELF_E_MIPS_ABI_O32, name = "o32",
+                              doc = "The original o32 abi." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ABI_O64, name = "o64",
+                              doc = "o32 extended to work on 64 bit 
architectures." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ABI_EABI32, name = "eabi32",
+                              doc = "EABI in 32 bit mode." },
+            Elf_Config_UInt { value = ELF_E_MIPS_ABI_EABI64, name = "eabi64",
+                              doc = "EABI in 64 bit mode." }];
+
+var ELF_E_MIPS_MACH_3900 = 0x0081_0000U,
+    ELF_E_MIPS_MACH_4010 = 0x0082_0000U,
+    ELF_E_MIPS_MACH_4100 = 0x0083_0000U,
+    ELF_E_MIPS_MACH_4650 = 0x0085_0000U,
+    ELF_E_MIPS_MACH_4120 = 0x0087_0000U,
+    ELF_E_MIPS_MACH_4111 = 0x0088_0000U,
+    ELF_E_MIPS_MACH_SB1  = 0x008a_0000U,
+    ELF_E_MIPS_MACH_OCTEON  = 0x008b_0000U,
+    ELF_E_MIPS_MACH_XLR     = 0x008c_0000U,
+    ELF_E_MIPS_MACH_OCTEON2 = 0x008d_0000U,
+    ELF_E_MIPS_MACH_OCTEON3 = 0x008e_0000U,
+    ELF_E_MIPS_MACH_5400   = 0x0091_0000U,
+    ELF_E_MIPS_MACH_5900   = 0x0092_0000U,
+    ELF_E_MIPS_MACH_IAMR2  = 0x0093_0000U,
+    ELF_E_MIPS_MACH_5500   = 0x0098_0000U,
+    ELF_E_MIPS_MACH_9000   = 0x0099_0000U,
+    ELF_E_MIPS_MACH_LS2E   = 0x00A0_0000U,
+    ELF_E_MIPS_MACH_LS2F   = 0x00A1_0000U,
+    ELF_E_MIPS_MACH_GS464  = 0x00A2_0000U,
+    ELF_E_MIPS_MACH_GS464E = 0x00A3_0000U,
+    ELF_E_MIPS_MACH_GS264E = 0x00A4_0000U;
+
+elf_config.add_enum
+  :machine ELF_EM_MIPS
+  :class "mips-machines"
+  :entries [Elf_Config_UInt { value = ELF_E_MIPS_MACH_3900, name = "3900" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_4010, name = "4010" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_4100, name = "4100" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_4650, name = "4650" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_4120, name = "4120" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_4111, name = "4111" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_SB1 , name = "SB1 " },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_OCTEON , name = "OCTEON 
" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_XLR    , name = "XLR    
" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_OCTEON2, name = 
"OCTEON2" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_OCTEON3, name = 
"OCTEON3" },
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_5400  , name = "5400  " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_5900  , name = "5900  " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_IAMR2 , name = "IAMR2 " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_5500  , name = "5500  " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_9000  , name = "9000  " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_LS2E  , name = "LS2E  " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_LS2F  , name = "LS2F  " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_GS464 , name = "GS464 " 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_GS464E, name = "GS464E" 
},
+            Elf_Config_UInt { value = ELF_E_MIPS_MACH_GS264E, name = "GS264E" 
}];
+
+/* MIPS section indices.  */
+
+var ELF_SHN_MIPS_ACOMMON = ELF_SHN_LORESERVE;
+
+elf_config.add_enum
+  :machine ELF_EM_MIPS
+  :class "section-indices"
+  :entries [Elf_Config_UInt { value = ELF_SHN_MIPS_ACOMMON, name = "acommon",
+                              doc = "Defined and allocated common symbol." }];
+
+/* MIPS section types.  */
+
+var ELF_SHT_MIPS_MSYM = 0x7000_0000U,
+    ELF_SHT_MIPS_MSYM = 0x7000_0001U,
+    ELF_SHT_MIPS_CONFLICT = 0x7000_0002U,
+    ELF_SHT_MIPS_GPTAB = 0x7000_0003U,
+    ELF_SHT_MIPS_UCODE = 0x7000_0004U,
+    ELF_SHT_MIPS_DEBUG = 0x7000_0005U,
+    ELF_SHT_MIPS_REGINFO = 0x7000_0006U,
+    ELF_SHT_MIPS_PACKAGE = 0x7000_0007U,
+    ELF_SHT_MIPS_PACKSYM = 0x7000_0008U,
+    ELF_SHT_MIPS_RELD = 0x7000_0009U,
+    ELF_SHT_MIPS_IFACE = 0x7000_000bU,
+    ELF_SHT_MIPS_CONTENT = 0x7000_000cU,
+    ELF_SHT_MIPS_OPTIONS = 0x7000_000dU,
+    ELF_SHT_MIPS_SHDR = 0x7000_0010U,
+    ELF_SHT_MIPS_FDESC = 0x7000_0011U,
+    ELF_SHT_MIPS_EXTSYM = 0x7000_0012U,
+    ELF_SHT_MIPS_DENSE = 0x7000_0013U,
+    ELF_SHT_MIPS_PDESC = 0x7000_0014U,
+    ELF_SHT_MIPS_LOCSYM = 0x7000_0015U,
+    ELF_SHT_MIPS_AUXSYM = 0x7000_0016U,
+    ELF_SHT_MIPS_OPTSYM = 0x7000_0017U,
+    ELF_SHT_MIPS_LOCSTR = 0x7000_0018U,
+    ELF_SHT_MIPS_LINE = 0x7000_0019U,
+    ELF_SHT_MIPS_RFDES = 0x7000_001aU,
+    ELF_SHT_MIPS_DELTASYM = 0x7000_001bU,
+    ELF_SHT_MIPS_DELTAINST = 0x7000_001cU,
+    ELF_SHT_MIPS_DELTACLASS = 0x7000_001dU,
+    ELF_SHT_MIPS_DWARF = 0x7000_001eU,
+    ELF_SHT_MIPS_DELTADECL = 0x7000_001fU,
+    ELF_SHT_MIPS_SYMBOL_LIB = 0x7000_0020U,
+    ELF_SHT_MIPS_EVENTS = 0x7000_0021U,
+    ELF_SHT_MIPS_TRANSLATE = 0x7000_0022U,
+    ELF_SHT_MIPS_PIXIE = 0x7000_0023U,
+    ELF_SHT_MIPS_XLATE = 0x7000_0024U,
+    ELF_SHT_MIPS_XLATE_DEBUG = 0x7000_0025U,
+    ELF_SHT_MIPS_WHIRL = 0x7000_0026U,
+    ELF_SHT_MIPS_EH_REGION = 0x7000_0027U,
+    ELF_SHT_MIPS_XLATE_OLD = 0x7000_0028U,
+    ELF_SHT_MIPS_PDR_EXCEPTION = 0x7000_0029U,
+    ELF_SHT_MIPS_ABIFLAGS = 0x7000_002aU,
+    ELF_SHT_MIPS_XHASH = 0x7000_002bU;
+
+elf_config.add_enum
+  :machine ELF_EM_MIPS
+  :class "section-types"
+  :entries [Elf_Config_UInt { value = ELF_SHT_MIPS_MSYM, name = "MSYM",
+                              doc = "Section contains the set of dynamic 
shared"
+                                    + " objects used when statically linking." 
},
+            Elf_Config_UInt { value = ELF_SHT_MIPS_MSYM, name = "MSYM",
+                              doc = "Used on Irix 5." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_CONFLICT, name = "CONFLICT",
+                              doc = "Section contains list of symbols whose 
definitions"
+                                    + " conflict with symbols defined in 
shared objects."},
+            Elf_Config_UInt { value = ELF_SHT_MIPS_GPTAB, name = "GPTAB",
+                              doc = "Section contains the global pointer 
table." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_UCODE, name = "UCODE",
+                              doc = "Section contains microcode information.  
The exact"
+                                    + "format is unspecified." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DEBUG, name = "DEBUG",
+                              doc = "Section contains some sort of debugging 
information."
+                                    + "Probably ECOFF symbols." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_REGINFO, name = "REGINFO",
+                              doc = "Section contains register usage 
information." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_PACKAGE, name = "PACKAGE" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_PACKSYM, name = "PACKSYM" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_RELD, name = "RELD" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_IFACE, name = "IFACE",
+                              doc = "Section contains interface information." 
},
+            Elf_Config_UInt { value = ELF_SHT_MIPS_CONTENT, name = "CONTENT",
+                              doc = "Section contains description of contents 
of another section." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_OPTIONS, name = "OPTIONS",
+                              doc = "Section contains miscellaneous options." 
},
+            Elf_Config_UInt { value = ELF_SHT_MIPS_SHDR, name = "SHDR" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_FDESC, name = "FDESC" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_EXTSYM, name = "EXTSYM" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DENSE, name = "DENSE" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_PDESC, name = "PDESC" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_LOCSYM, name = "LOCSYM" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_AUXSYM, name = "AUXSYM" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_OPTSYM, name = "OPTSYM" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_LOCSTR, name = "LOCSTR" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_LINE, name = "LINE" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_RFDES, name = "RFDES" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DELTASYM, name = "DELTASYM",
+                              doc = "Delta C++: symbol table." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DELTAINST, name = 
"DELTAINST",
+                              doc = "Delta C++: instance table." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DELTACLASS, name = 
"DELTACLASS",
+                              doc = "Delta C++: class table." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DWARF, name = "DWARF",
+                              doc = "DWARF debugging section." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_DELTADECL, name = 
"DELTADECL",
+                              doc = "Delta C++: declarations" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_SYMBOL_LIB, name = 
"SYMBOL_LIB",
+                              doc = "List of libraries the binary depends on.  
Includes"
+                                    + "a time stamp, version number." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_EVENTS, name = "EVENTS",
+                              doc = "Events section." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_TRANSLATE, name = 
"TRANSLATE" },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_PIXIE, name = "PIXIE",
+                              doc = "Special pixie sections." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_XLATE, name = "XLATE",
+                              doc = "Addres translation table (for debug 
info)." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_XLATE_DEBUG, name = 
"XLATE_DEBUG",
+                              doc = "SGI internal address translation table 
(for debug info)." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_WHIRL, name = "WHIRL",
+                              doc = "Intermediate code." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_EH_REGION, name = 
"EH_REGION",
+                              doc = "C++ exceptino handling region info." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_XLATE_OLD, name = 
"XLATE_OLD",
+                              doc = "Obsolete address translation table (for 
debug info)." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_PDR_EXCEPTION, name = 
"PDR_EXCEPTION",
+                              doc = "Runtime procedure descriptor table 
exception information (ucode)." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_ABIFLAGS, name = "ABIFLAGS",
+                              doc = "ABI related flags section." },
+            Elf_Config_UInt { value = ELF_SHT_MIPS_XHASH, name = "XHASH",
+                              doc = "GNU style symbol hash table with xlat." 
}];
+
+/* Sections of type SHT_MIPS_LIBLIST contain an array of the following
+   structure.  The sh_link field is the section index of the string table.
+   The sh_info field is the number of entries in the section.  */
+
+type Elf32_MIPS_Lib =
+  struct
+  {
+    /* String table index for name of shared object.  */
+    uint<32> l_name;
+    uint<32> l_time_stamp;
+    /* Checksum of symbol names and common sizes.  */
+    uint<32> l_checksum;
+    /* String table index for version.  */
+    uint<32> l_version;
+    /* Flags.  */
+    uint<32> l_flags;
+  };
diff --git a/poke-elf.texi b/poke-elf.texi
index 45fb794..4e30e4a 100644
--- a/poke-elf.texi
+++ b/poke-elf.texi
@@ -61,6 +61,7 @@ Poking at ELF
 @c * ELF Sections::                  ELF sections and their contents.
 @c * ELF Segments::                  ELF segments and their contents.
 @c * ELF Symbols::                   ELF symbols and their attributes.
+#c * ELF Machines::                  ELF machine specific data structures.
 
 Poking at DWARF
 @c * DWARF Sections::                DWARF info is distributed in several ELF 
sections.
@@ -626,6 +627,22 @@ Valid bits in sh_flags fields.
 Valid bits in p_flags fields.
 @end table
 
+@noindent
+The architecture-specific enum configuration parameters used by this
+pickle are:
+
+@table @code
+@item mips-abis
+Valid values in the @code{ELF_EF_MIPS_ABI} bits of @code{e_flags} in
+MIPS machines.
+@item mips-machines
+Valid values in the @code{ELF_EF_MIPS_MACH} bits of @code{e_flags} in
+MIPS machines.
+@item mips-architectures
+Valid values in the @code{ELF_EF_MIPS_ARCH} bits of @code{eflags} in
+MIPS machines.
+@end table
+
 @section Getting printed representations of configuration parameters
 
 The @code{format_enum} and @code{format_mask} methods of
-- 
2.30.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]