home *** CD-ROM | disk | FTP | other *** search
- /* reloc.h - assemble for HP-PA */
- /* Defines machine specific relocation entries */
-
- #ifndef HPPA_RELOC_INCLUDED
- #define HPPA_RELOC_INCLUDED
-
- /*
- * Relocation types used in the hppa implementation. Relocation entries for
- * things other than instructions use the same generic relocation as discribed
- * in <mach-o/reloc.h> and their r_type is HPPA_RELOC_VANILLA. The rest of the
- * relocation types are for instructions. Since they are for instructions the
- * r_address field indicates the 32 bit instruction that the relocation is to
- * be preformed on. The field r_pcrel is set only for the HPPA_RELOC_BR17.
- * And r_length is set to long for all non-RELOC_VANILLA r_types.
- */
- enum reloc_type_hppa
- {
- HPPA_RELOC_VANILLA, /* generic relocation as discribed in <mach-o/reloc.h>*/
- HPPA_RELOC_PAIR, /* the second relocation entry of a pair */
- HPPA_RELOC_HI21, /* a PAIR follows with the low part */
- HPPA_RELOC_LO14, /* a PAIR follows with the high part */
- HPPA_RELOC_BR17, /* 17 bit branch displacement (to a word address)
- a PAIR follows with the high part */
- HPPA_RELOC_BL17, /* a bl instruction (overlow causes an error) */
- HPPA_RELOC_JBSR, /* a bl instruction that is targeted at a long branch
- stub, a PAIR follows with the high part */
- HPPA_RELOC_SECTDIFF, /* a PAIR follows with subtract symbol value */
- HPPA_RELOC_HI21_SECTDIFF, /* a PAIR follows with subtract symbol value */
- HPPA_RELOC_LO14_SECTDIFF /* a PAIR follows with subtract symbol value */
- };
-
- /*
- * For the HI and LO relocation types the two parts of the relocated expression
- * (symbol + offset) are calculated as follows:
- *
- * rounded = round(offset, 0x2000);
- * left21 = (symbol + rounded) & 0xfffff800;
- * right14 = ((symbol + rounded) & 0x000007ff) + (offset - rounded);
- *
- * This allows the left part to be shared between references with different
- * offsets as long as the rounded offsets are the same.
- *
- * The HPPA_RELOC_BR17 r_type also uses the above calculation and the right14
- * bits, sign extened to fill the displacement, and converted to a word
- * displacement by droping the low bits (after checking they are zero).
- */
-
- /*
- * For relocation types that use pairs the part of the relocated expression that
- * is not stored in the instruction is stored in the r_address feild of the
- * PAIR's entry.
- *
- * All low parts are stored as sign extened byte addressed values in the PAIR's
- * r_address field as 32 bit values. This allows the HI21 not to have to know
- * which type of low it is used with.
- *
- * The high parts are left justified 21 bit values zero filled to 32 bits and
- * stored in the PAIR's r_address field.
- */
-
- /*
- * The instructions that use the non-RELOC_VANILLA r_types are and the r_types
- * they use are as follows:
- * instructions r_type
- *
- * LDIL,ADDIL HPPA_RELOC_HI21
- * LDx, STx, LDO HPPA_RELOC_LO14
- * BE, BLE HPPA_RELOC_BR17
- * BL HPPA_RELOC_BL17
- *
- * For the HPPA_RELOC_JBSR the BL instruction must be targeted at a long branch
- * stub that can be reached with 17 bits of signed word displacement. Also the
- * stub must be in the same block as the BL instruction so that scattered
- * loading done by the link editor will not move them apart. For example in
- * assembly code:
- * jbsr foo,%r2,L1 ; creates a bl inst with a HPPA_RELOC_JBSR
- * ; relocation entry for the symbol foo and the
- * ; instruction is targeted to L1
- * ...
- * L1: ldil L'foo,%r1 ; a HPPA_RELOC_HI21 entry for symbol foo
- * ble,n R'foo(%sr4,%r1) ; a HPPA_RELOC_BR17 entry for symbol foo
- */
-
- #endif /* HPPA_RELOC_INCLUDED */
-