Add support for reading Aarch64 core dumps.
[binutils-gdb.git] / include / aout / dynix3.h
index f2dd0ced8bf25de8ec29a6698bd49ff8edef4a95..90074e9efc9467a0f664c9dc77ea93796b88aa70 100644 (file)
-/*
- * a.out specifics for Sequent Symmetry running Dynix 3.x
- */
-#ifndef A_OUT_DYNIX3_H
-#define A_OUT_DYNIX3_H
-
-/* struct exec for Dynix 3
- *
- * a_gdtbl and a_bootstrap are only for standalone binaries.
- * Shared data fields are not supported by the kernel as of Dynix 3.1,
- * but are supported by Dynix compiler programs.
- */
-struct external_exec {
-       unsigned char e_info[4];
-       unsigned char e_text[4];
-       unsigned char e_data[4];
-       unsigned char e_bss[4];
-       unsigned char e_syms[4];
-       unsigned char e_entry[4];
-       unsigned char e_trsize[4];
-       unsigned char e_drsize[4];
-       unsigned char e_g_code[8], e_g_data[8], e_g_desc[8];
-       unsigned char e_shdata[4];
-       unsigned char e_shbss[4];
-       unsigned char e_shdrsize[4];
-       unsigned char e_bootstrap[44];
-       unsigned char e_reserved[12];
-       unsigned char e_version[4];
-};
+/* a.out specifics for Sequent Symmetry running Dynix 3.x
 
-/*
- * Register information and structs for Dynix 3,
- * culled from various system header files.
- */
+   Copyright (C) 2001-2014 Free Software Foundation, Inc.
 
-/*
- * 80387 structure, from ptrace(2) and in u area
- */
-struct  fpusave {
-        unsigned short fpu_control, fpu_rsvd1; /* control word */
-        unsigned short fpu_status, fpu_rsvd2;  /* status word */
-        unsigned short fpu_tag, fpu_rsvd3;     /* tag word */
-        unsigned long  fpu_ip;                 /* IP offset */
-        unsigned short fpu_cs, fpu_rsvd4;      /* CS selector */
-        unsigned long  fpu_data_offset;        /* data offset */
-        unsigned short fpu_op_sel, fpu_rsvd5;  /* operand selector */
-        unsigned short fpu_stack[8][5];        /* 8 80-bit temp-reals from FPU stack*/
-};
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-/*
- * WTL1167 structure, from ptrace(2) and in u area
- */
-#define FPA_NREGS 31
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-struct  fpasave {
-        long            fpa_pcr;                /* context register */
-        long            fpa_regs[FPA_NREGS];    /* register contents */
-};
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-/*
- * structure used by ptrace(2) XPT_RREGS and XPT_WREGS
- */
-struct  pt_regset {
-        int     pr_eax;
-        int     pr_ebx;
-        int     pr_ecx;
-        int     pr_edx;
-        int     pr_esi;
-        int     pr_edi;
-        int     pr_ebp;
-        int     pr_esp;
-        int     pr_eip;
-        int     pr_flags;
-        struct  fpusave pr_fpu;
-        struct  fpasave pr_fpa;
-};
+#ifndef A_OUT_DYNIX3_H
+#define A_OUT_DYNIX3_H
 
-/*
- * Register offsets in u area of core file
- */
-#define SS     (5)
-#define ESP    (4)
-#define FLAGS  (3)
-#define CS     (2)
-#define EIP    (1)
-#define EAX    (0)
-#define        ECX     (-1)
-#define EDX    (-2)
-#define EBX    (-3)
-#define EBP    (-5)
-#define ESI    (-6)
-#define EDI    (-7)
+#define external_exec dynix_external_exec
 
