Annotation of coherent/b/bin/c/h/reloc.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Relocatable object (from translator)
        !             3:  *     header
        !             4:  *     summary segment; contains sizes of loadable segments
        !             5:  *     loadable segments (possibly fragmented)
        !             6:  *     relocation fragment follows each relocatable fragment
        !             7:  *     symbol segment (seek address is seg_off[SYMBOLS] in summary)
        !             8:  *             (see below)
        !             9:  */
        !            10: 
        !            11: #ifndef        RELOC_H
        !            12: #define        RELOC_H RELOC_H
        !            13: 
        !            14: #include <types.h>
        !            15: typedef unsigned long uaddr_t;
        !            16: #define canuaddr(x)    canlong(x)
        !            17: 
        !            18: /*
        !            19:  * Object header
        !            20:  */
        !            21: #define        REL_OBJ "(Reloc)"
        !            22: 
        !            23: typedef        struct  objhdr_t        {       /* object module header */
        !            24:        char            obj_type[8],    /* REL_OBJ, BND_OBJ etc. */
        !            25:                        obj_hware[8],   /* target hardware */
        !            26:                        obj_sware[8],   /* program that produced object */
        !            27:                        obj_vers[8];    /* version of above */
        !            28: } objhdr_t;
        !            29: 
        !            30: /*
        !            31:  * Segment types
        !            32:  */
        !            33: 
        !            34: /* vertically encoded */
        !            35: #define        Xb      0x01    /* execute */
        !            36: #define        Wb      0x02    /* write */
        !            37: #define        Sb      0x04    /* shared */
        !            38: #define        Bb      0x08    /* block */
        !            39: #define        Cb      0x10    /* common */
        !            40: #define        Db      Bb      /* expand downwards (output only) */
        !            41: #define        Lb      Cb      /* loadable (output only) */
        !            42: 
        !            43: /* ordinary segments */
        !            44: #define        PURCODE (Xb)
        !            45: #define        PURDATA (0)
        !            46: #define        SHRCODE (Sb|Wb|Xb)      /* shared => writeable */
        !            47: #define        SHRDATA (Sb|Wb)
        !            48: #define        OWNCODE (Wb|Xb)
        !            49: #define        OWNDATA (Wb)
        !            50: #define        PLCODE  (Bb|Sb|Wb|Xb)   /* pooled => shared block */
        !            51: #define        PLDATA  (Bb|Sb|Wb)
        !            52: #define        BLCODE  (Bb|Wb|Xb)
        !            53: #define        BLDATA  (Bb|Wb)
        !            54: 
        !            55: /* meanings of otherwise meaningless bit combinations */
        !            56: /* these take clever advantage of the order of the bits */
        !            57: #define        STRINGS (Sb)
        !            58: #define        DEBUG   (Sb|Xb)
        !            59: #define        SYMBOLS (Bb)
        !            60: #define        TYPESYM (Bb|Xb)
        !            61: #define        ABSLUTE (Bb|Sb)
        !            62: #define        RELOCN  (Bb|Sb|Xb)
        !            63: #define        SUMMARY (Cb)
        !            64: #define        LASTSEG (0xFF)
        !            65: 
        !            66: typedef        struct  summseg_t       {       /* summary segment */
        !            67:        unsigned char   seg_type;       /* SUMMARY */
        !            68:        fsize_t         seg_size;       /* sizeof (seg_off) */
        !            69:        fsize_t         seg_off[SUMMARY];
        !            70: } summseg_t;
        !            71: 
        !            72: typedef        struct  segment_t       {       /* general segment fragment */
        !            73:        unsigned char   seg_type;
        !            74:        fsize_t         seg_size;
        !            75:        unsigned char   seg_data[];
        !            76: } segment_t;
        !            77: 
        !            78: /*
        !            79:  * A relocation fragment contains relocation items.
        !            80:  * Relocation type specifies the byte layout of the relocated word.
        !            81:  * The name defined for each layout is intended to suggest the number
        !            82:  * of bytes in the word, and their significance in increasing order
        !            83:  * when read in address order.
        !            84:  */
        !            85: #define        B_0     0
        !            86: #define        B_01    ((0<<2)|1)
        !            87: #define        B_10    ((1<<2)|0)
        !            88: #define        B_012   ((0<<4)|(1<<2)|2)
        !            89: #define        B_210   ((2<<4)|(1<<2)|0)
        !            90: #define        B_0123  ((0<<6)|(1<<4)|(2<<2)|3)
        !            91: #define        B_3210  ((3<<6)|(2<<4)|(1<<2)|0)
        !            92: #define        B_2301  ((2<<6)|(3<<4)|(0<<2)|1)
        !            93: #define        B_1032  ((1<<6)|(0<<4)|(3<<2)|2)
        !            94: 
        !            95: /* relocation flags (in rel_seg) */
        !            96: #define        PCREL   0x40
        !            97: #define        RELFLAGS (SIGNEDt|PCREL)
        !            98: 
        !            99: typedef        struct  reloctn_t       {       /* relocation item */
        !           100:        unsigned char   rel_type,       /* byte layout of relocated word */
        !           101:                        rel_seg;        /* segment referenced by relocator */
        !           102:        uaddr_t         rel_addr;       /* address of relocation */
        !           103: /*     uaddr_t         rel_num;           symbol num if rel_seg is SYMBOLS */
        !           104:                                        /* bias if rel_seg is ABSLUTE */
        !           105: } reloctn_t;
        !           106: 
        !           107: /*
        !           108:  * Symbol segment contains a symbol count, followed by that many symbols,
        !           109:  * numbered from 0, not necessarily in order.
        !           110:  */
        !           111: 
        !           112: typedef        union   symbol_t        {       /* object symbol */
        !           113:        struct  {                       /* relocatable */
        !           114:        unsigned char   sym_scope;      /* module, segment, load or ref */
        !           115:        uaddr_t         sym_num;        /* symbol number */
        !           116:        char            sym_name[];     /* NUL terminated */
        !           117:        unsigned char   sym_expr[];     /* absent if reference */
        !           118:        char            sym_type[];     /* always present */
        !           119:        };
        !           120:        struct  {                       /* bound or debug symbol */
        !           121:        unsigned char   sym_seg;        /* seg type */
        !           122:        uaddr_t         sym_addr;       /* value */
        !           123:        char            sym_name[];     /* NUL terminated */
        !           124:        char            sym_type[];     /* always present */
        !           125:        };
        !           126: } symbol_t;
        !           127: 
        !           128: typedef        struct  symseg_t        {       /* symbol segment */
        !           129:        unsigned char   seg_type;
        !           130:        fsize_t         seg_size;
        !           131:        uaddr_t         seg_nsym;
        !           132:        symbol_t        seg_sym[];
        !           133: } symseg_t;
        !           134: 
        !           135: /* Symbol scope */
        !           136: #define        RFSCOPE 0       /* reference (undefined) */
        !           137: #define        LDSCOPE 1       /* whole load */
        !           138: #define        SGSCOPE 2       /* single segment */
        !           139: #define        MDSCOPE 3       /* single module */
        !           140: 
        !           141: /*
        !           142:  * Symbol names are arbitrary length NUL ('\0') terminated character strings.
        !           143:  */
        !           144: /*
        !           145:  * Symbol expression is a prefix polish representation of a binary tree
        !           146:  * i.e. (opr) (left expr) (right expr).
        !           147:  * No expression exists for undefined symbols (scope == RFSCOPE).
        !           148:  */
        !           149: 
        !           150: typedef        struct  symleaf_t       {       /* expression tree leaf */
        !           151:        unsigned char   seg_type;
        !           152:        uaddr_t         sym_addr;       /* relocatable address */
        !           153: } symleaf_t;
        !           154: /* If seg_type is SYMBOLS sym_addr is symbol number */
        !           155: 
        !           156: /* Operators */
        !           157: #define        X_OP    0x80                    /* distinguish opr from seg */
        !           158: #define        X_ADD   (X_OP+1)
        !           159: #define        X_SUB   (X_OP+2)
        !           160: #define        X_MUL   (X_OP+3)
        !           161: #define        X_DIV   (X_OP+4)
        !           162: #define        X_MOD   (X_OP+5)
        !           163: #define        X_SHL   (X_OP+6)
        !           164: #define        X_SRL   (X_OP+7)                /* shift right logical */
        !           165: #define        X_SRA   (X_OP+8)                /* shift right arithmetic */
        !           166: #define        X_MSK   (X_OP+9)                /* a msk b  <=>  a&~b */
        !           167: #define        X_AND   (X_OP+10)
        !           168: #define        X_XOR   (X_OP+11)
        !           169: #define        X_IOR   (X_OP+12)
        !           170: 
        !           171: typedef        unsigned char   symopr_t;
        !           172: 
        !           173: /*
        !           174:  * Symbol type is tree represented as a NUL terminated string of leaves
        !           175:  * where a leaf is a character string, an n-byte signed or unsigned number,
        !           176:  * a type string, a type symbol, or special leaf ANYt.
        !           177:  * A character string is introduced by STRINGt, and is NUL terminated.
        !           178:  * A number consists of a byte count (or'd with SIGNEDt if signed),
        !           179:  * followed by that many bytes of data in order of increasing significance,
        !           180:  * with the sign (if any) at the top bit of the last byte.
        !           181:  * A type string is introduced by TYPEt, and is recursively defined as above.
        !           182:  * A type symbol is SYMBOLt followed by a symbol number (canonical uaddr_t)
        !           183:  * referring to the symbol segment in which the type was found.
        !           184:  */
        !           185: #define        ANYt    (-2)
        !           186: #define        STRINGt (-3)
        !           187: #define        TYPEt   (-4)
        !           188: #define        SYMBOLt (-5)
        !           189: #define        SIGNEDt (-1<<7)
        !           190: 
        !           191: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.