target-s390: Convert TPROT

Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
Richard Henderson 2012-08-22 15:15:59 -07:00
parent 2ae6805906
commit 112bf0791d
2 changed files with 12 additions and 37 deletions

View File

@ -508,4 +508,6 @@
C(0xac00, STNSM, SI, Z, la1, 0, 0, 0, stnosm, 0) C(0xac00, STNSM, SI, Z, la1, 0, 0, 0, stnosm, 0)
/* STORE THEN OR SYSTEM MASK */ /* STORE THEN OR SYSTEM MASK */
C(0xad00, STOSM, SI, Z, la1, 0, 0, 0, stnosm, 0) C(0xad00, STOSM, SI, Z, la1, 0, 0, 0, stnosm, 0)
/* TEST PROTECTION */
C(0xe501, TPROT, SSE, Z, la1, a2, 0, 0, tprot, 0)
#endif /* CONFIG_USER_ONLY */ #endif /* CONFIG_USER_ONLY */

View File

@ -1073,34 +1073,6 @@ static void disas_e3(CPUS390XState *env, DisasContext* s, int op, int r1,
tcg_temp_free_i64(addr); tcg_temp_free_i64(addr);
} }
#ifndef CONFIG_USER_ONLY
static void disas_e5(CPUS390XState *env, DisasContext* s, uint64_t insn)
{
TCGv_i64 tmp, tmp2;
int op = (insn >> 32) & 0xff;
tmp = get_address(s, 0, (insn >> 28) & 0xf, (insn >> 16) & 0xfff);
tmp2 = get_address(s, 0, (insn >> 12) & 0xf, insn & 0xfff);
LOG_DISAS("disas_e5: insn %" PRIx64 "\n", insn);
switch (op) {
case 0x01: /* TPROT D1(B1),D2(B2) [SSE] */
/* Test Protection */
potential_page_fault(s);
gen_helper_tprot(cc_op, tmp, tmp2);
set_cc_static(s);
break;
default:
LOG_DISAS("illegal e5 operation 0x%x\n", op);
gen_illegal_opcode(s);
break;
}
tcg_temp_free_i64(tmp);
tcg_temp_free_i64(tmp2);
}
#endif
static void disas_eb(CPUS390XState *env, DisasContext *s, int op, int r1, static void disas_eb(CPUS390XState *env, DisasContext *s, int op, int r1,
int r3, int b2, int d2) int r3, int b2, int d2)
{ {
@ -1996,15 +1968,6 @@ static void disas_s390_insn(CPUS390XState *env, DisasContext *s)
| ((insn << 4) & 0xff000)) << 12)) >> 12; | ((insn << 4) & 0xff000)) << 12)) >> 12;
disas_e3(env, s, op, r1, x2, b2, d2 ); disas_e3(env, s, op, r1, x2, b2, d2 );
break; break;
#ifndef CONFIG_USER_ONLY
case 0xe5:
/* Test Protection */
check_privileged(s);
insn = ld_code6(env, s->pc);
debug_insn(insn);
disas_e5(env, s, insn);
break;
#endif
case 0xeb: case 0xeb:
insn = ld_code6(env, s->pc); insn = ld_code6(env, s->pc);
debug_insn(insn); debug_insn(insn);
@ -3387,6 +3350,16 @@ static ExitStatus op_svc(DisasContext *s, DisasOps *o)
return EXIT_NORETURN; return EXIT_NORETURN;
} }
#ifndef CONFIG_USER_ONLY
static ExitStatus op_tprot(DisasContext *s, DisasOps *o)
{
potential_page_fault(s);
gen_helper_tprot(cc_op, o->addr1, o->in2);
set_cc_static(s);
return NO_EXIT;
}
#endif
static ExitStatus op_tr(DisasContext *s, DisasOps *o) static ExitStatus op_tr(DisasContext *s, DisasOps *o)
{ {
TCGv_i32 l = tcg_const_i32(get_field(s->fields, l1)); TCGv_i32 l = tcg_const_i32(get_field(s->fields, l1));