-/*
- * Important offsets into Dynix struct user, for use in examination of a
- * core file in a vaguely machine independant way.  For lack of
- * anything better, we use u_ar0 as a magic number, since it appears
- * to have an identical value under all versions of Dynix 3.
- */
-#define U_AR0_OFFSET           0x8
-#define U_AR0_VALUE            0x7fffffe8
-#define U_TSIZE_OFFSET         0x60
-#define U_DSIZE_OFFSET         0x64
-#define U_SSIZE_OFFSET         0x68
-#define U_FPUSAVE_OFFSET       0x3ff
-#define U_FPASAVE_OFFSET       0x3b0
+/* struct exec for Dynix 3
+   a_gdtbl and a_bootstrap are only for standalone binaries.
+   Shared data fields are not supported by the kernel as of Dynix 3.1,
+   but are supported by Dynix compiler programs.  */
+struct dynix_external_exec
+  {
+    unsigned char e_info[4];
+    unsigned char e_text[4];
+    unsigned char e_data[4];
+    unsigned char e_bss[4];
+    unsigned char e_syms[4];
+    unsigned char e_entry[4];
+    unsigned char e_trsize[4];
+    unsigned char e_drsize[4];
+    unsigned char e_g_code[8];
+    unsigned char e_g_data[8];
+    unsigned char e_g_desc[8];
+    unsigned char e_shdata[4];
+    unsigned char e_shbss[4];
+    unsigned char e_shdrsize[4];
+    unsigned char e_bootstrap[44];
+    unsigned char e_reserved[12];
+    unsigned char e_version[4];
+  };
 
-#define        EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7)
+#define        EXEC_BYTES_SIZE (128)
 
+/* All executables under Dynix are demand paged with read-only text,
+   Thus no NMAGIC.
+  
+   ZMAGIC has a page of 0s at virtual 0,
+   XMAGIC has an invalid page at virtual 0.  */
 #define OMAGIC 0x12eb          /* .o */
 #define ZMAGIC 0x22eb          /* zero @ 0, demand load */
 #define XMAGIC 0x32eb          /* invalid @ 0, demand load */
@@ -117,307 +65,23 @@ struct  pt_regset {
                     (XMAGIC != N_MAGIC(x)) && \
                     (SMAGIC != N_MAGIC(x)))
 
-#define TEXT_START_ADDR 0x1000
-
-#define PAGE_SIZE      0x1000
-#define SEGMENT_SIZE PAGE_SIZE
-
-#define STACK_END_ADDR (0x40000000 - PAGE_SIZE)
-
-#define N_SET_MACHTYPE(exec, machtype) \
-((exec).a_info = \
- ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16))
-
-#define N_SET_FLAGS(exec, flags) \
-((exec).a_info = \
- ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24))
-
-#define N_SET_MAGIC(exec, magic) \
-((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff)))
-
-#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff))
-#define N_MAGIC(x) ((x).a_info & 0xffff)
-
-#define N_MAGIC_EXTERNAL(x) ((x).a_magic)
-
 #define N_ADDRADJ(x) ((ZMAGIC == N_MAGIC(x) || XMAGIC == N_MAGIC(x)) ? 0x1000 : 0)
 
-#if 0
-/* Ignore shared segments for now... */
-#define N_TXTOFF(x) ((OMAGIC == N_MAGIC(x)) ? sizeof(struct exec) : 0)
-#define N_DATAOFF(x) (N_TXTOFF(x) + (x).a_text - N_ADDRADJ(x))
-#define N_SHDATAOFF(x) (N_DATAOFF(x) + (x).a_data)
-#define N_TROFF(x) (N_SHDATAOFF(x) + (x).a_shdata)
-#define N_DROFF(x) (N_TROFF(x) + (x).a_trsize)
-#define N_SHDROFF(x) (N_DROFF(x) + (x).a_drsize)
-#define N_SYMOFF(x) (N_SHDROFF(x) + (x).a_shdrsize)
-#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms)
-#endif
-
-#define N_TXTOFF(x) ((OMAGIC == N_MAGIC(x)) ? sizeof(x) : 0)
-#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text - N_ADDRADJ(x))
-#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data)
+#define N_TXTOFF(x) (EXEC_BYTES_SIZE)
+#define N_DATOFF(x) (N_TXTOFF(x) + N_TXTSIZE(x))
+#define N_SHDATOFF(x) (N_DATOFF(x) + (x).a_data)
+#define N_TRELOFF(x) (N_SHDATOFF(x) + (x).a_shdata)
 #define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize)
