diff options
| author | vapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-01-04 00:11:26 +0000 |
|---|---|---|
| committer | vapier <vapier@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-01-04 00:11:26 +0000 |
| commit | 9d13d2c633c4ebb0eea727823d2be30fd4737c97 (patch) | |
| tree | 95efdfd923c6fccf4e4e3a1d20e7efe812a1e82f /modutils | |
| parent | 06c8b1c3f2e611db0681ef0e96c287b4ba88d965 (diff) | |
| download | busybox-w32-9d13d2c633c4ebb0eea727823d2be30fd4737c97.tar.gz busybox-w32-9d13d2c633c4ebb0eea727823d2be30fd4737c97.tar.bz2 busybox-w32-9d13d2c633c4ebb0eea727823d2be30fd4737c97.zip | |
import nios2 support from microtronix
git-svn-id: svn://busybox.net/trunk/busybox@13062 69ca8d6d-28ef-0310-b511-8ec308f3f277
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: |
