diff options
author | Mike Frysinger <vapier@gentoo.org> | 2006-01-04 00:11:26 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2006-01-04 00:11:26 +0000 |
commit | f982d86ba717d72d66a10327c315cea9dc204639 (patch) | |
tree | 95efdfd923c6fccf4e4e3a1d20e7efe812a1e82f /modutils | |
parent | 29ed59ee1105449e2e0b39824d122b265ee067dd (diff) | |
download | busybox-w32-f982d86ba717d72d66a10327c315cea9dc204639.tar.gz busybox-w32-f982d86ba717d72d66a10327c315cea9dc204639.tar.bz2 busybox-w32-f982d86ba717d72d66a10327c315cea9dc204639.zip |
import nios2 support from microtronix
Diffstat (limited to 'modutils')
-rw-r--r-- | modutils/insmod.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/modutils/insmod.c b/modutils/insmod.c index 0ca39911c..79bdebd2c 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c | |||
@@ -217,6 +217,14 @@ extern int insmod_ng_main( int argc, char **argv); | |||
217 | #define ARCHDATAM "__dbe_table" | 217 | #define ARCHDATAM "__dbe_table" |
218 | #endif | 218 | #endif |
219 | 219 | ||
220 | /* Nios II */ | ||
221 | #if defined(__nios2__) | ||
222 | #define MATCH_MACHINE(x) (x == EM_ALTERA_NIOS2) | ||
223 | #define SHT_RELM SHT_RELA | ||
224 | #define Elf32_RelM Elf32_Rela | ||
225 | #define ELFCLASSM ELFCLASS32 | ||
226 | #endif | ||
227 | |||
220 | /* PowerPC */ | 228 | /* PowerPC */ |
221 | #if defined(__powerpc64__) | 229 | #if defined(__powerpc64__) |
222 | #define MATCH_MACHINE(x) (x == EM_PPC64) | 230 | #define MATCH_MACHINE(x) (x == EM_PPC64) |
@@ -1126,6 +1134,167 @@ arch_apply_relocation(struct obj_file *f, | |||
1126 | break; | 1134 | break; |
1127 | } | 1135 | } |
1128 | 1136 | ||
1137 | #elif defined(__nios2__) | ||
1138 | |||
1139 | case R_NIOS2_NONE: | ||
1140 | break; | ||
1141 | |||
1142 | case R_NIOS2_BFD_RELOC_32: | ||
1143 | *loc += v; | ||
1144 | break; | ||
1145 | |||
1146 | case R_NIOS2_BFD_RELOC_16: | ||
1147 | if (v > 0xffff) { | ||
1148 | ret = obj_reloc_overflow; | ||
1149 | } | ||
1150 | *(short *)loc = v; | ||
1151 | break; | ||
1152 | |||
1153 | case R_NIOS2_BFD_RELOC_8: | ||
1154 | if (v > 0xff) { | ||
1155 | ret = obj_reloc_overflow; | ||
1156 | } | ||
1157 | *(char *)loc = v; | ||
1158 | break; | ||
1159 | |||
1160 | case R_NIOS2_S16: | ||
1161 | { | ||
1162 | Elf32_Addr word; | ||
1163 | |||
1164 | if ((Elf32_Sword)v > 0x7fff || | ||
1165 | (Elf32_Sword)v < -(Elf32_Sword)0x8000) { | ||
1166 | ret = obj_reloc_overflow; | ||
1167 | } | ||
1168 | |||
1169 | word = *loc; | ||
1170 | *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | | ||
1171 | (word & 0x3f); | ||
1172 | } | ||
1173 | break; | ||
1174 | |||
1175 | case R_NIOS2_U16: | ||
1176 | { | ||
1177 | Elf32_Addr word; | ||
1178 | |||
1179 | if (v > 0xffff) { | ||
1180 | ret = obj_reloc_overflow; | ||
1181 | } | ||
1182 | |||
1183 | word = *loc; | ||
1184 | *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | | ||
1185 | (word & 0x3f); | ||
1186 | } | ||
1187 | break; | ||
1188 | |||
1189 | case R_NIOS2_PCREL16: | ||
1190 | { | ||
1191 | Elf32_Addr word; | ||
1192 | |||
1193 | v -= dot + 4; | ||
1194 | if ((Elf32_Sword)v > 0x7fff || | ||
1195 | (Elf32_Sword)v < -(Elf32_Sword)0x8000) { | ||
1196 | ret = obj_reloc_overflow; | ||
1197 | } | ||
1198 | |||
1199 | word = *loc; | ||
1200 | *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f); | ||
1201 | } | ||
1202 | break; | ||
1203 | |||
1204 | case R_NIOS2_GPREL: | ||
1205 | { | ||
1206 | Elf32_Addr word, gp; | ||
1207 | /* get _gp */ | ||
1208 | gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp")); | ||
1209 | v-=gp; | ||
1210 | if ((Elf32_Sword)v > 0x7fff || | ||
1211 | (Elf32_Sword)v < -(Elf32_Sword)0x8000) { | ||
1212 | ret = obj_reloc_overflow; | ||
1213 | } | ||
1214 | |||
1215 | word = *loc; | ||
1216 | *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f); | ||
1217 | } | ||
1218 | break; | ||
1219 | |||
1220 | case R_NIOS2_CALL26: | ||
1221 | if (v & 3) | ||
1222 | ret = obj_reloc_dangerous; | ||
1223 | if ((v >> 28) != (dot >> 28)) | ||
1224 | ret = obj_reloc_overflow; | ||
1225 | *loc = (*loc & 0x3f) | ((v >> 2) << 6); | ||
1226 | break; | ||
1227 | |||
1228 | case R_NIOS2_IMM5: | ||
1229 | { | ||
1230 | Elf32_Addr word; | ||
1231 | |||
1232 | if (v > 0x1f) { | ||
1233 | ret = obj_reloc_overflow; | ||
1234 | } | ||
1235 | |||
1236 | word = *loc & ~0x7c0; | ||
1237 | *loc = word | ((v & 0x1f) << 6); | ||
1238 | } | ||
1239 | break; | ||
1240 | |||
1241 | case R_NIOS2_IMM6: | ||
1242 | { | ||
1243 | Elf32_Addr word; | ||
1244 | |||
1245 | if (v > 0x3f) { | ||
1246 | ret = obj_reloc_overflow; | ||
1247 | } | ||
1248 | |||
1249 | word = *loc & ~0xfc0; | ||
1250 | *loc = word | ((v & 0x3f) << 6); | ||
1251 | } | ||
1252 | break; | ||
1253 | |||
1254 | case R_NIOS2_IMM8: | ||
1255 | { | ||
1256 | Elf32_Addr word; | ||
1257 | |||
1258 | if (v > 0xff) { | ||
1259 | ret = obj_reloc_overflow; | ||
1260 | } | ||
1261 | |||
1262 | word = *loc & ~0x3fc0; | ||
1263 | *loc = word | ((v & 0xff) << 6); | ||
1264 | } | ||
1265 | break; | ||
1266 | |||
1267 | case R_NIOS2_HI16: | ||
1268 | { | ||
1269 | Elf32_Addr word; | ||
1270 | |||
1271 | word = *loc; | ||
1272 | *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) | | ||
1273 | (word & 0x3f); | ||
1274 | } | ||
1275 | break; | ||
1276 | |||
1277 | case R_NIOS2_LO16: | ||
1278 | { | ||
1279 | Elf32_Addr word; | ||
1280 | |||
1281 | word = *loc; | ||
1282 | *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | | ||
1283 | (word & 0x3f); | ||
1284 | } | ||
1285 | break; | ||
1286 | |||
1287 | case R_NIOS2_HIADJ16: | ||
1288 | { | ||
1289 | Elf32_Addr word1, word2; | ||
1290 | |||
1291 | word1 = *loc; | ||
1292 | word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff; | ||
1293 | *loc = ((((word1 >> 22) << 16) | word2) << 6) | | ||
1294 | (word1 & 0x3f); | ||
1295 | } | ||
1296 | break; | ||
1297 | |||
1129 | #elif defined(__powerpc__) | 1298 | #elif defined(__powerpc__) |
1130 | 1299 | ||
1131 | case R_PPC_ADDR16_HA: | 1300 | case R_PPC_ADDR16_HA: |
@@ -1409,6 +1578,8 @@ arch_apply_relocation(struct obj_file *f, | |||
1409 | break; | 1578 | break; |
1410 | # endif | 1579 | # endif |
1411 | 1580 | ||
1581 | #else | ||
1582 | # warning "no idea how to handle relocations on your arch" | ||
1412 | #endif | 1583 | #endif |
1413 | 1584 | ||
1414 | default: | 1585 | default: |