-#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize)
+#define N_SHDRELOFF(x) (N_DRELOFF(x) + (x).a_drsize)
+#define N_SYMOFF(x) (N_SHDRELOFF(x) + (x).a_shdrsize)
 #define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms)
 
 #define N_TXTADDR(x) \
        (((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? 0 \
-        : TEXT_START_ADDR)
-
-#define N_DATADDR(x) \
-       (OMAGIC == N_MAGIC(x) ? (N_TXTADDR(x) + (x).a_text) \
-        : (SEGMENT_SIZE + ((N_TXTADDR(x) + (x).a_text - 1) & \
-                           ~(SEGMENT_SIZE - 1))))
-
-#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data)
-
-/* This may not be quite right */
-#define N_TXTSIZE(x) ((x).a_text)
-/* relocation stuff */
-
-
-/* Relocations 
-
-  There        are two types of relocation flavours for a.out systems,
-  standard and extended. The standard form is used on systems where
-  the instruction has room for all the bits of an offset to the operand, whilst the
-  extended form is used when an address operand has to be split over n
-  instructions. Eg, on the 68k, each move instruction can reference
-  the target with a displacement of 16 or 32 bits. On the sparc, move
-  instructions use an offset of 14 bits, so the offset is stored in
-  the reloc field, and the data in the section is ignored.
-*/
-
-/* This structure describes a single relocation to be performed.
-   The text-relocation section of the file is a vector of these structures,
-   all of which apply to the text section.
-   Likewise, the data-relocation section applies to the data section.  */
-
-struct reloc_std_external {
-  bfd_byte     r_address[BYTES_IN_WORD];       /* offset of of data to relocate        */
-  bfd_byte r_index[3]; /* symbol table index of symbol         */
-  bfd_byte r_type[1];  /* relocation type                      */
-};
-
-#define        RELOC_STD_BITS_PCREL_BIG        0x80
-#define        RELOC_STD_BITS_PCREL_LITTLE     0x01
-
-#define        RELOC_STD_BITS_LENGTH_BIG       0x60
-#define        RELOC_STD_BITS_LENGTH_SH_BIG    5       /* To shift to units place */
-#define        RELOC_STD_BITS_LENGTH_LITTLE    0x06
-#define        RELOC_STD_BITS_LENGTH_SH_LITTLE 1
-
-#define        RELOC_STD_BITS_EXTERN_BIG       0x10
-#define        RELOC_STD_BITS_EXTERN_LITTLE    0x08
-
-#define        RELOC_STD_BITS_BASEREL_BIG      0x08
-#define        RELOC_STD_BITS_BASEREL_LITTLE   0x08
-
-#define        RELOC_STD_BITS_JMPTABLE_BIG     0x04
-#define        RELOC_STD_BITS_JMPTABLE_LITTLE  0x04
-
-#define        RELOC_STD_BITS_RELATIVE_BIG     0x02
-#define        RELOC_STD_BITS_RELATIVE_LITTLE  0x02
-
-#define        RELOC_STD_SIZE  (BYTES_IN_WORD + 3 + 1)         /* Bytes per relocation entry */
-
-struct reloc_std_internal
-{
-  bfd_vma r_address;           /* Address (within segment) to be relocated.  */
-  /* The meaning of r_symbolnum depends on r_extern.  */
-  unsigned int r_symbolnum:24;
-  /* Nonzero means value is a pc-relative offset
-     and it should be relocated for changes in its own address
-     as well as for changes in the symbol or section specified.  */
-  unsigned int r_pcrel:1;
-  /* Length (as exponent of 2) of the field to be relocated.
-     Thus, a value of 2 indicates 1<<2 bytes.  */
-  unsigned int r_length:2;
-  /* 1 => relocate with value of symbol.
-     r_symbolnum is the index of the symbol
-     in files the symbol table.
-     0 => relocate with the address of a segment.
-     r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS
-     (the N_EXT bit may be set also, but signifies nothing).  */
-  unsigned int r_extern:1;
-  /* The next three bits are for SunOS shared libraries, and seem to
-     be undocumented.  */
-  unsigned int r_baserel:1;    /* Linkage table relative */
-  unsigned int r_jmptable:1;   /* pc-relative to jump table */
-  unsigned int r_relative:1;   /* "relative relocation" */
-  /* unused */
-  unsigned int r_pad:1;                /* Padding -- set to zero */
-};
-
-
-/* EXTENDED RELOCS  */
-
-struct reloc_ext_external {
-  bfd_byte r_address[BYTES_IN_WORD];   /* offset of of data to relocate        */
-  bfd_byte r_index[3]; /* symbol table index of symbol         */
-  bfd_byte r_type[1];  /* relocation type                      */
-  bfd_byte r_addend[BYTES_IN_WORD];    /* datum addend                         */
-};
-
-#define        RELOC_EXT_BITS_EXTERN_BIG       0x80
-#define        RELOC_EXT_BITS_EXTERN_LITTLE    0x01
-
-#define        RELOC_EXT_BITS_TYPE_BIG         0x1F
-#define        RELOC_EXT_BITS_TYPE_SH_BIG      0
-#define        RELOC_EXT_BITS_TYPE_LITTLE      0xF8
-#define        RELOC_EXT_BITS_TYPE_SH_LITTLE   3
-
-#define        RELOC_EXT_SIZE  (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) /* Bytes per relocation entry */
-
-enum reloc_type
-{
-
-
-
-
-
-  /* simple relocations */
-  RELOC_8,                     /* data[0:7] = addend + sv              */
-  RELOC_16,                    /* data[0:15] = addend + sv             */
-  RELOC_32,                    /* data[0:31] = addend + sv             */
-  /* pc-rel displacement */
-  RELOC_DISP8,                 /* data[0:7] = addend - pc + sv         */
-  RELOC_DISP16,                        /* data[0:15] = addend - pc + sv        */
-  RELOC_DISP32,                        /* data[0:31] = addend - pc + sv        */
-  /* Special */
-  RELOC_WDISP30,               /* data[0:29] = (addend + sv - pc)>>2   */
-  RELOC_WDISP22,               /* data[0:21] = (addend + sv - pc)>>2   */
-  RELOC_HI22,                  /* data[0:21] = (addend + sv)>>10       */
-  RELOC_22,                    /* data[0:21] = (addend + sv)           */
-  RELOC_13,                    /* data[0:12] = (addend + sv)           */
-  RELOC_LO10,                  /* data[0:9] = (addend + sv)            */
-  RELOC_SFA_BASE,              
-  RELOC_SFA_OFF13,
-  /* P.I.C. (base-relative) */
-  RELOC_BASE10,                /* Not sure - maybe we can do this the */
-  RELOC_BASE13,                        /* right way now */
-  RELOC_BASE22,
-  /* for some sort of pc-rel P.I.C. (?) */
-  RELOC_PC10,
-  RELOC_PC22,
-  /* P.I.C. jump table */
-  RELOC_JMP_TBL,
-  /* reputedly for shared libraries somehow */
-  RELOC_SEGOFF16,
-  RELOC_GLOB_DAT,
-  RELOC_JMP_SLOT,
-  RELOC_RELATIVE,
-
-  RELOC_11,    
-  RELOC_WDISP2_14,
-  RELOC_WDISP19,
-  RELOC_HHI22,                 /* data[0:21] = (addend + sv) >> 42     */
-  RELOC_HLO10,                 /* data[0:9] = (addend + sv) >> 32      */
-  
-  /* 29K relocation types */
-  RELOC_JUMPTARG,
-  RELOC_CONST,
-  RELOC_CONSTH,
-  
-
-  /* Q .
-     What are the other ones,
-     Since this is a clean slate, can we throw away the ones we dont
-     understand ? Should we sort the values ? What about using a
-     microcode format like the 68k ?
-     */
-  NO_RELOC
-  };
-
-
-struct reloc_internal {
-  bfd_vma r_address;           /* offset of of data to relocate        */
-  long r_index;                /* symbol table index of symbol         */
-  enum reloc_type r_type;      /* relocation type                      */
-  bfd_vma r_addend;            /* datum addend                         */
-};
-
-/* Q.
-   Should the length of the string table be 4 bytes or 8 bytes ?
-
-   Q.
-   What about archive indexes ?
-
- */
-
-#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD)
+        : TEXT_START_ADDR + EXEC_BYTES_SIZE)
 
-/*
- * All executables under Dynix are demand paged with read-only text,
- * Thus no NMAGIC.
- *
- * ZMAGIC has a page of 0s at virtual 0,
- * XMAGIC has an invalid page at virtual 0
- */
+#define N_TXTSIZE(x) \
+       (((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? ((x).a_text) \
+        : ((x).a_text - N_ADDRADJ(x) - EXEC_BYTES_SIZE))
 
-#define WRITE_HEADERS(abfd, execp)                                           \
-      {                                                                              \
-       if (abfd->flags & D_PAGED)                                            \
-           {                                                                 \
-             execp->a_text = obj_textsec (abfd)->_raw_size;                  \
-             /* Kludge to distinguish old- and new-style ZMAGIC.             \
-                The latter includes the exec header in the text size. */     \
-             if (obj_textsec(abfd)->filepos == EXEC_BYTES_SIZE)              \
-               execp->a_text += EXEC_BYTES_SIZE;                             \
-             N_SET_MAGIC (*execp, ZMAGIC);                                   \
-           }                                                                 \
-       else                                                                  \
-           {                                                                 \
-             execp->a_text = obj_textsec (abfd)->_raw_size;                  \
-             if (abfd->flags & WP_TEXT)                                      \
-               { N_SET_MAGIC (*execp, ZMAGIC); }                             \
-             else                                                            \
-               { N_SET_MAGIC(*execp, OMAGIC); }                              \
-           }                                                                 \
-       if (abfd->flags & D_PAGED)                                            \
-           {                                                                 \
-             data_pad = BFD_ALIGN(obj_datasec(abfd)->_raw_size, PAGE_SIZE)   \
-                 - obj_datasec(abfd)->_raw_size;                             \
-                                                                             \
-             if (data_pad > obj_bsssec(abfd)->_raw_size)                     \
-               execp->a_bss = 0;                                             \
-             else                                                            \
-               execp->a_bss = obj_bsssec(abfd)->_raw_size - data_pad;        \
-             execp->a_data = obj_datasec(abfd)->_raw_size + data_pad;        \
-           }                                                                 \
-       else                                                                  \
-           {                                                                 \
-             execp->a_data = obj_datasec (abfd)->_raw_size;                  \
-             execp->a_bss = obj_bsssec (abfd)->_raw_size;                    \
-           }                                                                 \
-                                                                             \
-       execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE;        \
-       execp->a_entry = bfd_get_start_address (abfd);                        \
-                                                                             \
-       execp->a_trsize = ((obj_textsec (abfd)->reloc_count) *                \
-                          obj_reloc_entry_size (abfd));                      \
-       execp->a_drsize = ((obj_datasec (abfd)->reloc_count) *                \
-                          obj_reloc_entry_size (abfd));                      \
-       NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes);           \
-                                                                             \
-       bfd_seek (abfd, 0L, false);                                           \
-       bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd);              \
-       /* Now write out reloc info, followed by syms and strings */          \
-                                                                             \
-       if (bfd_get_symcount (abfd) != 0)                                     \
-           {                                                                 \
-             bfd_seek (abfd,                                                 \
-                       (long)(N_SYMOFF(*execp)), false);                     \
-                                                                             \
-             NAME(aout,write_syms)(abfd);                                    \
-                                                                             \
-             bfd_seek (abfd,   (long)(N_TRELOFF(*execp)), false);            \
-                                                                             \
-             if (!NAME(aout,squirt_out_relocs) (abfd, obj_textsec (abfd))) return false; \
-             bfd_seek (abfd, (long)(N_DRELOFF(*execp)), false);              \
-                                                                             \
-             if (!NAME(aout,squirt_out_relocs)(abfd, obj_datasec (abfd))) return false; \
-           }                                                                 \
-      }                                                                              
-#endif
+#endif /* A_OUT_DYNIX3_H */