target/arm: Implement v8.1M NOCP handling
From v8.1M, disabled-coprocessor handling changes slightly: * coprocessors 8, 9, 14 and 15 are also governed by the cp10 enable bit, like cp11 * an extra range of instruction patterns is considered to be inside the coprocessor space We previously marked these up with TODO comments; implement the correct behaviour. Unfortunately there is no ID register field which indicates this behaviour. We could in theory test an unrelated ID register which indicates guaranteed-to-be-in-v8.1M behaviour like ID_ISAR0.CmpBranch >= 3 (low-overhead-loops), but it seems better to simply define a new ARM_FEATURE_V8_1M feature flag and use it for this and other new-in-v8.1M behaviour that isn't identifiable from the ID registers. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20201019151301.2046-3-peter.maydell@linaro.org
This commit is contained in:
parent
514101c0b9
commit
5d2555a1fe
@ -1985,6 +1985,7 @@ enum arm_features {
|
||||
ARM_FEATURE_VBAR, /* has cp15 VBAR */
|
||||
ARM_FEATURE_M_SECURITY, /* M profile Security Extension */
|
||||
ARM_FEATURE_M_MAIN, /* M profile Main Extension */
|
||||
ARM_FEATURE_V8_1M, /* M profile extras only in v8.1M and later */
|
||||
};
|
||||
|
||||
static inline int arm_feature(CPUARMState *env, int feature)
|
||||
|
@ -29,14 +29,16 @@
|
||||
# If the coprocessor is not present or disabled then we will generate
|
||||
# the NOCP exception; otherwise we let the insn through to the main decode.
|
||||
|
||||
&nocp cp
|
||||
|
||||
{
|
||||
# Special cases which do not take an early NOCP: VLLDM and VLSTM
|
||||
VLLDM_VLSTM 1110 1100 001 l:1 rn:4 0000 1010 0000 0000
|
||||
# TODO: VSCCLRM (new in v8.1M) is similar:
|
||||
#VSCCLRM 1110 1100 1-01 1111 ---- 1011 ---- ---0
|
||||
|
||||
NOCP 111- 1110 ---- ---- ---- cp:4 ---- ----
|
||||
NOCP 111- 110- ---- ---- ---- cp:4 ---- ----
|
||||
# TODO: From v8.1M onwards we will also want this range to NOCP
|
||||
#NOCP_8_1 111- 1111 ---- ---- ---- ---- ---- ---- cp=10
|
||||
NOCP 111- 1110 ---- ---- ---- cp:4 ---- ---- &nocp
|
||||
NOCP 111- 110- ---- ---- ---- cp:4 ---- ---- &nocp
|
||||
# From v8.1M onwards this range will also NOCP:
|
||||
NOCP_8_1 111- 1111 ---- ---- ---- ---- ---- ---- &nocp cp=10
|
||||
}
|
||||
|
@ -3459,7 +3459,7 @@ static bool trans_VLLDM_VLSTM(DisasContext *s, arg_VLLDM_VLSTM *a)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_NOCP(DisasContext *s, arg_NOCP *a)
|
||||
static bool trans_NOCP(DisasContext *s, arg_nocp *a)
|
||||
{
|
||||
/*
|
||||
* Handle M-profile early check for disabled coprocessor:
|
||||
@ -3472,7 +3472,11 @@ static bool trans_NOCP(DisasContext *s, arg_NOCP *a)
|
||||
if (a->cp == 11) {
|
||||
a->cp = 10;
|
||||
}
|
||||
/* TODO: in v8.1M cp 8, 9, 14, 15 also are governed by the cp10 enable */
|
||||
if (arm_dc_feature(s, ARM_FEATURE_V8_1M) &&
|
||||
(a->cp == 8 || a->cp == 9 || a->cp == 14 || a->cp == 15)) {
|
||||
/* in v8.1M cp 8, 9, 14, 15 also are governed by the cp10 enable */
|
||||
a->cp = 10;
|
||||
}
|
||||
|
||||
if (a->cp != 10) {
|
||||
gen_exception_insn(s, s->pc_curr, EXCP_NOCP,
|
||||
@ -3489,6 +3493,15 @@ static bool trans_NOCP(DisasContext *s, arg_NOCP *a)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool trans_NOCP_8_1(DisasContext *s, arg_nocp *a)
|
||||
{
|
||||
/* This range needs a coprocessor check for v8.1M and later only */
|
||||
if (!arm_dc_feature(s, ARM_FEATURE_V8_1M)) {
|
||||
return false;
|
||||
}
|
||||
return trans_NOCP(s, a);
|
||||
}
|
||||
|
||||
static bool trans_VINS(DisasContext *s, arg_VINS *a)
|
||||
{
|
||||
TCGv_i32 rd, rm;
|
||||
|
Loading…
Reference in New Issue
Block a user