Revision d4218d99
b/target-sparc/cpu.h | ||
---|---|---|
269 | 269 |
env->psrs = (_tmp & PSR_S)? 1 : 0; \ |
270 | 270 |
env->psrps = (_tmp & PSR_PS)? 1 : 0; \ |
271 | 271 |
env->psret = (_tmp & PSR_ET)? 1 : 0; \ |
272 |
cpu_set_cwp(env, _tmp & PSR_CWP & (NWINDOWS - 1)); \
|
|
272 |
cpu_set_cwp(env, _tmp & PSR_CWP); \
|
|
273 | 273 |
} while (0) |
274 | 274 |
|
275 | 275 |
#ifdef TARGET_SPARC64 |
b/target-sparc/op_helper.c | ||
---|---|---|
615 | 615 |
{ |
616 | 616 |
unsigned int cwp; |
617 | 617 |
|
618 |
if (env->psret == 1) |
|
619 |
raise_exception(TT_ILL_INSN); |
|
620 |
|
|
618 | 621 |
env->psret = 1; |
619 | 622 |
cwp = (env->cwp + 1) & (NWINDOWS - 1); |
620 | 623 |
if (env->wim & (1 << cwp)) { |
... | ... | |
655 | 658 |
#ifndef TARGET_SPARC64 |
656 | 659 |
void do_wrpsr() |
657 | 660 |
{ |
658 |
PUT_PSR(env, T0); |
|
661 |
if ((T0 & PSR_CWP) >= NWINDOWS) |
|
662 |
raise_exception(TT_ILL_INSN); |
|
663 |
else |
|
664 |
PUT_PSR(env, T0); |
|
659 | 665 |
} |
660 | 666 |
|
661 | 667 |
void do_rdpsr() |
b/target-sparc/translate.c | ||
---|---|---|
2341 | 2341 |
gen_op_ldst(lduh); |
2342 | 2342 |
break; |
2343 | 2343 |
case 0x3: /* load double word */ |
2344 |
if (rd & 1) |
|
2345 |
goto illegal_insn; |
|
2344 | 2346 |
gen_op_ldst(ldd); |
2345 | 2347 |
gen_movl_T0_reg(rd + 1); |
2346 | 2348 |
break; |
... | ... | |
2360 | 2362 |
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) |
2361 | 2363 |
case 0x10: /* load word alternate */ |
2362 | 2364 |
#ifndef TARGET_SPARC64 |
2365 |
if (IS_IMM) |
|
2366 |
goto illegal_insn; |
|
2363 | 2367 |
if (!supervisor(dc)) |
2364 | 2368 |
goto priv_insn; |
2365 | 2369 |
#endif |
... | ... | |
2367 | 2371 |
break; |
2368 | 2372 |
case 0x11: /* load unsigned byte alternate */ |
2369 | 2373 |
#ifndef TARGET_SPARC64 |
2374 |
if (IS_IMM) |
|
2375 |
goto illegal_insn; |
|
2370 | 2376 |
if (!supervisor(dc)) |
2371 | 2377 |
goto priv_insn; |
2372 | 2378 |
#endif |
... | ... | |
2374 | 2380 |
break; |
2375 | 2381 |
case 0x12: /* load unsigned halfword alternate */ |
2376 | 2382 |
#ifndef TARGET_SPARC64 |
2383 |
if (IS_IMM) |
|
2384 |
goto illegal_insn; |
|
2377 | 2385 |
if (!supervisor(dc)) |
2378 | 2386 |
goto priv_insn; |
2379 | 2387 |
#endif |
... | ... | |
2381 | 2389 |
break; |
2382 | 2390 |
case 0x13: /* load double word alternate */ |
2383 | 2391 |
#ifndef TARGET_SPARC64 |
2392 |
if (IS_IMM) |
|
2393 |
goto illegal_insn; |
|
2384 | 2394 |
if (!supervisor(dc)) |
2385 | 2395 |
goto priv_insn; |
2386 | 2396 |
#endif |
2397 |
if (rd & 1) |
|
2398 |
goto illegal_insn; |
|
2387 | 2399 |
gen_op_ldda(insn, 1, 8, 0); |
2388 | 2400 |
gen_movl_T0_reg(rd + 1); |
2389 | 2401 |
break; |
2390 | 2402 |
case 0x19: /* load signed byte alternate */ |
2391 | 2403 |
#ifndef TARGET_SPARC64 |
2404 |
if (IS_IMM) |
|
2405 |
goto illegal_insn; |
|
2392 | 2406 |
if (!supervisor(dc)) |
2393 | 2407 |
goto priv_insn; |
2394 | 2408 |
#endif |
... | ... | |
2396 | 2410 |
break; |
2397 | 2411 |
case 0x1a: /* load signed halfword alternate */ |
2398 | 2412 |
#ifndef TARGET_SPARC64 |
2413 |
if (IS_IMM) |
|
2414 |
goto illegal_insn; |
|
2399 | 2415 |
if (!supervisor(dc)) |
2400 | 2416 |
goto priv_insn; |
2401 | 2417 |
#endif |
... | ... | |
2403 | 2419 |
break; |
2404 | 2420 |
case 0x1d: /* ldstuba -- XXX: should be atomically */ |
2405 | 2421 |
#ifndef TARGET_SPARC64 |
2422 |
if (IS_IMM) |
|
2423 |
goto illegal_insn; |
|
2406 | 2424 |
if (!supervisor(dc)) |
2407 | 2425 |
goto priv_insn; |
2408 | 2426 |
#endif |
... | ... | |
2410 | 2428 |
break; |
2411 | 2429 |
case 0x1f: /* swap reg with alt. memory. Also atomically */ |
2412 | 2430 |
#ifndef TARGET_SPARC64 |
2431 |
if (IS_IMM) |
|
2432 |
goto illegal_insn; |
|
2413 | 2433 |
if (!supervisor(dc)) |
2414 | 2434 |
goto priv_insn; |
2415 | 2435 |
#endif |
... | ... | |
2508 | 2528 |
gen_op_ldst(sth); |
2509 | 2529 |
break; |
2510 | 2530 |
case 0x7: |
2531 |
if (rd & 1) |
|
2532 |
goto illegal_insn; |
|
2511 | 2533 |
flush_T2(dc); |
2512 | 2534 |
gen_movl_reg_T2(rd + 1); |
2513 | 2535 |
gen_op_ldst(std); |
... | ... | |
2515 | 2537 |
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) |
2516 | 2538 |
case 0x14: |
2517 | 2539 |
#ifndef TARGET_SPARC64 |
2540 |
if (IS_IMM) |
|
2541 |
goto illegal_insn; |
|
2518 | 2542 |
if (!supervisor(dc)) |
2519 | 2543 |
goto priv_insn; |
2520 | 2544 |
#endif |
... | ... | |
2522 | 2546 |
break; |
2523 | 2547 |
case 0x15: |
2524 | 2548 |
#ifndef TARGET_SPARC64 |
2549 |
if (IS_IMM) |
|
2550 |
goto illegal_insn; |
|
2525 | 2551 |
if (!supervisor(dc)) |
2526 | 2552 |
goto priv_insn; |
2527 | 2553 |
#endif |
... | ... | |
2529 | 2555 |
break; |
2530 | 2556 |
case 0x16: |
2531 | 2557 |
#ifndef TARGET_SPARC64 |
2558 |
if (IS_IMM) |
|
2559 |
goto illegal_insn; |
|
2532 | 2560 |
if (!supervisor(dc)) |
2533 | 2561 |
goto priv_insn; |
2534 | 2562 |
#endif |
... | ... | |
2536 | 2564 |
break; |
2537 | 2565 |
case 0x17: |
2538 | 2566 |
#ifndef TARGET_SPARC64 |
2567 |
if (IS_IMM) |
|
2568 |
goto illegal_insn; |
|
2539 | 2569 |
if (!supervisor(dc)) |
2540 | 2570 |
goto priv_insn; |
2541 | 2571 |
#endif |
2572 |
if (rd & 1) |
|
2573 |
goto illegal_insn; |
|
2542 | 2574 |
flush_T2(dc); |
2543 | 2575 |
gen_movl_reg_T2(rd + 1); |
2544 | 2576 |
gen_op_stda(insn, 0, 8, 0); |
Also available in: Unified diff