39 #include "loader/elf32.h"
40 #include "loader/cle.h"
43 #include "lib/assert.h"
46 #define PRINTF(...) do {} while (0)
48 #define PRINTF(...) printf(__VA_ARGS__)
53 #define R_AVR_7_PCREL 2
54 #define R_AVR_13_PCREL 3
57 #define R_AVR_LO8_LDI 6
58 #define R_AVR_HI8_LDI 7
59 #define R_AVR_HH8_LDI 8
60 #define R_AVR_LO8_LDI_NEG 9
61 #define R_AVR_HI8_LDI_NEG 10
62 #define R_AVR_HH8_LDI_NEG 11
63 #define R_AVR_LO8_LDI_PM 12
64 #define R_AVR_HI8_LDI_PM 13
65 #define R_AVR_HH8_LDI_PM 14
66 #define R_AVR_LO8_LDI_PM_NEG 15
67 #define R_AVR_HI8_LDI_PM_NEG 16
68 #define R_AVR_HH8_LDI_PM_NEG 17
76 cle_write_reloc(
void *pos_,
77 const struct elf32_rela *rela,
79 const struct cle_info *info)
81 unsigned char *pos = pos_;
84 switch(ELF32_R_TYPE(rela->r_info)) {
86 PRINTF(
"cle_upd_reloc: unsupported relocation type: %d\n",
87 ELF32_R_TYPE(rela->r_info));
88 return CLE_UNKNOWN_RELOC;
92 byte = addr - ( + rela->r_offset + 2);
94 pos[0] = (pos[0] & 0x07) | (byte << 3);
95 pos[1] = (pos[1] & 0xfc) | (byte >> 5);
100 addr = addr - (info->text + rela->r_offset + 2);
103 pos[1] = (pos[1] & 0xf0) | ((addr >> 8) & 0x0f);
138 case R_AVR_LO8_LDI_NEG:
142 case R_AVR_HI8_LDI_NEG:
146 case R_AVR_HH8_LDI_NEG:
147 byte = (-addr) >> 16;
150 case R_AVR_LO8_LDI_PM:
154 case R_AVR_HI8_LDI_PM:
158 case R_AVR_HH8_LDI_PM:
162 case R_AVR_LO8_LDI_PM_NEG:
166 case R_AVR_HI8_LDI_PM_NEG:
170 case R_AVR_HH8_LDI_PM_NEG:
171 byte = (-addr) >> 17;
175 pos[0] = (pos[0] & 0xf0) | (byte & 0x0f);
176 pos[1] = (pos[1] & 0xf0) | (byte >> 4);