Revision 5a834bb4
b/gdbstub.c | ||
---|---|---|
804 | 804 |
/* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
805 | 805 |
switch (n) { |
806 | 806 |
case 64: GET_REGA(env->y); |
807 |
case 65: GET_REGA(GET_PSR(env));
|
|
807 |
case 65: GET_REGA(cpu_get_psr(env));
|
|
808 | 808 |
case 66: GET_REGA(env->wim); |
809 | 809 |
case 67: GET_REGA(env->tbr); |
810 | 810 |
case 68: GET_REGA(env->pc); |
... | ... | |
829 | 829 |
switch (n) { |
830 | 830 |
case 80: GET_REGL(env->pc); |
831 | 831 |
case 81: GET_REGL(env->npc); |
832 |
case 82: GET_REGL(((uint64_t)GET_CCR(env) << 32) |
|
|
833 |
((env->asi & 0xff) << 24) |
|
|
834 |
((env->pstate & 0xfff) << 8) |
|
|
835 |
GET_CWP64(env));
|
|
832 |
case 82: GET_REGL((cpu_get_ccr(env) << 32) |
|
|
833 |
((env->asi & 0xff) << 24) | |
|
834 |
((env->pstate & 0xfff) << 8) | |
|
835 |
cpu_get_cwp64(env));
|
|
836 | 836 |
case 83: GET_REGL(env->fsr); |
837 | 837 |
case 84: GET_REGL(env->fprs); |
838 | 838 |
case 85: GET_REGL(env->y); |
... | ... | |
868 | 868 |
/* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ |
869 | 869 |
switch (n) { |
870 | 870 |
case 64: env->y = tmp; break; |
871 |
case 65: PUT_PSR(env, tmp); break;
|
|
871 |
case 65: cpu_put_psr(env, tmp); break;
|
|
872 | 872 |
case 66: env->wim = tmp; break; |
873 | 873 |
case 67: env->tbr = tmp; break; |
874 | 874 |
case 68: env->pc = tmp; break; |
... | ... | |
892 | 892 |
case 80: env->pc = tmp; break; |
893 | 893 |
case 81: env->npc = tmp; break; |
894 | 894 |
case 82: |
895 |
PUT_CCR(env, tmp >> 32);
|
|
895 |
cpu_put_ccr(env, tmp >> 32);
|
|
896 | 896 |
env->asi = (tmp >> 24) & 0xff; |
897 | 897 |
env->pstate = (tmp >> 8) & 0xfff; |
898 |
PUT_CWP64(env, tmp & 0xff);
|
|
898 |
cpu_put_cwp64(env, tmp & 0xff);
|
|
899 | 899 |
break; |
900 | 900 |
case 83: env->fsr = tmp; break; |
901 | 901 |
case 84: env->fprs = tmp; break; |
b/linux-user/signal.c | ||
---|---|---|
2111 | 2111 |
err |= __get_user(env->y, &((*grp)[MC_Y])); |
2112 | 2112 |
err |= __get_user(tstate, &((*grp)[MC_TSTATE])); |
2113 | 2113 |
env->asi = (tstate >> 24) & 0xff; |
2114 |
PUT_CCR(env, tstate >> 32);
|
|
2115 |
PUT_CWP64(env, tstate & 0x1f);
|
|
2114 |
cpu_put_ccr(env, tstate >> 32);
|
|
2115 |
cpu_put_cwp64(env, tstate & 0x1f);
|
|
2116 | 2116 |
err |= __get_user(env->gregs[1], (&(*grp)[MC_G1])); |
2117 | 2117 |
err |= __get_user(env->gregs[2], (&(*grp)[MC_G2])); |
2118 | 2118 |
err |= __get_user(env->gregs[3], (&(*grp)[MC_G3])); |
b/monitor.c | ||
---|---|---|
2856 | 2856 |
static target_long monitor_get_psr (const struct MonitorDef *md, int val) |
2857 | 2857 |
{ |
2858 | 2858 |
CPUState *env = mon_get_cpu(); |
2859 |
return GET_PSR(env); |
|
2859 |
|
|
2860 |
return cpu_get_psr(env); |
|
2860 | 2861 |
} |
2861 | 2862 |
#endif |
2862 | 2863 |
|
b/target-sparc/cpu.h | ||
---|---|---|
434 | 434 |
sparc_def_t *def; |
435 | 435 |
} CPUSPARCState; |
436 | 436 |
|
437 |
#ifndef NO_CPU_IO_DEFS |
|
437 | 438 |
/* helper.c */ |
438 | 439 |
CPUSPARCState *cpu_sparc_init(const char *cpu_model); |
439 | 440 |
void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu); |
... | ... | |
453 | 454 |
/* cpu-exec.c */ |
454 | 455 |
int cpu_sparc_exec(CPUSPARCState *s); |
455 | 456 |
|
456 |
#if !defined (TARGET_SPARC64) |
|
457 |
#define GET_PSR(env) (env->version | (env->psr & PSR_ICC) | \ |
|
458 |
(env->psref? PSR_EF : 0) | \ |
|
459 |
(env->psrpil << 8) | \ |
|
460 |
(env->psrs? PSR_S : 0) | \ |
|
461 |
(env->psrps? PSR_PS : 0) | \ |
|
462 |
(env->psret? PSR_ET : 0) | env->cwp) |
|
463 |
#else |
|
464 |
#define GET_PSR(env) (env->version | (env->psr & PSR_ICC) | \ |
|
465 |
(env->psref? PSR_EF : 0) | \ |
|
466 |
(env->psrpil << 8) | \ |
|
467 |
(env->psrs? PSR_S : 0) | \ |
|
468 |
(env->psrps? PSR_PS : 0) | \ |
|
469 |
env->cwp) |
|
470 |
#endif |
|
471 |
|
|
472 |
#ifndef NO_CPU_IO_DEFS |
|
473 |
|
|
474 |
static inline int cpu_cwp_inc(CPUSPARCState *env1, int cwp) |
|
475 |
{ |
|
476 |
if (unlikely(cwp >= env1->nwindows)) |
|
477 |
cwp -= env1->nwindows; |
|
478 |
return cwp; |
|
479 |
} |
|
480 |
|
|
481 |
static inline int cpu_cwp_dec(CPUSPARCState *env1, int cwp) |
|
482 |
{ |
|
483 |
if (unlikely(cwp < 0)) |
|
484 |
cwp += env1->nwindows; |
|
485 |
return cwp; |
|
486 |
} |
|
457 |
/* op_helper.c */ |
|
458 |
target_ulong cpu_get_psr(CPUState *env1); |
|
459 |
void cpu_put_psr(CPUState *env1, target_ulong val); |
|
460 |
#ifdef TARGET_SPARC64 |
|
461 |
target_ulong cpu_get_ccr(CPUState *env1); |
|
462 |
void cpu_put_ccr(CPUState *env1, target_ulong val); |
|
463 |
target_ulong cpu_get_cwp64(CPUState *env1); |
|
464 |
void cpu_put_cwp64(CPUState *env1, int cwp); |
|
487 | 465 |
#endif |
488 |
|
|
489 |
static inline void memcpy32(target_ulong *dst, const target_ulong *src) |
|
490 |
{ |
|
491 |
dst[0] = src[0]; |
|
492 |
dst[1] = src[1]; |
|
493 |
dst[2] = src[2]; |
|
494 |
dst[3] = src[3]; |
|
495 |
dst[4] = src[4]; |
|
496 |
dst[5] = src[5]; |
|
497 |
dst[6] = src[6]; |
|
498 |
dst[7] = src[7]; |
|
499 |
} |
|
500 |
|
|
501 |
static inline void cpu_set_cwp(CPUSPARCState *env1, int new_cwp) |
|
502 |
{ |
|
503 |
/* put the modified wrap registers at their proper location */ |
|
504 |
if (env1->cwp == env1->nwindows - 1) |
|
505 |
memcpy32(env1->regbase, env1->regbase + env1->nwindows * 16); |
|
506 |
env1->cwp = new_cwp; |
|
507 |
/* put the wrap registers at their temporary location */ |
|
508 |
if (new_cwp == env1->nwindows - 1) |
|
509 |
memcpy32(env1->regbase + env1->nwindows * 16, env1->regbase); |
|
510 |
env1->regwptr = env1->regbase + (new_cwp * 16); |
|
511 |
} |
|
466 |
int cpu_cwp_inc(CPUState *env1, int cwp); |
|
467 |
int cpu_cwp_dec(CPUState *env1, int cwp); |
|
468 |
void cpu_set_cwp(CPUState *env1, int new_cwp); |
|
512 | 469 |
|
513 | 470 |
/* sun4m.c, sun4u.c */ |
514 | 471 |
void cpu_check_irqs(CPUSPARCState *env); |
... | ... | |
530 | 487 |
} |
531 | 488 |
|
532 | 489 |
#endif |
533 |
|
|
534 |
static inline void PUT_PSR(CPUSPARCState *env1, target_ulong val) |
|
535 |
{ |
|
536 |
env1->psr = val & PSR_ICC; |
|
537 |
env1->psref = (val & PSR_EF)? 1 : 0; |
|
538 |
env1->psrpil = (val & PSR_PIL) >> 8; |
|
539 |
#if ((!defined (TARGET_SPARC64)) && !defined(CONFIG_USER_ONLY)) |
|
540 |
cpu_check_irqs(env1); |
|
541 |
#endif |
|
542 |
env1->psrs = (val & PSR_S)? 1 : 0; |
|
543 |
env1->psrps = (val & PSR_PS)? 1 : 0; |
|
544 |
#if !defined (TARGET_SPARC64) |
|
545 |
env1->psret = (val & PSR_ET)? 1 : 0; |
|
546 |
#endif |
|
547 |
cpu_set_cwp(env1, val & PSR_CWP); |
|
548 |
env1->cc_op = CC_OP_FLAGS; |
|
549 |
} |
|
550 |
|
|
551 |
#ifdef TARGET_SPARC64 |
|
552 |
#define GET_CCR(env) (((env->xcc >> 20) << 4) | ((env->psr & PSR_ICC) >> 20)) |
|
553 |
#define PUT_CCR(env, val) do { int _tmp = val; \ |
|
554 |
env->xcc = (_tmp >> 4) << 20; \ |
|
555 |
env->psr = (_tmp & 0xf) << 20; \ |
|
556 |
CC_OP = CC_OP_FLAGS; \ |
|
557 |
} while (0) |
|
558 |
#define GET_CWP64(env) (env->nwindows - 1 - (env)->cwp) |
|
559 |
|
|
560 |
#ifndef NO_CPU_IO_DEFS |
|
561 |
static inline void PUT_CWP64(CPUSPARCState *env1, int cwp) |
|
562 |
{ |
|
563 |
if (unlikely(cwp >= env1->nwindows || cwp < 0)) |
|
564 |
cwp %= env1->nwindows; |
|
565 |
cpu_set_cwp(env1, env1->nwindows - 1 - cwp); |
|
566 |
} |
|
567 |
#endif |
|
568 | 490 |
#endif |
569 | 491 |
|
570 | 492 |
/* cpu-exec.c */ |
b/target-sparc/helper.c | ||
---|---|---|
1490 | 1490 |
} |
1491 | 1491 |
#ifdef TARGET_SPARC64 |
1492 | 1492 |
cpu_fprintf(f, "pstate: %08x ccr: %02x (icc: ", env->pstate, |
1493 |
GET_CCR(env));
|
|
1494 |
cpu_print_cc(f, cpu_fprintf, GET_CCR(env) << PSR_CARRY_SHIFT);
|
|
1493 |
cpu_get_ccr(env));
|
|
1494 |
cpu_print_cc(f, cpu_fprintf, cpu_get_ccr(env) << PSR_CARRY_SHIFT);
|
|
1495 | 1495 |
cpu_fprintf(f, " xcc: "); |
1496 |
cpu_print_cc(f, cpu_fprintf, GET_CCR(env) << (PSR_CARRY_SHIFT - 4));
|
|
1496 |
cpu_print_cc(f, cpu_fprintf, cpu_get_ccr(env) << (PSR_CARRY_SHIFT - 4));
|
|
1497 | 1497 |
cpu_fprintf(f, ") asi: %02x tl: %d pil: %x\n", env->asi, env->tl, |
1498 | 1498 |
env->psrpil); |
1499 | 1499 |
cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate: %d " |
... | ... | |
1503 | 1503 |
cpu_fprintf(f, "fsr: " TARGET_FMT_lx " y: " TARGET_FMT_lx " fprs: " |
1504 | 1504 |
TARGET_FMT_lx "\n", env->fsr, env->y, env->fprs); |
1505 | 1505 |
#else |
1506 |
cpu_fprintf(f, "psr: %08x (icc: ", GET_PSR(env));
|
|
1507 |
cpu_print_cc(f, cpu_fprintf, GET_PSR(env));
|
|
1506 |
cpu_fprintf(f, "psr: %08x (icc: ", cpu_get_psr(env));
|
|
1507 |
cpu_print_cc(f, cpu_fprintf, cpu_get_psr(env));
|
|
1508 | 1508 |
cpu_fprintf(f, " SPE: %c%c%c) wim: %08x\n", env->psrs? 'S' : '-', |
1509 | 1509 |
env->psrps? 'P' : '-', env->psret? 'E' : '-', |
1510 | 1510 |
env->wim); |
b/target-sparc/machine.c | ||
---|---|---|
33 | 33 |
qemu_put_betls(f, &env->pc); |
34 | 34 |
qemu_put_betls(f, &env->npc); |
35 | 35 |
qemu_put_betls(f, &env->y); |
36 |
tmp = GET_PSR(env);
|
|
36 |
tmp = cpu_get_psr(env);
|
|
37 | 37 |
qemu_put_be32(f, tmp); |
38 | 38 |
qemu_put_betls(f, &env->fsr); |
39 | 39 |
qemu_put_betls(f, &env->tbr); |
... | ... | |
130 | 130 |
tmp = qemu_get_be32(f); |
131 | 131 |
env->cwp = 0; /* needed to ensure that the wrapping registers are |
132 | 132 |
correctly updated */ |
133 |
PUT_PSR(env, tmp);
|
|
133 |
cpu_put_psr(env, tmp);
|
|
134 | 134 |
qemu_get_betls(f, &env->fsr); |
135 | 135 |
qemu_get_betls(f, &env->tbr); |
136 | 136 |
tmp = qemu_get_be32(f); |
b/target-sparc/op_helper.c | ||
---|---|---|
253 | 253 |
raise_exception(tt); |
254 | 254 |
} |
255 | 255 |
|
256 |
static inline void set_cwp(int new_cwp) |
|
257 |
{ |
|
258 |
cpu_set_cwp(env, new_cwp); |
|
259 |
} |
|
260 |
|
|
261 | 256 |
void helper_check_align(target_ulong addr, uint32_t align) |
262 | 257 |
{ |
263 | 258 |
if (addr & align) { |
... | ... | |
1295 | 1290 |
return ret; |
1296 | 1291 |
} |
1297 | 1292 |
|
1293 |
static inline void memcpy32(target_ulong *dst, const target_ulong *src) |
|
1294 |
{ |
|
1295 |
dst[0] = src[0]; |
|
1296 |
dst[1] = src[1]; |
|
1297 |
dst[2] = src[2]; |
|
1298 |
dst[3] = src[3]; |
|
1299 |
dst[4] = src[4]; |
|
1300 |
dst[5] = src[5]; |
|
1301 |
dst[6] = src[6]; |
|
1302 |
dst[7] = src[7]; |
|
1303 |
} |
|
1304 |
|
|
1305 |
static void set_cwp(int new_cwp) |
|
1306 |
{ |
|
1307 |
/* put the modified wrap registers at their proper location */ |
|
1308 |
if (env->cwp == env->nwindows - 1) { |
|
1309 |
memcpy32(env->regbase, env->regbase + env->nwindows * 16); |
|
1310 |
} |
|
1311 |
env->cwp = new_cwp; |
|
1312 |
|
|
1313 |
/* put the wrap registers at their temporary location */ |
|
1314 |
if (new_cwp == env->nwindows - 1) { |
|
1315 |
memcpy32(env->regbase + env->nwindows * 16, env->regbase); |
|
1316 |
} |
|
1317 |
env->regwptr = env->regbase + (new_cwp * 16); |
|
1318 |
} |
|
1319 |
|
|
1320 |
void cpu_set_cwp(CPUState *env1, int new_cwp) |
|
1321 |
{ |
|
1322 |
CPUState *saved_env; |
|
1323 |
|
|
1324 |
saved_env = env; |
|
1325 |
env = env1; |
|
1326 |
set_cwp(new_cwp); |
|
1327 |
env = saved_env; |
|
1328 |
} |
|
1329 |
|
|
1330 |
static target_ulong get_psr(void) |
|
1331 |
{ |
|
1332 |
helper_compute_psr(); |
|
1333 |
|
|
1334 |
#if !defined (TARGET_SPARC64) |
|
1335 |
return env->version | (env->psr & PSR_ICC) | |
|
1336 |
(env->psref? PSR_EF : 0) | |
|
1337 |
(env->psrpil << 8) | |
|
1338 |
(env->psrs? PSR_S : 0) | |
|
1339 |
(env->psrps? PSR_PS : 0) | |
|
1340 |
(env->psret? PSR_ET : 0) | env->cwp; |
|
1341 |
#else |
|
1342 |
return env->version | (env->psr & PSR_ICC) | |
|
1343 |
(env->psref? PSR_EF : 0) | |
|
1344 |
(env->psrpil << 8) | |
|
1345 |
(env->psrs? PSR_S : 0) | |
|
1346 |
(env->psrps? PSR_PS : 0) | env->cwp; |
|
1347 |
#endif |
|
1348 |
} |
|
1349 |
|
|
1350 |
target_ulong cpu_get_psr(CPUState *env1) |
|
1351 |
{ |
|
1352 |
CPUState *saved_env; |
|
1353 |
target_ulong ret; |
|
1354 |
|
|
1355 |
saved_env = env; |
|
1356 |
env = env1; |
|
1357 |
ret = get_psr(); |
|
1358 |
env = saved_env; |
|
1359 |
return ret; |
|
1360 |
} |
|
1361 |
|
|
1362 |
static void put_psr(target_ulong val) |
|
1363 |
{ |
|
1364 |
env->psr = val & PSR_ICC; |
|
1365 |
env->psref = (val & PSR_EF)? 1 : 0; |
|
1366 |
env->psrpil = (val & PSR_PIL) >> 8; |
|
1367 |
#if ((!defined (TARGET_SPARC64)) && !defined(CONFIG_USER_ONLY)) |
|
1368 |
cpu_check_irqs(env); |
|
1369 |
#endif |
|
1370 |
env->psrs = (val & PSR_S)? 1 : 0; |
|
1371 |
env->psrps = (val & PSR_PS)? 1 : 0; |
|
1372 |
#if !defined (TARGET_SPARC64) |
|
1373 |
env->psret = (val & PSR_ET)? 1 : 0; |
|
1374 |
#endif |
|
1375 |
set_cwp(val & PSR_CWP); |
|
1376 |
env->cc_op = CC_OP_FLAGS; |
|
1377 |
} |
|
1378 |
|
|
1379 |
void cpu_put_psr(CPUState *env1, target_ulong val) |
|
1380 |
{ |
|
1381 |
CPUState *saved_env; |
|
1382 |
|
|
1383 |
saved_env = env; |
|
1384 |
env = env1; |
|
1385 |
put_psr(val); |
|
1386 |
env = saved_env; |
|
1387 |
} |
|
1388 |
|
|
1389 |
static int cwp_inc(int cwp) |
|
1390 |
{ |
|
1391 |
if (unlikely(cwp >= env->nwindows)) { |
|
1392 |
cwp -= env->nwindows; |
|
1393 |
} |
|
1394 |
return cwp; |
|
1395 |
} |
|
1396 |
|
|
1397 |
int cpu_cwp_inc(CPUState *env1, int cwp) |
|
1398 |
{ |
|
1399 |
CPUState *saved_env; |
|
1400 |
target_ulong ret; |
|
1401 |
|
|
1402 |
saved_env = env; |
|
1403 |
env = env1; |
|
1404 |
ret = cwp_inc(cwp); |
|
1405 |
env = saved_env; |
|
1406 |
return ret; |
|
1407 |
} |
|
1408 |
|
|
1409 |
static int cwp_dec(int cwp) |
|
1410 |
{ |
|
1411 |
if (unlikely(cwp < 0)) { |
|
1412 |
cwp += env->nwindows; |
|
1413 |
} |
|
1414 |
return cwp; |
|
1415 |
} |
|
1416 |
|
|
1417 |
int cpu_cwp_dec(CPUState *env1, int cwp) |
|
1418 |
{ |
|
1419 |
CPUState *saved_env; |
|
1420 |
target_ulong ret; |
|
1421 |
|
|
1422 |
saved_env = env; |
|
1423 |
env = env1; |
|
1424 |
ret = cwp_dec(cwp); |
|
1425 |
env = saved_env; |
|
1426 |
return ret; |
|
1427 |
} |
|
1428 |
|
|
1298 | 1429 |
#ifdef TARGET_SPARC64 |
1299 | 1430 |
GEN_FCMPS(fcmps_fcc1, float32, 22, 0); |
1300 | 1431 |
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0); |
... | ... | |
3016 | 3147 |
raise_exception(TT_ILL_INSN); |
3017 | 3148 |
|
3018 | 3149 |
env->psret = 1; |
3019 |
cwp = cpu_cwp_inc(env, env->cwp + 1) ;
|
|
3150 |
cwp = cwp_inc(env->cwp + 1) ;
|
|
3020 | 3151 |
if (env->wim & (1 << cwp)) { |
3021 | 3152 |
raise_exception(TT_WIN_UNF); |
3022 | 3153 |
} |
... | ... | |
3236 | 3367 |
{ |
3237 | 3368 |
uint32_t cwp; |
3238 | 3369 |
|
3239 |
cwp = cpu_cwp_dec(env, env->cwp - 1);
|
|
3370 |
cwp = cwp_dec(env->cwp - 1);
|
|
3240 | 3371 |
if (env->wim & (1 << cwp)) { |
3241 | 3372 |
raise_exception(TT_WIN_OVF); |
3242 | 3373 |
} |
... | ... | |
3247 | 3378 |
{ |
3248 | 3379 |
uint32_t cwp; |
3249 | 3380 |
|
3250 |
cwp = cpu_cwp_inc(env, env->cwp + 1);
|
|
3381 |
cwp = cwp_inc(env->cwp + 1);
|
|
3251 | 3382 |
if (env->wim & (1 << cwp)) { |
3252 | 3383 |
raise_exception(TT_WIN_UNF); |
3253 | 3384 |
} |
... | ... | |
3256 | 3387 |
|
3257 | 3388 |
void helper_wrpsr(target_ulong new_psr) |
3258 | 3389 |
{ |
3259 |
if ((new_psr & PSR_CWP) >= env->nwindows) |
|
3390 |
if ((new_psr & PSR_CWP) >= env->nwindows) {
|
|
3260 | 3391 |
raise_exception(TT_ILL_INSN); |
3261 |
else |
|
3262 |
PUT_PSR(env, new_psr); |
|
3392 |
} else { |
|
3393 |
cpu_put_psr(env, new_psr); |
|
3394 |
} |
|
3263 | 3395 |
} |
3264 | 3396 |
|
3265 | 3397 |
target_ulong helper_rdpsr(void) |
3266 | 3398 |
{ |
3267 |
return GET_PSR(env);
|
|
3399 |
return get_psr();
|
|
3268 | 3400 |
} |
3269 | 3401 |
|
3270 | 3402 |
#else |
... | ... | |
3274 | 3406 |
{ |
3275 | 3407 |
uint32_t cwp; |
3276 | 3408 |
|
3277 |
cwp = cpu_cwp_dec(env, env->cwp - 1);
|
|
3409 |
cwp = cwp_dec(env->cwp - 1);
|
|
3278 | 3410 |
if (env->cansave == 0) { |
3279 | 3411 |
raise_exception(TT_SPILL | (env->otherwin != 0 ? |
3280 | 3412 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)): |
... | ... | |
3295 | 3427 |
{ |
3296 | 3428 |
uint32_t cwp; |
3297 | 3429 |
|
3298 |
cwp = cpu_cwp_inc(env, env->cwp + 1);
|
|
3430 |
cwp = cwp_inc(env->cwp + 1);
|
|
3299 | 3431 |
if (env->canrestore == 0) { |
3300 | 3432 |
raise_exception(TT_FILL | (env->otherwin != 0 ? |
3301 | 3433 |
(TT_WOTHER | ((env->wstate & 0x38) >> 1)): |
... | ... | |
3336 | 3468 |
env->otherwin--; |
3337 | 3469 |
} |
3338 | 3470 |
|
3471 |
static target_ulong get_ccr(void) |
|
3472 |
{ |
|
3473 |
target_ulong psr; |
|
3474 |
|
|
3475 |
psr = get_psr(); |
|
3476 |
|
|
3477 |
return ((env->xcc >> 20) << 4) | ((psr & PSR_ICC) >> 20); |
|
3478 |
} |
|
3479 |
|
|
3480 |
target_ulong cpu_get_ccr(CPUState *env1) |
|
3481 |
{ |
|
3482 |
CPUState *saved_env; |
|
3483 |
target_ulong ret; |
|
3484 |
|
|
3485 |
saved_env = env; |
|
3486 |
env = env1; |
|
3487 |
ret = get_ccr(); |
|
3488 |
env = saved_env; |
|
3489 |
return ret; |
|
3490 |
} |
|
3491 |
|
|
3492 |
static void put_ccr(target_ulong val) |
|
3493 |
{ |
|
3494 |
target_ulong tmp = val; |
|
3495 |
|
|
3496 |
env->xcc = (tmp >> 4) << 20; |
|
3497 |
env->psr = (tmp & 0xf) << 20; |
|
3498 |
CC_OP = CC_OP_FLAGS; |
|
3499 |
} |
|
3500 |
|
|
3501 |
void cpu_put_ccr(CPUState *env1, target_ulong val) |
|
3502 |
{ |
|
3503 |
CPUState *saved_env; |
|
3504 |
|
|
3505 |
saved_env = env; |
|
3506 |
env = env1; |
|
3507 |
put_ccr(val); |
|
3508 |
env = saved_env; |
|
3509 |
} |
|
3510 |
|
|
3511 |
static target_ulong get_cwp64(void) |
|
3512 |
{ |
|
3513 |
return env->nwindows - 1 - env->cwp; |
|
3514 |
} |
|
3515 |
|
|
3516 |
target_ulong cpu_get_cwp64(CPUState *env1) |
|
3517 |
{ |
|
3518 |
CPUState *saved_env; |
|
3519 |
target_ulong ret; |
|
3520 |
|
|
3521 |
saved_env = env; |
|
3522 |
env = env1; |
|
3523 |
ret = get_cwp64(); |
|
3524 |
env = saved_env; |
|
3525 |
return ret; |
|
3526 |
} |
|
3527 |
|
|
3528 |
static void put_cwp64(int cwp) |
|
3529 |
{ |
|
3530 |
if (unlikely(cwp >= env->nwindows || cwp < 0)) { |
|
3531 |
cwp %= env->nwindows; |
|
3532 |
} |
|
3533 |
set_cwp(env->nwindows - 1 - cwp); |
|
3534 |
} |
|
3535 |
|
|
3536 |
void cpu_put_cwp64(CPUState *env1, int cwp) |
|
3537 |
{ |
|
3538 |
CPUState *saved_env; |
|
3539 |
|
|
3540 |
saved_env = env; |
|
3541 |
env = env1; |
|
3542 |
put_cwp64(cwp); |
|
3543 |
env = saved_env; |
|
3544 |
} |
|
3545 |
|
|
3339 | 3546 |
target_ulong helper_rdccr(void) |
3340 | 3547 |
{ |
3341 |
return GET_CCR(env);
|
|
3548 |
return get_ccr();
|
|
3342 | 3549 |
} |
3343 | 3550 |
|
3344 | 3551 |
void helper_wrccr(target_ulong new_ccr) |
3345 | 3552 |
{ |
3346 |
PUT_CCR(env, new_ccr);
|
|
3553 |
put_ccr(new_ccr);
|
|
3347 | 3554 |
} |
3348 | 3555 |
|
3349 | 3556 |
// CWP handling is reversed in V9, but we still use the V8 register |
3350 | 3557 |
// order. |
3351 | 3558 |
target_ulong helper_rdcwp(void) |
3352 | 3559 |
{ |
3353 |
return GET_CWP64(env);
|
|
3560 |
return get_cwp64();
|
|
3354 | 3561 |
} |
3355 | 3562 |
|
3356 | 3563 |
void helper_wrcwp(target_ulong new_cwp) |
3357 | 3564 |
{ |
3358 |
PUT_CWP64(env, new_cwp);
|
|
3565 |
put_cwp64(new_cwp);
|
|
3359 | 3566 |
} |
3360 | 3567 |
|
3361 | 3568 |
// This function uses non-native bit order |
... | ... | |
3475 | 3682 |
|
3476 | 3683 |
env->pc = tsptr->tnpc; |
3477 | 3684 |
env->npc = tsptr->tnpc + 4; |
3478 |
PUT_CCR(env, tsptr->tstate >> 32);
|
|
3685 |
put_ccr(tsptr->tstate >> 32);
|
|
3479 | 3686 |
env->asi = (tsptr->tstate >> 24) & 0xff; |
3480 | 3687 |
change_pstate((tsptr->tstate >> 8) & 0xf3f); |
3481 |
PUT_CWP64(env, tsptr->tstate & 0xff);
|
|
3688 |
put_cwp64(tsptr->tstate & 0xff);
|
|
3482 | 3689 |
env->tl--; |
3483 | 3690 |
|
3484 | 3691 |
DPRINTF_PSTATE("... helper_done tl=%d\n", env->tl); |
... | ... | |
3496 | 3703 |
|
3497 | 3704 |
env->pc = tsptr->tpc; |
3498 | 3705 |
env->npc = tsptr->tnpc; |
3499 |
PUT_CCR(env, tsptr->tstate >> 32);
|
|
3706 |
put_ccr(tsptr->tstate >> 32);
|
|
3500 | 3707 |
env->asi = (tsptr->tstate >> 24) & 0xff; |
3501 | 3708 |
change_pstate((tsptr->tstate >> 8) & 0xf3f); |
3502 |
PUT_CWP64(env, tsptr->tstate & 0xff);
|
|
3709 |
put_cwp64(tsptr->tstate & 0xff);
|
|
3503 | 3710 |
env->tl--; |
3504 | 3711 |
|
3505 | 3712 |
DPRINTF_PSTATE("... helper_retry tl=%d\n", env->tl); |
... | ... | |
3650 | 3857 |
} |
3651 | 3858 |
tsptr = cpu_tsptr(env); |
3652 | 3859 |
|
3653 |
tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) |
|
|
3860 |
tsptr->tstate = (get_ccr() << 32) |
|
|
3654 | 3861 |
((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) | |
3655 |
GET_CWP64(env);
|
|
3862 |
get_cwp64();
|
|
3656 | 3863 |
tsptr->tpc = env->pc; |
3657 | 3864 |
tsptr->tnpc = env->npc; |
3658 | 3865 |
tsptr->tt = intno; |
... | ... | |
3673 | 3880 |
break; |
3674 | 3881 |
} |
3675 | 3882 |
|
3676 |
if (intno == TT_CLRWIN) |
|
3677 |
cpu_set_cwp(env, cpu_cwp_dec(env, env->cwp - 1)); |
|
3678 |
else if ((intno & 0x1c0) == TT_SPILL) |
|
3679 |
cpu_set_cwp(env, cpu_cwp_dec(env, env->cwp - env->cansave - 2)); |
|
3680 |
else if ((intno & 0x1c0) == TT_FILL) |
|
3681 |
cpu_set_cwp(env, cpu_cwp_inc(env, env->cwp + 1)); |
|
3883 |
if (intno == TT_CLRWIN) { |
|
3884 |
set_cwp(cwp_dec(env->cwp - 1)); |
|
3885 |
} else if ((intno & 0x1c0) == TT_SPILL) { |
|
3886 |
set_cwp(cwp_dec(env->cwp - env->cansave - 2)); |
|
3887 |
} else if ((intno & 0x1c0) == TT_FILL) { |
|
3888 |
set_cwp(cwp_inc(env->cwp + 1)); |
|
3889 |
} |
|
3682 | 3890 |
env->tbr &= ~0x7fffULL; |
3683 | 3891 |
env->tbr |= ((env->tl > 1) ? 1 << 14 : 0) | (intno << 5); |
3684 | 3892 |
env->pc = env->tbr; |
... | ... | |
3769 | 3977 |
} |
3770 | 3978 |
#endif |
3771 | 3979 |
env->psret = 0; |
3772 |
cwp = cpu_cwp_dec(env, env->cwp - 1);
|
|
3773 |
cpu_set_cwp(env, cwp);
|
|
3980 |
cwp = cwp_dec(env->cwp - 1);
|
|
3981 |
set_cwp(cwp);
|
|
3774 | 3982 |
env->regwptr[9] = env->pc; |
3775 | 3983 |
env->regwptr[10] = env->npc; |
3776 | 3984 |
env->psrps = env->psrs; |
Also available in: Unified diff