Revision 6f5d427d target-ppc/translate_init.c
b/target-ppc/translate_init.c | ||
---|---|---|
389 | 389 |
} |
390 | 390 |
#endif |
391 | 391 |
|
392 |
#if !defined(CONFIG_USER_ONLY) |
|
393 |
/* Callback used to write the exception vector base */ |
|
394 |
static void spr_write_excp_prefix (void *opaque, int sprn) |
|
395 |
{ |
|
396 |
gen_op_store_excp_prefix(); |
|
397 |
gen_op_store_spr(sprn); |
|
398 |
} |
|
399 |
|
|
400 |
static void spr_write_excp_vector (void *opaque, int sprn) |
|
401 |
{ |
|
402 |
DisasContext *ctx = opaque; |
|
403 |
|
|
404 |
if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) { |
|
405 |
gen_op_store_excp_vector(sprn - SPR_BOOKE_IVOR0); |
|
406 |
gen_op_store_spr(sprn); |
|
407 |
} else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) { |
|
408 |
gen_op_store_excp_vector(sprn - SPR_BOOKE_IVOR32 + 32); |
|
409 |
gen_op_store_spr(sprn); |
|
410 |
} else { |
|
411 |
printf("Trying to write an unknown exception vector %d %03x\n", |
|
412 |
sprn, sprn); |
|
413 |
GEN_EXCP_PRIVREG(ctx); |
|
414 |
} |
|
415 |
} |
|
416 |
#endif |
|
417 |
|
|
392 | 418 |
#if defined(CONFIG_USER_ONLY) |
393 | 419 |
#define spr_register(env, num, name, uea_read, uea_write, \ |
394 | 420 |
oea_read, oea_write, initial_value) \ |
... | ... | |
1311 | 1337 |
0x00000000); |
1312 | 1338 |
spr_register(env, SPR_BOOKE_IVPR, "IVPR", |
1313 | 1339 |
SPR_NOACCESS, SPR_NOACCESS, |
1314 |
&spr_read_generic, &spr_write_generic,
|
|
1340 |
&spr_read_generic, &spr_write_excp_prefix,
|
|
1315 | 1341 |
0x00000000); |
1316 | 1342 |
/* Exception vectors */ |
1317 | 1343 |
spr_register(env, SPR_BOOKE_IVOR0, "IVOR0", |
1318 | 1344 |
SPR_NOACCESS, SPR_NOACCESS, |
1319 |
&spr_read_generic, &spr_write_generic,
|
|
1345 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1320 | 1346 |
0x00000000); |
1321 | 1347 |
spr_register(env, SPR_BOOKE_IVOR1, "IVOR1", |
1322 | 1348 |
SPR_NOACCESS, SPR_NOACCESS, |
1323 |
&spr_read_generic, &spr_write_generic,
|
|
1349 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1324 | 1350 |
0x00000000); |
1325 | 1351 |
spr_register(env, SPR_BOOKE_IVOR2, "IVOR2", |
1326 | 1352 |
SPR_NOACCESS, SPR_NOACCESS, |
1327 |
&spr_read_generic, &spr_write_generic,
|
|
1353 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1328 | 1354 |
0x00000000); |
1329 | 1355 |
spr_register(env, SPR_BOOKE_IVOR3, "IVOR3", |
1330 | 1356 |
SPR_NOACCESS, SPR_NOACCESS, |
1331 |
&spr_read_generic, &spr_write_generic,
|
|
1357 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1332 | 1358 |
0x00000000); |
1333 | 1359 |
spr_register(env, SPR_BOOKE_IVOR4, "IVOR4", |
1334 | 1360 |
SPR_NOACCESS, SPR_NOACCESS, |
1335 |
&spr_read_generic, &spr_write_generic,
|
|
1361 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1336 | 1362 |
0x00000000); |
1337 | 1363 |
spr_register(env, SPR_BOOKE_IVOR5, "IVOR5", |
1338 | 1364 |
SPR_NOACCESS, SPR_NOACCESS, |
1339 |
&spr_read_generic, &spr_write_generic,
|
|
1365 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1340 | 1366 |
0x00000000); |
1341 | 1367 |
spr_register(env, SPR_BOOKE_IVOR6, "IVOR6", |
1342 | 1368 |
SPR_NOACCESS, SPR_NOACCESS, |
1343 |
&spr_read_generic, &spr_write_generic,
|
|
1369 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1344 | 1370 |
0x00000000); |
1345 | 1371 |
spr_register(env, SPR_BOOKE_IVOR7, "IVOR7", |
1346 | 1372 |
SPR_NOACCESS, SPR_NOACCESS, |
1347 |
&spr_read_generic, &spr_write_generic,
|
|
1373 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1348 | 1374 |
0x00000000); |
1349 | 1375 |
spr_register(env, SPR_BOOKE_IVOR8, "IVOR8", |
1350 | 1376 |
SPR_NOACCESS, SPR_NOACCESS, |
1351 |
&spr_read_generic, &spr_write_generic,
|
|
1377 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1352 | 1378 |
0x00000000); |
1353 | 1379 |
spr_register(env, SPR_BOOKE_IVOR9, "IVOR9", |
1354 | 1380 |
SPR_NOACCESS, SPR_NOACCESS, |
1355 |
&spr_read_generic, &spr_write_generic,
|
|
1381 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1356 | 1382 |
0x00000000); |
1357 | 1383 |
spr_register(env, SPR_BOOKE_IVOR10, "IVOR10", |
1358 | 1384 |
SPR_NOACCESS, SPR_NOACCESS, |
1359 |
&spr_read_generic, &spr_write_generic,
|
|
1385 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1360 | 1386 |
0x00000000); |
1361 | 1387 |
spr_register(env, SPR_BOOKE_IVOR11, "IVOR11", |
1362 | 1388 |
SPR_NOACCESS, SPR_NOACCESS, |
1363 |
&spr_read_generic, &spr_write_generic,
|
|
1389 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1364 | 1390 |
0x00000000); |
1365 | 1391 |
spr_register(env, SPR_BOOKE_IVOR12, "IVOR12", |
1366 | 1392 |
SPR_NOACCESS, SPR_NOACCESS, |
1367 |
&spr_read_generic, &spr_write_generic,
|
|
1393 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1368 | 1394 |
0x00000000); |
1369 | 1395 |
spr_register(env, SPR_BOOKE_IVOR13, "IVOR13", |
1370 | 1396 |
SPR_NOACCESS, SPR_NOACCESS, |
1371 |
&spr_read_generic, &spr_write_generic,
|
|
1397 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1372 | 1398 |
0x00000000); |
1373 | 1399 |
spr_register(env, SPR_BOOKE_IVOR14, "IVOR14", |
1374 | 1400 |
SPR_NOACCESS, SPR_NOACCESS, |
1375 |
&spr_read_generic, &spr_write_generic,
|
|
1401 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1376 | 1402 |
0x00000000); |
1377 | 1403 |
spr_register(env, SPR_BOOKE_IVOR15, "IVOR15", |
1378 | 1404 |
SPR_NOACCESS, SPR_NOACCESS, |
1379 |
&spr_read_generic, &spr_write_generic,
|
|
1405 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1380 | 1406 |
0x00000000); |
1381 | 1407 |
#if 0 |
1382 | 1408 |
spr_register(env, SPR_BOOKE_IVOR32, "IVOR32", |
1383 | 1409 |
SPR_NOACCESS, SPR_NOACCESS, |
1384 |
&spr_read_generic, &spr_write_generic,
|
|
1410 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1385 | 1411 |
0x00000000); |
1386 | 1412 |
spr_register(env, SPR_BOOKE_IVOR33, "IVOR33", |
1387 | 1413 |
SPR_NOACCESS, SPR_NOACCESS, |
1388 |
&spr_read_generic, &spr_write_generic,
|
|
1414 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1389 | 1415 |
0x00000000); |
1390 | 1416 |
spr_register(env, SPR_BOOKE_IVOR34, "IVOR34", |
1391 | 1417 |
SPR_NOACCESS, SPR_NOACCESS, |
1392 |
&spr_read_generic, &spr_write_generic,
|
|
1418 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1393 | 1419 |
0x00000000); |
1394 | 1420 |
spr_register(env, SPR_BOOKE_IVOR35, "IVOR35", |
1395 | 1421 |
SPR_NOACCESS, SPR_NOACCESS, |
1396 |
&spr_read_generic, &spr_write_generic,
|
|
1422 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1397 | 1423 |
0x00000000); |
1398 | 1424 |
spr_register(env, SPR_BOOKE_IVOR36, "IVOR36", |
1399 | 1425 |
SPR_NOACCESS, SPR_NOACCESS, |
1400 |
&spr_read_generic, &spr_write_generic,
|
|
1426 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1401 | 1427 |
0x00000000); |
1402 | 1428 |
spr_register(env, SPR_BOOKE_IVOR37, "IVOR37", |
1403 | 1429 |
SPR_NOACCESS, SPR_NOACCESS, |
1404 |
&spr_read_generic, &spr_write_generic,
|
|
1430 |
&spr_read_generic, &spr_write_excp_vector,
|
|
1405 | 1431 |
0x00000000); |
1406 | 1432 |
#endif |
1407 | 1433 |
spr_register(env, SPR_BOOKE_PID, "PID", |
... | ... | |
1720 | 1746 |
0x00000000); |
1721 | 1747 |
spr_register(env, SPR_40x_EVPR, "EVPR", |
1722 | 1748 |
SPR_NOACCESS, SPR_NOACCESS, |
1723 |
&spr_read_generic, &spr_write_generic,
|
|
1749 |
&spr_read_generic, &spr_write_excp_prefix,
|
|
1724 | 1750 |
0x00000000); |
1725 | 1751 |
spr_register(env, SPR_40x_SRR2, "SRR2", |
1726 | 1752 |
&spr_read_generic, &spr_write_generic, |
... | ... | |
2147 | 2173 |
env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010; |
2148 | 2174 |
env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020; |
2149 | 2175 |
env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000; |
2176 |
env->excp_prefix = 0x00000000; |
|
2177 |
env->ivor_mask = 0x0000FFF0; |
|
2178 |
env->ivpr_mask = 0xFFFF0000; |
|
2150 | 2179 |
#endif |
2151 | 2180 |
} |
2152 | 2181 |
|
... | ... | |
2167 | 2196 |
env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100; |
2168 | 2197 |
env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200; |
2169 | 2198 |
env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000; |
2199 |
env->excp_prefix = 0x00000000; |
|
2200 |
env->ivor_mask = 0x0000FFF0; |
|
2201 |
env->ivpr_mask = 0xFFFF0000; |
|
2170 | 2202 |
#endif |
2171 | 2203 |
} |
2172 | 2204 |
|
Also available in: Unified diff