Signed-off-by: Richard Henderson <r...@twiddle.net> --- target/s390x/translate.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/target/s390x/translate.c b/target/s390x/translate.c index af18ffb..48cee25 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -55,6 +55,7 @@ typedef struct DisasFields DisasFields; struct DisasContext { struct TranslationBlock *tb; + const unsigned long *features; const DisasInsn *insn; DisasFields *fields; uint64_t ex_value; @@ -5600,6 +5601,12 @@ static ExitStatus translate_one(CPUS390XState *env, DisasContext *s) } #endif + /* Check for insn feature enabled. */ + if (!test_bit(insn->fac, s->features)) { + gen_program_exception(s, PGM_OPERATION); + return EXIT_NORETURN; + } + /* Check for insn specification exceptions. */ if (insn->spec) { int spec = insn->spec, excp = 0, r; @@ -5726,6 +5733,7 @@ void gen_intermediate_code(CPUS390XState *env, struct TranslationBlock *tb) } dc.tb = tb; + dc.features = cpu->model->features; dc.pc = pc_start; dc.cc_op = CC_OP_DYNAMIC; dc.ex_value = tb->cs_base; -- 2.9.4