linux/arch/powerpc/boot/rs6000.h
<<
>>
Prefs
   1/* IBM RS/6000 "XCOFF" file definitions for BFD.
   2   Copyright (C) 1990, 1991 Free Software Foundation, Inc.
   3   FIXME: Can someone provide a transliteration of this name into ASCII?
   4   Using the following chars caused a compiler warning on HIUX (so I replaced
   5   them with octal escapes), and isn't useful without an understanding of what
   6   character set it is.
   7   Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM
   8   and John Gilmore of Cygnus Support.  */
   9
  10/********************** FILE HEADER **********************/
  11
  12struct external_filehdr {
  13        char f_magic[2];        /* magic number                 */
  14        char f_nscns[2];        /* number of sections           */
  15        char f_timdat[4];       /* time & date stamp            */
  16        char f_symptr[4];       /* file pointer to symtab       */
  17        char f_nsyms[4];        /* number of symtab entries     */
  18        char f_opthdr[2];       /* sizeof(optional hdr)         */
  19        char f_flags[2];        /* flags                        */
  20};
  21
  22        /* IBM RS/6000 */
  23#define U802WRMAGIC     0730    /* writeable text segments **chh**      */
  24#define U802ROMAGIC     0735    /* readonly sharable text segments      */
  25#define U802TOCMAGIC    0737    /* readonly text segments and TOC       */
  26
  27#define BADMAG(x)       \
  28        ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
  29         (x).f_magic != U802TOCMAGIC)
  30
  31#define FILHDR  struct external_filehdr
  32#define FILHSZ  20
  33
  34
  35/********************** AOUT "OPTIONAL HEADER" **********************/
  36
  37
  38typedef struct
  39{
  40  unsigned char magic[2];       /* type of file                 */
  41  unsigned char vstamp[2];      /* version stamp                */
  42  unsigned char tsize[4];       /* text size in bytes, padded to FW bdry */
  43  unsigned char dsize[4];       /* initialized data "  "        */
  44  unsigned char bsize[4];       /* uninitialized data "   "     */
  45  unsigned char entry[4];       /* entry pt.                    */
  46  unsigned char text_start[4];  /* base of text used for this file */
  47  unsigned char data_start[4];  /* base of data used for this file */
  48  unsigned char o_toc[4];       /* address of TOC */
  49  unsigned char o_snentry[2];   /* section number of entry point */
  50  unsigned char o_sntext[2];    /* section number of .text section */
  51  unsigned char o_sndata[2];    /* section number of .data section */
  52  unsigned char o_sntoc[2];     /* section number of TOC */
  53  unsigned char o_snloader[2];  /* section number of .loader section */
  54  unsigned char o_snbss[2];     /* section number of .bss section */
  55  unsigned char o_algntext[2];  /* .text alignment */
  56  unsigned char o_algndata[2];  /* .data alignment */
  57  unsigned char o_modtype[2];   /* module type (??) */
  58  unsigned char o_cputype[2];   /* cpu type */
  59  unsigned char o_maxstack[4];  /* max stack size (??) */
  60  unsigned char o_maxdata[4];   /* max data size (??) */
  61  unsigned char o_resv2[12];    /* reserved */
  62}
  63AOUTHDR;
  64
  65#define AOUTSZ 72
  66#define SMALL_AOUTSZ (28)
  67#define AOUTHDRSZ 72
  68
  69#define RS6K_AOUTHDR_OMAGIC     0x0107  /* old: text & data writeable */
  70#define RS6K_AOUTHDR_NMAGIC     0x0108  /* new: text r/o, data r/w */
  71#define RS6K_AOUTHDR_ZMAGIC     0x010B  /* paged: text r/o, both page-aligned */
  72
  73
  74/********************** SECTION HEADER **********************/
  75
  76
  77struct external_scnhdr {
  78        char            s_name[8];      /* section name                 */
  79        char            s_paddr[4];     /* physical address, aliased s_nlib */
  80        char            s_vaddr[4];     /* virtual address              */
  81        char            s_size[4];      /* section size                 */
  82        char            s_scnptr[4];    /* file ptr to raw data for section */
  83        char            s_relptr[4];    /* file ptr to relocation       */
  84        char            s_lnnoptr[4];   /* file ptr to line numbers     */
  85        char            s_nreloc[2];    /* number of relocation entries */
  86        char            s_nlnno[2];     /* number of line number entries*/
  87        char            s_flags[4];     /* flags                        */
  88};
  89
  90/*
  91 * names of "special" sections
  92 */
  93#define _TEXT   ".text"
  94#define _DATA   ".data"
  95#define _BSS    ".bss"
  96#define _PAD    ".pad"
  97#define _LOADER ".loader"
  98
  99#define SCNHDR  struct external_scnhdr
 100#define SCNHSZ  40
 101
 102/* XCOFF uses a special .loader section with type STYP_LOADER.  */
 103#define STYP_LOADER 0x1000
 104
 105/* XCOFF uses a special .debug section with type STYP_DEBUG.  */
 106#define STYP_DEBUG 0x2000
 107
 108/* XCOFF handles line number or relocation overflow by creating
 109   another section header with STYP_OVRFLO set.  */
 110#define STYP_OVRFLO 0x8000
 111
 112/********************** LINE NUMBERS **********************/
 113
 114/* 1 line number entry for every "breakpointable" source line in a section.
 115 * Line numbers are grouped on a per function basis; first entry in a function
 116 * grouping will have l_lnno = 0 and in place of physical address will be the
 117 * symbol table index of the function name.
 118 */
 119struct external_lineno {
 120        union {
 121                char l_symndx[4];       /* function name symbol index, iff l_lnno == 0*/
 122                char l_paddr[4];        /* (physical) address of line number    */
 123        } l_addr;
 124        char l_lnno[2]; /* line number          */
 125};
 126
 127
 128#define LINENO  struct external_lineno
 129#define LINESZ  6
 130
 131
 132/********************** SYMBOLS **********************/
 133
 134#define E_SYMNMLEN      8       /* # characters in a symbol name        */
 135#define E_FILNMLEN      14      /* # characters in a file name          */
 136#define E_DIMNUM        4       /* # array dimensions in auxiliary entry */
 137
 138struct external_syment
 139{
 140  union {
 141    char e_name[E_SYMNMLEN];
 142    struct {
 143      char e_zeroes[4];
 144      char e_offset[4];
 145    } e;
 146  } e;
 147  char e_value[4];
 148  char e_scnum[2];
 149  char e_type[2];
 150  char e_sclass[1];
 151  char e_numaux[1];
 152};
 153
 154
 155
 156#define N_BTMASK        (017)
 157#define N_TMASK         (060)
 158#define N_BTSHFT        (4)
 159#define N_TSHIFT        (2)
 160
 161
 162union external_auxent {
 163        struct {
 164                char x_tagndx[4];       /* str, un, or enum tag indx */
 165                union {
 166                        struct {
 167                            char  x_lnno[2]; /* declaration line number */
 168                            char  x_size[2]; /* str/union/array size */
 169                        } x_lnsz;
 170                        char x_fsize[4];        /* size of function */
 171                } x_misc;
 172                union {
 173                        struct {                /* if ISFCN, tag, or .bb */
 174                            char x_lnnoptr[4];  /* ptr to fcn line # */
 175                            char x_endndx[4];   /* entry ndx past block end */
 176                        } x_fcn;
 177                        struct {                /* if ISARY, up to 4 dimen. */
 178                            char x_dimen[E_DIMNUM][2];
 179                        } x_ary;
 180                } x_fcnary;
 181                char x_tvndx[2];                /* tv index */
 182        } x_sym;
 183
 184        union {
 185                char x_fname[E_FILNMLEN];
 186                struct {
 187                        char x_zeroes[4];
 188                        char x_offset[4];
 189                } x_n;
 190        } x_file;
 191
 192        struct {
 193                char x_scnlen[4];                       /* section length */
 194                char x_nreloc[2];       /* # relocation entries */
 195                char x_nlinno[2];       /* # line numbers */
 196        } x_scn;
 197
 198        struct {
 199                char x_tvfill[4];       /* tv fill value */
 200                char x_tvlen[2];        /* length of .tv */
 201                char x_tvran[2][2];     /* tv range */
 202        } x_tv;         /* info about .tv section (in auxent of symbol .tv)) */
 203
 204        struct {
 205                unsigned char x_scnlen[4];
 206                unsigned char x_parmhash[4];
 207                unsigned char x_snhash[2];
 208                unsigned char x_smtyp[1];
 209                unsigned char x_smclas[1];
 210                unsigned char x_stab[4];
 211                unsigned char x_snstab[2];
 212        } x_csect;
 213
 214};
 215
 216#define SYMENT  struct external_syment
 217#define SYMESZ  18
 218#define AUXENT  union external_auxent
 219#define AUXESZ  18
 220#define DBXMASK 0x80            /* for dbx storage mask */
 221#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
 222
 223
 224
 225/********************** RELOCATION DIRECTIVES **********************/
 226
 227
 228struct external_reloc {
 229  char r_vaddr[4];
 230  char r_symndx[4];
 231  char r_size[1];
 232  char r_type[1];
 233};
 234
 235
 236#define RELOC struct external_reloc
 237#define RELSZ 10
 238
 239#define DEFAULT_DATA_SECTION_ALIGNMENT 4
 240#define DEFAULT_BSS_SECTION_ALIGNMENT 4
 241#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
 242/* For new sections we havn't heard of before */
 243#define DEFAULT_SECTION_ALIGNMENT 4
 244