target/arm: Move do_coproc_insn() syndrome calculation earlier
Rearrange the code in do_coproc_insn() so that we calculate the syndrome value for a potential trap early; we're about to add a second check that wants this value earlier than where it is currently determined. (Specifically, a trap to EL2 because of HSTR_EL2 should take priority over an UNDEF to EL1, even when the UNDEF is because the register does not exist at all or because its ri->access bits non-configurably fail the access. So the check we put in for HSTR_EL2 trapping at EL1 (which needs the syndrome) is going to have to be done before the check "is the ARMCPRegInfo pointer NULL".) This commit is just code motion; the change to HSTR_EL2 handling that will use the 'syndrome' variable is in a subsequent commit. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Fuad Tabba <tabba@google.com> Message-id: 20230130182459.3309057-5-peter.maydell@linaro.org Message-id: 20230127175507.2895013-5-peter.maydell@linaro.org
This commit is contained in:
parent
80ea70f2e5
commit
9ada333982
@ -4718,43 +4718,6 @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
|
||||
const ARMCPRegInfo *ri = get_arm_cp_reginfo(s->cp_regs, key);
|
||||
TCGv_ptr tcg_ri = NULL;
|
||||
bool need_exit_tb;
|
||||
|
||||
if (!ri) {
|
||||
/*
|
||||
* Unknown register; this might be a guest error or a QEMU
|
||||
* unimplemented feature.
|
||||
*/
|
||||
if (is64) {
|
||||
qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
|
||||
"64 bit system register cp:%d opc1: %d crm:%d "
|
||||
"(%s)\n",
|
||||
isread ? "read" : "write", cpnum, opc1, crm,
|
||||
s->ns ? "non-secure" : "secure");
|
||||
} else {
|
||||
qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
|
||||
"system register cp:%d opc1:%d crn:%d crm:%d "
|
||||
"opc2:%d (%s)\n",
|
||||
isread ? "read" : "write", cpnum, opc1, crn,
|
||||
crm, opc2, s->ns ? "non-secure" : "secure");
|
||||
}
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check access permissions */
|
||||
if (!cp_access_ok(s->current_el, ri, isread)) {
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
|
||||
if (s->hstr_active || ri->accessfn ||
|
||||
(arm_dc_feature(s, ARM_FEATURE_XSCALE) && cpnum < 14)) {
|
||||
/*
|
||||
* Emit code to perform further access permissions checks at
|
||||
* runtime; this may result in an exception.
|
||||
* Note that on XScale all cp0..c13 registers do an access check
|
||||
* call in order to handle c15_cpar.
|
||||
*/
|
||||
uint32_t syndrome;
|
||||
|
||||
/*
|
||||
@ -4797,6 +4760,42 @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ri) {
|
||||
/*
|
||||
* Unknown register; this might be a guest error or a QEMU
|
||||
* unimplemented feature.
|
||||
*/
|
||||
if (is64) {
|
||||
qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
|
||||
"64 bit system register cp:%d opc1: %d crm:%d "
|
||||
"(%s)\n",
|
||||
isread ? "read" : "write", cpnum, opc1, crm,
|
||||
s->ns ? "non-secure" : "secure");
|
||||
} else {
|
||||
qemu_log_mask(LOG_UNIMP, "%s access to unsupported AArch32 "
|
||||
"system register cp:%d opc1:%d crn:%d crm:%d "
|
||||
"opc2:%d (%s)\n",
|
||||
isread ? "read" : "write", cpnum, opc1, crn,
|
||||
crm, opc2, s->ns ? "non-secure" : "secure");
|
||||
}
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check access permissions */
|
||||
if (!cp_access_ok(s->current_el, ri, isread)) {
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
}
|
||||
|
||||
if (s->hstr_active || ri->accessfn ||
|
||||
(arm_dc_feature(s, ARM_FEATURE_XSCALE) && cpnum < 14)) {
|
||||
/*
|
||||
* Emit code to perform further access permissions checks at
|
||||
* runtime; this may result in an exception.
|
||||
* Note that on XScale all cp0..c13 registers do an access check
|
||||
* call in order to handle c15_cpar.
|
||||
*/
|
||||
gen_set_condexec(s);
|
||||
gen_update_pc(s, 0);
|
||||
tcg_ri = tcg_temp_new_ptr();
|
||||
|
Loading…
x
Reference in New Issue
Block a user