aboutsummaryrefslogtreecommitdiff
path: root/modutils
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2006-01-04 00:11:26 +0000
committerMike Frysinger <vapier@gentoo.org>2006-01-04 00:11:26 +0000
commitf982d86ba717d72d66a10327c315cea9dc204639 (patch)
tree95efdfd923c6fccf4e4e3a1d20e7efe812a1e82f /modutils
parent29ed59ee1105449e2e0b39824d122b265ee067dd (diff)
downloadbusybox-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.c171
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: