Skip to content

Commit

Permalink
target-s390x: PER instruction-fetch event support
Browse files Browse the repository at this point in the history
For the PER instruction-fetch, we can't use the QEMU breakpoint
infrastructure as it triggers for a single address and not a full
address range, and as it actually stop before the instruction and
not before.

We therefore call an helper with the just fetched instruction address,
which check if the address is within the PER address range. If it is
the case, an event is recorded and will be signaled through an
exception.

Note that we implement here the PER-3 behaviour, that is an invalid
opcode is not considered as an instruction fetch. Without PER-3 this
behavious is undefined.

Signed-off-by: Aurelien Jarno <[email protected]>
Signed-off-by: Alexander Graf <[email protected]>
  • Loading branch information
aurel32 authored and agraf committed Jun 17, 2015
1 parent 2c2275e commit f0e0d81
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 0 deletions.
1 change: 1 addition & 0 deletions target-s390x/helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ DEF_HELPER_FLAGS_3(stura, TCG_CALL_NO_WG, void, env, i64, i64)
DEF_HELPER_FLAGS_3(sturg, TCG_CALL_NO_WG, void, env, i64, i64)
DEF_HELPER_1(per_check_exception, void, env)
DEF_HELPER_FLAGS_3(per_branch, TCG_CALL_NO_RWG, void, env, i64, i64)
DEF_HELPER_FLAGS_2(per_ifetch, TCG_CALL_NO_RWG, void, env, i64)

DEF_HELPER_2(xsch, void, env, i64)
DEF_HELPER_2(csch, void, env, i64)
Expand Down
8 changes: 8 additions & 0 deletions target-s390x/misc_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -619,4 +619,12 @@ void HELPER(per_branch)(CPUS390XState *env, uint64_t from, uint64_t to)
}
}
}

void HELPER(per_ifetch)(CPUS390XState *env, uint64_t addr)
{
if ((env->cregs[9] & PER_CR9_EVENT_IFETCH) && get_per_in_range(env, addr)) {
env->per_address = addr;
env->per_perc_atmid = PER_CODE_EVENT_IFETCH | get_per_atmid(env);
}
}
#endif
8 changes: 8 additions & 0 deletions target-s390x/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -5187,6 +5187,14 @@ static ExitStatus translate_one(CPUS390XState *env, DisasContext *s)
return EXIT_NORETURN;
}

#ifndef CONFIG_USER_ONLY
if (s->tb->flags & FLAG_MASK_PER) {
TCGv_i64 addr = tcg_const_i64(s->pc);
gen_helper_per_ifetch(cpu_env, addr);
tcg_temp_free_i64(addr);
}
#endif

/* Check for insn specification exceptions. */
if (insn->spec) {
int spec = insn->spec, excp = 0, r;
Expand Down

0 comments on commit f0e0d81

Please sign in to comment.