|
|
1.1 ! root 1: /* reloc.h - assemble for HP-PA */ ! 2: /* Defines machine specific relocation entries */ ! 3: ! 4: #ifndef HPPA_RELOC_INCLUDED ! 5: #define HPPA_RELOC_INCLUDED ! 6: ! 7: /* ! 8: * Relocation types used in the hppa implementation. Relocation entries for ! 9: * things other than instructions use the same generic relocation as discribed ! 10: * in <mach-o/reloc.h> and their r_type is HPPA_RELOC_VANILLA. The rest of the ! 11: * relocation types are for instructions. Since they are for instructions the ! 12: * r_address field indicates the 32 bit instruction that the relocation is to ! 13: * be preformed on. The field r_pcrel is set only for the HPPA_RELOC_BR17. ! 14: * And r_length is set to long for all non-RELOC_VANILLA r_types. ! 15: */ ! 16: enum reloc_type_hppa ! 17: { ! 18: HPPA_RELOC_VANILLA, /* generic relocation as discribed in <mach-o/reloc.h>*/ ! 19: HPPA_RELOC_PAIR, /* the second relocation entry of a pair */ ! 20: HPPA_RELOC_HI21, /* a PAIR follows with the low part */ ! 21: HPPA_RELOC_LO14, /* a PAIR follows with the high part */ ! 22: HPPA_RELOC_BR17, /* 17 bit branch displacement (to a word address) ! 23: a PAIR follows with the high part */ ! 24: HPPA_RELOC_BL17, /* a bl instruction (overlow causes an error) */ ! 25: HPPA_RELOC_JBSR, /* a bl instruction that is targeted at a long branch ! 26: stub, a PAIR follows with the high part */ ! 27: HPPA_RELOC_SECTDIFF, /* a PAIR follows with subtract symbol value */ ! 28: HPPA_RELOC_HI21_SECTDIFF, /* a PAIR follows with subtract symbol value */ ! 29: HPPA_RELOC_LO14_SECTDIFF /* a PAIR follows with subtract symbol value */ ! 30: }; ! 31: ! 32: /* ! 33: * For the HI and LO relocation types the two parts of the relocated expression ! 34: * (symbol + offset) are calculated as follows: ! 35: * ! 36: * rounded = round(offset, 0x2000); ! 37: * left21 = (symbol + rounded) & 0xfffff800; ! 38: * right14 = ((symbol + rounded) & 0x000007ff) + (offset - rounded); ! 39: * ! 40: * This allows the left part to be shared between references with different ! 41: * offsets as long as the rounded offsets are the same. ! 42: * ! 43: * The HPPA_RELOC_BR17 r_type also uses the above calculation and the right14 ! 44: * bits, sign extened to fill the displacement, and converted to a word ! 45: * displacement by droping the low bits (after checking they are zero). ! 46: */ ! 47: ! 48: /* ! 49: * For relocation types that use pairs the part of the relocated expression that ! 50: * is not stored in the instruction is stored in the r_address feild of the ! 51: * PAIR's entry. ! 52: * ! 53: * All low parts are stored as sign extened byte addressed values in the PAIR's ! 54: * r_address field as 32 bit values. This allows the HI21 not to have to know ! 55: * which type of low it is used with. ! 56: * ! 57: * The high parts are left justified 21 bit values zero filled to 32 bits and ! 58: * stored in the PAIR's r_address field. ! 59: */ ! 60: ! 61: /* ! 62: * The instructions that use the non-RELOC_VANILLA r_types are and the r_types ! 63: * they use are as follows: ! 64: * instructions r_type ! 65: * ! 66: * LDIL,ADDIL HPPA_RELOC_HI21 ! 67: * LDx, STx, LDO HPPA_RELOC_LO14 ! 68: * BE, BLE HPPA_RELOC_BR17 ! 69: * BL HPPA_RELOC_BL17 ! 70: * ! 71: * For the HPPA_RELOC_JBSR the BL instruction must be targeted at a long branch ! 72: * stub that can be reached with 17 bits of signed word displacement. Also the ! 73: * stub must be in the same block as the BL instruction so that scattered ! 74: * loading done by the link editor will not move them apart. For example in ! 75: * assembly code: ! 76: * jbsr foo,%r2,L1 ; creates a bl inst with a HPPA_RELOC_JBSR ! 77: * ; relocation entry for the symbol foo and the ! 78: * ; instruction is targeted to L1 ! 79: * ... ! 80: * L1: ldil L'foo,%r1 ; a HPPA_RELOC_HI21 entry for symbol foo ! 81: * ble,n R'foo(%sr4,%r1) ; a HPPA_RELOC_BR17 entry for symbol foo ! 82: */ ! 83: ! 84: #endif /* HPPA_RELOC_INCLUDED */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.