1
This is mostly RTH's tcg_constant refactoring work, plus a few
1
The following changes since commit 003ba52a8b327180e284630b289c6ece5a3e08b9:
2
other things.
3
2
4
thanks
3
Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2023-02-16 11:16:39 +0000)
5
-- PMM
6
7
The following changes since commit cf6f26d6f9b2015ee12b4604b79359e76784163a:
8
9
Merge tag 'kraxel-20220427-pull-request' of git://git.kraxel.org/qemu into staging (2022-04-27 10:49:28 -0700)
10
4
11
are available in the Git repository at:
5
are available in the Git repository at:
12
6
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220428
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20230216
14
8
15
for you to fetch changes up to f8e7163d9e6740b5cef02bf73a17a59d0bef8bdb:
9
for you to fetch changes up to caf01d6a435d9f4a95aeae2f9fc6cb8b889b1fb8:
16
10
17
hw/arm/smmuv3: Advertise support for SMMUv3.2-BBML2 (2022-04-28 13:59:23 +0100)
11
tests/qtest: Restrict tpm-tis-devices-{swtpm}-test to CONFIG_TCG (2023-02-16 16:28:53 +0000)
18
12
19
----------------------------------------------------------------
13
----------------------------------------------------------------
20
target-arm queue:
14
target-arm queue:
21
* refactor to use tcg_constant where appropriate
15
* Some mostly M-profile-related code cleanups
22
* Advertise support for FEAT_TTL and FEAT_BBM level 2
16
* avocado: Retire the boot_linux.py AArch64 TCG tests
23
* smmuv3: Cache event fault record
17
* hw/arm/smmuv3: Add GBPA register
24
* smmuv3: Add space in guest error message
18
* arm/virt: don't try to spell out the accelerator
25
* smmuv3: Advertise support for SMMUv3.2-BBML2
19
* hw/arm: Attach PSPI module to NPCM7XX SoC
20
* Some cleanup/refactoring patches aiming towards
21
allowing building Arm targets without CONFIG_TCG
26
22
27
----------------------------------------------------------------
23
----------------------------------------------------------------
28
Damien Hedde (1):
24
Alex Bennée (1):
29
target/arm: Disable cryptographic instructions when neon is disabled
25
tests/avocado: retire the Aarch64 TCG tests from boot_linux.py
26
27
Claudio Fontana (3):
28
target/arm: rename handle_semihosting to tcg_handle_semihosting
29
target/arm: wrap psci call with tcg_enabled
30
target/arm: wrap call to aarch64_sve_change_el in tcg_enabled()
31
32
Cornelia Huck (1):
33
arm/virt: don't try to spell out the accelerator
34
35
Fabiano Rosas (7):
36
target/arm: Move PC alignment check
37
target/arm: Move cpregs code out of cpu.h
38
tests/avocado: Skip tests that require a missing accelerator
39
tests/avocado: Tag TCG tests with accel:tcg
40
target/arm: Use "max" as default cpu for the virt machine with KVM
41
tests/qtest: arm-cpu-features: Match tests to required accelerators
42
tests/qtest: Restrict tpm-tis-devices-{swtpm}-test to CONFIG_TCG
43
44
Hao Wu (3):
45
MAINTAINERS: Add myself to maintainers and remove Havard
46
hw/ssi: Add Nuvoton PSPI Module
47
hw/arm: Attach PSPI module to NPCM7XX SoC
30
48
31
Jean-Philippe Brucker (2):
49
Jean-Philippe Brucker (2):
32
hw/arm/smmuv3: Cache event fault record
50
hw/arm/smmu-common: Support 64-bit addresses
33
hw/arm/smmuv3: Add space in guest error message
51
hw/arm/smmu-common: Fix TTB1 handling
34
52
35
Peter Maydell (3):
53
Mostafa Saleh (1):
36
target/arm: Advertise support for FEAT_TTL
54
hw/arm/smmuv3: Add GBPA register
37
target/arm: Advertise support for FEAT_BBM level 2
38
hw/arm/smmuv3: Advertise support for SMMUv3.2-BBML2
39
55
40
Richard Henderson (48):
56
Philippe Mathieu-Daudé (12):
41
target/arm: Use tcg_constant in gen_probe_access
57
hw/intc/armv7m_nvic: Use OBJECT_DECLARE_SIMPLE_TYPE() macro
42
target/arm: Use tcg_constant in gen_mte_check*
58
target/arm: Simplify arm_v7m_mmu_idx_for_secstate() for user emulation
43
target/arm: Use tcg_constant in gen_exception*
59
target/arm: Reduce arm_v7m_mmu_idx_[all/for_secstate_and_priv]() scope
44
target/arm: Use tcg_constant in gen_adc_CC
60
target/arm: Constify ID_PFR1 on user emulation
45
target/arm: Use tcg_constant in handle_msr_i
61
target/arm: Convert CPUARMState::eabi to boolean
46
target/arm: Use tcg_constant in handle_sys
62
target/arm: Avoid resetting CPUARMState::eabi field
47
target/arm: Use tcg_constant in disas_exc
63
target/arm: Restrict CPUARMState::gicv3state to sysemu
48
target/arm: Use tcg_constant in gen_compare_and_swap_pair
64
target/arm: Restrict CPUARMState::arm_boot_info to sysemu
49
target/arm: Use tcg_constant in disas_ld_lit
65
target/arm: Restrict CPUARMState::nvic to sysemu
50
target/arm: Use tcg_constant in disas_ldst_*
66
target/arm: Store CPUARMState::nvic as NVICState*
51
target/arm: Use tcg_constant in disas_add_sum_imm*
67
target/arm: Declare CPU <-> NVIC helpers in 'hw/intc/armv7m_nvic.h'
52
target/arm: Use tcg_constant in disas_movw_imm
68
hw/arm: Add missing XLNX_ZYNQMP_ARM -> USB_DWC3 Kconfig dependency
53
target/arm: Use tcg_constant in shift_reg_imm
54
target/arm: Use tcg_constant in disas_cond_select
55
target/arm: Use tcg_constant in handle_{rev16,crc32}
56
target/arm: Use tcg_constant in disas_data_proc_2src
57
target/arm: Use tcg_constant in disas_fp*
58
target/arm: Use tcg_constant in simd shift expanders
59
target/arm: Use tcg_constant in simd fp/int conversion
60
target/arm: Use tcg_constant in 2misc expanders
61
target/arm: Use tcg_constant in balance of translate-a64.c
62
target/arm: Use tcg_constant for aa32 exceptions
63
target/arm: Use tcg_constant for disas_iwmmxt_insn
64
target/arm: Use tcg_constant for gen_{msr,mrs}
65
target/arm: Use tcg_constant for vector shift expanders
66
target/arm: Use tcg_constant for do_coproc_insn
67
target/arm: Use tcg_constant for gen_srs
68
target/arm: Use tcg_constant for op_s_{rri,rxi}_rot
69
target/arm: Use tcg_constant for MOVW, UMAAL, CRC32
70
target/arm: Use tcg_constant for v7m MRS, MSR
71
target/arm: Use tcg_constant for TT, SAT, SMMLA
72
target/arm: Use tcg_constant in LDM, STM
73
target/arm: Use tcg_constant in CLRM, DLS, WLS, LE
74
target/arm: Use tcg_constant in trans_CPS_v7m
75
target/arm: Use tcg_constant in trans_CSEL
76
target/arm: Use tcg_constant for trans_INDEX_*
77
target/arm: Use tcg_constant in SINCDEC, INCDEC
78
target/arm: Use tcg_constant in FCPY, CPY
79
target/arm: Use tcg_constant in {incr, wrap}_last_active
80
target/arm: Use tcg_constant in do_clast_scalar
81
target/arm: Use tcg_constant in WHILE
82
target/arm: Use tcg_constant in LD1, ST1
83
target/arm: Use tcg_constant in SUBR
84
target/arm: Use tcg_constant in do_zzi_{sat, ool}, do_fp_imm
85
target/arm: Use tcg_constant for predicate descriptors
86
target/arm: Use tcg_constant for do_brk{2,3}
87
target/arm: Use tcg_constant for vector descriptor
88
target/arm: Use field names for accessing DBGWCRn
89
69
90
docs/system/arm/emulation.rst | 2 +
70
MAINTAINERS | 8 +-
91
hw/arm/smmuv3-internal.h | 2 +-
71
docs/system/arm/nuvoton.rst | 2 +-
92
include/hw/arm/smmu-common.h | 1 +
72
hw/arm/smmuv3-internal.h | 7 +
93
target/arm/internals.h | 12 ++
73
include/hw/arm/npcm7xx.h | 2 +
94
hw/arm/smmuv3.c | 17 +--
74
include/hw/arm/smmu-common.h | 2 -
95
target/arm/cpu.c | 9 ++
75
include/hw/arm/smmuv3.h | 1 +
96
target/arm/cpu64.c | 2 +
76
include/hw/intc/armv7m_nvic.h | 128 +++++++++++++++++-
97
target/arm/debug_helper.c | 10 +-
77
include/hw/ssi/npcm_pspi.h | 53 ++++++++
98
target/arm/helper.c | 8 +-
78
linux-user/user-internals.h | 2 +-
99
target/arm/kvm64.c | 14 +-
79
target/arm/cpregs.h | 98 ++++++++++++++
100
target/arm/translate-a64.c | 301 +++++++++++++-----------------------------
80
target/arm/cpu.h | 228 ++-------------------------------
101
target/arm/translate-sve.c | 202 ++++++++++------------------
81
target/arm/internals.h | 14 --
102
target/arm/translate.c | 244 ++++++++++++----------------------
82
hw/arm/npcm7xx.c | 25 +++-
103
13 files changed, 293 insertions(+), 531 deletions(-)
83
hw/arm/smmu-common.c | 4 +-
84
hw/arm/smmuv3.c | 43 ++++++-
85
hw/arm/virt.c | 10 +-
86
hw/intc/armv7m_nvic.c | 38 ++----
87
hw/ssi/npcm_pspi.c | 221 ++++++++++++++++++++++++++++++++
88
linux-user/arm/cpu_loop.c | 4 +-
89
target/arm/cpu.c | 5 +-
90
target/arm/cpu_tcg.c | 3 +
91
target/arm/helper.c | 31 +++--
92
target/arm/m_helper.c | 86 +++++++------
93
target/arm/machine.c | 18 +--
94
tests/qtest/arm-cpu-features.c | 28 ++--
95
hw/arm/Kconfig | 1 +
96
hw/ssi/meson.build | 2 +-
97
hw/ssi/trace-events | 5 +
98
tests/avocado/avocado_qemu/__init__.py | 4 +
99
tests/avocado/boot_linux.py | 48 ++-----
100
tests/avocado/boot_linux_console.py | 1 +
101
tests/avocado/machine_aarch64_virt.py | 63 ++++++++-
102
tests/avocado/reverse_debugging.py | 8 ++
103
tests/qtest/meson.build | 4 +-
104
34 files changed, 798 insertions(+), 399 deletions(-)
105
create mode 100644 include/hw/ssi/npcm_pspi.h
106
create mode 100644 hw/ssi/npcm_pspi.c
107
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-2-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_address_with_allocation_tag0(TCGv_i64 dst, TCGv_i64 src)
16
static void gen_probe_access(DisasContext *s, TCGv_i64 ptr,
17
MMUAccessType acc, int log2_size)
18
{
19
- TCGv_i32 t_acc = tcg_const_i32(acc);
20
- TCGv_i32 t_idx = tcg_const_i32(get_mem_index(s));
21
- TCGv_i32 t_size = tcg_const_i32(1 << log2_size);
22
-
23
- gen_helper_probe_access(cpu_env, ptr, t_acc, t_idx, t_size);
24
- tcg_temp_free_i32(t_acc);
25
- tcg_temp_free_i32(t_idx);
26
- tcg_temp_free_i32(t_size);
27
+ gen_helper_probe_access(cpu_env, ptr,
28
+ tcg_constant_i32(acc),
29
+ tcg_constant_i32(get_mem_index(s)),
30
+ tcg_constant_i32(1 << log2_size));
31
}
32
33
/*
34
--
35
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-3-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 10 ++--------
9
1 file changed, 2 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_mte_check1_mmuidx(DisasContext *s, TCGv_i64 addr,
16
int core_idx)
17
{
18
if (tag_checked && s->mte_active[is_unpriv]) {
19
- TCGv_i32 tcg_desc;
20
TCGv_i64 ret;
21
int desc = 0;
22
23
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_mte_check1_mmuidx(DisasContext *s, TCGv_i64 addr,
24
desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
25
desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write);
26
desc = FIELD_DP32(desc, MTEDESC, SIZEM1, (1 << log2_size) - 1);
27
- tcg_desc = tcg_const_i32(desc);
28
29
ret = new_tmp_a64(s);
30
- gen_helper_mte_check(ret, cpu_env, tcg_desc, addr);
31
- tcg_temp_free_i32(tcg_desc);
32
+ gen_helper_mte_check(ret, cpu_env, tcg_constant_i32(desc), addr);
33
34
return ret;
35
}
36
@@ -XXX,XX +XXX,XX @@ TCGv_i64 gen_mte_checkN(DisasContext *s, TCGv_i64 addr, bool is_write,
37
bool tag_checked, int size)
38
{
39
if (tag_checked && s->mte_active[0]) {
40
- TCGv_i32 tcg_desc;
41
TCGv_i64 ret;
42
int desc = 0;
43
44
@@ -XXX,XX +XXX,XX @@ TCGv_i64 gen_mte_checkN(DisasContext *s, TCGv_i64 addr, bool is_write,
45
desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
46
desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write);
47
desc = FIELD_DP32(desc, MTEDESC, SIZEM1, size - 1);
48
- tcg_desc = tcg_const_i32(desc);
49
50
ret = new_tmp_a64(s);
51
- gen_helper_mte_check(ret, cpu_env, tcg_desc, addr);
52
- tcg_temp_free_i32(tcg_desc);
53
+ gen_helper_mte_check(ret, cpu_env, tcg_constant_i32(desc), addr);
54
55
return ret;
56
}
57
--
58
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Manually convert to OBJECT_DECLARE_SIMPLE_TYPE() macro,
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
similarly to automatic conversion from commit 8063396bf3
5
Message-id: 20220426163043.100432-8-richard.henderson@linaro.org
5
("Use OBJECT_DECLARE_SIMPLE_TYPE when possible").
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230206223502.25122-2-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate-a64.c | 5 +----
12
include/hw/intc/armv7m_nvic.h | 5 +----
9
1 file changed, 1 insertion(+), 4 deletions(-)
13
1 file changed, 1 insertion(+), 4 deletions(-)
10
14
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
diff --git a/include/hw/intc/armv7m_nvic.h b/include/hw/intc/armv7m_nvic.h
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
17
--- a/include/hw/intc/armv7m_nvic.h
14
+++ b/target/arm/translate-a64.c
18
+++ b/include/hw/intc/armv7m_nvic.h
15
@@ -XXX,XX +XXX,XX @@ static void disas_exc(DisasContext *s, uint32_t insn)
19
@@ -XXX,XX +XXX,XX @@
16
int opc = extract32(insn, 21, 3);
20
#include "qom/object.h"
17
int op2_ll = extract32(insn, 0, 5);
21
18
int imm16 = extract32(insn, 5, 16);
22
#define TYPE_NVIC "armv7m_nvic"
19
- TCGv_i32 tmp;
23
-
20
24
-typedef struct NVICState NVICState;
21
switch (opc) {
25
-DECLARE_INSTANCE_CHECKER(NVICState, NVIC,
22
case 0:
26
- TYPE_NVIC)
23
@@ -XXX,XX +XXX,XX @@ static void disas_exc(DisasContext *s, uint32_t insn)
27
+OBJECT_DECLARE_SIMPLE_TYPE(NVICState, NVIC)
24
break;
28
25
}
29
/* Highest permitted number of exceptions (architectural limit) */
26
gen_a64_set_pc_im(s->pc_curr);
30
#define NVIC_MAX_VECTORS 512
27
- tmp = tcg_const_i32(syn_aa64_smc(imm16));
28
- gen_helper_pre_smc(cpu_env, tmp);
29
- tcg_temp_free_i32(tmp);
30
+ gen_helper_pre_smc(cpu_env, tcg_constant_i32(syn_aa64_smc(imm16)));
31
gen_ss_advance(s);
32
gen_exception_insn(s, s->base.pc_next, EXCP_SMC,
33
syn_aa64_smc(imm16), 3);
34
--
31
--
35
2.25.1
32
2.34.1
33
34
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
In these cases, 't' did double-duty as zero source and
3
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
4
temporary destination. Split the two uses and narrow
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
the scope of the temp.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
6
Message-id: 20230206223502.25122-3-philmd@linaro.org
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220426163043.100432-47-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
8
---
12
target/arm/translate-sve.c | 18 ++++++++++--------
9
target/arm/m_helper.c | 11 ++++++++---
13
1 file changed, 10 insertions(+), 8 deletions(-)
10
1 file changed, 8 insertions(+), 3 deletions(-)
14
11
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
14
--- a/target/arm/m_helper.c
18
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/m_helper.c
19
@@ -XXX,XX +XXX,XX @@ static bool do_brk3(DisasContext *s, arg_rprr_s *a,
16
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
20
TCGv_ptr n = tcg_temp_new_ptr();
17
return 0;
21
TCGv_ptr m = tcg_temp_new_ptr();
22
TCGv_ptr g = tcg_temp_new_ptr();
23
- TCGv_i32 t = tcg_const_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
24
+ TCGv_i32 desc = tcg_constant_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
25
26
tcg_gen_addi_ptr(d, cpu_env, pred_full_reg_offset(s, a->rd));
27
tcg_gen_addi_ptr(n, cpu_env, pred_full_reg_offset(s, a->rn));
28
@@ -XXX,XX +XXX,XX @@ static bool do_brk3(DisasContext *s, arg_rprr_s *a,
29
tcg_gen_addi_ptr(g, cpu_env, pred_full_reg_offset(s, a->pg));
30
31
if (a->s) {
32
- fn_s(t, d, n, m, g, t);
33
+ TCGv_i32 t = tcg_temp_new_i32();
34
+ fn_s(t, d, n, m, g, desc);
35
do_pred_flags(t);
36
+ tcg_temp_free_i32(t);
37
} else {
38
- fn(d, n, m, g, t);
39
+ fn(d, n, m, g, desc);
40
}
41
tcg_temp_free_ptr(d);
42
tcg_temp_free_ptr(n);
43
tcg_temp_free_ptr(m);
44
tcg_temp_free_ptr(g);
45
- tcg_temp_free_i32(t);
46
return true;
47
}
18
}
48
19
49
@@ -XXX,XX +XXX,XX @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a,
20
-#else
50
TCGv_ptr d = tcg_temp_new_ptr();
21
+ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
51
TCGv_ptr n = tcg_temp_new_ptr();
22
+{
52
TCGv_ptr g = tcg_temp_new_ptr();
23
+ return ARMMMUIdx_MUser;
53
- TCGv_i32 t = tcg_const_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
24
+}
54
+ TCGv_i32 desc = tcg_constant_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
25
+
55
26
+#else /* !CONFIG_USER_ONLY */
56
tcg_gen_addi_ptr(d, cpu_env, pred_full_reg_offset(s, a->rd));
27
57
tcg_gen_addi_ptr(n, cpu_env, pred_full_reg_offset(s, a->rn));
28
/*
58
tcg_gen_addi_ptr(g, cpu_env, pred_full_reg_offset(s, a->pg));
29
* What kind of stack write are we doing? This affects how exceptions
59
30
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
60
if (a->s) {
31
return tt_resp;
61
- fn_s(t, d, n, g, t);
62
+ TCGv_i32 t = tcg_temp_new_i32();
63
+ fn_s(t, d, n, g, desc);
64
do_pred_flags(t);
65
+ tcg_temp_free_i32(t);
66
} else {
67
- fn(d, n, g, t);
68
+ fn(d, n, g, desc);
69
}
70
tcg_temp_free_ptr(d);
71
tcg_temp_free_ptr(n);
72
tcg_temp_free_ptr(g);
73
- tcg_temp_free_i32(t);
74
return true;
75
}
32
}
76
33
34
-#endif /* !CONFIG_USER_ONLY */
35
-
36
ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
37
bool secstate, bool priv, bool negpri)
38
{
39
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
40
41
return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
42
}
43
+
44
+#endif /* !CONFIG_USER_ONLY */
77
--
45
--
78
2.25.1
46
2.34.1
47
48
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
arm_v7m_mmu_idx_all() and arm_v7m_mmu_idx_for_secstate_and_priv()
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
are only used for system emulation in m_helper.c.
5
Message-id: 20220426163043.100432-48-richard.henderson@linaro.org
5
Move the definitions to avoid prototype forward declarations.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20230206223502.25122-4-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate-sve.c | 54 ++++++++++----------------------------
12
target/arm/internals.h | 14 --------
9
1 file changed, 14 insertions(+), 40 deletions(-)
13
target/arm/m_helper.c | 74 +++++++++++++++++++++---------------------
14
2 files changed, 37 insertions(+), 51 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/internals.h b/target/arm/internals.h
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/internals.h
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/internals.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
20
@@ -XXX,XX +XXX,XX @@ static inline ARMMMUIdx core_to_aa64_mmu_idx(int mmu_idx)
16
return true;
21
17
}
22
int arm_mmu_idx_to_el(ARMMMUIdx mmu_idx);
18
23
19
- desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
24
-/*
20
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
25
- * Return the MMU index for a v7M CPU with all relevant information
21
temp = tcg_temp_new_i64();
26
- * manually specified.
22
t_zn = tcg_temp_new_ptr();
27
- */
23
t_pg = tcg_temp_new_ptr();
28
-ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
24
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
29
- bool secstate, bool priv, bool negpri);
25
fn(temp, t_zn, t_pg, desc);
30
-
26
tcg_temp_free_ptr(t_zn);
31
-/*
27
tcg_temp_free_ptr(t_pg);
32
- * Return the MMU index for a v7M CPU in the specified security and
28
- tcg_temp_free_i32(desc);
33
- * privilege state.
29
34
- */
30
write_fp_dreg(s, a->rd, temp);
35
-ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
31
tcg_temp_free_i64(temp);
36
- bool secstate, bool priv);
32
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
37
-
33
TCGv_i64 start, TCGv_i64 incr)
38
/* Return the MMU index for a v7M CPU in the specified security state */
34
{
39
ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate);
35
unsigned vsz = vec_full_reg_size(s);
40
36
- TCGv_i32 desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
41
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
37
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
42
index XXXXXXX..XXXXXXX 100644
38
TCGv_ptr t_zd = tcg_temp_new_ptr();
43
--- a/target/arm/m_helper.c
39
44
+++ b/target/arm/m_helper.c
40
tcg_gen_addi_ptr(t_zd, cpu_env, vec_full_reg_offset(s, rd));
45
@@ -XXX,XX +XXX,XX @@ ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
41
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
46
42
tcg_temp_free_i32(i32);
47
#else /* !CONFIG_USER_ONLY */
43
}
48
44
tcg_temp_free_ptr(t_zd);
49
+static ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
45
- tcg_temp_free_i32(desc);
50
+ bool secstate, bool priv, bool negpri)
51
+{
52
+ ARMMMUIdx mmu_idx = ARM_MMU_IDX_M;
53
+
54
+ if (priv) {
55
+ mmu_idx |= ARM_MMU_IDX_M_PRIV;
56
+ }
57
+
58
+ if (negpri) {
59
+ mmu_idx |= ARM_MMU_IDX_M_NEGPRI;
60
+ }
61
+
62
+ if (secstate) {
63
+ mmu_idx |= ARM_MMU_IDX_M_S;
64
+ }
65
+
66
+ return mmu_idx;
67
+}
68
+
69
+static ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
70
+ bool secstate, bool priv)
71
+{
72
+ bool negpri = armv7m_nvic_neg_prio_requested(env->nvic, secstate);
73
+
74
+ return arm_v7m_mmu_idx_all(env, secstate, priv, negpri);
75
+}
76
+
77
+/* Return the MMU index for a v7M CPU in the specified security state */
78
+ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
79
+{
80
+ bool priv = arm_v7m_is_handler_mode(env) ||
81
+ !(env->v7m.control[secstate] & 1);
82
+
83
+ return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
84
+}
85
+
86
/*
87
* What kind of stack write are we doing? This affects how exceptions
88
* generated during the stacking are treated.
89
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(v7m_tt)(CPUARMState *env, uint32_t addr, uint32_t op)
90
return tt_resp;
46
}
91
}
47
92
48
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
93
-ARMMMUIdx arm_v7m_mmu_idx_all(CPUARMState *env,
49
@@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
94
- bool secstate, bool priv, bool negpri)
50
nptr = tcg_temp_new_ptr();
95
-{
51
tcg_gen_addi_ptr(dptr, cpu_env, vec_full_reg_offset(s, rd));
96
- ARMMMUIdx mmu_idx = ARM_MMU_IDX_M;
52
tcg_gen_addi_ptr(nptr, cpu_env, vec_full_reg_offset(s, rn));
97
-
53
- desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
98
- if (priv) {
54
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
99
- mmu_idx |= ARM_MMU_IDX_M_PRIV;
55
100
- }
56
switch (esz) {
101
-
57
case MO_8:
102
- if (negpri) {
58
@@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
103
- mmu_idx |= ARM_MMU_IDX_M_NEGPRI;
59
104
- }
60
tcg_temp_free_ptr(dptr);
105
-
61
tcg_temp_free_ptr(nptr);
106
- if (secstate) {
62
- tcg_temp_free_i32(desc);
107
- mmu_idx |= ARM_MMU_IDX_M_S;
63
}
108
- }
64
109
-
65
static bool trans_CNT_r(DisasContext *s, arg_CNT_r *a)
110
- return mmu_idx;
66
@@ -XXX,XX +XXX,XX @@ static void do_cpy_m(DisasContext *s, int esz, int rd, int rn, int pg,
111
-}
67
gen_helper_sve_cpy_m_s, gen_helper_sve_cpy_m_d,
112
-
68
};
113
-ARMMMUIdx arm_v7m_mmu_idx_for_secstate_and_priv(CPUARMState *env,
69
unsigned vsz = vec_full_reg_size(s);
114
- bool secstate, bool priv)
70
- TCGv_i32 desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
115
-{
71
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
116
- bool negpri = armv7m_nvic_neg_prio_requested(env->nvic, secstate);
72
TCGv_ptr t_zd = tcg_temp_new_ptr();
117
-
73
TCGv_ptr t_zn = tcg_temp_new_ptr();
118
- return arm_v7m_mmu_idx_all(env, secstate, priv, negpri);
74
TCGv_ptr t_pg = tcg_temp_new_ptr();
119
-}
75
@@ -XXX,XX +XXX,XX @@ static void do_cpy_m(DisasContext *s, int esz, int rd, int rn, int pg,
120
-
76
tcg_temp_free_ptr(t_zd);
121
-/* Return the MMU index for a v7M CPU in the specified security state */
77
tcg_temp_free_ptr(t_zn);
122
-ARMMMUIdx arm_v7m_mmu_idx_for_secstate(CPUARMState *env, bool secstate)
78
tcg_temp_free_ptr(t_pg);
123
-{
79
- tcg_temp_free_i32(desc);
124
- bool priv = arm_v7m_is_handler_mode(env) ||
80
}
125
- !(env->v7m.control[secstate] & 1);
81
126
-
82
static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
127
- return arm_v7m_mmu_idx_for_secstate_and_priv(env, secstate, priv);
83
@@ -XXX,XX +XXX,XX @@ static void do_insr_i64(DisasContext *s, arg_rrr_esz *a, TCGv_i64 val)
128
-}
84
gen_helper_sve_insr_s, gen_helper_sve_insr_d,
129
-
85
};
130
#endif /* !CONFIG_USER_ONLY */
86
unsigned vsz = vec_full_reg_size(s);
87
- TCGv_i32 desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
88
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
89
TCGv_ptr t_zd = tcg_temp_new_ptr();
90
TCGv_ptr t_zn = tcg_temp_new_ptr();
91
92
@@ -XXX,XX +XXX,XX @@ static void do_insr_i64(DisasContext *s, arg_rrr_esz *a, TCGv_i64 val)
93
94
tcg_temp_free_ptr(t_zd);
95
tcg_temp_free_ptr(t_zn);
96
- tcg_temp_free_i32(desc);
97
}
98
99
static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a)
100
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred3(DisasContext *s, arg_rrr_esz *a, bool high_odd,
101
TCGv_ptr t_d = tcg_temp_new_ptr();
102
TCGv_ptr t_n = tcg_temp_new_ptr();
103
TCGv_ptr t_m = tcg_temp_new_ptr();
104
- TCGv_i32 t_desc;
105
uint32_t desc = 0;
106
107
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz);
108
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred3(DisasContext *s, arg_rrr_esz *a, bool high_odd,
109
tcg_gen_addi_ptr(t_d, cpu_env, pred_full_reg_offset(s, a->rd));
110
tcg_gen_addi_ptr(t_n, cpu_env, pred_full_reg_offset(s, a->rn));
111
tcg_gen_addi_ptr(t_m, cpu_env, pred_full_reg_offset(s, a->rm));
112
- t_desc = tcg_const_i32(desc);
113
114
- fn(t_d, t_n, t_m, t_desc);
115
+ fn(t_d, t_n, t_m, tcg_constant_i32(desc));
116
117
tcg_temp_free_ptr(t_d);
118
tcg_temp_free_ptr(t_n);
119
tcg_temp_free_ptr(t_m);
120
- tcg_temp_free_i32(t_desc);
121
return true;
122
}
123
124
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
125
unsigned vsz = pred_full_reg_size(s);
126
TCGv_ptr t_d = tcg_temp_new_ptr();
127
TCGv_ptr t_n = tcg_temp_new_ptr();
128
- TCGv_i32 t_desc;
129
uint32_t desc = 0;
130
131
tcg_gen_addi_ptr(t_d, cpu_env, pred_full_reg_offset(s, a->rd));
132
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
133
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz);
134
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
135
desc = FIELD_DP32(desc, PREDDESC, DATA, high_odd);
136
- t_desc = tcg_const_i32(desc);
137
138
- fn(t_d, t_n, t_desc);
139
+ fn(t_d, t_n, tcg_constant_i32(desc));
140
141
- tcg_temp_free_i32(t_desc);
142
tcg_temp_free_ptr(t_d);
143
tcg_temp_free_ptr(t_n);
144
return true;
145
@@ -XXX,XX +XXX,XX @@ static void find_last_active(DisasContext *s, TCGv_i32 ret, int esz, int pg)
146
* round up, as we do elsewhere, because we need the exact size.
147
*/
148
TCGv_ptr t_p = tcg_temp_new_ptr();
149
- TCGv_i32 t_desc;
150
unsigned desc = 0;
151
152
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, pred_full_reg_size(s));
153
desc = FIELD_DP32(desc, PREDDESC, ESZ, esz);
154
155
tcg_gen_addi_ptr(t_p, cpu_env, pred_full_reg_offset(s, pg));
156
- t_desc = tcg_const_i32(desc);
157
158
- gen_helper_sve_last_active_element(ret, t_p, t_desc);
159
+ gen_helper_sve_last_active_element(ret, t_p, tcg_constant_i32(desc));
160
161
- tcg_temp_free_i32(t_desc);
162
tcg_temp_free_ptr(t_p);
163
}
164
165
@@ -XXX,XX +XXX,XX @@ static void do_cntp(DisasContext *s, TCGv_i64 val, int esz, int pn, int pg)
166
TCGv_ptr t_pn = tcg_temp_new_ptr();
167
TCGv_ptr t_pg = tcg_temp_new_ptr();
168
unsigned desc = 0;
169
- TCGv_i32 t_desc;
170
171
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, psz);
172
desc = FIELD_DP32(desc, PREDDESC, ESZ, esz);
173
174
tcg_gen_addi_ptr(t_pn, cpu_env, pred_full_reg_offset(s, pn));
175
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
176
- t_desc = tcg_const_i32(desc);
177
178
- gen_helper_sve_cntp(val, t_pn, t_pg, t_desc);
179
+ gen_helper_sve_cntp(val, t_pn, t_pg, tcg_constant_i32(desc));
180
tcg_temp_free_ptr(t_pn);
181
tcg_temp_free_ptr(t_pg);
182
- tcg_temp_free_i32(t_desc);
183
}
184
}
185
186
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
187
{
188
unsigned vsz = vec_full_reg_size(s);
189
unsigned p2vsz = pow2ceil(vsz);
190
- TCGv_i32 t_desc = tcg_const_i32(simd_desc(vsz, vsz, p2vsz));
191
+ TCGv_i32 t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
192
TCGv_ptr t_zn, t_pg, status;
193
TCGv_i64 temp;
194
195
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
196
tcg_temp_free_ptr(t_zn);
197
tcg_temp_free_ptr(t_pg);
198
tcg_temp_free_ptr(status);
199
- tcg_temp_free_i32(t_desc);
200
201
write_fp_dreg(s, a->rd, temp);
202
tcg_temp_free_i64(temp);
203
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
204
tcg_gen_addi_ptr(t_rm, cpu_env, vec_full_reg_offset(s, a->rm));
205
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, a->pg));
206
t_fpst = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
207
- t_desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
208
+ t_desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
209
210
fns[a->esz - 1](t_val, t_val, t_rm, t_pg, t_fpst, t_desc);
211
212
- tcg_temp_free_i32(t_desc);
213
tcg_temp_free_ptr(t_fpst);
214
tcg_temp_free_ptr(t_pg);
215
tcg_temp_free_ptr(t_rm);
216
@@ -XXX,XX +XXX,XX @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16,
217
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
218
219
status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
220
- desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
221
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
222
fn(t_zd, t_zn, t_pg, scalar, status, desc);
223
224
- tcg_temp_free_i32(desc);
225
tcg_temp_free_ptr(status);
226
tcg_temp_free_ptr(t_pg);
227
tcg_temp_free_ptr(t_zn);
228
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
229
{
230
unsigned vsz = vec_full_reg_size(s);
231
TCGv_ptr t_pg;
232
- TCGv_i32 t_desc;
233
int desc = 0;
234
235
/*
236
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
237
}
238
239
desc = simd_desc(vsz, vsz, zt | desc);
240
- t_desc = tcg_const_i32(desc);
241
t_pg = tcg_temp_new_ptr();
242
243
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
244
- fn(cpu_env, t_pg, addr, t_desc);
245
+ fn(cpu_env, t_pg, addr, tcg_constant_i32(desc));
246
247
tcg_temp_free_ptr(t_pg);
248
- tcg_temp_free_i32(t_desc);
249
}
250
251
/* Indexed by [mte][be][dtype][nreg] */
252
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm,
253
TCGv_ptr t_zm = tcg_temp_new_ptr();
254
TCGv_ptr t_pg = tcg_temp_new_ptr();
255
TCGv_ptr t_zt = tcg_temp_new_ptr();
256
- TCGv_i32 t_desc;
257
int desc = 0;
258
259
if (s->mte_active[0]) {
260
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm,
261
desc <<= SVE_MTEDESC_SHIFT;
262
}
263
desc = simd_desc(vsz, vsz, desc | scale);
264
- t_desc = tcg_const_i32(desc);
265
266
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
267
tcg_gen_addi_ptr(t_zm, cpu_env, vec_full_reg_offset(s, zm));
268
tcg_gen_addi_ptr(t_zt, cpu_env, vec_full_reg_offset(s, zt));
269
- fn(cpu_env, t_zt, t_pg, t_zm, scalar, t_desc);
270
+ fn(cpu_env, t_zt, t_pg, t_zm, scalar, tcg_constant_i32(desc));
271
272
tcg_temp_free_ptr(t_zt);
273
tcg_temp_free_ptr(t_zm);
274
tcg_temp_free_ptr(t_pg);
275
- tcg_temp_free_i32(t_desc);
276
}
277
278
/* Indexed by [mte][be][ff][xs][u][msz]. */
279
--
131
--
280
2.25.1
132
2.34.1
133
134
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-id: 20220426163043.100432-40-richard.henderson@linaro.org
5
Message-id: 20230206223502.25122-5-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 12 ++++--------
8
target/arm/helper.c | 12 ++++++++++--
9
1 file changed, 4 insertions(+), 8 deletions(-)
9
1 file changed, 10 insertions(+), 2 deletions(-)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/target/arm/helper.c
14
+++ b/target/arm/translate-sve.c
14
+++ b/target/arm/helper.c
15
@@ -XXX,XX +XXX,XX @@ static void incr_last_active(DisasContext *s, TCGv_i32 last, int esz)
15
@@ -XXX,XX +XXX,XX @@ static void define_pmu_regs(ARMCPU *cpu)
16
if (is_power_of_2(vsz)) {
17
tcg_gen_andi_i32(last, last, vsz - 1);
18
} else {
19
- TCGv_i32 max = tcg_const_i32(vsz);
20
- TCGv_i32 zero = tcg_const_i32(0);
21
+ TCGv_i32 max = tcg_constant_i32(vsz);
22
+ TCGv_i32 zero = tcg_constant_i32(0);
23
tcg_gen_movcond_i32(TCG_COND_GEU, last, last, max, zero, last);
24
- tcg_temp_free_i32(max);
25
- tcg_temp_free_i32(zero);
26
}
16
}
27
}
17
}
28
18
29
@@ -XXX,XX +XXX,XX @@ static void wrap_last_active(DisasContext *s, TCGv_i32 last, int esz)
19
+#ifndef CONFIG_USER_ONLY
30
if (is_power_of_2(vsz)) {
20
/*
31
tcg_gen_andi_i32(last, last, vsz - 1);
21
* We don't know until after realize whether there's a GICv3
32
} else {
22
* attached, and that is what registers the gicv3 sysregs.
33
- TCGv_i32 max = tcg_const_i32(vsz - (1 << esz));
23
@@ -XXX,XX +XXX,XX @@ static uint64_t id_pfr1_read(CPUARMState *env, const ARMCPRegInfo *ri)
34
- TCGv_i32 zero = tcg_const_i32(0);
24
return pfr1;
35
+ TCGv_i32 max = tcg_constant_i32(vsz - (1 << esz));
36
+ TCGv_i32 zero = tcg_constant_i32(0);
37
tcg_gen_movcond_i32(TCG_COND_LT, last, last, zero, max, last);
38
- tcg_temp_free_i32(max);
39
- tcg_temp_free_i32(zero);
40
}
41
}
25
}
42
26
27
-#ifndef CONFIG_USER_ONLY
28
static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri)
29
{
30
ARMCPU *cpu = env_archcpu(env);
31
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
32
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 1,
33
.access = PL1_R, .type = ARM_CP_NO_RAW,
34
.accessfn = access_aa32_tid3,
35
+#ifdef CONFIG_USER_ONLY
36
+ .type = ARM_CP_CONST,
37
+ .resetvalue = cpu->isar.id_pfr1,
38
+#else
39
+ .type = ARM_CP_NO_RAW,
40
+ .accessfn = access_aa32_tid3,
41
.readfn = id_pfr1_read,
42
- .writefn = arm_cp_write_ignore },
43
+ .writefn = arm_cp_write_ignore
44
+#endif
45
+ },
46
{ .name = "ID_DFR0", .state = ARM_CP_STATE_BOTH,
47
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 1, .opc2 = 2,
48
.access = PL1_R, .type = ARM_CP_CONST,
43
--
49
--
44
2.25.1
50
2.34.1
51
52
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-id: 20220426163043.100432-43-richard.henderson@linaro.org
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20230206223502.25122-6-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
---
8
target/arm/translate-sve.c | 12 ++++--------
9
linux-user/user-internals.h | 2 +-
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
target/arm/cpu.h | 2 +-
11
linux-user/arm/cpu_loop.c | 4 ++--
12
3 files changed, 4 insertions(+), 4 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/linux-user/user-internals.h b/linux-user/user-internals.h
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/linux-user/user-internals.h
14
+++ b/target/arm/translate-sve.c
17
+++ b/linux-user/user-internals.h
15
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zpiz(DisasContext *s, arg_LD1_zpiz *a)
18
@@ -XXX,XX +XXX,XX @@ void print_termios(void *arg);
16
gen_helper_gvec_mem_scatter *fn = NULL;
19
#ifdef TARGET_ARM
17
bool be = s->be_data == MO_BE;
20
static inline int regpairs_aligned(CPUArchState *cpu_env, int num)
18
bool mte = s->mte_active[0];
21
{
19
- TCGv_i64 imm;
22
- return cpu_env->eabi == 1;
20
23
+ return cpu_env->eabi;
21
if (a->esz < a->msz || (a->esz == a->msz && !a->u)) {
22
return false;
23
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zpiz(DisasContext *s, arg_LD1_zpiz *a)
24
/* Treat LD1_zpiz (zn[x] + imm) the same way as LD1_zprz (rn + zm[x])
25
* by loading the immediate into the scalar parameter.
26
*/
27
- imm = tcg_const_i64(a->imm << a->msz);
28
- do_mem_zpz(s, a->rd, a->pg, a->rn, 0, imm, a->msz, false, fn);
29
- tcg_temp_free_i64(imm);
30
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
31
+ tcg_constant_i64(a->imm << a->msz), a->msz, false, fn);
32
return true;
33
}
24
}
34
25
#elif defined(TARGET_MIPS) && defined(TARGET_ABI_MIPSO32)
35
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
26
static inline int regpairs_aligned(CPUArchState *cpu_env, int num) { return 1; }
36
gen_helper_gvec_mem_scatter *fn = NULL;
27
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
37
bool be = s->be_data == MO_BE;
28
index XXXXXXX..XXXXXXX 100644
38
bool mte = s->mte_active[0];
29
--- a/target/arm/cpu.h
39
- TCGv_i64 imm;
30
+++ b/target/arm/cpu.h
40
31
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
41
if (a->esz < a->msz) {
32
42
return false;
33
#if defined(CONFIG_USER_ONLY)
43
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
34
/* For usermode syscall translation. */
44
/* Treat ST1_zpiz (zn[x] + imm) the same way as ST1_zprz (rn + zm[x])
35
- int eabi;
45
* by loading the immediate into the scalar parameter.
36
+ bool eabi;
46
*/
37
#endif
47
- imm = tcg_const_i64(a->imm << a->msz);
38
48
- do_mem_zpz(s, a->rd, a->pg, a->rn, 0, imm, a->msz, true, fn);
39
struct CPUBreakpoint *cpu_breakpoint[16];
49
- tcg_temp_free_i64(imm);
40
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
50
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
41
index XXXXXXX..XXXXXXX 100644
51
+ tcg_constant_i64(a->imm << a->msz), a->msz, true, fn);
42
--- a/linux-user/arm/cpu_loop.c
52
return true;
43
+++ b/linux-user/arm/cpu_loop.c
53
}
44
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
45
break;
46
case EXCP_SWI:
47
{
48
- env->eabi = 1;
49
+ env->eabi = true;
50
/* system call */
51
if (env->thumb) {
52
/* Thumb is always EABI style with syscall number in r7 */
53
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
54
* > 0xfffff and are handled below as out-of-range.
55
*/
56
n ^= ARM_SYSCALL_BASE;
57
- env->eabi = 0;
58
+ env->eabi = false;
59
}
60
}
54
61
55
--
62
--
56
2.25.1
63
2.34.1
64
65
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
In these cases, 't' did double-duty as zero source and
3
Although the 'eabi' field is only used in user emulation where
4
temporary destination. Split the two uses.
4
CPU reset doesn't occur, it doesn't belong to the area to reset.
5
Move it after the 'end_reset_fields' for consistency.
5
6
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Message-id: 20220426163043.100432-46-richard.henderson@linaro.org
9
Message-id: 20230206223502.25122-7-philmd@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
target/arm/translate-sve.c | 17 ++++++++---------
12
target/arm/cpu.h | 9 ++++-----
12
1 file changed, 8 insertions(+), 9 deletions(-)
13
1 file changed, 4 insertions(+), 5 deletions(-)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/cpu.h
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@ static void do_predtest(DisasContext *s, int dofs, int gofs, int words)
19
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
19
{
20
ARMVectorReg zarray[ARM_MAX_VQ * 16];
20
TCGv_ptr dptr = tcg_temp_new_ptr();
21
#endif
21
TCGv_ptr gptr = tcg_temp_new_ptr();
22
22
- TCGv_i32 t;
23
-#if defined(CONFIG_USER_ONLY)
23
+ TCGv_i32 t = tcg_temp_new_i32();
24
- /* For usermode syscall translation. */
24
25
- bool eabi;
25
tcg_gen_addi_ptr(dptr, cpu_env, dofs);
26
-#endif
26
tcg_gen_addi_ptr(gptr, cpu_env, gofs);
27
-
27
- t = tcg_const_i32(words);
28
struct CPUBreakpoint *cpu_breakpoint[16];
28
29
struct CPUWatchpoint *cpu_watchpoint[16];
29
- gen_helper_sve_predtest(t, dptr, gptr, t);
30
30
+ gen_helper_sve_predtest(t, dptr, gptr, tcg_constant_i32(words));
31
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
31
tcg_temp_free_ptr(dptr);
32
const struct arm_boot_info *boot_info;
32
tcg_temp_free_ptr(gptr);
33
/* Store GICv3CPUState to access from this struct */
33
34
void *gicv3state;
34
@@ -XXX,XX +XXX,XX @@ static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
35
+#if defined(CONFIG_USER_ONLY)
35
36
+ /* For usermode syscall translation. */
36
tcg_gen_addi_ptr(t_pd, cpu_env, pred_full_reg_offset(s, a->rd));
37
+ bool eabi;
37
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, a->rn));
38
+#endif /* CONFIG_USER_ONLY */
38
- t = tcg_const_i32(desc);
39
39
+ t = tcg_temp_new_i32();
40
#ifdef TARGET_TAGGED_ADDRESSES
40
41
/* Linux syscall tagged address support */
41
- gen_fn(t, t_pd, t_pg, t);
42
+ gen_fn(t, t_pd, t_pg, tcg_constant_i32(desc));
43
tcg_temp_free_ptr(t_pd);
44
tcg_temp_free_ptr(t_pg);
45
46
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
47
}
48
49
vsz = vec_full_reg_size(s);
50
- t = tcg_const_i32(simd_desc(vsz, vsz, 0));
51
+ t = tcg_temp_new_i32();
52
pd = tcg_temp_new_ptr();
53
zn = tcg_temp_new_ptr();
54
zm = tcg_temp_new_ptr();
55
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
56
tcg_gen_addi_ptr(zm, cpu_env, vec_full_reg_offset(s, a->rm));
57
tcg_gen_addi_ptr(pg, cpu_env, pred_full_reg_offset(s, a->pg));
58
59
- gen_fn(t, pd, zn, zm, pg, t);
60
+ gen_fn(t, pd, zn, zm, pg, tcg_constant_i32(simd_desc(vsz, vsz, 0)));
61
62
tcg_temp_free_ptr(pd);
63
tcg_temp_free_ptr(zn);
64
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
65
}
66
67
vsz = vec_full_reg_size(s);
68
- t = tcg_const_i32(simd_desc(vsz, vsz, a->imm));
69
+ t = tcg_temp_new_i32();
70
pd = tcg_temp_new_ptr();
71
zn = tcg_temp_new_ptr();
72
pg = tcg_temp_new_ptr();
73
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
74
tcg_gen_addi_ptr(zn, cpu_env, vec_full_reg_offset(s, a->rn));
75
tcg_gen_addi_ptr(pg, cpu_env, pred_full_reg_offset(s, a->pg));
76
77
- gen_fn(t, pd, zn, pg, t);
78
+ gen_fn(t, pd, zn, pg, tcg_constant_i32(simd_desc(vsz, vsz, a->imm)));
79
80
tcg_temp_free_ptr(pd);
81
tcg_temp_free_ptr(zn);
82
--
42
--
83
2.25.1
43
2.34.1
44
45
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-id: 20220426163043.100432-45-richard.henderson@linaro.org
5
Message-id: 20230206223502.25122-8-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 15 +++++----------
8
target/arm/cpu.h | 3 ++-
9
1 file changed, 5 insertions(+), 10 deletions(-)
9
1 file changed, 2 insertions(+), 1 deletion(-)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/target/arm/cpu.h
14
+++ b/target/arm/translate-sve.c
14
+++ b/target/arm/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
15
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
16
return false;
16
17
}
17
void *nvic;
18
if (sve_access_check(s)) {
18
const struct arm_boot_info *boot_info;
19
- TCGv_i64 val = tcg_const_i64(a->imm);
19
+#if !defined(CONFIG_USER_ONLY)
20
- do_sat_addsub_vec(s, a->esz, a->rd, a->rn, val, u, d);
20
/* Store GICv3CPUState to access from this struct */
21
- tcg_temp_free_i64(val);
21
void *gicv3state;
22
+ do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
22
-#if defined(CONFIG_USER_ONLY)
23
+ tcg_constant_i64(a->imm), u, d);
23
+#else /* CONFIG_USER_ONLY */
24
}
24
/* For usermode syscall translation. */
25
return true;
25
bool eabi;
26
}
26
#endif /* CONFIG_USER_ONLY */
27
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
28
{
29
if (sve_access_check(s)) {
30
unsigned vsz = vec_full_reg_size(s);
31
- TCGv_i64 c = tcg_const_i64(a->imm);
32
-
33
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
34
vec_full_reg_offset(s, a->rn),
35
- c, vsz, vsz, 0, fn);
36
- tcg_temp_free_i64(c);
37
+ tcg_constant_i64(a->imm), vsz, vsz, 0, fn);
38
}
39
return true;
40
}
41
@@ -XXX,XX +XXX,XX @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16,
42
static void do_fp_imm(DisasContext *s, arg_rpri_esz *a, uint64_t imm,
43
gen_helper_sve_fp2scalar *fn)
44
{
45
- TCGv_i64 temp = tcg_const_i64(imm);
46
- do_fp_scalar(s, a->rd, a->rn, a->pg, a->esz == MO_16, temp, fn);
47
- tcg_temp_free_i64(temp);
48
+ do_fp_scalar(s, a->rd, a->rn, a->pg, a->esz == MO_16,
49
+ tcg_constant_i64(imm), fn);
50
}
51
52
#define DO_FP_IMM(NAME, name, const0, const1) \
53
--
27
--
54
2.25.1
28
2.34.1
29
30
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-id: 20220426163043.100432-44-richard.henderson@linaro.org
5
Message-id: 20230206223502.25122-9-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 4 +---
8
target/arm/cpu.h | 2 +-
9
1 file changed, 1 insertion(+), 3 deletions(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/target/arm/cpu.h
14
+++ b/target/arm/translate-sve.c
14
+++ b/target/arm/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
15
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
16
}
16
} sau;
17
if (sve_access_check(s)) {
17
18
unsigned vsz = vec_full_reg_size(s);
18
void *nvic;
19
- TCGv_i64 c = tcg_const_i64(a->imm);
19
- const struct arm_boot_info *boot_info;
20
tcg_gen_gvec_2s(vec_full_reg_offset(s, a->rd),
20
#if !defined(CONFIG_USER_ONLY)
21
vec_full_reg_offset(s, a->rn),
21
+ const struct arm_boot_info *boot_info;
22
- vsz, vsz, c, &op[a->esz]);
22
/* Store GICv3CPUState to access from this struct */
23
- tcg_temp_free_i64(c);
23
void *gicv3state;
24
+ vsz, vsz, tcg_constant_i64(a->imm), &op[a->esz]);
24
#else /* CONFIG_USER_ONLY */
25
}
26
return true;
27
}
28
--
25
--
29
2.25.1
26
2.34.1
27
28
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220426163043.100432-42-richard.henderson@linaro.org
5
Message-id: 20230206223502.25122-10-philmd@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 20 +++++++-------------
8
target/arm/cpu.h | 2 +-
9
1 file changed, 7 insertions(+), 13 deletions(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/target/arm/cpu.h
14
+++ b/target/arm/translate-sve.c
14
+++ b/target/arm/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CTERM(DisasContext *s, arg_CTERM *a)
15
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
16
static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
16
uint32_t ctrl;
17
{
17
} sau;
18
TCGv_i64 op0, op1, t0, t1, tmax;
18
19
- TCGv_i32 t2, t3;
19
- void *nvic;
20
+ TCGv_i32 t2;
20
#if !defined(CONFIG_USER_ONLY)
21
TCGv_ptr ptr;
21
+ void *nvic;
22
unsigned vsz = vec_full_reg_size(s);
22
const struct arm_boot_info *boot_info;
23
unsigned desc = 0;
23
/* Store GICv3CPUState to access from this struct */
24
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
24
void *gicv3state;
25
}
26
}
27
28
- tmax = tcg_const_i64(vsz >> a->esz);
29
+ tmax = tcg_constant_i64(vsz >> a->esz);
30
if (eq) {
31
/* Equality means one more iteration. */
32
tcg_gen_addi_i64(t0, t0, 1);
33
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
34
35
/* Bound to the maximum. */
36
tcg_gen_umin_i64(t0, t0, tmax);
37
- tcg_temp_free_i64(tmax);
38
39
/* Set the count to zero if the condition is false. */
40
tcg_gen_movi_i64(t1, 0);
41
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
42
43
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8);
44
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
45
- t3 = tcg_const_i32(desc);
46
47
ptr = tcg_temp_new_ptr();
48
tcg_gen_addi_ptr(ptr, cpu_env, pred_full_reg_offset(s, a->rd));
49
50
if (a->lt) {
51
- gen_helper_sve_whilel(t2, ptr, t2, t3);
52
+ gen_helper_sve_whilel(t2, ptr, t2, tcg_constant_i32(desc));
53
} else {
54
- gen_helper_sve_whileg(t2, ptr, t2, t3);
55
+ gen_helper_sve_whileg(t2, ptr, t2, tcg_constant_i32(desc));
56
}
57
do_pred_flags(t2);
58
59
tcg_temp_free_ptr(ptr);
60
tcg_temp_free_i32(t2);
61
- tcg_temp_free_i32(t3);
62
return true;
63
}
64
65
static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
66
{
67
TCGv_i64 op0, op1, diff, t1, tmax;
68
- TCGv_i32 t2, t3;
69
+ TCGv_i32 t2;
70
TCGv_ptr ptr;
71
unsigned vsz = vec_full_reg_size(s);
72
unsigned desc = 0;
73
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
74
op0 = read_cpu_reg(s, a->rn, 1);
75
op1 = read_cpu_reg(s, a->rm, 1);
76
77
- tmax = tcg_const_i64(vsz);
78
+ tmax = tcg_constant_i64(vsz);
79
diff = tcg_temp_new_i64();
80
81
if (a->rw) {
82
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
83
84
/* Bound to the maximum. */
85
tcg_gen_umin_i64(diff, diff, tmax);
86
- tcg_temp_free_i64(tmax);
87
88
/* Since we're bounded, pass as a 32-bit type. */
89
t2 = tcg_temp_new_i32();
90
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
91
92
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8);
93
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
94
- t3 = tcg_const_i32(desc);
95
96
ptr = tcg_temp_new_ptr();
97
tcg_gen_addi_ptr(ptr, cpu_env, pred_full_reg_offset(s, a->rd));
98
99
- gen_helper_sve_whilel(t2, ptr, t2, t3);
100
+ gen_helper_sve_whilel(t2, ptr, t2, tcg_constant_i32(desc));
101
do_pred_flags(t2);
102
103
tcg_temp_free_ptr(ptr);
104
tcg_temp_free_i32(t2);
105
- tcg_temp_free_i32(t3);
106
return true;
107
}
108
109
--
25
--
110
2.25.1
26
2.34.1
27
28
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Finish conversion of the file to tcg_constant_*.
3
There is no point in using a void pointer to access the NVIC.
4
4
Use the real type to avoid casting it while debugging.
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Message-id: 20220426163043.100432-22-richard.henderson@linaro.org
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20230206223502.25122-11-philmd@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
target/arm/translate-a64.c | 20 ++++++++------------
11
target/arm/cpu.h | 46 ++++++++++++++++++++++---------------------
11
1 file changed, 8 insertions(+), 12 deletions(-)
12
hw/intc/armv7m_nvic.c | 38 ++++++++++++-----------------------
12
13
target/arm/cpu.c | 1 +
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
14
target/arm/m_helper.c | 2 +-
15
4 files changed, 39 insertions(+), 48 deletions(-)
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
19
--- a/target/arm/cpu.h
16
+++ b/target/arm/translate-a64.c
20
+++ b/target/arm/cpu.h
17
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
21
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMTBFlags {
18
}
22
19
23
typedef struct ARMMMUFaultInfo ARMMMUFaultInfo;
20
if (is_scalar) {
24
21
- tcg_res[1] = tcg_const_i64(0);
25
+typedef struct NVICState NVICState;
22
+ tcg_res[1] = tcg_constant_i64(0);
26
+
23
}
27
typedef struct CPUArchState {
24
28
/* Regs for current mode. */
25
for (pass = 0; pass < 2; pass++) {
29
uint32_t regs[16];
26
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
30
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
27
tcg_op2 = tcg_temp_new_i32();
31
} sau;
28
tcg_op3 = tcg_temp_new_i32();
32
29
tcg_res = tcg_temp_new_i32();
33
#if !defined(CONFIG_USER_ONLY)
30
- tcg_zero = tcg_const_i32(0);
34
- void *nvic;
31
+ tcg_zero = tcg_constant_i32(0);
35
+ NVICState *nvic;
32
36
const struct arm_boot_info *boot_info;
33
read_vec_element_i32(s, tcg_op1, rn, 3, MO_32);
37
/* Store GICv3CPUState to access from this struct */
34
read_vec_element_i32(s, tcg_op2, rm, 3, MO_32);
38
void *gicv3state;
35
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
39
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
36
tcg_temp_free_i32(tcg_op2);
40
37
tcg_temp_free_i32(tcg_op3);
41
/* Interface between CPU and Interrupt controller. */
38
tcg_temp_free_i32(tcg_res);
42
#ifndef CONFIG_USER_ONLY
39
- tcg_temp_free_i32(tcg_zero);
43
-bool armv7m_nvic_can_take_pending_exception(void *opaque);
44
+bool armv7m_nvic_can_take_pending_exception(NVICState *s);
45
#else
46
-static inline bool armv7m_nvic_can_take_pending_exception(void *opaque)
47
+static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
48
{
49
return true;
50
}
51
#endif
52
/**
53
* armv7m_nvic_set_pending: mark the specified exception as pending
54
- * @opaque: the NVIC
55
+ * @s: the NVIC
56
* @irq: the exception number to mark pending
57
* @secure: false for non-banked exceptions or for the nonsecure
58
* version of a banked exception, true for the secure version of a banked
59
@@ -XXX,XX +XXX,XX @@ static inline bool armv7m_nvic_can_take_pending_exception(void *opaque)
60
* if @secure is true and @irq does not specify one of the fixed set
61
* of architecturally banked exceptions.
62
*/
63
-void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
64
+void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
65
/**
66
* armv7m_nvic_set_pending_derived: mark this derived exception as pending
67
- * @opaque: the NVIC
68
+ * @s: the NVIC
69
* @irq: the exception number to mark pending
70
* @secure: false for non-banked exceptions or for the nonsecure
71
* version of a banked exception, true for the secure version of a banked
72
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
73
* exceptions (exceptions generated in the course of trying to take
74
* a different exception).
75
*/
76
-void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
77
+void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
78
/**
79
* armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
80
- * @opaque: the NVIC
81
+ * @s: the NVIC
82
* @irq: the exception number to mark pending
83
* @secure: false for non-banked exceptions or for the nonsecure
84
* version of a banked exception, true for the secure version of a banked
85
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
86
* Similar to armv7m_nvic_set_pending(), but specifically for exceptions
87
* generated in the course of lazy stacking of FP registers.
88
*/
89
-void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure);
90
+void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
91
/**
92
* armv7m_nvic_get_pending_irq_info: return highest priority pending
93
* exception, and whether it targets Secure state
94
- * @opaque: the NVIC
95
+ * @s: the NVIC
96
* @pirq: set to pending exception number
97
* @ptargets_secure: set to whether pending exception targets Secure
98
*
99
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure);
100
* to true if the current highest priority pending exception should
101
* be taken to Secure state, false for NS.
102
*/
103
-void armv7m_nvic_get_pending_irq_info(void *opaque, int *pirq,
104
+void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
105
bool *ptargets_secure);
106
/**
107
* armv7m_nvic_acknowledge_irq: make highest priority pending exception active
108
- * @opaque: the NVIC
109
+ * @s: the NVIC
110
*
111
* Move the current highest priority pending exception from the pending
112
* state to the active state, and update v7m.exception to indicate that
113
* it is the exception currently being handled.
114
*/
115
-void armv7m_nvic_acknowledge_irq(void *opaque);
116
+void armv7m_nvic_acknowledge_irq(NVICState *s);
117
/**
118
* armv7m_nvic_complete_irq: complete specified interrupt or exception
119
- * @opaque: the NVIC
120
+ * @s: the NVIC
121
* @irq: the exception number to complete
122
* @secure: true if this exception was secure
123
*
124
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque);
125
* 0 if there is still an irq active after this one was completed
126
* (Ignoring -1, this is the same as the RETTOBASE value before completion.)
127
*/
128
-int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure);
129
+int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
130
/**
131
* armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
132
- * @opaque: the NVIC
133
+ * @s: the NVIC
134
* @irq: the exception number to mark pending
135
* @secure: false for non-banked exceptions or for the nonsecure
136
* version of a banked exception, true for the secure version of a banked
137
@@ -XXX,XX +XXX,XX @@ int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure);
138
* interrupt the current execution priority. This controls whether the
139
* RDY bit for it in the FPCCR is set.
140
*/
141
-bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure);
142
+bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
143
/**
144
* armv7m_nvic_raw_execution_priority: return the raw execution priority
145
- * @opaque: the NVIC
146
+ * @s: the NVIC
147
*
148
* Returns: the raw execution priority as defined by the v8M architecture.
149
* This is the execution priority minus the effects of AIRCR.PRIS,
150
* and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
151
* (v8M ARM ARM I_PKLD.)
152
*/
153
-int armv7m_nvic_raw_execution_priority(void *opaque);
154
+int armv7m_nvic_raw_execution_priority(NVICState *s);
155
/**
156
* armv7m_nvic_neg_prio_requested: return true if the requested execution
157
* priority is negative for the specified security state.
158
- * @opaque: the NVIC
159
+ * @s: the NVIC
160
* @secure: the security state to test
161
* This corresponds to the pseudocode IsReqExecPriNeg().
162
*/
163
#ifndef CONFIG_USER_ONLY
164
-bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure);
165
+bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
166
#else
167
-static inline bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
168
+static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
169
{
170
return false;
171
}
172
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
173
index XXXXXXX..XXXXXXX 100644
174
--- a/hw/intc/armv7m_nvic.c
175
+++ b/hw/intc/armv7m_nvic.c
176
@@ -XXX,XX +XXX,XX @@ static inline int nvic_exec_prio(NVICState *s)
177
return MIN(running, s->exception_prio);
178
}
179
180
-bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
181
+bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
182
{
183
/* Return true if the requested execution priority is negative
184
* for the specified security state, ie that security state
185
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
186
* mean we don't allow FAULTMASK_NS to actually make the execution
187
* priority negative). Compare pseudocode IsReqExcPriNeg().
188
*/
189
- NVICState *s = opaque;
190
-
191
if (s->cpu->env.v7m.faultmask[secure]) {
192
return true;
40
}
193
}
41
}
194
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
42
195
return false;
43
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
196
}
44
gen_helper_yield(cpu_env);
197
45
break;
198
-bool armv7m_nvic_can_take_pending_exception(void *opaque)
46
case DISAS_WFI:
199
+bool armv7m_nvic_can_take_pending_exception(NVICState *s)
47
- {
200
{
48
- /* This is a special case because we don't want to just halt the CPU
201
- NVICState *s = opaque;
49
- * if trying to debug across a WFI.
50
+ /*
51
+ * This is a special case because we don't want to just halt
52
+ * the CPU if trying to debug across a WFI.
53
*/
54
- TCGv_i32 tmp = tcg_const_i32(4);
55
-
202
-
56
gen_a64_set_pc_im(dc->base.pc_next);
203
return nvic_exec_prio(s) > nvic_pending_prio(s);
57
- gen_helper_wfi(cpu_env, tmp);
204
}
58
- tcg_temp_free_i32(tmp);
205
59
- /* The helper doesn't necessarily throw an exception, but we
206
-int armv7m_nvic_raw_execution_priority(void *opaque)
60
+ gen_helper_wfi(cpu_env, tcg_constant_i32(4));
207
+int armv7m_nvic_raw_execution_priority(NVICState *s)
61
+ /*
208
{
62
+ * The helper doesn't necessarily throw an exception, but we
209
- NVICState *s = opaque;
63
* must go back to the main loop to check for interrupts anyway.
210
-
64
*/
211
return s->exception_prio;
65
tcg_gen_exit_tb(NULL, 0);
212
}
66
break;
213
67
}
214
@@ -XXX,XX +XXX,XX @@ static void nvic_irq_update(NVICState *s)
68
- }
215
* if @secure is true and @irq does not specify one of the fixed set
216
* of architecturally banked exceptions.
217
*/
218
-static void armv7m_nvic_clear_pending(void *opaque, int irq, bool secure)
219
+static void armv7m_nvic_clear_pending(NVICState *s, int irq, bool secure)
220
{
221
- NVICState *s = (NVICState *)opaque;
222
VecInfo *vec;
223
224
assert(irq > ARMV7M_EXCP_RESET && irq < s->num_irq);
225
@@ -XXX,XX +XXX,XX @@ static void do_armv7m_nvic_set_pending(void *opaque, int irq, bool secure,
69
}
226
}
70
}
227
}
71
228
229
-void armv7m_nvic_set_pending(void *opaque, int irq, bool secure)
230
+void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure)
231
{
232
- do_armv7m_nvic_set_pending(opaque, irq, secure, false);
233
+ do_armv7m_nvic_set_pending(s, irq, secure, false);
234
}
235
236
-void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure)
237
+void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure)
238
{
239
- do_armv7m_nvic_set_pending(opaque, irq, secure, true);
240
+ do_armv7m_nvic_set_pending(s, irq, secure, true);
241
}
242
243
-void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure)
244
+void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure)
245
{
246
/*
247
* Pend an exception during lazy FP stacking. This differs
248
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure)
249
* whether we should escalate depends on the saved context
250
* in the FPCCR register, not on the current state of the CPU/NVIC.
251
*/
252
- NVICState *s = (NVICState *)opaque;
253
bool banked = exc_is_banked(irq);
254
VecInfo *vec;
255
bool targets_secure;
256
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure)
257
}
258
259
/* Make pending IRQ active. */
260
-void armv7m_nvic_acknowledge_irq(void *opaque)
261
+void armv7m_nvic_acknowledge_irq(NVICState *s)
262
{
263
- NVICState *s = (NVICState *)opaque;
264
CPUARMState *env = &s->cpu->env;
265
const int pending = s->vectpending;
266
const int running = nvic_exec_prio(s);
267
@@ -XXX,XX +XXX,XX @@ static bool vectpending_targets_secure(NVICState *s)
268
exc_targets_secure(s, s->vectpending);
269
}
270
271
-void armv7m_nvic_get_pending_irq_info(void *opaque,
272
+void armv7m_nvic_get_pending_irq_info(NVICState *s,
273
int *pirq, bool *ptargets_secure)
274
{
275
- NVICState *s = (NVICState *)opaque;
276
const int pending = s->vectpending;
277
bool targets_secure;
278
279
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_get_pending_irq_info(void *opaque,
280
*pirq = pending;
281
}
282
283
-int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure)
284
+int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure)
285
{
286
- NVICState *s = (NVICState *)opaque;
287
VecInfo *vec = NULL;
288
int ret = 0;
289
290
@@ -XXX,XX +XXX,XX @@ int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure)
291
return ret;
292
}
293
294
-bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
295
+bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure)
296
{
297
/*
298
* Return whether an exception is "ready", i.e. it is enabled and is
299
@@ -XXX,XX +XXX,XX @@ bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
300
* for non-banked exceptions secure is always false; for banked exceptions
301
* it indicates which of the exceptions is required.
302
*/
303
- NVICState *s = (NVICState *)opaque;
304
bool banked = exc_is_banked(irq);
305
VecInfo *vec;
306
int running = nvic_exec_prio(s);
307
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
308
index XXXXXXX..XXXXXXX 100644
309
--- a/target/arm/cpu.c
310
+++ b/target/arm/cpu.c
311
@@ -XXX,XX +XXX,XX @@
312
#if !defined(CONFIG_USER_ONLY)
313
#include "hw/loader.h"
314
#include "hw/boards.h"
315
+#include "hw/intc/armv7m_nvic.h"
316
#endif
317
#include "sysemu/tcg.h"
318
#include "sysemu/qtest.h"
319
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
320
index XXXXXXX..XXXXXXX 100644
321
--- a/target/arm/m_helper.c
322
+++ b/target/arm/m_helper.c
323
@@ -XXX,XX +XXX,XX @@ static void v7m_update_fpccr(CPUARMState *env, uint32_t frameptr,
324
* that we will need later in order to do lazy FP reg stacking.
325
*/
326
bool is_secure = env->v7m.secure;
327
- void *nvic = env->nvic;
328
+ NVICState *nvic = env->nvic;
329
/*
330
* Some bits are unbanked and live always in fpccr[M_REG_S]; some bits
331
* are banked and we want to update the bit in the bank for the
72
--
332
--
73
2.25.1
333
2.34.1
334
335
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
As of now, cryptographic instructions ISAR fields are never cleared so
3
While dozens of files include "cpu.h", only 3 files require
4
we can end up with a cpu with cryptographic instructions but no
4
these NVIC helper declarations.
5
floating-point/neon instructions which is not a possible configuration
5
6
according to Arm specifications.
7
8
In QEMU, we have 3 kinds of cpus regarding cryptographic instructions:
9
+ no support
10
+ cortex-a57/a72: cryptographic extension is optional,
11
floating-point/neon is not.
12
+ cortex-a53: crytographic extension is optional as well as
13
floating-point/neon. But cryptographic requires
14
floating-point/neon support.
15
16
Therefore we can safely clear the ISAR fields when neon is disabled.
17
18
Note that other Arm cpus seem to follow this. For example cortex-a55 is
19
like cortex-a53 and cortex-a76/cortex-a710 are like cortex-a57/a72.
20
21
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
23
Message-id: 20220427090117.6954-1-damien.hedde@greensocs.com
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
24
[PMM: fixed commit message typos]
8
Message-id: 20230206223502.25122-12-philmd@linaro.org
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
10
---
27
target/arm/cpu.c | 9 +++++++++
11
include/hw/intc/armv7m_nvic.h | 123 ++++++++++++++++++++++++++++++++++
28
1 file changed, 9 insertions(+)
12
target/arm/cpu.h | 123 ----------------------------------
29
13
target/arm/cpu.c | 4 +-
14
target/arm/cpu_tcg.c | 3 +
15
target/arm/m_helper.c | 3 +
16
5 files changed, 132 insertions(+), 124 deletions(-)
17
18
diff --git a/include/hw/intc/armv7m_nvic.h b/include/hw/intc/armv7m_nvic.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/intc/armv7m_nvic.h
21
+++ b/include/hw/intc/armv7m_nvic.h
22
@@ -XXX,XX +XXX,XX @@ struct NVICState {
23
qemu_irq sysresetreq;
24
};
25
26
+/* Interface between CPU and Interrupt controller. */
27
+/**
28
+ * armv7m_nvic_set_pending: mark the specified exception as pending
29
+ * @s: the NVIC
30
+ * @irq: the exception number to mark pending
31
+ * @secure: false for non-banked exceptions or for the nonsecure
32
+ * version of a banked exception, true for the secure version of a banked
33
+ * exception.
34
+ *
35
+ * Marks the specified exception as pending. Note that we will assert()
36
+ * if @secure is true and @irq does not specify one of the fixed set
37
+ * of architecturally banked exceptions.
38
+ */
39
+void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
40
+/**
41
+ * armv7m_nvic_set_pending_derived: mark this derived exception as pending
42
+ * @s: the NVIC
43
+ * @irq: the exception number to mark pending
44
+ * @secure: false for non-banked exceptions or for the nonsecure
45
+ * version of a banked exception, true for the secure version of a banked
46
+ * exception.
47
+ *
48
+ * Similar to armv7m_nvic_set_pending(), but specifically for derived
49
+ * exceptions (exceptions generated in the course of trying to take
50
+ * a different exception).
51
+ */
52
+void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
53
+/**
54
+ * armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
55
+ * @s: the NVIC
56
+ * @irq: the exception number to mark pending
57
+ * @secure: false for non-banked exceptions or for the nonsecure
58
+ * version of a banked exception, true for the secure version of a banked
59
+ * exception.
60
+ *
61
+ * Similar to armv7m_nvic_set_pending(), but specifically for exceptions
62
+ * generated in the course of lazy stacking of FP registers.
63
+ */
64
+void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
65
+/**
66
+ * armv7m_nvic_get_pending_irq_info: return highest priority pending
67
+ * exception, and whether it targets Secure state
68
+ * @s: the NVIC
69
+ * @pirq: set to pending exception number
70
+ * @ptargets_secure: set to whether pending exception targets Secure
71
+ *
72
+ * This function writes the number of the highest priority pending
73
+ * exception (the one which would be made active by
74
+ * armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
75
+ * to true if the current highest priority pending exception should
76
+ * be taken to Secure state, false for NS.
77
+ */
78
+void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
79
+ bool *ptargets_secure);
80
+/**
81
+ * armv7m_nvic_acknowledge_irq: make highest priority pending exception active
82
+ * @s: the NVIC
83
+ *
84
+ * Move the current highest priority pending exception from the pending
85
+ * state to the active state, and update v7m.exception to indicate that
86
+ * it is the exception currently being handled.
87
+ */
88
+void armv7m_nvic_acknowledge_irq(NVICState *s);
89
+/**
90
+ * armv7m_nvic_complete_irq: complete specified interrupt or exception
91
+ * @s: the NVIC
92
+ * @irq: the exception number to complete
93
+ * @secure: true if this exception was secure
94
+ *
95
+ * Returns: -1 if the irq was not active
96
+ * 1 if completing this irq brought us back to base (no active irqs)
97
+ * 0 if there is still an irq active after this one was completed
98
+ * (Ignoring -1, this is the same as the RETTOBASE value before completion.)
99
+ */
100
+int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
101
+/**
102
+ * armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
103
+ * @s: the NVIC
104
+ * @irq: the exception number to mark pending
105
+ * @secure: false for non-banked exceptions or for the nonsecure
106
+ * version of a banked exception, true for the secure version of a banked
107
+ * exception.
108
+ *
109
+ * Return whether an exception is "ready", i.e. whether the exception is
110
+ * enabled and is configured at a priority which would allow it to
111
+ * interrupt the current execution priority. This controls whether the
112
+ * RDY bit for it in the FPCCR is set.
113
+ */
114
+bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
115
+/**
116
+ * armv7m_nvic_raw_execution_priority: return the raw execution priority
117
+ * @s: the NVIC
118
+ *
119
+ * Returns: the raw execution priority as defined by the v8M architecture.
120
+ * This is the execution priority minus the effects of AIRCR.PRIS,
121
+ * and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
122
+ * (v8M ARM ARM I_PKLD.)
123
+ */
124
+int armv7m_nvic_raw_execution_priority(NVICState *s);
125
+/**
126
+ * armv7m_nvic_neg_prio_requested: return true if the requested execution
127
+ * priority is negative for the specified security state.
128
+ * @s: the NVIC
129
+ * @secure: the security state to test
130
+ * This corresponds to the pseudocode IsReqExecPriNeg().
131
+ */
132
+#ifndef CONFIG_USER_ONLY
133
+bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
134
+#else
135
+static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
136
+{
137
+ return false;
138
+}
139
+#endif
140
+#ifndef CONFIG_USER_ONLY
141
+bool armv7m_nvic_can_take_pending_exception(NVICState *s);
142
+#else
143
+static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
144
+{
145
+ return true;
146
+}
147
+#endif
148
+
149
#endif
150
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
151
index XXXXXXX..XXXXXXX 100644
152
--- a/target/arm/cpu.h
153
+++ b/target/arm/cpu.h
154
@@ -XXX,XX +XXX,XX @@ void arm_cpu_list(void);
155
uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
156
uint32_t cur_el, bool secure);
157
158
-/* Interface between CPU and Interrupt controller. */
159
-#ifndef CONFIG_USER_ONLY
160
-bool armv7m_nvic_can_take_pending_exception(NVICState *s);
161
-#else
162
-static inline bool armv7m_nvic_can_take_pending_exception(NVICState *s)
163
-{
164
- return true;
165
-}
166
-#endif
167
-/**
168
- * armv7m_nvic_set_pending: mark the specified exception as pending
169
- * @s: the NVIC
170
- * @irq: the exception number to mark pending
171
- * @secure: false for non-banked exceptions or for the nonsecure
172
- * version of a banked exception, true for the secure version of a banked
173
- * exception.
174
- *
175
- * Marks the specified exception as pending. Note that we will assert()
176
- * if @secure is true and @irq does not specify one of the fixed set
177
- * of architecturally banked exceptions.
178
- */
179
-void armv7m_nvic_set_pending(NVICState *s, int irq, bool secure);
180
-/**
181
- * armv7m_nvic_set_pending_derived: mark this derived exception as pending
182
- * @s: the NVIC
183
- * @irq: the exception number to mark pending
184
- * @secure: false for non-banked exceptions or for the nonsecure
185
- * version of a banked exception, true for the secure version of a banked
186
- * exception.
187
- *
188
- * Similar to armv7m_nvic_set_pending(), but specifically for derived
189
- * exceptions (exceptions generated in the course of trying to take
190
- * a different exception).
191
- */
192
-void armv7m_nvic_set_pending_derived(NVICState *s, int irq, bool secure);
193
-/**
194
- * armv7m_nvic_set_pending_lazyfp: mark this lazy FP exception as pending
195
- * @s: the NVIC
196
- * @irq: the exception number to mark pending
197
- * @secure: false for non-banked exceptions or for the nonsecure
198
- * version of a banked exception, true for the secure version of a banked
199
- * exception.
200
- *
201
- * Similar to armv7m_nvic_set_pending(), but specifically for exceptions
202
- * generated in the course of lazy stacking of FP registers.
203
- */
204
-void armv7m_nvic_set_pending_lazyfp(NVICState *s, int irq, bool secure);
205
-/**
206
- * armv7m_nvic_get_pending_irq_info: return highest priority pending
207
- * exception, and whether it targets Secure state
208
- * @s: the NVIC
209
- * @pirq: set to pending exception number
210
- * @ptargets_secure: set to whether pending exception targets Secure
211
- *
212
- * This function writes the number of the highest priority pending
213
- * exception (the one which would be made active by
214
- * armv7m_nvic_acknowledge_irq()) to @pirq, and sets @ptargets_secure
215
- * to true if the current highest priority pending exception should
216
- * be taken to Secure state, false for NS.
217
- */
218
-void armv7m_nvic_get_pending_irq_info(NVICState *s, int *pirq,
219
- bool *ptargets_secure);
220
-/**
221
- * armv7m_nvic_acknowledge_irq: make highest priority pending exception active
222
- * @s: the NVIC
223
- *
224
- * Move the current highest priority pending exception from the pending
225
- * state to the active state, and update v7m.exception to indicate that
226
- * it is the exception currently being handled.
227
- */
228
-void armv7m_nvic_acknowledge_irq(NVICState *s);
229
-/**
230
- * armv7m_nvic_complete_irq: complete specified interrupt or exception
231
- * @s: the NVIC
232
- * @irq: the exception number to complete
233
- * @secure: true if this exception was secure
234
- *
235
- * Returns: -1 if the irq was not active
236
- * 1 if completing this irq brought us back to base (no active irqs)
237
- * 0 if there is still an irq active after this one was completed
238
- * (Ignoring -1, this is the same as the RETTOBASE value before completion.)
239
- */
240
-int armv7m_nvic_complete_irq(NVICState *s, int irq, bool secure);
241
-/**
242
- * armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure)
243
- * @s: the NVIC
244
- * @irq: the exception number to mark pending
245
- * @secure: false for non-banked exceptions or for the nonsecure
246
- * version of a banked exception, true for the secure version of a banked
247
- * exception.
248
- *
249
- * Return whether an exception is "ready", i.e. whether the exception is
250
- * enabled and is configured at a priority which would allow it to
251
- * interrupt the current execution priority. This controls whether the
252
- * RDY bit for it in the FPCCR is set.
253
- */
254
-bool armv7m_nvic_get_ready_status(NVICState *s, int irq, bool secure);
255
-/**
256
- * armv7m_nvic_raw_execution_priority: return the raw execution priority
257
- * @s: the NVIC
258
- *
259
- * Returns: the raw execution priority as defined by the v8M architecture.
260
- * This is the execution priority minus the effects of AIRCR.PRIS,
261
- * and minus any PRIMASK/FAULTMASK/BASEPRI priority boosting.
262
- * (v8M ARM ARM I_PKLD.)
263
- */
264
-int armv7m_nvic_raw_execution_priority(NVICState *s);
265
-/**
266
- * armv7m_nvic_neg_prio_requested: return true if the requested execution
267
- * priority is negative for the specified security state.
268
- * @s: the NVIC
269
- * @secure: the security state to test
270
- * This corresponds to the pseudocode IsReqExecPriNeg().
271
- */
272
-#ifndef CONFIG_USER_ONLY
273
-bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure);
274
-#else
275
-static inline bool armv7m_nvic_neg_prio_requested(NVICState *s, bool secure)
276
-{
277
- return false;
278
-}
279
-#endif
280
-
281
/* Interface for defining coprocessor registers.
282
* Registers are defined in tables of arm_cp_reginfo structs
283
* which are passed to define_arm_cp_regs().
30
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
284
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
31
index XXXXXXX..XXXXXXX 100644
285
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/cpu.c
286
--- a/target/arm/cpu.c
33
+++ b/target/arm/cpu.c
287
+++ b/target/arm/cpu.c
34
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
288
@@ -XXX,XX +XXX,XX @@
35
unset_feature(env, ARM_FEATURE_NEON);
289
#if !defined(CONFIG_USER_ONLY)
36
290
#include "hw/loader.h"
37
t = cpu->isar.id_aa64isar0;
291
#include "hw/boards.h"
38
+ t = FIELD_DP64(t, ID_AA64ISAR0, AES, 0);
292
+#ifdef CONFIG_TCG
39
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 0);
293
#include "hw/intc/armv7m_nvic.h"
40
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 0);
294
-#endif
41
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 0);
295
+#endif /* CONFIG_TCG */
42
+ t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 0);
296
+#endif /* !CONFIG_USER_ONLY */
43
+ t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 0);
297
#include "sysemu/tcg.h"
44
t = FIELD_DP64(t, ID_AA64ISAR0, DP, 0);
298
#include "sysemu/qtest.h"
45
cpu->isar.id_aa64isar0 = t;
299
#include "sysemu/hw_accel.h"
46
300
diff --git a/target/arm/cpu_tcg.c b/target/arm/cpu_tcg.c
47
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
301
index XXXXXXX..XXXXXXX 100644
48
cpu->isar.id_aa64pfr0 = t;
302
--- a/target/arm/cpu_tcg.c
49
303
+++ b/target/arm/cpu_tcg.c
50
u = cpu->isar.id_isar5;
304
@@ -XXX,XX +XXX,XX @@
51
+ u = FIELD_DP32(u, ID_ISAR5, AES, 0);
305
#include "hw/boards.h"
52
+ u = FIELD_DP32(u, ID_ISAR5, SHA1, 0);
306
#endif
53
+ u = FIELD_DP32(u, ID_ISAR5, SHA2, 0);
307
#include "cpregs.h"
54
u = FIELD_DP32(u, ID_ISAR5, RDM, 0);
308
+#if !defined(CONFIG_USER_ONLY) && defined(CONFIG_TCG)
55
u = FIELD_DP32(u, ID_ISAR5, VCMA, 0);
309
+#include "hw/intc/armv7m_nvic.h"
56
cpu->isar.id_isar5 = u;
310
+#endif
311
312
313
/* Share AArch32 -cpu max features with AArch64. */
314
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
315
index XXXXXXX..XXXXXXX 100644
316
--- a/target/arm/m_helper.c
317
+++ b/target/arm/m_helper.c
318
@@ -XXX,XX +XXX,XX @@
319
#include "exec/cpu_ldst.h"
320
#include "semihosting/common-semi.h"
321
#endif
322
+#if !defined(CONFIG_USER_ONLY)
323
+#include "hw/intc/armv7m_nvic.h"
324
+#endif
325
326
static void v7m_msr_xpsr(CPUARMState *env, uint32_t mask,
327
uint32_t reg, uint32_t val)
57
--
328
--
58
2.25.1
329
2.34.1
330
331
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
The two TCG tests for GICv2 and GICv3 are very heavy weight distros
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
that take a long time to boot up, especially for an --enable-debug
5
Message-id: 20220426163043.100432-41-richard.henderson@linaro.org
5
build. The total code coverage they give is:
6
7
Overall coverage rate:
8
lines......: 11.2% (59584 of 530123 lines)
9
functions..: 15.0% (7436 of 49443 functions)
10
branches...: 6.3% (19273 of 303933 branches)
11
12
We already get pretty close to that with the machine_aarch64_virt
13
tests which only does one full boot (~120s vs ~600s) of alpine. We
14
expand the kernel+initrd boot (~8s) to test both GICs and also add an
15
RNG device and a block device to generate a few IRQs and exercise the
16
storage layer. With that we get to a coverage of:
17
18
Overall coverage rate:
19
lines......: 11.0% (58121 of 530123 lines)
20
functions..: 14.9% (7343 of 49443 functions)
21
branches...: 6.0% (18269 of 303933 branches)
22
23
which I feel is close enough given the massive time saving. If we want
24
to target any more sub-systems we can use lighter weight more directed
25
tests.
26
27
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
28
Reviewed-by: Fabiano Rosas <farosas@suse.de>
29
Acked-by: Richard Henderson <richard.henderson@linaro.org>
30
Message-id: 20230203181632.2919715-1-alex.bennee@linaro.org
31
Cc: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
32
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
33
---
8
target/arm/translate-sve.c | 7 +++----
34
tests/avocado/boot_linux.py | 48 ++++----------------
9
1 file changed, 3 insertions(+), 4 deletions(-)
35
tests/avocado/machine_aarch64_virt.py | 63 ++++++++++++++++++++++++---
10
36
2 files changed, 65 insertions(+), 46 deletions(-)
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
37
38
diff --git a/tests/avocado/boot_linux.py b/tests/avocado/boot_linux.py
12
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
40
--- a/tests/avocado/boot_linux.py
14
+++ b/target/arm/translate-sve.c
41
+++ b/tests/avocado/boot_linux.py
15
@@ -XXX,XX +XXX,XX @@ static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
42
@@ -XXX,XX +XXX,XX @@ def test_pc_q35_kvm(self):
16
bool before, TCGv_i64 reg_val)
43
self.launch_and_wait(set_up_ssh_connection=False)
17
{
44
18
TCGv_i32 last = tcg_temp_new_i32();
45
19
- TCGv_i64 ele, cmp, zero;
46
-# For Aarch64 we only boot KVM tests in CI as the TCG tests are very
20
+ TCGv_i64 ele, cmp;
47
-# heavyweight. There are lighter weight distros which we use in the
21
48
-# machine_aarch64_virt.py tests.
22
find_last_active(s, last, esz, pg);
49
+# For Aarch64 we only boot KVM tests in CI as booting the current
23
50
+# Fedora OS in TCG tests is very heavyweight. There are lighter weight
24
@@ -XXX,XX +XXX,XX @@ static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
51
+# distros which we use in the machine_aarch64_virt.py tests.
25
ele = load_last_active(s, last, rm, esz);
52
class BootLinuxAarch64(LinuxTest):
26
tcg_temp_free_i32(last);
53
"""
27
54
:avocado: tags=arch:aarch64
28
- zero = tcg_const_i64(0);
55
:avocado: tags=machine:virt
29
- tcg_gen_movcond_i64(TCG_COND_GE, reg_val, cmp, zero, ele, reg_val);
56
- :avocado: tags=machine:gic-version=2
30
+ tcg_gen_movcond_i64(TCG_COND_GE, reg_val, cmp, tcg_constant_i64(0),
57
"""
31
+ ele, reg_val);
58
timeout = 720
32
59
33
- tcg_temp_free_i64(zero);
60
- def add_common_args(self):
34
tcg_temp_free_i64(cmp);
61
- self.vm.add_args('-bios',
35
tcg_temp_free_i64(ele);
62
- os.path.join(BUILD_DIR, 'pc-bios',
36
}
63
- 'edk2-aarch64-code.fd'))
64
- self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
65
- self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
66
-
67
- @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
68
- def test_fedora_cloud_tcg_gicv2(self):
69
- """
70
- :avocado: tags=accel:tcg
71
- :avocado: tags=cpu:max
72
- :avocado: tags=device:gicv2
73
- """
74
- self.require_accelerator("tcg")
75
- self.vm.add_args("-accel", "tcg")
76
- self.vm.add_args("-cpu", "max,lpa2=off")
77
- self.vm.add_args("-machine", "virt,gic-version=2")
78
- self.add_common_args()
79
- self.launch_and_wait(set_up_ssh_connection=False)
80
-
81
- @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
82
- def test_fedora_cloud_tcg_gicv3(self):
83
- """
84
- :avocado: tags=accel:tcg
85
- :avocado: tags=cpu:max
86
- :avocado: tags=device:gicv3
87
- """
88
- self.require_accelerator("tcg")
89
- self.vm.add_args("-accel", "tcg")
90
- self.vm.add_args("-cpu", "max,lpa2=off")
91
- self.vm.add_args("-machine", "virt,gic-version=3")
92
- self.add_common_args()
93
- self.launch_and_wait(set_up_ssh_connection=False)
94
-
95
def test_virt_kvm(self):
96
"""
97
:avocado: tags=accel:kvm
98
@@ -XXX,XX +XXX,XX @@ def test_virt_kvm(self):
99
self.require_accelerator("kvm")
100
self.vm.add_args("-accel", "kvm")
101
self.vm.add_args("-machine", "virt,gic-version=host")
102
- self.add_common_args()
103
+ self.vm.add_args('-bios',
104
+ os.path.join(BUILD_DIR, 'pc-bios',
105
+ 'edk2-aarch64-code.fd'))
106
+ self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
107
+ self.vm.add_args('-object', 'rng-random,id=rng0,filename=/dev/urandom')
108
self.launch_and_wait(set_up_ssh_connection=False)
109
110
111
diff --git a/tests/avocado/machine_aarch64_virt.py b/tests/avocado/machine_aarch64_virt.py
112
index XXXXXXX..XXXXXXX 100644
113
--- a/tests/avocado/machine_aarch64_virt.py
114
+++ b/tests/avocado/machine_aarch64_virt.py
115
@@ -XXX,XX +XXX,XX @@
116
117
import time
118
import os
119
+import logging
120
121
from avocado_qemu import QemuSystemTest
122
from avocado_qemu import wait_for_console_pattern
123
from avocado_qemu import exec_command
124
from avocado_qemu import BUILD_DIR
125
+from avocado.utils import process
126
+from avocado.utils.path import find_command
127
128
class Aarch64VirtMachine(QemuSystemTest):
129
KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
130
@@ -XXX,XX +XXX,XX @@ def test_alpine_virt_tcg_gic_max(self):
131
self.wait_for_console_pattern('Welcome to Alpine Linux 3.16')
132
133
134
- def test_aarch64_virt(self):
135
+ def common_aarch64_virt(self, machine):
136
"""
137
- :avocado: tags=arch:aarch64
138
- :avocado: tags=machine:virt
139
- :avocado: tags=accel:tcg
140
- :avocado: tags=cpu:max
141
+ Common code to launch basic virt machine with kernel+initrd
142
+ and a scratch disk.
143
"""
144
+ logger = logging.getLogger('aarch64_virt')
145
+
146
kernel_url = ('https://fileserver.linaro.org/s/'
147
'z6B2ARM7DQT3HWN/download')
148
-
149
kernel_hash = 'ed11daab50c151dde0e1e9c9cb8b2d9bd3215347'
150
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
151
152
@@ -XXX,XX +XXX,XX @@ def test_aarch64_virt(self):
153
'console=ttyAMA0')
154
self.require_accelerator("tcg")
155
self.vm.add_args('-cpu', 'max,pauth-impdef=on',
156
+ '-machine', machine,
157
'-accel', 'tcg',
158
'-kernel', kernel_path,
159
'-append', kernel_command_line)
160
+
161
+ # A RNG offers an easy way to generate a few IRQs
162
+ self.vm.add_args('-device', 'virtio-rng-pci,rng=rng0')
163
+ self.vm.add_args('-object',
164
+ 'rng-random,id=rng0,filename=/dev/urandom')
165
+
166
+ # Also add a scratch block device
167
+ logger.info('creating scratch qcow2 image')
168
+ image_path = os.path.join(self.workdir, 'scratch.qcow2')
169
+ qemu_img = os.path.join(BUILD_DIR, 'qemu-img')
170
+ if not os.path.exists(qemu_img):
171
+ qemu_img = find_command('qemu-img', False)
172
+ if qemu_img is False:
173
+ self.cancel('Could not find "qemu-img", which is required to '
174
+ 'create the temporary qcow2 image')
175
+ cmd = '%s create -f qcow2 %s 8M' % (qemu_img, image_path)
176
+ process.run(cmd)
177
+
178
+ # Add the device
179
+ self.vm.add_args('-blockdev',
180
+ f"driver=qcow2,file.driver=file,file.filename={image_path},node-name=scratch")
181
+ self.vm.add_args('-device',
182
+ 'virtio-blk-device,drive=scratch')
183
+
184
self.vm.launch()
185
self.wait_for_console_pattern('Welcome to Buildroot')
186
time.sleep(0.1)
187
exec_command(self, 'root')
188
time.sleep(0.1)
189
+ exec_command(self, 'dd if=/dev/hwrng of=/dev/vda bs=512 count=4')
190
+ time.sleep(0.1)
191
+ exec_command(self, 'md5sum /dev/vda')
192
+ time.sleep(0.1)
193
+ exec_command(self, 'cat /proc/interrupts')
194
+ time.sleep(0.1)
195
exec_command(self, 'cat /proc/self/maps')
196
time.sleep(0.1)
197
+
198
+ def test_aarch64_virt_gicv3(self):
199
+ """
200
+ :avocado: tags=arch:aarch64
201
+ :avocado: tags=machine:virt
202
+ :avocado: tags=accel:tcg
203
+ :avocado: tags=cpu:max
204
+ """
205
+ self.common_aarch64_virt("virt,gic_version=3")
206
+
207
+ def test_aarch64_virt_gicv2(self):
208
+ """
209
+ :avocado: tags=arch:aarch64
210
+ :avocado: tags=machine:virt
211
+ :avocado: tags=accel:tcg
212
+ :avocado: tags=cpu:max
213
+ """
214
+ self.common_aarch64_virt("virt,gic-version=2")
37
--
215
--
38
2.25.1
216
2.34.1
217
218
diff view generated by jsdifflib
1
The Arm SMMUv3 includes an optional feature equivalent to the CPU
1
From: Mostafa Saleh <smostafa@google.com>
2
FEAT_BBM, which permits an OS to switch a range of memory between
3
"covered by a huge page" and "covered by a sequence of normal pages"
4
without having to engage in the traditional 'break-before-make'
5
dance. (This is particularly important for the SMMU, because devices
6
performing I/O through an SMMU are less likely to be able to cope with
7
the window in the sequence where an access results in a translation
8
fault.) The SMMU spec explicitly notes that one of the valid ways to
9
be a BBM level 2 compliant implementation is:
10
* if there are multiple entries in the TLB for an address,
11
choose one of them and use it, ignoring the others
12
2
13
Our SMMU TLB implementation (unlike our CPU TLB) does allow multiple
3
GBPA register can be used to globally abort all
14
TLB entries for an address, because the translation table level is
4
transactions.
15
part of the SMMUIOTLBKey, and so our IOTLB hashtable can include
16
entries for the same address where the leaf was at different levels
17
(i.e. both hugepage and normal page). Our TLB lookup implementation in
18
smmu_iotlb_lookup() will always find the entry with the lowest level
19
(i.e. it prefers the hugepage over the normal page) and ignore any
20
others. TLB invalidation correctly removes all TLB entries matching
21
the specified address or address range (unless the guest specifies the
22
leaf level explicitly, in which case it gets what it asked for). So we
23
can validly advertise support for BBML level 2.
24
5
25
Note that we still can't yet advertise ourselves as an SMMU v3.2,
6
It is described in the SMMU manual in "6.3.14 SMMU_GBPA".
26
because v3.2 requires support for the S2FWB feature, which we don't
7
ABORT reset value is IMPLEMENTATION DEFINED, it is chosen to
27
yet implement.
8
be zero(Do not abort incoming transactions).
28
9
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Other fields have default values of Use Incoming.
11
12
If UPDATE is not set, the write is ignored. This is the only permitted
13
behavior in SMMUv3.2 and later.(6.3.14.1 Update procedure)
14
15
As this patch adds a new state to the SMMU (GBPA), it is added
16
in a new subsection for forward migration compatibility.
17
GBPA is only migrated if its value is different from the reset value.
18
It does this to be backward migration compatible if SW didn't write
19
the register.
20
21
Signed-off-by: Mostafa Saleh <smostafa@google.com>
30
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
31
Reviewed-by: Eric Auger <eric.auger@redhat.com>
23
Reviewed-by: Eric Auger <eric.auger@redhat.com>
32
Message-id: 20220426160422.2353158-4-peter.maydell@linaro.org
24
Message-id: 20230214094009.2445653-1-smostafa@google.com
25
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
33
---
27
---
34
hw/arm/smmuv3-internal.h | 1 +
28
hw/arm/smmuv3-internal.h | 7 +++++++
35
hw/arm/smmuv3.c | 1 +
29
include/hw/arm/smmuv3.h | 1 +
36
2 files changed, 2 insertions(+)
30
hw/arm/smmuv3.c | 43 +++++++++++++++++++++++++++++++++++++++-
31
3 files changed, 50 insertions(+), 1 deletion(-)
37
32
38
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
33
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
39
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/smmuv3-internal.h
35
--- a/hw/arm/smmuv3-internal.h
41
+++ b/hw/arm/smmuv3-internal.h
36
+++ b/hw/arm/smmuv3-internal.h
42
@@ -XXX,XX +XXX,XX @@ REG32(IDR2, 0x8)
37
@@ -XXX,XX +XXX,XX @@ REG32(CR0ACK, 0x24)
43
REG32(IDR3, 0xc)
38
REG32(CR1, 0x28)
44
FIELD(IDR3, HAD, 2, 1);
39
REG32(CR2, 0x2c)
45
FIELD(IDR3, RIL, 10, 1);
40
REG32(STATUSR, 0x40)
46
+ FIELD(IDR3, BBML, 11, 2);
41
+REG32(GBPA, 0x44)
47
REG32(IDR4, 0x10)
42
+ FIELD(GBPA, ABORT, 20, 1)
48
REG32(IDR5, 0x14)
43
+ FIELD(GBPA, UPDATE, 31, 1)
49
FIELD(IDR5, OAS, 0, 3);
44
+
45
+/* Use incoming. */
46
+#define SMMU_GBPA_RESET_VAL 0x1000
47
+
48
REG32(IRQ_CTRL, 0x50)
49
FIELD(IRQ_CTRL, GERROR_IRQEN, 0, 1)
50
FIELD(IRQ_CTRL, PRI_IRQEN, 1, 1)
51
diff --git a/include/hw/arm/smmuv3.h b/include/hw/arm/smmuv3.h
52
index XXXXXXX..XXXXXXX 100644
53
--- a/include/hw/arm/smmuv3.h
54
+++ b/include/hw/arm/smmuv3.h
55
@@ -XXX,XX +XXX,XX @@ struct SMMUv3State {
56
uint32_t cr[3];
57
uint32_t cr0ack;
58
uint32_t statusr;
59
+ uint32_t gbpa;
60
uint32_t irq_ctrl;
61
uint32_t gerror;
62
uint32_t gerrorn;
50
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
63
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
51
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/smmuv3.c
65
--- a/hw/arm/smmuv3.c
53
+++ b/hw/arm/smmuv3.c
66
+++ b/hw/arm/smmuv3.c
54
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
67
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
55
68
s->gerror = 0;
56
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
69
s->gerrorn = 0;
57
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
70
s->statusr = 0;
58
+ s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
71
+ s->gbpa = SMMU_GBPA_RESET_VAL;
59
72
}
60
/* 4K, 16K and 64K granule support */
73
61
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1);
74
static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
75
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
76
qemu_mutex_lock(&s->mutex);
77
78
if (!smmu_enabled(s)) {
79
- status = SMMU_TRANS_DISABLE;
80
+ if (FIELD_EX32(s->gbpa, GBPA, ABORT)) {
81
+ status = SMMU_TRANS_ABORT;
82
+ } else {
83
+ status = SMMU_TRANS_DISABLE;
84
+ }
85
goto epilogue;
86
}
87
88
@@ -XXX,XX +XXX,XX @@ static MemTxResult smmu_writel(SMMUv3State *s, hwaddr offset,
89
case A_GERROR_IRQ_CFG2:
90
s->gerror_irq_cfg2 = data;
91
return MEMTX_OK;
92
+ case A_GBPA:
93
+ /*
94
+ * If UPDATE is not set, the write is ignored. This is the only
95
+ * permitted behavior in SMMUv3.2 and later.
96
+ */
97
+ if (data & R_GBPA_UPDATE_MASK) {
98
+ /* Ignore update bit as write is synchronous. */
99
+ s->gbpa = data & ~R_GBPA_UPDATE_MASK;
100
+ }
101
+ return MEMTX_OK;
102
case A_STRTAB_BASE: /* 64b */
103
s->strtab_base = deposit64(s->strtab_base, 0, 32, data);
104
return MEMTX_OK;
105
@@ -XXX,XX +XXX,XX @@ static MemTxResult smmu_readl(SMMUv3State *s, hwaddr offset,
106
case A_STATUSR:
107
*data = s->statusr;
108
return MEMTX_OK;
109
+ case A_GBPA:
110
+ *data = s->gbpa;
111
+ return MEMTX_OK;
112
case A_IRQ_CTRL:
113
case A_IRQ_CTRL_ACK:
114
*data = s->irq_ctrl;
115
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_smmuv3_queue = {
116
},
117
};
118
119
+static bool smmuv3_gbpa_needed(void *opaque)
120
+{
121
+ SMMUv3State *s = opaque;
122
+
123
+ /* Only migrate GBPA if it has different reset value. */
124
+ return s->gbpa != SMMU_GBPA_RESET_VAL;
125
+}
126
+
127
+static const VMStateDescription vmstate_gbpa = {
128
+ .name = "smmuv3/gbpa",
129
+ .version_id = 1,
130
+ .minimum_version_id = 1,
131
+ .needed = smmuv3_gbpa_needed,
132
+ .fields = (VMStateField[]) {
133
+ VMSTATE_UINT32(gbpa, SMMUv3State),
134
+ VMSTATE_END_OF_LIST()
135
+ }
136
+};
137
+
138
static const VMStateDescription vmstate_smmuv3 = {
139
.name = "smmuv3",
140
.version_id = 1,
141
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_smmuv3 = {
142
143
VMSTATE_END_OF_LIST(),
144
},
145
+ .subsections = (const VMStateDescription * []) {
146
+ &vmstate_gbpa,
147
+ NULL
148
+ }
149
};
150
151
static void smmuv3_instance_init(Object *obj)
62
--
152
--
63
2.25.1
153
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Since commit acc0b8b05a when running the ZynqMP ZCU102 board with
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
a QEMU configured using --without-default-devices, we get:
5
Message-id: 20220426163043.100432-39-richard.henderson@linaro.org
5
6
$ qemu-system-aarch64 -M xlnx-zcu102
7
qemu-system-aarch64: missing object type 'usb_dwc3'
8
Abort trap: 6
9
10
Fix by adding the missing Kconfig dependency.
11
12
Fixes: acc0b8b05a ("hw/arm/xlnx-zynqmp: Connect ZynqMP's USB controllers")
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
14
Message-id: 20230216092327.2203-1-philmd@linaro.org
15
Reviewed-by: Francisco Iglesias <francisco.iglesias@amd.com>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
17
---
8
target/arm/translate-sve.c | 13 ++++---------
18
hw/arm/Kconfig | 1 +
9
1 file changed, 4 insertions(+), 9 deletions(-)
19
1 file changed, 1 insertion(+)
10
20
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
23
--- a/hw/arm/Kconfig
14
+++ b/target/arm/translate-sve.c
24
+++ b/hw/arm/Kconfig
15
@@ -XXX,XX +XXX,XX @@ static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
25
@@ -XXX,XX +XXX,XX @@ config XLNX_ZYNQMP_ARM
16
if (sve_access_check(s)) {
26
select XLNX_CSU_DMA
17
/* Decode the VFP immediate. */
27
select XLNX_ZYNQMP
18
uint64_t imm = vfp_expand_imm(a->esz, a->imm);
28
select XLNX_ZDMA
19
- TCGv_i64 t_imm = tcg_const_i64(imm);
29
+ select USB_DWC3
20
- do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, t_imm);
30
21
- tcg_temp_free_i64(t_imm);
31
config XLNX_VERSAL
22
+ do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(imm));
32
bool
23
}
24
return true;
25
}
26
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_m_i(DisasContext *s, arg_rpri_esz *a)
27
return false;
28
}
29
if (sve_access_check(s)) {
30
- TCGv_i64 t_imm = tcg_const_i64(a->imm);
31
- do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, t_imm);
32
- tcg_temp_free_i64(t_imm);
33
+ do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(a->imm));
34
}
35
return true;
36
}
37
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_z_i(DisasContext *s, arg_CPY_z_i *a)
38
}
39
if (sve_access_check(s)) {
40
unsigned vsz = vec_full_reg_size(s);
41
- TCGv_i64 t_imm = tcg_const_i64(a->imm);
42
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
43
pred_full_reg_offset(s, a->pg),
44
- t_imm, vsz, vsz, 0, fns[a->esz]);
45
- tcg_temp_free_i64(t_imm);
46
+ tcg_constant_i64(a->imm),
47
+ vsz, vsz, 0, fns[a->esz]);
48
}
49
return true;
50
}
51
--
33
--
52
2.25.1
34
2.34.1
35
36
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cornelia Huck <cohuck@redhat.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Just use current_accel_name() directly.
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
5
Message-id: 20220426163043.100432-20-richard.henderson@linaro.org
5
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
6
Reviewed-by: Eric Auger <eric.auger@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
target/arm/translate-a64.c | 26 ++++++--------------------
10
hw/arm/virt.c | 6 +++---
9
1 file changed, 6 insertions(+), 20 deletions(-)
11
1 file changed, 3 insertions(+), 3 deletions(-)
10
12
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
15
--- a/hw/arm/virt.c
14
+++ b/target/arm/translate-a64.c
16
+++ b/hw/arm/virt.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
17
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
16
int pass;
18
if (vms->secure && (kvm_enabled() || hvf_enabled())) {
17
19
error_report("mach-virt: %s does not support providing "
18
if (fracbits || size == MO_64) {
20
"Security extensions (TrustZone) to the guest CPU",
19
- tcg_shift = tcg_const_i32(fracbits);
21
- kvm_enabled() ? "KVM" : "HVF");
20
+ tcg_shift = tcg_constant_i32(fracbits);
22
+ current_accel_name());
23
exit(1);
21
}
24
}
22
25
23
if (size == MO_64) {
26
if (vms->virt && (kvm_enabled() || hvf_enabled())) {
24
@@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
27
error_report("mach-virt: %s does not support providing "
28
"Virtualization extensions to the guest CPU",
29
- kvm_enabled() ? "KVM" : "HVF");
30
+ current_accel_name());
31
exit(1);
25
}
32
}
26
33
27
tcg_temp_free_ptr(tcg_fpst);
34
if (vms->mte && (kvm_enabled() || hvf_enabled())) {
28
- if (tcg_shift) {
35
error_report("mach-virt: %s does not support providing "
29
- tcg_temp_free_i32(tcg_shift);
36
"MTE to the guest CPU",
30
- }
37
- kvm_enabled() ? "KVM" : "HVF");
31
38
+ current_accel_name());
32
clear_vec_high(s, elements << size == 16, rd);
39
exit(1);
33
}
34
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
35
tcg_fpstatus = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
36
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
37
fracbits = (16 << size) - immhb;
38
- tcg_shift = tcg_const_i32(fracbits);
39
+ tcg_shift = tcg_constant_i32(fracbits);
40
41
if (size == MO_64) {
42
int maxpass = is_scalar ? 1 : 2;
43
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
44
}
45
}
40
}
46
41
47
- tcg_temp_free_i32(tcg_shift);
48
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
49
tcg_temp_free_ptr(tcg_fpstatus);
50
tcg_temp_free_i32(tcg_rmode);
51
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
52
case 0x1c: /* FCVTAS */
53
case 0x3a: /* FCVTPS */
54
case 0x3b: /* FCVTZS */
55
- {
56
- TCGv_i32 tcg_shift = tcg_const_i32(0);
57
- gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
58
- tcg_temp_free_i32(tcg_shift);
59
+ gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
60
break;
61
- }
62
case 0x5a: /* FCVTNU */
63
case 0x5b: /* FCVTMU */
64
case 0x5c: /* FCVTAU */
65
case 0x7a: /* FCVTPU */
66
case 0x7b: /* FCVTZU */
67
- {
68
- TCGv_i32 tcg_shift = tcg_const_i32(0);
69
- gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
70
- tcg_temp_free_i32(tcg_shift);
71
+ gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
72
break;
73
- }
74
case 0x18: /* FRINTN */
75
case 0x19: /* FRINTM */
76
case 0x38: /* FRINTP */
77
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
78
79
if (is_double) {
80
TCGv_i64 tcg_op = tcg_temp_new_i64();
81
- TCGv_i64 tcg_zero = tcg_const_i64(0);
82
+ TCGv_i64 tcg_zero = tcg_constant_i64(0);
83
TCGv_i64 tcg_res = tcg_temp_new_i64();
84
NeonGenTwoDoubleOpFn *genfn;
85
bool swap = false;
86
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
87
write_vec_element(s, tcg_res, rd, pass, MO_64);
88
}
89
tcg_temp_free_i64(tcg_res);
90
- tcg_temp_free_i64(tcg_zero);
91
tcg_temp_free_i64(tcg_op);
92
93
clear_vec_high(s, !is_scalar, rd);
94
} else {
95
TCGv_i32 tcg_op = tcg_temp_new_i32();
96
- TCGv_i32 tcg_zero = tcg_const_i32(0);
97
+ TCGv_i32 tcg_zero = tcg_constant_i32(0);
98
TCGv_i32 tcg_res = tcg_temp_new_i32();
99
NeonGenTwoSingleOpFn *genfn;
100
bool swap = false;
101
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
102
}
103
}
104
tcg_temp_free_i32(tcg_res);
105
- tcg_temp_free_i32(tcg_zero);
106
tcg_temp_free_i32(tcg_op);
107
if (!is_scalar) {
108
clear_vec_high(s, is_q, rd);
109
--
42
--
110
2.25.1
43
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Havard is no longer working on the Nuvoton systems for a while
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
and won't be able to do any work on it in the future. So I'll
5
Message-id: 20220426163043.100432-38-richard.henderson@linaro.org
5
take over maintaining the Nuvoton system from him.
6
7
Signed-off-by: Hao Wu <wuhaotsh@google.com>
8
Acked-by: Havard Skinnemoen <hskinnemoen@google.com>
9
Reviewed-by: Philippe Mathieu-Daude <philmd@linaro.org>
10
Message-id: 20230208235433.3989937-2-wuhaotsh@google.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/translate-sve.c | 18 ++++++------------
13
MAINTAINERS | 2 +-
9
1 file changed, 6 insertions(+), 12 deletions(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/MAINTAINERS b/MAINTAINERS
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/MAINTAINERS
14
+++ b/target/arm/translate-sve.c
19
+++ b/MAINTAINERS
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SINCDEC_r_32(DisasContext *s, arg_incdec_cnt *a)
20
@@ -XXX,XX +XXX,XX @@ F: include/hw/net/mv88w8618_eth.h
16
tcg_gen_ext32s_i64(reg, reg);
21
F: docs/system/arm/musicpal.rst
17
}
22
18
} else {
23
Nuvoton NPCM7xx
19
- TCGv_i64 t = tcg_const_i64(inc);
24
-M: Havard Skinnemoen <hskinnemoen@google.com>
20
- do_sat_addsub_32(reg, t, a->u, a->d);
25
M: Tyrone Ting <kfting@nuvoton.com>
21
- tcg_temp_free_i64(t);
26
+M: Hao Wu <wuhaotsh@google.com>
22
+ do_sat_addsub_32(reg, tcg_constant_i64(inc), a->u, a->d);
27
L: qemu-arm@nongnu.org
23
}
28
S: Supported
24
return true;
29
F: hw/*/npcm7xx*
25
}
26
@@ -XXX,XX +XXX,XX @@ static bool trans_SINCDEC_r_64(DisasContext *s, arg_incdec_cnt *a)
27
TCGv_i64 reg = cpu_reg(s, a->rd);
28
29
if (inc != 0) {
30
- TCGv_i64 t = tcg_const_i64(inc);
31
- do_sat_addsub_64(reg, t, a->u, a->d);
32
- tcg_temp_free_i64(t);
33
+ do_sat_addsub_64(reg, tcg_constant_i64(inc), a->u, a->d);
34
}
35
return true;
36
}
37
@@ -XXX,XX +XXX,XX @@ static bool trans_INCDEC_v(DisasContext *s, arg_incdec2_cnt *a)
38
39
if (inc != 0) {
40
if (sve_access_check(s)) {
41
- TCGv_i64 t = tcg_const_i64(a->d ? -inc : inc);
42
tcg_gen_gvec_adds(a->esz, vec_full_reg_offset(s, a->rd),
43
vec_full_reg_offset(s, a->rn),
44
- t, fullsz, fullsz);
45
- tcg_temp_free_i64(t);
46
+ tcg_constant_i64(a->d ? -inc : inc),
47
+ fullsz, fullsz);
48
}
49
} else {
50
do_mov_z(s, a->rd, a->rn);
51
@@ -XXX,XX +XXX,XX @@ static bool trans_SINCDEC_v(DisasContext *s, arg_incdec2_cnt *a)
52
53
if (inc != 0) {
54
if (sve_access_check(s)) {
55
- TCGv_i64 t = tcg_const_i64(inc);
56
- do_sat_addsub_vec(s, a->esz, a->rd, a->rn, t, a->u, a->d);
57
- tcg_temp_free_i64(t);
58
+ do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
59
+ tcg_constant_i64(inc), a->u, a->d);
60
}
61
} else {
62
do_mov_z(s, a->rd, a->rn);
63
--
30
--
64
2.25.1
31
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Nuvoton's PSPI is a general purpose SPI module which enables
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
connections to SPI-based peripheral devices.
5
Message-id: 20220426163043.100432-29-richard.henderson@linaro.org
5
6
Signed-off-by: Hao Wu <wuhaotsh@google.com>
7
Reviewed-by: Chris Rauer <crauer@google.com>
8
Reviewed-by: Philippe Mathieu-Daude <philmd@linaro.org>
9
Message-id: 20230208235433.3989937-3-wuhaotsh@google.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate.c | 11 +++++------
12
MAINTAINERS | 6 +-
9
1 file changed, 5 insertions(+), 6 deletions(-)
13
include/hw/ssi/npcm_pspi.h | 53 +++++++++
14
hw/ssi/npcm_pspi.c | 221 +++++++++++++++++++++++++++++++++++++
15
hw/ssi/meson.build | 2 +-
16
hw/ssi/trace-events | 5 +
17
5 files changed, 283 insertions(+), 4 deletions(-)
18
create mode 100644 include/hw/ssi/npcm_pspi.h
19
create mode 100644 hw/ssi/npcm_pspi.c
10
20
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
21
diff --git a/MAINTAINERS b/MAINTAINERS
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
23
--- a/MAINTAINERS
14
+++ b/target/arm/translate.c
24
+++ b/MAINTAINERS
15
@@ -XXX,XX +XXX,XX @@ static bool op_s_rri_rot(DisasContext *s, arg_s_rri_rot *a,
25
@@ -XXX,XX +XXX,XX @@ M: Tyrone Ting <kfting@nuvoton.com>
16
void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32),
26
M: Hao Wu <wuhaotsh@google.com>
17
int logic_cc, StoreRegKind kind)
27
L: qemu-arm@nongnu.org
18
{
28
S: Supported
19
- TCGv_i32 tmp1, tmp2;
29
-F: hw/*/npcm7xx*
20
+ TCGv_i32 tmp1;
30
-F: include/hw/*/npcm7xx*
21
uint32_t imm;
31
-F: tests/qtest/npcm7xx*
22
32
+F: hw/*/npcm*
23
imm = ror32(a->imm, a->rot);
33
+F: include/hw/*/npcm*
24
if (logic_cc && a->rot) {
34
+F: tests/qtest/npcm*
25
tcg_gen_movi_i32(cpu_CF, imm >> 31);
35
F: pc-bios/npcm7xx_bootrom.bin
26
}
36
F: roms/vbootrom
27
- tmp2 = tcg_const_i32(imm);
37
F: docs/system/arm/nuvoton.rst
28
tmp1 = load_reg(s, a->rn);
38
diff --git a/include/hw/ssi/npcm_pspi.h b/include/hw/ssi/npcm_pspi.h
29
39
new file mode 100644
30
- gen(tmp1, tmp1, tmp2);
40
index XXXXXXX..XXXXXXX
31
- tcg_temp_free_i32(tmp2);
41
--- /dev/null
32
+ gen(tmp1, tmp1, tcg_constant_i32(imm));
42
+++ b/include/hw/ssi/npcm_pspi.h
33
43
@@ -XXX,XX +XXX,XX @@
34
if (logic_cc) {
44
+/*
35
gen_logic_CC(tmp1);
45
+ * Nuvoton Peripheral SPI Module
36
@@ -XXX,XX +XXX,XX @@ static bool op_s_rxi_rot(DisasContext *s, arg_s_rri_rot *a,
46
+ *
37
if (logic_cc && a->rot) {
47
+ * Copyright 2023 Google LLC
38
tcg_gen_movi_i32(cpu_CF, imm >> 31);
48
+ *
39
}
49
+ * This program is free software; you can redistribute it and/or modify it
40
- tmp = tcg_const_i32(imm);
50
+ * under the terms of the GNU General Public License as published by the
41
51
+ * Free Software Foundation; either version 2 of the License, or
42
- gen(tmp, tmp);
52
+ * (at your option) any later version.
43
+ tmp = tcg_temp_new_i32();
53
+ *
44
+ gen(tmp, tcg_constant_i32(imm));
54
+ * This program is distributed in the hope that it will be useful, but WITHOUT
45
+
55
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
46
if (logic_cc) {
56
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
47
gen_logic_CC(tmp);
57
+ * for more details.
48
}
58
+ */
59
+#ifndef NPCM_PSPI_H
60
+#define NPCM_PSPI_H
61
+
62
+#include "hw/ssi/ssi.h"
63
+#include "hw/sysbus.h"
64
+
65
+/*
66
+ * Number of registers in our device state structure. Don't change this without
67
+ * incrementing the version_id in the vmstate.
68
+ */
69
+#define NPCM_PSPI_NR_REGS 3
70
+
71
+/**
72
+ * NPCMPSPIState - Device state for one Flash Interface Unit.
73
+ * @parent: System bus device.
74
+ * @mmio: Memory region for register access.
75
+ * @spi: The SPI bus mastered by this controller.
76
+ * @regs: Register contents.
77
+ * @irq: The interrupt request queue for this module.
78
+ *
79
+ * Each PSPI has a shared bank of registers, and controls up to four chip
80
+ * selects. Each chip select has a dedicated memory region which may be used to
81
+ * read and write the flash connected to that chip select as if it were memory.
82
+ */
83
+typedef struct NPCMPSPIState {
84
+ SysBusDevice parent;
85
+
86
+ MemoryRegion mmio;
87
+
88
+ SSIBus *spi;
89
+ uint16_t regs[NPCM_PSPI_NR_REGS];
90
+ qemu_irq irq;
91
+} NPCMPSPIState;
92
+
93
+#define TYPE_NPCM_PSPI "npcm-pspi"
94
+OBJECT_DECLARE_SIMPLE_TYPE(NPCMPSPIState, NPCM_PSPI)
95
+
96
+#endif /* NPCM_PSPI_H */
97
diff --git a/hw/ssi/npcm_pspi.c b/hw/ssi/npcm_pspi.c
98
new file mode 100644
99
index XXXXXXX..XXXXXXX
100
--- /dev/null
101
+++ b/hw/ssi/npcm_pspi.c
102
@@ -XXX,XX +XXX,XX @@
103
+/*
104
+ * Nuvoton NPCM Peripheral SPI Module (PSPI)
105
+ *
106
+ * Copyright 2023 Google LLC
107
+ *
108
+ * This program is free software; you can redistribute it and/or modify it
109
+ * under the terms of the GNU General Public License as published by the
110
+ * Free Software Foundation; either version 2 of the License, or
111
+ * (at your option) any later version.
112
+ *
113
+ * This program is distributed in the hope that it will be useful, but WITHOUT
114
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
115
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
116
+ * for more details.
117
+ */
118
+
119
+#include "qemu/osdep.h"
120
+
121
+#include "hw/irq.h"
122
+#include "hw/registerfields.h"
123
+#include "hw/ssi/npcm_pspi.h"
124
+#include "migration/vmstate.h"
125
+#include "qapi/error.h"
126
+#include "qemu/error-report.h"
127
+#include "qemu/log.h"
128
+#include "qemu/module.h"
129
+#include "qemu/units.h"
130
+
131
+#include "trace.h"
132
+
133
+REG16(PSPI_DATA, 0x0)
134
+REG16(PSPI_CTL1, 0x2)
135
+ FIELD(PSPI_CTL1, SPIEN, 0, 1)
136
+ FIELD(PSPI_CTL1, MOD, 2, 1)
137
+ FIELD(PSPI_CTL1, EIR, 5, 1)
138
+ FIELD(PSPI_CTL1, EIW, 6, 1)
139
+ FIELD(PSPI_CTL1, SCM, 7, 1)
140
+ FIELD(PSPI_CTL1, SCIDL, 8, 1)
141
+ FIELD(PSPI_CTL1, SCDV, 9, 7)
142
+REG16(PSPI_STAT, 0x4)
143
+ FIELD(PSPI_STAT, BSY, 0, 1)
144
+ FIELD(PSPI_STAT, RBF, 1, 1)
145
+
146
+static void npcm_pspi_update_irq(NPCMPSPIState *s)
147
+{
148
+ int level = 0;
149
+
150
+ /* Only fire IRQ when the module is enabled. */
151
+ if (FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, SPIEN)) {
152
+ /* Update interrupt as BSY is cleared. */
153
+ if ((!FIELD_EX16(s->regs[R_PSPI_STAT], PSPI_STAT, BSY)) &&
154
+ FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, EIW)) {
155
+ level = 1;
156
+ }
157
+
158
+ /* Update interrupt as RBF is set. */
159
+ if (FIELD_EX16(s->regs[R_PSPI_STAT], PSPI_STAT, RBF) &&
160
+ FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, EIR)) {
161
+ level = 1;
162
+ }
163
+ }
164
+ qemu_set_irq(s->irq, level);
165
+}
166
+
167
+static uint16_t npcm_pspi_read_data(NPCMPSPIState *s)
168
+{
169
+ uint16_t value = s->regs[R_PSPI_DATA];
170
+
171
+ /* Clear stat bits as the value are read out. */
172
+ s->regs[R_PSPI_STAT] = 0;
173
+
174
+ return value;
175
+}
176
+
177
+static void npcm_pspi_write_data(NPCMPSPIState *s, uint16_t data)
178
+{
179
+ uint16_t value = 0;
180
+
181
+ if (FIELD_EX16(s->regs[R_PSPI_CTL1], PSPI_CTL1, MOD)) {
182
+ value = ssi_transfer(s->spi, extract16(data, 8, 8)) << 8;
183
+ }
184
+ value |= ssi_transfer(s->spi, extract16(data, 0, 8));
185
+ s->regs[R_PSPI_DATA] = value;
186
+
187
+ /* Mark data as available */
188
+ s->regs[R_PSPI_STAT] = R_PSPI_STAT_BSY_MASK | R_PSPI_STAT_RBF_MASK;
189
+}
190
+
191
+/* Control register read handler. */
192
+static uint64_t npcm_pspi_ctrl_read(void *opaque, hwaddr addr,
193
+ unsigned int size)
194
+{
195
+ NPCMPSPIState *s = opaque;
196
+ uint16_t value;
197
+
198
+ switch (addr) {
199
+ case A_PSPI_DATA:
200
+ value = npcm_pspi_read_data(s);
201
+ break;
202
+
203
+ case A_PSPI_CTL1:
204
+ value = s->regs[R_PSPI_CTL1];
205
+ break;
206
+
207
+ case A_PSPI_STAT:
208
+ value = s->regs[R_PSPI_STAT];
209
+ break;
210
+
211
+ default:
212
+ qemu_log_mask(LOG_GUEST_ERROR,
213
+ "%s: write to invalid offset 0x%" PRIx64 "\n",
214
+ DEVICE(s)->canonical_path, addr);
215
+ return 0;
216
+ }
217
+ trace_npcm_pspi_ctrl_read(DEVICE(s)->canonical_path, addr, value);
218
+ npcm_pspi_update_irq(s);
219
+
220
+ return value;
221
+}
222
+
223
+/* Control register write handler. */
224
+static void npcm_pspi_ctrl_write(void *opaque, hwaddr addr, uint64_t v,
225
+ unsigned int size)
226
+{
227
+ NPCMPSPIState *s = opaque;
228
+ uint16_t value = v;
229
+
230
+ trace_npcm_pspi_ctrl_write(DEVICE(s)->canonical_path, addr, value);
231
+
232
+ switch (addr) {
233
+ case A_PSPI_DATA:
234
+ npcm_pspi_write_data(s, value);
235
+ break;
236
+
237
+ case A_PSPI_CTL1:
238
+ s->regs[R_PSPI_CTL1] = value;
239
+ break;
240
+
241
+ case A_PSPI_STAT:
242
+ qemu_log_mask(LOG_GUEST_ERROR,
243
+ "%s: write to read-only register PSPI_STAT: 0x%08"
244
+ PRIx64 "\n", DEVICE(s)->canonical_path, v);
245
+ break;
246
+
247
+ default:
248
+ qemu_log_mask(LOG_GUEST_ERROR,
249
+ "%s: write to invalid offset 0x%" PRIx64 "\n",
250
+ DEVICE(s)->canonical_path, addr);
251
+ return;
252
+ }
253
+ npcm_pspi_update_irq(s);
254
+}
255
+
256
+static const MemoryRegionOps npcm_pspi_ctrl_ops = {
257
+ .read = npcm_pspi_ctrl_read,
258
+ .write = npcm_pspi_ctrl_write,
259
+ .endianness = DEVICE_LITTLE_ENDIAN,
260
+ .valid = {
261
+ .min_access_size = 1,
262
+ .max_access_size = 2,
263
+ .unaligned = false,
264
+ },
265
+ .impl = {
266
+ .min_access_size = 2,
267
+ .max_access_size = 2,
268
+ .unaligned = false,
269
+ },
270
+};
271
+
272
+static void npcm_pspi_enter_reset(Object *obj, ResetType type)
273
+{
274
+ NPCMPSPIState *s = NPCM_PSPI(obj);
275
+
276
+ trace_npcm_pspi_enter_reset(DEVICE(obj)->canonical_path, type);
277
+ memset(s->regs, 0, sizeof(s->regs));
278
+}
279
+
280
+static void npcm_pspi_realize(DeviceState *dev, Error **errp)
281
+{
282
+ NPCMPSPIState *s = NPCM_PSPI(dev);
283
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
284
+ Object *obj = OBJECT(dev);
285
+
286
+ s->spi = ssi_create_bus(dev, "pspi");
287
+ memory_region_init_io(&s->mmio, obj, &npcm_pspi_ctrl_ops, s,
288
+ "mmio", 4 * KiB);
289
+ sysbus_init_mmio(sbd, &s->mmio);
290
+ sysbus_init_irq(sbd, &s->irq);
291
+}
292
+
293
+static const VMStateDescription vmstate_npcm_pspi = {
294
+ .name = "npcm-pspi",
295
+ .version_id = 0,
296
+ .minimum_version_id = 0,
297
+ .fields = (VMStateField[]) {
298
+ VMSTATE_UINT16_ARRAY(regs, NPCMPSPIState, NPCM_PSPI_NR_REGS),
299
+ VMSTATE_END_OF_LIST(),
300
+ },
301
+};
302
+
303
+
304
+static void npcm_pspi_class_init(ObjectClass *klass, void *data)
305
+{
306
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
307
+ DeviceClass *dc = DEVICE_CLASS(klass);
308
+
309
+ dc->desc = "NPCM Peripheral SPI Module";
310
+ dc->realize = npcm_pspi_realize;
311
+ dc->vmsd = &vmstate_npcm_pspi;
312
+ rc->phases.enter = npcm_pspi_enter_reset;
313
+}
314
+
315
+static const TypeInfo npcm_pspi_types[] = {
316
+ {
317
+ .name = TYPE_NPCM_PSPI,
318
+ .parent = TYPE_SYS_BUS_DEVICE,
319
+ .instance_size = sizeof(NPCMPSPIState),
320
+ .class_init = npcm_pspi_class_init,
321
+ },
322
+};
323
+DEFINE_TYPES(npcm_pspi_types);
324
diff --git a/hw/ssi/meson.build b/hw/ssi/meson.build
325
index XXXXXXX..XXXXXXX 100644
326
--- a/hw/ssi/meson.build
327
+++ b/hw/ssi/meson.build
328
@@ -XXX,XX +XXX,XX @@
329
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_smc.c'))
330
softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('mss-spi.c'))
331
-softmmu_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_fiu.c'))
332
+softmmu_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_fiu.c', 'npcm_pspi.c'))
333
softmmu_ss.add(when: 'CONFIG_PL022', if_true: files('pl022.c'))
334
softmmu_ss.add(when: 'CONFIG_SIFIVE_SPI', if_true: files('sifive_spi.c'))
335
softmmu_ss.add(when: 'CONFIG_SSI', if_true: files('ssi.c'))
336
diff --git a/hw/ssi/trace-events b/hw/ssi/trace-events
337
index XXXXXXX..XXXXXXX 100644
338
--- a/hw/ssi/trace-events
339
+++ b/hw/ssi/trace-events
340
@@ -XXX,XX +XXX,XX @@ npcm7xx_fiu_ctrl_write(const char *id, uint64_t addr, uint32_t data) "%s offset:
341
npcm7xx_fiu_flash_read(const char *id, int cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
342
npcm7xx_fiu_flash_write(const char *id, unsigned cs, uint64_t addr, unsigned int size, uint64_t value) "%s[%d] offset: 0x%08" PRIx64 " size: %u value: 0x%" PRIx64
343
344
+# npcm_pspi.c
345
+npcm_pspi_enter_reset(const char *id, int reset_type) "%s reset type: %d"
346
+npcm_pspi_ctrl_read(const char *id, uint64_t addr, uint16_t data) "%s offset: 0x%03" PRIx64 " value: 0x%04" PRIx16
347
+npcm_pspi_ctrl_write(const char *id, uint64_t addr, uint16_t data) "%s offset: 0x%03" PRIx64 " value: 0x%04" PRIx16
348
+
349
# ibex_spi_host.c
350
351
ibex_spi_host_reset(const char *msg) "%s"
49
--
352
--
50
2.25.1
353
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Hao Wu <wuhaotsh@google.com>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Titus Rwantare <titusr@google.com>
5
Message-id: 20220426163043.100432-19-richard.henderson@linaro.org
5
Reviewed-by: Philippe Mathieu-Daude <philmd@linaro.org>
6
Message-id: 20230208235433.3989937-4-wuhaotsh@google.com
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
---
8
target/arm/translate-a64.c | 21 +++++----------------
9
docs/system/arm/nuvoton.rst | 2 +-
9
1 file changed, 5 insertions(+), 16 deletions(-)
10
include/hw/arm/npcm7xx.h | 2 ++
11
hw/arm/npcm7xx.c | 25 +++++++++++++++++++++++--
12
3 files changed, 26 insertions(+), 3 deletions(-)
10
13
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
14
diff --git a/docs/system/arm/nuvoton.rst b/docs/system/arm/nuvoton.rst
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
16
--- a/docs/system/arm/nuvoton.rst
14
+++ b/target/arm/translate-a64.c
17
+++ b/docs/system/arm/nuvoton.rst
15
@@ -XXX,XX +XXX,XX @@ static void handle_shri_with_rndacc(TCGv_i64 tcg_res, TCGv_i64 tcg_src,
18
@@ -XXX,XX +XXX,XX @@ Supported devices
16
/* Deal with the rounding step */
19
* SMBus controller (SMBF)
17
if (round) {
20
* Ethernet controller (EMC)
18
if (extended_result) {
21
* Tachometer
19
- TCGv_i64 tcg_zero = tcg_const_i64(0);
22
+ * Peripheral SPI controller (PSPI)
20
+ TCGv_i64 tcg_zero = tcg_constant_i64(0);
23
21
if (!is_u) {
24
Missing devices
22
/* take care of sign extending tcg_res */
25
---------------
23
tcg_gen_sari_i64(tcg_src_hi, tcg_src, 63);
26
@@ -XXX,XX +XXX,XX @@ Missing devices
24
@@ -XXX,XX +XXX,XX @@ static void handle_shri_with_rndacc(TCGv_i64 tcg_res, TCGv_i64 tcg_src,
27
25
tcg_src, tcg_zero,
28
* Ethernet controller (GMAC)
26
tcg_rnd, tcg_zero);
29
* USB device (USBD)
27
}
30
- * Peripheral SPI controller (PSPI)
28
- tcg_temp_free_i64(tcg_zero);
31
* SD/MMC host
29
} else {
32
* PECI interface
30
tcg_gen_add_i64(tcg_src, tcg_src, tcg_rnd);
33
* PCI and PCIe root complex and bridges
31
}
34
diff --git a/include/hw/arm/npcm7xx.h b/include/hw/arm/npcm7xx.h
32
@@ -XXX,XX +XXX,XX @@ static void handle_scalar_simd_shri(DisasContext *s,
35
index XXXXXXX..XXXXXXX 100644
36
--- a/include/hw/arm/npcm7xx.h
37
+++ b/include/hw/arm/npcm7xx.h
38
@@ -XXX,XX +XXX,XX @@
39
#include "hw/nvram/npcm7xx_otp.h"
40
#include "hw/timer/npcm7xx_timer.h"
41
#include "hw/ssi/npcm7xx_fiu.h"
42
+#include "hw/ssi/npcm_pspi.h"
43
#include "hw/usb/hcd-ehci.h"
44
#include "hw/usb/hcd-ohci.h"
45
#include "target/arm/cpu.h"
46
@@ -XXX,XX +XXX,XX @@ struct NPCM7xxState {
47
NPCM7xxFIUState fiu[2];
48
NPCM7xxEMCState emc[2];
49
NPCM7xxSDHCIState mmc;
50
+ NPCMPSPIState pspi[2];
51
};
52
53
#define TYPE_NPCM7XX "npcm7xx"
54
diff --git a/hw/arm/npcm7xx.c b/hw/arm/npcm7xx.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/hw/arm/npcm7xx.c
57
+++ b/hw/arm/npcm7xx.c
58
@@ -XXX,XX +XXX,XX @@ enum NPCM7xxInterrupt {
59
NPCM7XX_EMC1RX_IRQ = 15,
60
NPCM7XX_EMC1TX_IRQ,
61
NPCM7XX_MMC_IRQ = 26,
62
+ NPCM7XX_PSPI2_IRQ = 28,
63
+ NPCM7XX_PSPI1_IRQ = 31,
64
NPCM7XX_TIMER0_IRQ = 32, /* Timer Module 0 */
65
NPCM7XX_TIMER1_IRQ,
66
NPCM7XX_TIMER2_IRQ,
67
@@ -XXX,XX +XXX,XX @@ static const hwaddr npcm7xx_emc_addr[] = {
68
0xf0826000,
69
};
70
71
+/* Register base address for each PSPI Module */
72
+static const hwaddr npcm7xx_pspi_addr[] = {
73
+ 0xf0200000,
74
+ 0xf0201000,
75
+};
76
+
77
static const struct {
78
hwaddr regs_addr;
79
uint32_t unconnected_pins;
80
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_init(Object *obj)
81
object_initialize_child(obj, "emc[*]", &s->emc[i], TYPE_NPCM7XX_EMC);
33
}
82
}
34
83
35
if (round) {
84
+ for (i = 0; i < ARRAY_SIZE(s->pspi); i++) {
36
- uint64_t round_const = 1ULL << (shift - 1);
85
+ object_initialize_child(obj, "pspi[*]", &s->pspi[i], TYPE_NPCM_PSPI);
37
- tcg_round = tcg_const_i64(round_const);
86
+ }
38
+ tcg_round = tcg_constant_i64(1ULL << (shift - 1));
87
+
39
} else {
88
object_initialize_child(obj, "mmc", &s->mmc, TYPE_NPCM7XX_SDHCI);
40
tcg_round = NULL;
41
}
42
@@ -XXX,XX +XXX,XX @@ static void handle_scalar_simd_shri(DisasContext *s,
43
44
tcg_temp_free_i64(tcg_rn);
45
tcg_temp_free_i64(tcg_rd);
46
- if (round) {
47
- tcg_temp_free_i64(tcg_round);
48
- }
49
}
89
}
50
90
51
/* SHL/SLI - Scalar shift left */
91
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
52
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
92
sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc), 0,
53
tcg_final = tcg_const_i64(0);
93
npcm7xx_irq(s, NPCM7XX_MMC_IRQ));
54
94
55
if (round) {
95
+ /* PSPI */
56
- uint64_t round_const = 1ULL << (shift - 1);
96
+ QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_pspi_addr) != ARRAY_SIZE(s->pspi));
57
- tcg_round = tcg_const_i64(round_const);
97
+ for (i = 0; i < ARRAY_SIZE(s->pspi); i++) {
58
+ tcg_round = tcg_constant_i64(1ULL << (shift - 1));
98
+ SysBusDevice *sbd = SYS_BUS_DEVICE(&s->pspi[i]);
59
} else {
99
+ int irq = (i == 0) ? NPCM7XX_PSPI1_IRQ : NPCM7XX_PSPI2_IRQ;
60
tcg_round = NULL;
100
+
61
}
101
+ sysbus_realize(sbd, &error_abort);
62
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
102
+ sysbus_mmio_map(sbd, 0, npcm7xx_pspi_addr[i]);
63
write_vec_element(s, tcg_final, rd, 1, MO_64);
103
+ sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, irq));
64
}
104
+ }
65
105
+
66
- if (round) {
106
create_unimplemented_device("npcm7xx.shm", 0xc0001000, 4 * KiB);
67
- tcg_temp_free_i64(tcg_round);
107
create_unimplemented_device("npcm7xx.vdmx", 0xe0800000, 4 * KiB);
68
- }
108
create_unimplemented_device("npcm7xx.pcierc", 0xe1000000, 64 * KiB);
69
tcg_temp_free_i64(tcg_rn);
109
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_realize(DeviceState *dev, Error **errp)
70
tcg_temp_free_i64(tcg_rd);
110
create_unimplemented_device("npcm7xx.peci", 0xf0100000, 4 * KiB);
71
tcg_temp_free_i32(tcg_rd_narrowed);
111
create_unimplemented_device("npcm7xx.siox[1]", 0xf0101000, 4 * KiB);
72
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
112
create_unimplemented_device("npcm7xx.siox[2]", 0xf0102000, 4 * KiB);
73
}
113
- create_unimplemented_device("npcm7xx.pspi1", 0xf0200000, 4 * KiB);
74
114
- create_unimplemented_device("npcm7xx.pspi2", 0xf0201000, 4 * KiB);
75
if (size == 3) {
115
create_unimplemented_device("npcm7xx.ahbpci", 0xf0400000, 1 * MiB);
76
- TCGv_i64 tcg_shift = tcg_const_i64(shift);
116
create_unimplemented_device("npcm7xx.mcphy", 0xf05f0000, 64 * KiB);
77
+ TCGv_i64 tcg_shift = tcg_constant_i64(shift);
117
create_unimplemented_device("npcm7xx.gmac1", 0xf0802000, 8 * KiB);
78
static NeonGenTwo64OpEnvFn * const fns[2][2] = {
79
{ gen_helper_neon_qshl_s64, gen_helper_neon_qshlu_s64 },
80
{ NULL, gen_helper_neon_qshl_u64 },
81
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
82
83
tcg_temp_free_i64(tcg_op);
84
}
85
- tcg_temp_free_i64(tcg_shift);
86
clear_vec_high(s, is_q, rd);
87
} else {
88
- TCGv_i32 tcg_shift = tcg_const_i32(shift);
89
+ TCGv_i32 tcg_shift = tcg_constant_i32(shift);
90
static NeonGenTwoOpEnvFn * const fns[2][2][3] = {
91
{
92
{ gen_helper_neon_qshl_s8,
93
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
94
95
tcg_temp_free_i32(tcg_op);
96
}
97
- tcg_temp_free_i32(tcg_shift);
98
99
if (!scalar) {
100
clear_vec_high(s, is_q, rd);
101
--
118
--
102
2.25.1
119
2.34.1
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
The Record bit in the Context Descriptor tells the SMMU to report fault
3
Addresses targeting the second translation table (TTB1) in the SMMU have
4
events to the event queue. Since we don't cache the Record bit at the
4
all upper bits set. Ensure the IOMMU region covers all 64 bits.
5
moment, access faults from a cached Context Descriptor are never
6
reported. Store the Record bit in the cached SMMUTransCfg.
7
5
8
Fixes: 9bde7f0674fe ("hw/arm/smmuv3: Implement translate callback")
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
7
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
Message-id: 20220427111543.124620-1-jean-philippe@linaro.org
9
Message-id: 20230214171921.1917916-2-jean-philippe@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
11
---
15
hw/arm/smmuv3-internal.h | 1 -
12
include/hw/arm/smmu-common.h | 2 --
16
include/hw/arm/smmu-common.h | 1 +
13
hw/arm/smmu-common.c | 2 +-
17
hw/arm/smmuv3.c | 14 +++++++-------
14
2 files changed, 1 insertion(+), 3 deletions(-)
18
3 files changed, 8 insertions(+), 8 deletions(-)
19
15
20
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/smmuv3-internal.h
23
+++ b/hw/arm/smmuv3-internal.h
24
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
25
SMMUEventType type;
26
uint32_t sid;
27
bool recorded;
28
- bool record_trans_faults;
29
bool inval_ste_allowed;
30
union {
31
struct {
32
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
16
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
33
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
34
--- a/include/hw/arm/smmu-common.h
18
--- a/include/hw/arm/smmu-common.h
35
+++ b/include/hw/arm/smmu-common.h
19
+++ b/include/hw/arm/smmu-common.h
36
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUTransCfg {
20
@@ -XXX,XX +XXX,XX @@
37
bool disabled; /* smmu is disabled */
21
#define SMMU_PCI_DEVFN_MAX 256
38
bool bypassed; /* translation is bypassed */
22
#define SMMU_PCI_DEVFN(sid) (sid & 0xFF)
39
bool aborted; /* translation is aborted */
23
40
+ bool record_faults; /* record fault events */
24
-#define SMMU_MAX_VA_BITS 48
41
uint64_t ttb; /* TT base address */
25
-
42
uint8_t oas; /* output address width */
26
/*
43
uint8_t tbi; /* Top Byte Ignore */
27
* Page table walk error types
44
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
28
*/
29
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
45
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/arm/smmuv3.c
31
--- a/hw/arm/smmu-common.c
47
+++ b/hw/arm/smmuv3.c
32
+++ b/hw/arm/smmu-common.c
48
@@ -XXX,XX +XXX,XX @@ static int decode_cd(SMMUTransCfg *cfg, CD *cd, SMMUEventInfo *event)
33
@@ -XXX,XX +XXX,XX @@ static AddressSpace *smmu_find_add_as(PCIBus *bus, void *opaque, int devfn)
49
trace_smmuv3_decode_cd_tt(i, tt->tsz, tt->ttb, tt->granule_sz, tt->had);
34
50
}
35
memory_region_init_iommu(&sdev->iommu, sizeof(sdev->iommu),
51
36
s->mrtypename,
52
- event->record_trans_faults = CD_R(cd);
37
- OBJECT(s), name, 1ULL << SMMU_MAX_VA_BITS);
53
+ cfg->record_faults = CD_R(cd);
38
+ OBJECT(s), name, UINT64_MAX);
54
39
address_space_init(&sdev->as,
55
return 0;
40
MEMORY_REGION(&sdev->iommu), name);
56
41
trace_smmu_add_mr(name);
57
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
58
59
tt = select_tt(cfg, addr);
60
if (!tt) {
61
- if (event.record_trans_faults) {
62
+ if (cfg->record_faults) {
63
event.type = SMMU_EVT_F_TRANSLATION;
64
event.u.f_translation.addr = addr;
65
event.u.f_translation.rnw = flag & 0x1;
66
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
67
if (cached_entry) {
68
if ((flag & IOMMU_WO) && !(cached_entry->entry.perm & IOMMU_WO)) {
69
status = SMMU_TRANS_ERROR;
70
- if (event.record_trans_faults) {
71
+ if (cfg->record_faults) {
72
event.type = SMMU_EVT_F_PERMISSION;
73
event.u.f_permission.addr = addr;
74
event.u.f_permission.rnw = flag & 0x1;
75
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
76
event.u.f_walk_eabt.addr2 = ptw_info.addr;
77
break;
78
case SMMU_PTW_ERR_TRANSLATION:
79
- if (event.record_trans_faults) {
80
+ if (cfg->record_faults) {
81
event.type = SMMU_EVT_F_TRANSLATION;
82
event.u.f_translation.addr = addr;
83
event.u.f_translation.rnw = flag & 0x1;
84
}
85
break;
86
case SMMU_PTW_ERR_ADDR_SIZE:
87
- if (event.record_trans_faults) {
88
+ if (cfg->record_faults) {
89
event.type = SMMU_EVT_F_ADDR_SIZE;
90
event.u.f_addr_size.addr = addr;
91
event.u.f_addr_size.rnw = flag & 0x1;
92
}
93
break;
94
case SMMU_PTW_ERR_ACCESS:
95
- if (event.record_trans_faults) {
96
+ if (cfg->record_faults) {
97
event.type = SMMU_EVT_F_ACCESS;
98
event.u.f_access.addr = addr;
99
event.u.f_access.rnw = flag & 0x1;
100
}
101
break;
102
case SMMU_PTW_ERR_PERMISSION:
103
- if (event.record_trans_faults) {
104
+ if (cfg->record_faults) {
105
event.type = SMMU_EVT_F_PERMISSION;
106
event.u.f_permission.addr = addr;
107
event.u.f_permission.rnw = flag & 0x1;
108
--
42
--
109
2.25.1
43
2.34.1
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
2
2
3
Make the translation error message prettier by adding a missing space
3
Addresses targeting the second translation table (TTB1) in the SMMU have
4
before the parenthesis.
4
all upper bits set (except for the top byte when TBI is enabled). Fix
5
the TTB1 check.
5
6
7
Reported-by: Ola Hugosson <ola.hugosson@arm.com>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
10
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20230214171921.1917916-3-jean-philippe@linaro.org
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
9
Message-id: 20220427111543.124620-2-jean-philippe@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
13
---
12
hw/arm/smmuv3.c | 2 +-
14
hw/arm/smmu-common.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
15
1 file changed, 1 insertion(+), 1 deletion(-)
14
16
15
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
17
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/smmuv3.c
19
--- a/hw/arm/smmu-common.c
18
+++ b/hw/arm/smmuv3.c
20
+++ b/hw/arm/smmu-common.c
19
@@ -XXX,XX +XXX,XX @@ epilogue:
21
@@ -XXX,XX +XXX,XX @@ SMMUTransTableInfo *select_tt(SMMUTransCfg *cfg, dma_addr_t iova)
20
break;
22
/* there is a ttbr0 region and we are in it (high bits all zero) */
21
case SMMU_TRANS_ERROR:
23
return &cfg->tt[0];
22
qemu_log_mask(LOG_GUEST_ERROR,
24
} else if (cfg->tt[1].tsz &&
23
- "%s translation failed for iova=0x%"PRIx64"(%s)\n",
25
- !extract64(iova, 64 - cfg->tt[1].tsz, cfg->tt[1].tsz - tbi_byte)) {
24
+ "%s translation failed for iova=0x%"PRIx64" (%s)\n",
26
+ sextract64(iova, 64 - cfg->tt[1].tsz, cfg->tt[1].tsz - tbi_byte) == -1) {
25
mr->parent_obj.name, addr, smmu_event_string(event.type));
27
/* there is a ttbr1 region and we are in it (high bits all one) */
26
smmuv3_record_event(s, &event);
28
return &cfg->tt[1];
27
break;
29
} else if (!cfg->tt[0].tsz) {
28
--
30
--
29
2.25.1
31
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Claudio Fontana <cfontana@suse.de>
2
2
3
While defining these names, use the correct field width of 5 not 4 for
3
make it clearer from the name that this is a tcg-only function.
4
DBGWCR.MASK. This typo prevented setting a watchpoint larger than 32k.
5
4
6
Reported-by: Chris Howard <cvz185@web.de>
5
Signed-off-by: Claudio Fontana <cfontana@suse.de>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Fabiano Rosas <farosas@suse.de>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220427051926.295223-1-richard.henderson@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
target/arm/internals.h | 12 ++++++++++++
12
target/arm/helper.c | 4 ++--
13
target/arm/debug_helper.c | 10 +++++-----
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
target/arm/helper.c | 8 ++++----
15
target/arm/kvm64.c | 14 +++++++-------
16
4 files changed, 28 insertions(+), 16 deletions(-)
17
14
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/internals.h
21
+++ b/target/arm/internals.h
22
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_EXCRET, RES1, 7, 25) /* including the must-be-1 prefix */
23
*/
24
#define FNC_RETURN_MIN_MAGIC 0xfefffffe
25
26
+/* Bit definitions for DBGWCRn and DBGWCRn_EL1 */
27
+FIELD(DBGWCR, E, 0, 1)
28
+FIELD(DBGWCR, PAC, 1, 2)
29
+FIELD(DBGWCR, LSC, 3, 2)
30
+FIELD(DBGWCR, BAS, 5, 8)
31
+FIELD(DBGWCR, HMC, 13, 1)
32
+FIELD(DBGWCR, SSC, 14, 2)
33
+FIELD(DBGWCR, LBN, 16, 4)
34
+FIELD(DBGWCR, WT, 20, 1)
35
+FIELD(DBGWCR, MASK, 24, 5)
36
+FIELD(DBGWCR, SSCE, 29, 1)
37
+
38
/* We use a few fake FSR values for internal purposes in M profile.
39
* M profile cores don't have A/R format FSRs, but currently our
40
* get_phys_addr() code assumes A/R profile and reports failures via
41
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/debug_helper.c
44
+++ b/target/arm/debug_helper.c
45
@@ -XXX,XX +XXX,XX @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp)
46
* Non-Secure to simplify the code slightly compared to the full
47
* table in the ARM ARM.
48
*/
49
- pac = extract64(cr, 1, 2);
50
- hmc = extract64(cr, 13, 1);
51
- ssc = extract64(cr, 14, 2);
52
+ pac = FIELD_EX64(cr, DBGWCR, PAC);
53
+ hmc = FIELD_EX64(cr, DBGWCR, HMC);
54
+ ssc = FIELD_EX64(cr, DBGWCR, SSC);
55
56
switch (ssc) {
57
case 0:
58
@@ -XXX,XX +XXX,XX @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp)
59
g_assert_not_reached();
60
}
61
62
- wt = extract64(cr, 20, 1);
63
- lbn = extract64(cr, 16, 4);
64
+ wt = FIELD_EX64(cr, DBGWCR, WT);
65
+ lbn = FIELD_EX64(cr, DBGWCR, LBN);
66
67
if (wt && !linked_bp_matches(cpu, lbn)) {
68
return false;
69
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
70
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
71
--- a/target/arm/helper.c
17
--- a/target/arm/helper.c
72
+++ b/target/arm/helper.c
18
+++ b/target/arm/helper.c
73
@@ -XXX,XX +XXX,XX @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
19
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
74
env->cpu_watchpoint[n] = NULL;
20
* trapped to the hypervisor in KVM.
75
}
21
*/
76
22
#ifdef CONFIG_TCG
77
- if (!extract64(wcr, 0, 1)) {
23
-static void handle_semihosting(CPUState *cs)
78
+ if (!FIELD_EX64(wcr, DBGWCR, E)) {
24
+static void tcg_handle_semihosting(CPUState *cs)
79
/* E bit clear : watchpoint disabled */
25
{
26
ARMCPU *cpu = ARM_CPU(cs);
27
CPUARMState *env = &cpu->env;
28
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
29
*/
30
#ifdef CONFIG_TCG
31
if (cs->exception_index == EXCP_SEMIHOST) {
32
- handle_semihosting(cs);
33
+ tcg_handle_semihosting(cs);
80
return;
34
return;
81
}
35
}
82
36
#endif
83
- switch (extract64(wcr, 3, 2)) {
84
+ switch (FIELD_EX64(wcr, DBGWCR, LSC)) {
85
case 0:
86
/* LSC 00 is reserved and must behave as if the wp is disabled */
87
return;
88
@@ -XXX,XX +XXX,XX @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
89
* CONSTRAINED UNPREDICTABLE; we opt to ignore BAS in this case,
90
* thus generating a watchpoint for every byte in the masked region.
91
*/
92
- mask = extract64(wcr, 24, 4);
93
+ mask = FIELD_EX64(wcr, DBGWCR, MASK);
94
if (mask == 1 || mask == 2) {
95
/* Reserved values of MASK; we must act as if the mask value was
96
* some non-reserved value, or as if the watchpoint were disabled.
97
@@ -XXX,XX +XXX,XX @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
98
wvr &= ~(len - 1);
99
} else {
100
/* Watchpoint covers bytes defined by the byte address select bits */
101
- int bas = extract64(wcr, 5, 8);
102
+ int bas = FIELD_EX64(wcr, DBGWCR, BAS);
103
int basstart;
104
105
if (extract64(wvr, 2, 1)) {
106
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/kvm64.c
109
+++ b/target/arm/kvm64.c
110
@@ -XXX,XX +XXX,XX @@ static int insert_hw_watchpoint(target_ulong addr,
111
target_ulong len, int type)
112
{
113
HWWatchpoint wp = {
114
- .wcr = 1, /* E=1, enable */
115
+ .wcr = R_DBGWCR_E_MASK, /* E=1, enable */
116
.wvr = addr & (~0x7ULL),
117
.details = { .vaddr = addr, .len = len }
118
};
119
@@ -XXX,XX +XXX,XX @@ static int insert_hw_watchpoint(target_ulong addr,
120
* HMC=0 SSC=0 PAC=3 will hit EL0 or EL1, any security state,
121
* valid whether EL3 is implemented or not
122
*/
123
- wp.wcr = deposit32(wp.wcr, 1, 2, 3);
124
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, PAC, 3);
125
126
switch (type) {
127
case GDB_WATCHPOINT_READ:
128
- wp.wcr = deposit32(wp.wcr, 3, 2, 1);
129
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 1);
130
wp.details.flags = BP_MEM_READ;
131
break;
132
case GDB_WATCHPOINT_WRITE:
133
- wp.wcr = deposit32(wp.wcr, 3, 2, 2);
134
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 2);
135
wp.details.flags = BP_MEM_WRITE;
136
break;
137
case GDB_WATCHPOINT_ACCESS:
138
- wp.wcr = deposit32(wp.wcr, 3, 2, 3);
139
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 3);
140
wp.details.flags = BP_MEM_ACCESS;
141
break;
142
default:
143
@@ -XXX,XX +XXX,XX @@ static int insert_hw_watchpoint(target_ulong addr,
144
int bits = ctz64(len);
145
146
wp.wvr &= ~((1 << bits) - 1);
147
- wp.wcr = deposit32(wp.wcr, 24, 4, bits);
148
- wp.wcr = deposit32(wp.wcr, 5, 8, 0xff);
149
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, MASK, bits);
150
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, BAS, 0xff);
151
} else {
152
return -ENOBUFS;
153
}
154
--
37
--
155
2.25.1
38
2.34.1
156
39
157
40
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Claudio Fontana <cfontana@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
for "all" builds (tcg + kvm), we want to avoid doing
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
the psci check if tcg is built-in, but not enabled.
5
Message-id: 20220426163043.100432-36-richard.henderson@linaro.org
5
6
Signed-off-by: Claudio Fontana <cfontana@suse.de>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Fabiano Rosas <farosas@suse.de>
9
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate.c | 7 +++----
12
target/arm/helper.c | 3 ++-
9
1 file changed, 3 insertions(+), 4 deletions(-)
13
1 file changed, 2 insertions(+), 1 deletion(-)
10
14
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
17
--- a/target/arm/helper.c
14
+++ b/target/arm/translate.c
18
+++ b/target/arm/helper.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
19
@@ -XXX,XX +XXX,XX @@
20
#include "hw/irq.h"
21
#include "sysemu/cpu-timers.h"
22
#include "sysemu/kvm.h"
23
+#include "sysemu/tcg.h"
24
#include "qapi/qapi-commands-machine-target.h"
25
#include "qapi/error.h"
26
#include "qemu/guest-random.h"
27
@@ -XXX,XX +XXX,XX @@ void arm_cpu_do_interrupt(CPUState *cs)
28
env->exception.syndrome);
16
}
29
}
17
30
18
/* In this insn input reg fields of 0b1111 mean "zero", not "PC" */
31
- if (arm_is_psci_call(cpu, cs->exception_index)) {
19
+ zero = tcg_constant_i32(0);
32
+ if (tcg_enabled() && arm_is_psci_call(cpu, cs->exception_index)) {
20
if (a->rn == 15) {
33
arm_handle_psci_call(cpu);
21
- rn = tcg_const_i32(0);
34
qemu_log_mask(CPU_LOG_INT, "...handled as PSCI call\n");
22
+ rn = zero;
35
return;
23
} else {
24
rn = load_reg(s, a->rn);
25
}
26
if (a->rm == 15) {
27
- rm = tcg_const_i32(0);
28
+ rm = zero;
29
} else {
30
rm = load_reg(s, a->rm);
31
}
32
@@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
33
}
34
35
arm_test_cc(&c, a->fcond);
36
- zero = tcg_const_i32(0);
37
tcg_gen_movcond_i32(c.cond, rn, c.value, zero, rn, rm);
38
arm_free_cc(&c);
39
- tcg_temp_free_i32(zero);
40
41
store_reg(s, a->rd, rn);
42
tcg_temp_free_i32(rm);
43
--
36
--
44
2.25.1
37
2.34.1
38
39
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Claudio Fontana <cfontana@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Claudio Fontana <cfontana@suse.de>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220426163043.100432-37-richard.henderson@linaro.org
5
Signed-off-by: Fabiano Rosas <farosas@suse.de>
6
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
---
8
target/arm/translate-sve.c | 12 ++++--------
9
target/arm/helper.c | 12 +++++++-----
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
1 file changed, 7 insertions(+), 5 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/helper.c
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/helper.c
15
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
16
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_do_interrupt_aarch64(CPUState *cs)
16
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
17
unsigned int cur_el = arm_current_el(env);
17
{
18
int rt;
18
if (sve_access_check(s)) {
19
19
- TCGv_i64 start = tcg_const_i64(a->imm1);
20
- /*
20
- TCGv_i64 incr = tcg_const_i64(a->imm2);
21
- * Note that new_el can never be 0. If cur_el is 0, then
21
+ TCGv_i64 start = tcg_constant_i64(a->imm1);
22
- * el0_a64 is is_a64(), else el0_a64 is ignored.
22
+ TCGv_i64 incr = tcg_constant_i64(a->imm2);
23
- */
23
do_index(s, a->esz, a->rd, start, incr);
24
- aarch64_sve_change_el(env, cur_el, new_el, is_a64(env));
24
- tcg_temp_free_i64(start);
25
+ if (tcg_enabled()) {
25
- tcg_temp_free_i64(incr);
26
+ /*
26
}
27
+ * Note that new_el can never be 0. If cur_el is 0, then
27
return true;
28
+ * el0_a64 is is_a64(), else el0_a64 is ignored.
28
}
29
+ */
29
@@ -XXX,XX +XXX,XX @@ static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
30
+ aarch64_sve_change_el(env, cur_el, new_el, is_a64(env));
30
static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
31
+ }
31
{
32
32
if (sve_access_check(s)) {
33
if (cur_el < new_el) {
33
- TCGv_i64 start = tcg_const_i64(a->imm);
34
/*
34
+ TCGv_i64 start = tcg_constant_i64(a->imm);
35
TCGv_i64 incr = cpu_reg(s, a->rm);
36
do_index(s, a->esz, a->rd, start, incr);
37
- tcg_temp_free_i64(start);
38
}
39
return true;
40
}
41
@@ -XXX,XX +XXX,XX @@ static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
42
{
43
if (sve_access_check(s)) {
44
TCGv_i64 start = cpu_reg(s, a->rn);
45
- TCGv_i64 incr = tcg_const_i64(a->imm);
46
+ TCGv_i64 incr = tcg_constant_i64(a->imm);
47
do_index(s, a->esz, a->rd, start, incr);
48
- tcg_temp_free_i64(incr);
49
}
50
return true;
51
}
52
--
35
--
53
2.25.1
36
2.34.1
37
38
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Move this earlier to make the next patch diff cleaner. While here
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
update the comment slightly to not give the impression that the
5
Message-id: 20220426163043.100432-32-richard.henderson@linaro.org
5
misalignment affects only TCG.
6
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Fabiano Rosas <farosas@suse.de>
10
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/translate.c | 14 +++++---------
13
target/arm/machine.c | 18 +++++++++---------
9
1 file changed, 5 insertions(+), 9 deletions(-)
14
1 file changed, 9 insertions(+), 9 deletions(-)
10
15
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
diff --git a/target/arm/machine.c b/target/arm/machine.c
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
18
--- a/target/arm/machine.c
14
+++ b/target/arm/translate.c
19
+++ b/target/arm/machine.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_TT(DisasContext *s, arg_TT *a)
20
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
21
}
16
}
22
}
17
23
18
addr = load_reg(s, a->rn);
24
+ /*
19
- tmp = tcg_const_i32((a->A << 1) | a->T);
25
+ * Misaligned thumb pc is architecturally impossible. Fail the
20
- gen_helper_v7m_tt(tmp, cpu_env, addr, tmp);
26
+ * incoming migration. For TCG it would trigger the assert in
21
+ tmp = tcg_temp_new_i32();
27
+ * thumb_tr_translate_insn().
22
+ gen_helper_v7m_tt(tmp, cpu_env, addr, tcg_constant_i32((a->A << 1) | a->T));
28
+ */
23
tcg_temp_free_i32(addr);
29
+ if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
24
store_reg(s, a->rd, tmp);
30
+ return -1;
25
return true;
31
+ }
26
@@ -XXX,XX +XXX,XX @@ static bool trans_PKH(DisasContext *s, arg_PKH *a)
32
+
27
static bool op_sat(DisasContext *s, arg_sat *a,
33
hw_breakpoint_update_all(cpu);
28
void (*gen)(TCGv_i32, TCGv_env, TCGv_i32, TCGv_i32))
34
hw_watchpoint_update_all(cpu);
29
{
35
30
- TCGv_i32 tmp, satimm;
36
@@ -XXX,XX +XXX,XX @@ static int cpu_post_load(void *opaque, int version_id)
31
+ TCGv_i32 tmp;
37
}
32
int shift = a->imm;
33
34
if (!ENABLE_ARCH_6) {
35
@@ -XXX,XX +XXX,XX @@ static bool op_sat(DisasContext *s, arg_sat *a,
36
tcg_gen_shli_i32(tmp, tmp, shift);
37
}
38
}
38
39
39
- satimm = tcg_const_i32(a->satimm);
40
- /*
40
- gen(tmp, cpu_env, tmp, satimm);
41
- * Misaligned thumb pc is architecturally impossible.
41
- tcg_temp_free_i32(satimm);
42
- * We have an assert in thumb_tr_translate_insn to verify this.
42
+ gen(tmp, cpu_env, tmp, tcg_constant_i32(a->satimm));
43
- * Fail an incoming migrate to avoid this assert.
43
44
- */
44
store_reg(s, a->rd, tmp);
45
- if (!is_a64(env) && env->thumb && (env->regs[15] & 1)) {
45
return true;
46
- return -1;
46
@@ -XXX,XX +XXX,XX @@ static bool op_smmla(DisasContext *s, arg_rrrr *a, bool round, bool sub)
47
- }
47
* a non-zero multiplicand lowpart, and the correct result
48
-
48
* lowpart for rounding.
49
if (!kvm_enabled()) {
49
*/
50
pmu_op_finish(&cpu->env);
50
- TCGv_i32 zero = tcg_const_i32(0);
51
}
51
- tcg_gen_sub2_i32(t2, t1, zero, t3, t2, t1);
52
- tcg_temp_free_i32(zero);
53
+ tcg_gen_sub2_i32(t2, t1, tcg_constant_i32(0), t3, t2, t1);
54
} else {
55
tcg_gen_add_i32(t1, t1, t3);
56
}
57
--
52
--
58
2.25.1
53
2.34.1
54
55
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Since commit cf7c6d1004 ("target/arm: Split out cpregs.h") we now have
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
a cpregs.h header which is more suitable for this code.
5
Message-id: 20220426163043.100432-31-richard.henderson@linaro.org
5
6
Code moved verbatim.
7
8
Signed-off-by: Fabiano Rosas <farosas@suse.de>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
13
---
8
target/arm/translate.c | 7 +++----
14
target/arm/cpregs.h | 98 +++++++++++++++++++++++++++++++++++++++++++++
9
1 file changed, 3 insertions(+), 4 deletions(-)
15
target/arm/cpu.h | 91 -----------------------------------------
10
16
2 files changed, 98 insertions(+), 91 deletions(-)
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
18
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
20
--- a/target/arm/cpregs.h
14
+++ b/target/arm/translate.c
21
+++ b/target/arm/cpregs.h
15
@@ -XXX,XX +XXX,XX @@ static bool trans_MRS_v7m(DisasContext *s, arg_MRS_v7m *a)
22
@@ -XXX,XX +XXX,XX @@ enum {
16
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
23
ARM_CP_SME = 1 << 19,
17
return false;
24
};
18
}
25
19
- tmp = tcg_const_i32(a->sysm);
26
+/*
20
- gen_helper_v7m_mrs(tmp, cpu_env, tmp);
27
+ * Interface for defining coprocessor registers.
21
+ tmp = tcg_temp_new_i32();
28
+ * Registers are defined in tables of arm_cp_reginfo structs
22
+ gen_helper_v7m_mrs(tmp, cpu_env, tcg_constant_i32(a->sysm));
29
+ * which are passed to define_arm_cp_regs().
23
store_reg(s, a->rd, tmp);
30
+ */
24
return true;
31
+
25
}
32
+/*
26
@@ -XXX,XX +XXX,XX @@ static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
33
+ * When looking up a coprocessor register we look for it
27
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
34
+ * via an integer which encodes all of:
28
return false;
35
+ * coprocessor number
29
}
36
+ * Crn, Crm, opc1, opc2 fields
30
- addr = tcg_const_i32((a->mask << 10) | a->sysm);
37
+ * 32 or 64 bit register (ie is it accessed via MRC/MCR
31
+ addr = tcg_constant_i32((a->mask << 10) | a->sysm);
38
+ * or via MRRC/MCRR?)
32
reg = load_reg(s, a->rn);
39
+ * non-secure/secure bank (AArch32 only)
33
gen_helper_v7m_msr(cpu_env, addr, reg);
40
+ * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
34
- tcg_temp_free_i32(addr);
41
+ * (In this case crn and opc2 should be zero.)
35
tcg_temp_free_i32(reg);
42
+ * For AArch64, there is no 32/64 bit size distinction;
36
/* If we wrote to CONTROL, the EL might have changed */
43
+ * instead all registers have a 2 bit op0, 3 bit op1 and op2,
37
gen_rebuild_hflags(s, true);
44
+ * and 4 bit CRn and CRm. The encoding patterns are chosen
45
+ * to be easy to convert to and from the KVM encodings, and also
46
+ * so that the hashtable can contain both AArch32 and AArch64
47
+ * registers (to allow for interprocessing where we might run
48
+ * 32 bit code on a 64 bit core).
49
+ */
50
+/*
51
+ * This bit is private to our hashtable cpreg; in KVM register
52
+ * IDs the AArch64/32 distinction is the KVM_REG_ARM/ARM64
53
+ * in the upper bits of the 64 bit ID.
54
+ */
55
+#define CP_REG_AA64_SHIFT 28
56
+#define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
57
+
58
+/*
59
+ * To enable banking of coprocessor registers depending on ns-bit we
60
+ * add a bit to distinguish between secure and non-secure cpregs in the
61
+ * hashtable.
62
+ */
63
+#define CP_REG_NS_SHIFT 29
64
+#define CP_REG_NS_MASK (1 << CP_REG_NS_SHIFT)
65
+
66
+#define ENCODE_CP_REG(cp, is64, ns, crn, crm, opc1, opc2) \
67
+ ((ns) << CP_REG_NS_SHIFT | ((cp) << 16) | ((is64) << 15) | \
68
+ ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
69
+
70
+#define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
71
+ (CP_REG_AA64_MASK | \
72
+ ((cp) << CP_REG_ARM_COPROC_SHIFT) | \
73
+ ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \
74
+ ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \
75
+ ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \
76
+ ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \
77
+ ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT))
78
+
79
+/*
80
+ * Convert a full 64 bit KVM register ID to the truncated 32 bit
81
+ * version used as a key for the coprocessor register hashtable
82
+ */
83
+static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid)
84
+{
85
+ uint32_t cpregid = kvmid;
86
+ if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) {
87
+ cpregid |= CP_REG_AA64_MASK;
88
+ } else {
89
+ if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) {
90
+ cpregid |= (1 << 15);
91
+ }
92
+
93
+ /*
94
+ * KVM is always non-secure so add the NS flag on AArch32 register
95
+ * entries.
96
+ */
97
+ cpregid |= 1 << CP_REG_NS_SHIFT;
98
+ }
99
+ return cpregid;
100
+}
101
+
102
+/*
103
+ * Convert a truncated 32 bit hashtable key into the full
104
+ * 64 bit KVM register ID.
105
+ */
106
+static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
107
+{
108
+ uint64_t kvmid;
109
+
110
+ if (cpregid & CP_REG_AA64_MASK) {
111
+ kvmid = cpregid & ~CP_REG_AA64_MASK;
112
+ kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64;
113
+ } else {
114
+ kvmid = cpregid & ~(1 << 15);
115
+ if (cpregid & (1 << 15)) {
116
+ kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM;
117
+ } else {
118
+ kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM;
119
+ }
120
+ }
121
+ return kvmid;
122
+}
123
+
124
/*
125
* Valid values for ARMCPRegInfo state field, indicating which of
126
* the AArch32 and AArch64 execution states this register is visible in.
127
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
128
index XXXXXXX..XXXXXXX 100644
129
--- a/target/arm/cpu.h
130
+++ b/target/arm/cpu.h
131
@@ -XXX,XX +XXX,XX @@ void arm_cpu_list(void);
132
uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
133
uint32_t cur_el, bool secure);
134
135
-/* Interface for defining coprocessor registers.
136
- * Registers are defined in tables of arm_cp_reginfo structs
137
- * which are passed to define_arm_cp_regs().
138
- */
139
-
140
-/* When looking up a coprocessor register we look for it
141
- * via an integer which encodes all of:
142
- * coprocessor number
143
- * Crn, Crm, opc1, opc2 fields
144
- * 32 or 64 bit register (ie is it accessed via MRC/MCR
145
- * or via MRRC/MCRR?)
146
- * non-secure/secure bank (AArch32 only)
147
- * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
148
- * (In this case crn and opc2 should be zero.)
149
- * For AArch64, there is no 32/64 bit size distinction;
150
- * instead all registers have a 2 bit op0, 3 bit op1 and op2,
151
- * and 4 bit CRn and CRm. The encoding patterns are chosen
152
- * to be easy to convert to and from the KVM encodings, and also
153
- * so that the hashtable can contain both AArch32 and AArch64
154
- * registers (to allow for interprocessing where we might run
155
- * 32 bit code on a 64 bit core).
156
- */
157
-/* This bit is private to our hashtable cpreg; in KVM register
158
- * IDs the AArch64/32 distinction is the KVM_REG_ARM/ARM64
159
- * in the upper bits of the 64 bit ID.
160
- */
161
-#define CP_REG_AA64_SHIFT 28
162
-#define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
163
-
164
-/* To enable banking of coprocessor registers depending on ns-bit we
165
- * add a bit to distinguish between secure and non-secure cpregs in the
166
- * hashtable.
167
- */
168
-#define CP_REG_NS_SHIFT 29
169
-#define CP_REG_NS_MASK (1 << CP_REG_NS_SHIFT)
170
-
171
-#define ENCODE_CP_REG(cp, is64, ns, crn, crm, opc1, opc2) \
172
- ((ns) << CP_REG_NS_SHIFT | ((cp) << 16) | ((is64) << 15) | \
173
- ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
174
-
175
-#define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
176
- (CP_REG_AA64_MASK | \
177
- ((cp) << CP_REG_ARM_COPROC_SHIFT) | \
178
- ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \
179
- ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \
180
- ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \
181
- ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \
182
- ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT))
183
-
184
-/* Convert a full 64 bit KVM register ID to the truncated 32 bit
185
- * version used as a key for the coprocessor register hashtable
186
- */
187
-static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid)
188
-{
189
- uint32_t cpregid = kvmid;
190
- if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) {
191
- cpregid |= CP_REG_AA64_MASK;
192
- } else {
193
- if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) {
194
- cpregid |= (1 << 15);
195
- }
196
-
197
- /* KVM is always non-secure so add the NS flag on AArch32 register
198
- * entries.
199
- */
200
- cpregid |= 1 << CP_REG_NS_SHIFT;
201
- }
202
- return cpregid;
203
-}
204
-
205
-/* Convert a truncated 32 bit hashtable key into the full
206
- * 64 bit KVM register ID.
207
- */
208
-static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
209
-{
210
- uint64_t kvmid;
211
-
212
- if (cpregid & CP_REG_AA64_MASK) {
213
- kvmid = cpregid & ~CP_REG_AA64_MASK;
214
- kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64;
215
- } else {
216
- kvmid = cpregid & ~(1 << 15);
217
- if (cpregid & (1 << 15)) {
218
- kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM;
219
- } else {
220
- kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM;
221
- }
222
- }
223
- return kvmid;
224
-}
225
-
226
/* Return the highest implemented Exception Level */
227
static inline int arm_highest_el(CPUARMState *env)
228
{
38
--
229
--
39
2.25.1
230
2.34.1
231
232
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
If a test was tagged with the "accel" tag and the specified
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
accelerator it not present in the qemu binary, cancel the test.
5
Message-id: 20220426163043.100432-4-richard.henderson@linaro.org
5
6
We can now write tests without explicit calls to require_accelerator,
7
just the tag is enough.
8
9
Signed-off-by: Fabiano Rosas <farosas@suse.de>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
13
---
8
target/arm/translate-a64.c | 11 ++---------
14
tests/avocado/avocado_qemu/__init__.py | 4 ++++
9
1 file changed, 2 insertions(+), 9 deletions(-)
15
1 file changed, 4 insertions(+)
10
16
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
diff --git a/tests/avocado/avocado_qemu/__init__.py b/tests/avocado/avocado_qemu/__init__.py
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
19
--- a/tests/avocado/avocado_qemu/__init__.py
14
+++ b/target/arm/translate-a64.c
20
+++ b/tests/avocado/avocado_qemu/__init__.py
15
@@ -XXX,XX +XXX,XX @@ static void gen_rebuild_hflags(DisasContext *s)
21
@@ -XXX,XX +XXX,XX @@ def setUp(self):
16
22
17
static void gen_exception_internal(int excp)
23
super().setUp('qemu-system-')
18
{
24
19
- TCGv_i32 tcg_excp = tcg_const_i32(excp);
25
+ accel_required = self._get_unique_tag_val('accel')
20
-
26
+ if accel_required:
21
assert(excp_is_internal(excp));
27
+ self.require_accelerator(accel_required)
22
- gen_helper_exception_internal(cpu_env, tcg_excp);
28
+
23
- tcg_temp_free_i32(tcg_excp);
29
self.machine = self.params.get('machine',
24
+ gen_helper_exception_internal(cpu_env, tcg_constant_i32(excp));
30
default=self._get_unique_tag_val('machine'))
25
}
26
27
static void gen_exception_internal_insn(DisasContext *s, uint64_t pc, int excp)
28
@@ -XXX,XX +XXX,XX @@ static void gen_exception_internal_insn(DisasContext *s, uint64_t pc, int excp)
29
30
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syndrome)
31
{
32
- TCGv_i32 tcg_syn;
33
-
34
gen_a64_set_pc_im(s->pc_curr);
35
- tcg_syn = tcg_const_i32(syndrome);
36
- gen_helper_exception_bkpt_insn(cpu_env, tcg_syn);
37
- tcg_temp_free_i32(tcg_syn);
38
+ gen_helper_exception_bkpt_insn(cpu_env, tcg_constant_i32(syndrome));
39
s->base.is_jmp = DISAS_NORETURN;
40
}
41
31
42
--
32
--
43
2.25.1
33
2.34.1
34
35
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Note that tmp was doing double-duty as zero
4
and then later as a temporary in its own right.
5
Split the use of 0 to a new variable 'zero'.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220426163043.100432-5-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-a64.c | 26 +++++++++++++-------------
13
1 file changed, 13 insertions(+), 13 deletions(-)
14
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ static void gen_adc(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1)
20
static void gen_adc_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1)
21
{
22
if (sf) {
23
- TCGv_i64 result, cf_64, vf_64, tmp;
24
- result = tcg_temp_new_i64();
25
- cf_64 = tcg_temp_new_i64();
26
- vf_64 = tcg_temp_new_i64();
27
- tmp = tcg_const_i64(0);
28
+ TCGv_i64 result = tcg_temp_new_i64();
29
+ TCGv_i64 cf_64 = tcg_temp_new_i64();
30
+ TCGv_i64 vf_64 = tcg_temp_new_i64();
31
+ TCGv_i64 tmp = tcg_temp_new_i64();
32
+ TCGv_i64 zero = tcg_constant_i64(0);
33
34
tcg_gen_extu_i32_i64(cf_64, cpu_CF);
35
- tcg_gen_add2_i64(result, cf_64, t0, tmp, cf_64, tmp);
36
- tcg_gen_add2_i64(result, cf_64, result, cf_64, t1, tmp);
37
+ tcg_gen_add2_i64(result, cf_64, t0, zero, cf_64, zero);
38
+ tcg_gen_add2_i64(result, cf_64, result, cf_64, t1, zero);
39
tcg_gen_extrl_i64_i32(cpu_CF, cf_64);
40
gen_set_NZ64(result);
41
42
@@ -XXX,XX +XXX,XX @@ static void gen_adc_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1)
43
tcg_temp_free_i64(cf_64);
44
tcg_temp_free_i64(result);
45
} else {
46
- TCGv_i32 t0_32, t1_32, tmp;
47
- t0_32 = tcg_temp_new_i32();
48
- t1_32 = tcg_temp_new_i32();
49
- tmp = tcg_const_i32(0);
50
+ TCGv_i32 t0_32 = tcg_temp_new_i32();
51
+ TCGv_i32 t1_32 = tcg_temp_new_i32();
52
+ TCGv_i32 tmp = tcg_temp_new_i32();
53
+ TCGv_i32 zero = tcg_constant_i32(0);
54
55
tcg_gen_extrl_i64_i32(t0_32, t0);
56
tcg_gen_extrl_i64_i32(t1_32, t1);
57
- tcg_gen_add2_i32(cpu_NF, cpu_CF, t0_32, tmp, cpu_CF, tmp);
58
- tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1_32, tmp);
59
+ tcg_gen_add2_i32(cpu_NF, cpu_CF, t0_32, zero, cpu_CF, zero);
60
+ tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1_32, zero);
61
62
tcg_gen_mov_i32(cpu_ZF, cpu_NF);
63
tcg_gen_xor_i32(cpu_VF, cpu_NF, t0_32);
64
--
65
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-6-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 13 +++----------
9
1 file changed, 3 insertions(+), 10 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_axflag(void)
16
static void handle_msr_i(DisasContext *s, uint32_t insn,
17
unsigned int op1, unsigned int op2, unsigned int crm)
18
{
19
- TCGv_i32 t1;
20
int op = op1 << 3 | op2;
21
22
/* End the TB by default, chaining is ok. */
23
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
24
if (s->current_el == 0) {
25
goto do_unallocated;
26
}
27
- t1 = tcg_const_i32(crm & PSTATE_SP);
28
- gen_helper_msr_i_spsel(cpu_env, t1);
29
- tcg_temp_free_i32(t1);
30
+ gen_helper_msr_i_spsel(cpu_env, tcg_constant_i32(crm & PSTATE_SP));
31
break;
32
33
case 0x19: /* SSBS */
34
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
35
break;
36
37
case 0x1e: /* DAIFSet */
38
- t1 = tcg_const_i32(crm);
39
- gen_helper_msr_i_daifset(cpu_env, t1);
40
- tcg_temp_free_i32(t1);
41
+ gen_helper_msr_i_daifset(cpu_env, tcg_constant_i32(crm));
42
break;
43
44
case 0x1f: /* DAIFClear */
45
- t1 = tcg_const_i32(crm);
46
- gen_helper_msr_i_daifclear(cpu_env, t1);
47
- tcg_temp_free_i32(t1);
48
+ gen_helper_msr_i_daifclear(cpu_env, tcg_constant_i32(crm));
49
/* For DAIFClear, exit the cpu loop to re-evaluate pending IRQs. */
50
s->base.is_jmp = DISAS_UPDATE_EXIT;
51
break;
52
--
53
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-7-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 31 +++++++++----------------------
9
1 file changed, 9 insertions(+), 22 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
16
/* Emit code to perform further access permissions checks at
17
* runtime; this may result in an exception.
18
*/
19
- TCGv_ptr tmpptr;
20
- TCGv_i32 tcg_syn, tcg_isread;
21
uint32_t syndrome;
22
23
- gen_a64_set_pc_im(s->pc_curr);
24
- tmpptr = tcg_const_ptr(ri);
25
syndrome = syn_aa64_sysregtrap(op0, op1, op2, crn, crm, rt, isread);
26
- tcg_syn = tcg_const_i32(syndrome);
27
- tcg_isread = tcg_const_i32(isread);
28
- gen_helper_access_check_cp_reg(cpu_env, tmpptr, tcg_syn, tcg_isread);
29
- tcg_temp_free_ptr(tmpptr);
30
- tcg_temp_free_i32(tcg_syn);
31
- tcg_temp_free_i32(tcg_isread);
32
+ gen_a64_set_pc_im(s->pc_curr);
33
+ gen_helper_access_check_cp_reg(cpu_env,
34
+ tcg_constant_ptr(ri),
35
+ tcg_constant_i32(syndrome),
36
+ tcg_constant_i32(isread));
37
} else if (ri->type & ARM_CP_RAISES_EXC) {
38
/*
39
* The readfn or writefn might raise an exception;
40
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
41
case ARM_CP_DC_ZVA:
42
/* Writes clear the aligned block of memory which rt points into. */
43
if (s->mte_active[0]) {
44
- TCGv_i32 t_desc;
45
int desc = 0;
46
47
desc = FIELD_DP32(desc, MTEDESC, MIDX, get_mem_index(s));
48
desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid);
49
desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
50
- t_desc = tcg_const_i32(desc);
51
52
tcg_rt = new_tmp_a64(s);
53
- gen_helper_mte_check_zva(tcg_rt, cpu_env, t_desc, cpu_reg(s, rt));
54
- tcg_temp_free_i32(t_desc);
55
+ gen_helper_mte_check_zva(tcg_rt, cpu_env,
56
+ tcg_constant_i32(desc), cpu_reg(s, rt));
57
} else {
58
tcg_rt = clean_data_tbi(s, cpu_reg(s, rt));
59
}
60
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
61
if (ri->type & ARM_CP_CONST) {
62
tcg_gen_movi_i64(tcg_rt, ri->resetvalue);
63
} else if (ri->readfn) {
64
- TCGv_ptr tmpptr;
65
- tmpptr = tcg_const_ptr(ri);
66
- gen_helper_get_cp_reg64(tcg_rt, cpu_env, tmpptr);
67
- tcg_temp_free_ptr(tmpptr);
68
+ gen_helper_get_cp_reg64(tcg_rt, cpu_env, tcg_constant_ptr(ri));
69
} else {
70
tcg_gen_ld_i64(tcg_rt, cpu_env, ri->fieldoffset);
71
}
72
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
73
/* If not forbidden by access permissions, treat as WI */
74
return;
75
} else if (ri->writefn) {
76
- TCGv_ptr tmpptr;
77
- tmpptr = tcg_const_ptr(ri);
78
- gen_helper_set_cp_reg64(cpu_env, tmpptr, tcg_rt);
79
- tcg_temp_free_ptr(tmpptr);
80
+ gen_helper_set_cp_reg64(cpu_env, tcg_constant_ptr(ri), tcg_rt);
81
} else {
82
tcg_gen_st_i64(tcg_rt, cpu_env, ri->fieldoffset);
83
}
84
--
85
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-9-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 6 ++----
9
1 file changed, 2 insertions(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
16
tcg_temp_free_i64(cmp);
17
} else if (tb_cflags(s->base.tb) & CF_PARALLEL) {
18
if (HAVE_CMPXCHG128) {
19
- TCGv_i32 tcg_rs = tcg_const_i32(rs);
20
+ TCGv_i32 tcg_rs = tcg_constant_i32(rs);
21
if (s->be_data == MO_LE) {
22
gen_helper_casp_le_parallel(cpu_env, tcg_rs,
23
clean_addr, t1, t2);
24
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
25
gen_helper_casp_be_parallel(cpu_env, tcg_rs,
26
clean_addr, t1, t2);
27
}
28
- tcg_temp_free_i32(tcg_rs);
29
} else {
30
gen_helper_exit_atomic(cpu_env);
31
s->base.is_jmp = DISAS_NORETURN;
32
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
33
TCGv_i64 a2 = tcg_temp_new_i64();
34
TCGv_i64 c1 = tcg_temp_new_i64();
35
TCGv_i64 c2 = tcg_temp_new_i64();
36
- TCGv_i64 zero = tcg_const_i64(0);
37
+ TCGv_i64 zero = tcg_constant_i64(0);
38
39
/* Load the two words, in memory order. */
40
tcg_gen_qemu_ld_i64(d1, clean_addr, memidx,
41
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
42
tcg_temp_free_i64(a2);
43
tcg_temp_free_i64(c1);
44
tcg_temp_free_i64(c2);
45
- tcg_temp_free_i64(zero);
46
47
/* Write back the data from memory to Rs. */
48
tcg_gen_mov_i64(s1, d1);
49
--
50
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-10-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 3 +--
9
1 file changed, 1 insertion(+), 2 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_ld_lit(DisasContext *s, uint32_t insn)
16
17
tcg_rt = cpu_reg(s, rt);
18
19
- clean_addr = tcg_const_i64(s->pc_curr + imm);
20
+ clean_addr = tcg_constant_i64(s->pc_curr + imm);
21
if (is_vector) {
22
do_fp_ld(s, rt, clean_addr, size);
23
} else {
24
@@ -XXX,XX +XXX,XX @@ static void disas_ld_lit(DisasContext *s, uint32_t insn)
25
do_gpr_ld(s, tcg_rt, clean_addr, size + is_signed * MO_SIGN,
26
false, true, rt, iss_sf, false);
27
}
28
- tcg_temp_free_i64(clean_addr);
29
}
30
31
/*
32
--
33
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-11-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 9 +++------
9
1 file changed, 3 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
16
mop = endian | size | align;
17
18
elements = (is_q ? 16 : 8) >> size;
19
- tcg_ebytes = tcg_const_i64(1 << size);
20
+ tcg_ebytes = tcg_constant_i64(1 << size);
21
for (r = 0; r < rpt; r++) {
22
int e;
23
for (e = 0; e < elements; e++) {
24
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
25
}
26
}
27
}
28
- tcg_temp_free_i64(tcg_ebytes);
29
30
if (!is_store) {
31
/* For non-quad operations, setting a slice of the low
32
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
33
total);
34
mop = finalize_memop(s, scale);
35
36
- tcg_ebytes = tcg_const_i64(1 << scale);
37
+ tcg_ebytes = tcg_constant_i64(1 << scale);
38
for (xs = 0; xs < selem; xs++) {
39
if (replicate) {
40
/* Load and replicate to all elements */
41
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
42
tcg_gen_add_i64(clean_addr, clean_addr, tcg_ebytes);
43
rt = (rt + 1) % 32;
44
}
45
- tcg_temp_free_i64(tcg_ebytes);
46
47
if (is_postidx) {
48
if (rm == 31) {
49
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn)
50
51
if (is_zero) {
52
TCGv_i64 clean_addr = clean_data_tbi(s, addr);
53
- TCGv_i64 tcg_zero = tcg_const_i64(0);
54
+ TCGv_i64 tcg_zero = tcg_constant_i64(0);
55
int mem_index = get_mem_index(s);
56
int i, n = (1 + is_pair) << LOG2_TAG_GRANULE;
57
58
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn)
59
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
60
tcg_gen_qemu_st_i64(tcg_zero, clean_addr, mem_index, MO_UQ);
61
}
62
- tcg_temp_free_i64(tcg_zero);
63
}
64
65
if (index != 0) {
66
--
67
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-12-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn)
16
tcg_gen_addi_i64(tcg_result, tcg_rn, imm);
17
}
18
} else {
19
- TCGv_i64 tcg_imm = tcg_const_i64(imm);
20
+ TCGv_i64 tcg_imm = tcg_constant_i64(imm);
21
if (sub_op) {
22
gen_sub_CC(is_64bit, tcg_result, tcg_rn, tcg_imm);
23
} else {
24
gen_add_CC(is_64bit, tcg_result, tcg_rn, tcg_imm);
25
}
26
- tcg_temp_free_i64(tcg_imm);
27
}
28
29
if (is_64bit) {
30
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_imm_with_tags(DisasContext *s, uint32_t insn)
31
tcg_rd = cpu_reg_sp(s, rd);
32
33
if (s->ata) {
34
- TCGv_i32 offset = tcg_const_i32(imm);
35
- TCGv_i32 tag_offset = tcg_const_i32(uimm4);
36
-
37
- gen_helper_addsubg(tcg_rd, cpu_env, tcg_rn, offset, tag_offset);
38
- tcg_temp_free_i32(tag_offset);
39
- tcg_temp_free_i32(offset);
40
+ gen_helper_addsubg(tcg_rd, cpu_env, tcg_rn,
41
+ tcg_constant_i32(imm),
42
+ tcg_constant_i32(uimm4));
43
} else {
44
tcg_gen_addi_i64(tcg_rd, tcg_rn, imm);
45
gen_address_with_allocation_tag0(tcg_rd, tcg_rd);
46
--
47
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-13-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 5 +----
9
1 file changed, 1 insertion(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_movw_imm(DisasContext *s, uint32_t insn)
16
int opc = extract32(insn, 29, 2);
17
int pos = extract32(insn, 21, 2) << 4;
18
TCGv_i64 tcg_rd = cpu_reg(s, rd);
19
- TCGv_i64 tcg_imm;
20
21
if (!sf && (pos >= 32)) {
22
unallocated_encoding(s);
23
@@ -XXX,XX +XXX,XX @@ static void disas_movw_imm(DisasContext *s, uint32_t insn)
24
tcg_gen_movi_i64(tcg_rd, imm);
25
break;
26
case 3: /* MOVK */
27
- tcg_imm = tcg_const_i64(imm);
28
- tcg_gen_deposit_i64(tcg_rd, tcg_rd, tcg_imm, pos, 16);
29
- tcg_temp_free_i64(tcg_imm);
30
+ tcg_gen_deposit_i64(tcg_rd, tcg_rd, tcg_constant_i64(imm), pos, 16);
31
if (!sf) {
32
tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
33
}
34
--
35
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-14-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 6 +-----
9
1 file changed, 1 insertion(+), 5 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void shift_reg_imm(TCGv_i64 dst, TCGv_i64 src, int sf,
16
if (shift_i == 0) {
17
tcg_gen_mov_i64(dst, src);
18
} else {
19
- TCGv_i64 shift_const;
20
-
21
- shift_const = tcg_const_i64(shift_i);
22
- shift_reg(dst, src, sf, shift_type, shift_const);
23
- tcg_temp_free_i64(shift_const);
24
+ shift_reg(dst, src, sf, shift_type, tcg_constant_i64(shift_i));
25
}
26
}
27
28
--
29
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-15-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 3 +--
9
1 file changed, 1 insertion(+), 2 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
16
tcg_rd = cpu_reg(s, rd);
17
18
a64_test_cc(&c, cond);
19
- zero = tcg_const_i64(0);
20
+ zero = tcg_constant_i64(0);
21
22
if (rn == 31 && rm == 31 && (else_inc ^ else_inv)) {
23
/* CSET & CSETM. */
24
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
25
tcg_gen_movcond_i64(c.cond, tcg_rd, c.value, zero, t_true, t_false);
26
}
27
28
- tcg_temp_free_i64(zero);
29
a64_free_cc(&c);
30
31
if (!sf) {
32
--
33
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-16-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 7 ++-----
9
1 file changed, 2 insertions(+), 5 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_rev16(DisasContext *s, unsigned int sf,
16
TCGv_i64 tcg_rd = cpu_reg(s, rd);
17
TCGv_i64 tcg_tmp = tcg_temp_new_i64();
18
TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf);
19
- TCGv_i64 mask = tcg_const_i64(sf ? 0x00ff00ff00ff00ffull : 0x00ff00ff);
20
+ TCGv_i64 mask = tcg_constant_i64(sf ? 0x00ff00ff00ff00ffull : 0x00ff00ff);
21
22
tcg_gen_shri_i64(tcg_tmp, tcg_rn, 8);
23
tcg_gen_and_i64(tcg_rd, tcg_rn, mask);
24
@@ -XXX,XX +XXX,XX @@ static void handle_rev16(DisasContext *s, unsigned int sf,
25
tcg_gen_shli_i64(tcg_rd, tcg_rd, 8);
26
tcg_gen_or_i64(tcg_rd, tcg_rd, tcg_tmp);
27
28
- tcg_temp_free_i64(mask);
29
tcg_temp_free_i64(tcg_tmp);
30
}
31
32
@@ -XXX,XX +XXX,XX @@ static void handle_crc32(DisasContext *s,
33
}
34
35
tcg_acc = cpu_reg(s, rn);
36
- tcg_bytes = tcg_const_i32(1 << sz);
37
+ tcg_bytes = tcg_constant_i32(1 << sz);
38
39
if (crc32c) {
40
gen_helper_crc32c_64(cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes);
41
} else {
42
gen_helper_crc32_64(cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes);
43
}
44
-
45
- tcg_temp_free_i32(tcg_bytes);
46
}
47
48
/* Data-processing (2 source)
49
--
50
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Existing temp usage treats t1 as both zero and as a
4
temporary. Rearrange to only require one temporary,
5
so remove t1 and rename t2.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220426163043.100432-17-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-a64.c | 12 +++++-------
13
1 file changed, 5 insertions(+), 7 deletions(-)
14
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
20
if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) {
21
goto do_unallocated;
22
} else {
23
- TCGv_i64 t1 = tcg_const_i64(1);
24
- TCGv_i64 t2 = tcg_temp_new_i64();
25
+ TCGv_i64 t = tcg_temp_new_i64();
26
27
- tcg_gen_extract_i64(t2, cpu_reg_sp(s, rn), 56, 4);
28
- tcg_gen_shl_i64(t1, t1, t2);
29
- tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t1);
30
+ tcg_gen_extract_i64(t, cpu_reg_sp(s, rn), 56, 4);
31
+ tcg_gen_shl_i64(t, tcg_constant_i64(1), t);
32
+ tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t);
33
34
- tcg_temp_free_i64(t1);
35
- tcg_temp_free_i64(t2);
36
+ tcg_temp_free_i64(t);
37
}
38
break;
39
case 8: /* LSLV */
40
--
41
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-18-richard.henderson@linaro.org
6
[PMM: Restore incorrectly removed free of t_false in disas_fp_csel()]
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
target/arm/translate-a64.c | 23 +++++++----------------
10
1 file changed, 7 insertions(+), 16 deletions(-)
11
12
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/translate-a64.c
15
+++ b/target/arm/translate-a64.c
16
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, int size,
17
18
tcg_vn = read_fp_dreg(s, rn);
19
if (cmp_with_zero) {
20
- tcg_vm = tcg_const_i64(0);
21
+ tcg_vm = tcg_constant_i64(0);
22
} else {
23
tcg_vm = read_fp_dreg(s, rm);
24
}
25
@@ -XXX,XX +XXX,XX @@ static void disas_fp_compare(DisasContext *s, uint32_t insn)
26
static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
27
{
28
unsigned int mos, type, rm, cond, rn, op, nzcv;
29
- TCGv_i64 tcg_flags;
30
TCGLabel *label_continue = NULL;
31
int size;
32
33
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
34
label_continue = gen_new_label();
35
arm_gen_test_cc(cond, label_match);
36
/* nomatch: */
37
- tcg_flags = tcg_const_i64(nzcv << 28);
38
- gen_set_nzcv(tcg_flags);
39
- tcg_temp_free_i64(tcg_flags);
40
+ gen_set_nzcv(tcg_constant_i64(nzcv << 28));
41
tcg_gen_br(label_continue);
42
gen_set_label(label_match);
43
}
44
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
45
static void disas_fp_csel(DisasContext *s, uint32_t insn)
46
{
47
unsigned int mos, type, rm, cond, rn, rd;
48
- TCGv_i64 t_true, t_false, t_zero;
49
+ TCGv_i64 t_true, t_false;
50
DisasCompare64 c;
51
MemOp sz;
52
53
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
54
read_vec_element(s, t_false, rm, 0, sz);
55
56
a64_test_cc(&c, cond);
57
- t_zero = tcg_const_i64(0);
58
- tcg_gen_movcond_i64(c.cond, t_true, c.value, t_zero, t_true, t_false);
59
- tcg_temp_free_i64(t_zero);
60
+ tcg_gen_movcond_i64(c.cond, t_true, c.value, tcg_constant_i64(0),
61
+ t_true, t_false);
62
tcg_temp_free_i64(t_false);
63
a64_free_cc(&c);
64
65
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
66
int type = extract32(insn, 22, 2);
67
int mos = extract32(insn, 29, 3);
68
uint64_t imm;
69
- TCGv_i64 tcg_res;
70
MemOp sz;
71
72
if (mos || imm5) {
73
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
74
}
75
76
imm = vfp_expand_imm(sz, imm8);
77
-
78
- tcg_res = tcg_const_i64(imm);
79
- write_fp_dreg(s, rd, tcg_res);
80
- tcg_temp_free_i64(tcg_res);
81
+ write_fp_dreg(s, rd, tcg_constant_i64(imm));
82
}
83
84
/* Handle floating point <=> fixed point conversions. Note that we can
85
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
86
87
tcg_fpstatus = fpstatus_ptr(type == 3 ? FPST_FPCR_F16 : FPST_FPCR);
88
89
- tcg_shift = tcg_const_i32(64 - scale);
90
+ tcg_shift = tcg_constant_i32(64 - scale);
91
92
if (itof) {
93
TCGv_i64 tcg_int = cpu_reg(s, rn);
94
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
95
}
96
97
tcg_temp_free_ptr(tcg_fpstatus);
98
- tcg_temp_free_i32(tcg_shift);
99
}
100
101
/* Floating point <-> fixed point conversions
102
--
103
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-21-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 40 ++++++++++----------------------------
9
1 file changed, 10 insertions(+), 30 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
16
int passes = scalar ? 1 : 2;
17
18
if (scalar) {
19
- tcg_res[1] = tcg_const_i32(0);
20
+ tcg_res[1] = tcg_constant_i32(0);
21
}
22
23
for (pass = 0; pass < passes; pass++) {
24
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u,
25
}
26
27
if (is_scalar) {
28
- TCGv_i64 tcg_zero = tcg_const_i64(0);
29
- write_vec_element(s, tcg_zero, rd, 0, MO_64);
30
- tcg_temp_free_i64(tcg_zero);
31
+ write_vec_element(s, tcg_constant_i64(0), rd, 0, MO_64);
32
}
33
write_vec_element_i32(s, tcg_rd, rd, pass, MO_32);
34
}
35
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
36
case 0x1c: /* FCVTAS */
37
case 0x3a: /* FCVTPS */
38
case 0x3b: /* FCVTZS */
39
- {
40
- TCGv_i32 tcg_shift = tcg_const_i32(0);
41
- gen_helper_vfp_tosls(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
42
- tcg_temp_free_i32(tcg_shift);
43
+ gen_helper_vfp_tosls(tcg_rd, tcg_rn, tcg_constant_i32(0),
44
+ tcg_fpstatus);
45
break;
46
- }
47
case 0x5a: /* FCVTNU */
48
case 0x5b: /* FCVTMU */
49
case 0x5c: /* FCVTAU */
50
case 0x7a: /* FCVTPU */
51
case 0x7b: /* FCVTZU */
52
- {
53
- TCGv_i32 tcg_shift = tcg_const_i32(0);
54
- gen_helper_vfp_touls(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
55
- tcg_temp_free_i32(tcg_shift);
56
+ gen_helper_vfp_touls(tcg_rd, tcg_rn, tcg_constant_i32(0),
57
+ tcg_fpstatus);
58
break;
59
- }
60
default:
61
g_assert_not_reached();
62
}
63
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shrn(DisasContext *s, bool is_q,
64
read_vec_element(s, tcg_final, rd, is_q ? 1 : 0, MO_64);
65
66
if (round) {
67
- uint64_t round_const = 1ULL << (shift - 1);
68
- tcg_round = tcg_const_i64(round_const);
69
+ tcg_round = tcg_constant_i64(1ULL << (shift - 1));
70
} else {
71
tcg_round = NULL;
72
}
73
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shrn(DisasContext *s, bool is_q,
74
} else {
75
write_vec_element(s, tcg_final, rd, 1, MO_64);
76
}
77
- if (round) {
78
- tcg_temp_free_i64(tcg_round);
79
- }
80
tcg_temp_free_i64(tcg_rn);
81
tcg_temp_free_i64(tcg_rd);
82
tcg_temp_free_i64(tcg_final);
83
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u,
84
}
85
}
86
if (!is_q) {
87
- tcg_res[1] = tcg_const_i64(0);
88
+ tcg_res[1] = tcg_constant_i64(0);
89
}
90
for (pass = 0; pass < 2; pass++) {
91
write_vec_element(s, tcg_res[pass], rd, pass, MO_64);
92
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
93
case 0x1c: /* FCVTAS */
94
case 0x3a: /* FCVTPS */
95
case 0x3b: /* FCVTZS */
96
- {
97
- TCGv_i32 tcg_shift = tcg_const_i32(0);
98
gen_helper_vfp_tosls(tcg_res, tcg_op,
99
- tcg_shift, tcg_fpstatus);
100
- tcg_temp_free_i32(tcg_shift);
101
+ tcg_constant_i32(0), tcg_fpstatus);
102
break;
103
- }
104
case 0x5a: /* FCVTNU */
105
case 0x5b: /* FCVTMU */
106
case 0x5c: /* FCVTAU */
107
case 0x7a: /* FCVTPU */
108
case 0x7b: /* FCVTZU */
109
- {
110
- TCGv_i32 tcg_shift = tcg_const_i32(0);
111
gen_helper_vfp_touls(tcg_res, tcg_op,
112
- tcg_shift, tcg_fpstatus);
113
- tcg_temp_free_i32(tcg_shift);
114
+ tcg_constant_i32(0), tcg_fpstatus);
115
break;
116
- }
117
case 0x18: /* FRINTN */
118
case 0x19: /* FRINTM */
119
case 0x38: /* FRINTP */
120
--
121
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-23-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 32 +++++++-------------------------
9
1 file changed, 7 insertions(+), 25 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void store_sp_checked(DisasContext *s, TCGv_i32 var)
16
17
void gen_set_cpsr(TCGv_i32 var, uint32_t mask)
18
{
19
- TCGv_i32 tmp_mask = tcg_const_i32(mask);
20
- gen_helper_cpsr_write(cpu_env, var, tmp_mask);
21
- tcg_temp_free_i32(tmp_mask);
22
+ gen_helper_cpsr_write(cpu_env, var, tcg_constant_i32(mask));
23
}
24
25
static void gen_rebuild_hflags(DisasContext *s, bool new_el)
26
@@ -XXX,XX +XXX,XX @@ static void gen_rebuild_hflags(DisasContext *s, bool new_el)
27
28
static void gen_exception_internal(int excp)
29
{
30
- TCGv_i32 tcg_excp = tcg_const_i32(excp);
31
-
32
assert(excp_is_internal(excp));
33
- gen_helper_exception_internal(cpu_env, tcg_excp);
34
- tcg_temp_free_i32(tcg_excp);
35
+ gen_helper_exception_internal(cpu_env, tcg_constant_i32(excp));
36
}
37
38
static void gen_singlestep_exception(DisasContext *s)
39
@@ -XXX,XX +XXX,XX @@ static inline void gen_smc(DisasContext *s)
40
/* As with HVC, we may take an exception either before or after
41
* the insn executes.
42
*/
43
- TCGv_i32 tmp;
44
-
45
gen_set_pc_im(s, s->pc_curr);
46
- tmp = tcg_const_i32(syn_aa32_smc());
47
- gen_helper_pre_smc(cpu_env, tmp);
48
- tcg_temp_free_i32(tmp);
49
+ gen_helper_pre_smc(cpu_env, tcg_constant_i32(syn_aa32_smc()));
50
gen_set_pc_im(s, s->base.pc_next);
51
s->base.is_jmp = DISAS_SMC;
52
}
53
@@ -XXX,XX +XXX,XX @@ void gen_exception_insn(DisasContext *s, uint64_t pc, int excp,
54
55
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
56
{
57
- TCGv_i32 tcg_syn;
58
-
59
gen_set_condexec(s);
60
gen_set_pc_im(s, s->pc_curr);
61
- tcg_syn = tcg_const_i32(syn);
62
- gen_helper_exception_bkpt_insn(cpu_env, tcg_syn);
63
- tcg_temp_free_i32(tcg_syn);
64
+ gen_helper_exception_bkpt_insn(cpu_env, tcg_constant_i32(syn));
65
s->base.is_jmp = DISAS_NORETURN;
66
}
67
68
@@ -XXX,XX +XXX,XX @@ void unallocated_encoding(DisasContext *s)
69
static void gen_exception_el(DisasContext *s, int excp, uint32_t syn,
70
TCGv_i32 tcg_el)
71
{
72
- TCGv_i32 tcg_excp;
73
- TCGv_i32 tcg_syn;
74
-
75
gen_set_condexec(s);
76
gen_set_pc_im(s, s->pc_curr);
77
- tcg_excp = tcg_const_i32(excp);
78
- tcg_syn = tcg_const_i32(syn);
79
- gen_helper_exception_with_syndrome(cpu_env, tcg_excp, tcg_syn, tcg_el);
80
- tcg_temp_free_i32(tcg_syn);
81
- tcg_temp_free_i32(tcg_excp);
82
+ gen_helper_exception_with_syndrome(cpu_env,
83
+ tcg_constant_i32(excp),
84
+ tcg_constant_i32(syn), tcg_el);
85
s->base.is_jmp = DISAS_NORETURN;
86
}
87
88
--
89
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-24-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 25 ++++++++++---------------
9
1 file changed, 10 insertions(+), 15 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
16
gen_op_iwmmxt_movq_M0_wRn(wrd);
17
switch ((insn >> 6) & 3) {
18
case 0:
19
- tmp2 = tcg_const_i32(0xff);
20
- tmp3 = tcg_const_i32((insn & 7) << 3);
21
+ tmp2 = tcg_constant_i32(0xff);
22
+ tmp3 = tcg_constant_i32((insn & 7) << 3);
23
break;
24
case 1:
25
- tmp2 = tcg_const_i32(0xffff);
26
- tmp3 = tcg_const_i32((insn & 3) << 4);
27
+ tmp2 = tcg_constant_i32(0xffff);
28
+ tmp3 = tcg_constant_i32((insn & 3) << 4);
29
break;
30
case 2:
31
- tmp2 = tcg_const_i32(0xffffffff);
32
- tmp3 = tcg_const_i32((insn & 1) << 5);
33
+ tmp2 = tcg_constant_i32(0xffffffff);
34
+ tmp3 = tcg_constant_i32((insn & 1) << 5);
35
break;
36
default:
37
- tmp2 = NULL;
38
- tmp3 = NULL;
39
+ g_assert_not_reached();
40
}
41
gen_helper_iwmmxt_insr(cpu_M0, cpu_M0, tmp, tmp2, tmp3);
42
- tcg_temp_free_i32(tmp3);
43
- tcg_temp_free_i32(tmp2);
44
tcg_temp_free_i32(tmp);
45
gen_op_iwmmxt_movq_wRn_M0(wrd);
46
gen_op_iwmmxt_set_mup();
47
@@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
48
rd0 = (insn >> 16) & 0xf;
49
rd1 = (insn >> 0) & 0xf;
50
gen_op_iwmmxt_movq_M0_wRn(rd0);
51
- tmp = tcg_const_i32((insn >> 20) & 3);
52
iwmmxt_load_reg(cpu_V1, rd1);
53
- gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, tmp);
54
- tcg_temp_free_i32(tmp);
55
+ gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1,
56
+ tcg_constant_i32((insn >> 20) & 3));
57
gen_op_iwmmxt_movq_wRn_M0(wrd);
58
gen_op_iwmmxt_set_mup();
59
break;
60
@@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
61
wrd = (insn >> 12) & 0xf;
62
rd0 = (insn >> 16) & 0xf;
63
gen_op_iwmmxt_movq_M0_wRn(rd0);
64
- tmp = tcg_const_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
65
+ tmp = tcg_constant_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
66
gen_helper_iwmmxt_shufh(cpu_M0, cpu_env, cpu_M0, tmp);
67
- tcg_temp_free_i32(tmp);
68
gen_op_iwmmxt_movq_wRn_M0(wrd);
69
gen_op_iwmmxt_set_mup();
70
gen_op_iwmmxt_set_cup();
71
--
72
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-25-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 22 +++++++++-------------
9
1 file changed, 9 insertions(+), 13 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool msr_banked_access_decode(DisasContext *s, int r, int sysm, int rn,
16
tcg_gen_sextract_i32(tcg_el, tcg_el, ctz32(SCR_EEL2), 1);
17
tcg_gen_addi_i32(tcg_el, tcg_el, 3);
18
} else {
19
- tcg_el = tcg_const_i32(3);
20
+ tcg_el = tcg_constant_i32(3);
21
}
22
23
gen_exception_el(s, EXCP_UDEF, syn_uncategorized(), tcg_el);
24
@@ -XXX,XX +XXX,XX @@ undef:
25
26
static void gen_msr_banked(DisasContext *s, int r, int sysm, int rn)
27
{
28
- TCGv_i32 tcg_reg, tcg_tgtmode, tcg_regno;
29
+ TCGv_i32 tcg_reg;
30
int tgtmode = 0, regno = 0;
31
32
if (!msr_banked_access_decode(s, r, sysm, rn, &tgtmode, &regno)) {
33
@@ -XXX,XX +XXX,XX @@ static void gen_msr_banked(DisasContext *s, int r, int sysm, int rn)
34
gen_set_condexec(s);
35
gen_set_pc_im(s, s->pc_curr);
36
tcg_reg = load_reg(s, rn);
37
- tcg_tgtmode = tcg_const_i32(tgtmode);
38
- tcg_regno = tcg_const_i32(regno);
39
- gen_helper_msr_banked(cpu_env, tcg_reg, tcg_tgtmode, tcg_regno);
40
- tcg_temp_free_i32(tcg_tgtmode);
41
- tcg_temp_free_i32(tcg_regno);
42
+ gen_helper_msr_banked(cpu_env, tcg_reg,
43
+ tcg_constant_i32(tgtmode),
44
+ tcg_constant_i32(regno));
45
tcg_temp_free_i32(tcg_reg);
46
s->base.is_jmp = DISAS_UPDATE_EXIT;
47
}
48
49
static void gen_mrs_banked(DisasContext *s, int r, int sysm, int rn)
50
{
51
- TCGv_i32 tcg_reg, tcg_tgtmode, tcg_regno;
52
+ TCGv_i32 tcg_reg;
53
int tgtmode = 0, regno = 0;
54
55
if (!msr_banked_access_decode(s, r, sysm, rn, &tgtmode, &regno)) {
56
@@ -XXX,XX +XXX,XX @@ static void gen_mrs_banked(DisasContext *s, int r, int sysm, int rn)
57
gen_set_condexec(s);
58
gen_set_pc_im(s, s->pc_curr);
59
tcg_reg = tcg_temp_new_i32();
60
- tcg_tgtmode = tcg_const_i32(tgtmode);
61
- tcg_regno = tcg_const_i32(regno);
62
- gen_helper_mrs_banked(tcg_reg, cpu_env, tcg_tgtmode, tcg_regno);
63
- tcg_temp_free_i32(tcg_tgtmode);
64
- tcg_temp_free_i32(tcg_regno);
65
+ gen_helper_mrs_banked(tcg_reg, cpu_env,
66
+ tcg_constant_i32(tgtmode),
67
+ tcg_constant_i32(regno));
68
store_reg(s, rn, tcg_reg);
69
s->base.is_jmp = DISAS_UPDATE_EXIT;
70
}
71
--
72
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-26-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 27 +++++++++------------------
9
1 file changed, 9 insertions(+), 18 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ void gen_gvec_sqrdmlsh_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
16
} \
17
static void gen_##NAME##0_vec(unsigned vece, TCGv_vec d, TCGv_vec a) \
18
{ \
19
- TCGv_vec zero = tcg_const_zeros_vec_matching(d); \
20
+ TCGv_vec zero = tcg_constant_vec_matching(d, vece, 0); \
21
tcg_gen_cmp_vec(COND, vece, d, a, zero); \
22
- tcg_temp_free_vec(zero); \
23
} \
24
void gen_gvec_##NAME##0(unsigned vece, uint32_t d, uint32_t m, \
25
uint32_t opr_sz, uint32_t max_sz) \
26
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
27
TCGv_i32 rval = tcg_temp_new_i32();
28
TCGv_i32 lsh = tcg_temp_new_i32();
29
TCGv_i32 rsh = tcg_temp_new_i32();
30
- TCGv_i32 zero = tcg_const_i32(0);
31
- TCGv_i32 max = tcg_const_i32(32);
32
+ TCGv_i32 zero = tcg_constant_i32(0);
33
+ TCGv_i32 max = tcg_constant_i32(32);
34
35
/*
36
* Rely on the TCG guarantee that out of range shifts produce
37
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
38
tcg_temp_free_i32(rval);
39
tcg_temp_free_i32(lsh);
40
tcg_temp_free_i32(rsh);
41
- tcg_temp_free_i32(zero);
42
- tcg_temp_free_i32(max);
43
}
44
45
void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
46
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
47
TCGv_i64 rval = tcg_temp_new_i64();
48
TCGv_i64 lsh = tcg_temp_new_i64();
49
TCGv_i64 rsh = tcg_temp_new_i64();
50
- TCGv_i64 zero = tcg_const_i64(0);
51
- TCGv_i64 max = tcg_const_i64(64);
52
+ TCGv_i64 zero = tcg_constant_i64(0);
53
+ TCGv_i64 max = tcg_constant_i64(64);
54
55
/*
56
* Rely on the TCG guarantee that out of range shifts produce
57
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
58
tcg_temp_free_i64(rval);
59
tcg_temp_free_i64(lsh);
60
tcg_temp_free_i64(rsh);
61
- tcg_temp_free_i64(zero);
62
- tcg_temp_free_i64(max);
63
}
64
65
static void gen_ushl_vec(unsigned vece, TCGv_vec dst,
66
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
67
TCGv_i32 rval = tcg_temp_new_i32();
68
TCGv_i32 lsh = tcg_temp_new_i32();
69
TCGv_i32 rsh = tcg_temp_new_i32();
70
- TCGv_i32 zero = tcg_const_i32(0);
71
- TCGv_i32 max = tcg_const_i32(31);
72
+ TCGv_i32 zero = tcg_constant_i32(0);
73
+ TCGv_i32 max = tcg_constant_i32(31);
74
75
/*
76
* Rely on the TCG guarantee that out of range shifts produce
77
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
78
tcg_temp_free_i32(rval);
79
tcg_temp_free_i32(lsh);
80
tcg_temp_free_i32(rsh);
81
- tcg_temp_free_i32(zero);
82
- tcg_temp_free_i32(max);
83
}
84
85
void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
86
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
87
TCGv_i64 rval = tcg_temp_new_i64();
88
TCGv_i64 lsh = tcg_temp_new_i64();
89
TCGv_i64 rsh = tcg_temp_new_i64();
90
- TCGv_i64 zero = tcg_const_i64(0);
91
- TCGv_i64 max = tcg_const_i64(63);
92
+ TCGv_i64 zero = tcg_constant_i64(0);
93
+ TCGv_i64 max = tcg_constant_i64(63);
94
95
/*
96
* Rely on the TCG guarantee that out of range shifts produce
97
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
98
tcg_temp_free_i64(rval);
99
tcg_temp_free_i64(lsh);
100
tcg_temp_free_i64(rsh);
101
- tcg_temp_free_i64(zero);
102
- tcg_temp_free_i64(max);
103
}
104
105
static void gen_sshl_vec(unsigned vece, TCGv_vec dst,
106
--
107
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-27-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 43 +++++++++++++-----------------------------
9
1 file changed, 13 insertions(+), 30 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
16
* Note that on XScale all cp0..c13 registers do an access check
17
* call in order to handle c15_cpar.
18
*/
19
- TCGv_ptr tmpptr;
20
- TCGv_i32 tcg_syn, tcg_isread;
21
uint32_t syndrome;
22
23
/* Note that since we are an implementation which takes an
24
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
25
26
gen_set_condexec(s);
27
gen_set_pc_im(s, s->pc_curr);
28
- tmpptr = tcg_const_ptr(ri);
29
- tcg_syn = tcg_const_i32(syndrome);
30
- tcg_isread = tcg_const_i32(isread);
31
- gen_helper_access_check_cp_reg(cpu_env, tmpptr, tcg_syn,
32
- tcg_isread);
33
- tcg_temp_free_ptr(tmpptr);
34
- tcg_temp_free_i32(tcg_syn);
35
- tcg_temp_free_i32(tcg_isread);
36
+ gen_helper_access_check_cp_reg(cpu_env,
37
+ tcg_constant_ptr(ri),
38
+ tcg_constant_i32(syndrome),
39
+ tcg_constant_i32(isread));
40
} else if (ri->type & ARM_CP_RAISES_EXC) {
41
/*
42
* The readfn or writefn might raise an exception;
43
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
44
TCGv_i64 tmp64;
45
TCGv_i32 tmp;
46
if (ri->type & ARM_CP_CONST) {
47
- tmp64 = tcg_const_i64(ri->resetvalue);
48
+ tmp64 = tcg_constant_i64(ri->resetvalue);
49
} else if (ri->readfn) {
50
- TCGv_ptr tmpptr;
51
tmp64 = tcg_temp_new_i64();
52
- tmpptr = tcg_const_ptr(ri);
53
- gen_helper_get_cp_reg64(tmp64, cpu_env, tmpptr);
54
- tcg_temp_free_ptr(tmpptr);
55
+ gen_helper_get_cp_reg64(tmp64, cpu_env,
56
+ tcg_constant_ptr(ri));
57
} else {
58
tmp64 = tcg_temp_new_i64();
59
tcg_gen_ld_i64(tmp64, cpu_env, ri->fieldoffset);
60
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
61
} else {
62
TCGv_i32 tmp;
63
if (ri->type & ARM_CP_CONST) {
64
- tmp = tcg_const_i32(ri->resetvalue);
65
+ tmp = tcg_constant_i32(ri->resetvalue);
66
} else if (ri->readfn) {
67
- TCGv_ptr tmpptr;
68
tmp = tcg_temp_new_i32();
69
- tmpptr = tcg_const_ptr(ri);
70
- gen_helper_get_cp_reg(tmp, cpu_env, tmpptr);
71
- tcg_temp_free_ptr(tmpptr);
72
+ gen_helper_get_cp_reg(tmp, cpu_env, tcg_constant_ptr(ri));
73
} else {
74
tmp = load_cpu_offset(ri->fieldoffset);
75
}
76
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
77
tcg_temp_free_i32(tmplo);
78
tcg_temp_free_i32(tmphi);
79
if (ri->writefn) {
80
- TCGv_ptr tmpptr = tcg_const_ptr(ri);
81
- gen_helper_set_cp_reg64(cpu_env, tmpptr, tmp64);
82
- tcg_temp_free_ptr(tmpptr);
83
+ gen_helper_set_cp_reg64(cpu_env, tcg_constant_ptr(ri),
84
+ tmp64);
85
} else {
86
tcg_gen_st_i64(tmp64, cpu_env, ri->fieldoffset);
87
}
88
tcg_temp_free_i64(tmp64);
89
} else {
90
+ TCGv_i32 tmp = load_reg(s, rt);
91
if (ri->writefn) {
92
- TCGv_i32 tmp;
93
- TCGv_ptr tmpptr;
94
- tmp = load_reg(s, rt);
95
- tmpptr = tcg_const_ptr(ri);
96
- gen_helper_set_cp_reg(cpu_env, tmpptr, tmp);
97
- tcg_temp_free_ptr(tmpptr);
98
+ gen_helper_set_cp_reg(cpu_env, tcg_constant_ptr(ri), tmp);
99
tcg_temp_free_i32(tmp);
100
} else {
101
- TCGv_i32 tmp = load_reg(s, rt);
102
store_cpu_offset(tmp, ri->fieldoffset, 4);
103
}
104
}
105
--
106
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-28-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 8 ++------
9
1 file changed, 2 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
16
}
17
18
addr = tcg_temp_new_i32();
19
- tmp = tcg_const_i32(mode);
20
/* get_r13_banked() will raise an exception if called from System mode */
21
gen_set_condexec(s);
22
gen_set_pc_im(s, s->pc_curr);
23
- gen_helper_get_r13_banked(addr, cpu_env, tmp);
24
- tcg_temp_free_i32(tmp);
25
+ gen_helper_get_r13_banked(addr, cpu_env, tcg_constant_i32(mode));
26
switch (amode) {
27
case 0: /* DA */
28
offset = -4;
29
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
30
abort();
31
}
32
tcg_gen_addi_i32(addr, addr, offset);
33
- tmp = tcg_const_i32(mode);
34
- gen_helper_set_r13_banked(cpu_env, tmp, addr);
35
- tcg_temp_free_i32(tmp);
36
+ gen_helper_set_r13_banked(cpu_env, tcg_constant_i32(mode), addr);
37
}
38
tcg_temp_free_i32(addr);
39
s->base.is_jmp = DISAS_UPDATE_EXIT;
40
--
41
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
This allows the test to be skipped when TCG is not present in the QEMU
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
binary.
5
Message-id: 20220426163043.100432-35-richard.henderson@linaro.org
5
6
Signed-off-by: Fabiano Rosas <farosas@suse.de>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate.c | 9 +++------
11
tests/avocado/boot_linux_console.py | 1 +
9
1 file changed, 3 insertions(+), 6 deletions(-)
12
tests/avocado/reverse_debugging.py | 8 ++++++++
13
2 files changed, 9 insertions(+)
10
14
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
17
--- a/tests/avocado/boot_linux_console.py
14
+++ b/target/arm/translate.c
18
+++ b/tests/avocado/boot_linux_console.py
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CPS_v7m(DisasContext *s, arg_CPS_v7m *a)
19
@@ -XXX,XX +XXX,XX @@ def test_arm_orangepi_uboot_netbsd9(self):
16
return true;
20
17
}
21
def test_aarch64_raspi3_atf(self):
18
22
"""
19
- tmp = tcg_const_i32(a->im);
23
+ :avocado: tags=accel:tcg
20
+ tmp = tcg_constant_i32(a->im);
24
:avocado: tags=arch:aarch64
21
/* FAULTMASK */
25
:avocado: tags=machine:raspi3b
22
if (a->F) {
26
:avocado: tags=cpu:cortex-a53
23
- addr = tcg_const_i32(19);
27
diff --git a/tests/avocado/reverse_debugging.py b/tests/avocado/reverse_debugging.py
24
+ addr = tcg_constant_i32(19);
28
index XXXXXXX..XXXXXXX 100644
25
gen_helper_v7m_msr(cpu_env, addr, tmp);
29
--- a/tests/avocado/reverse_debugging.py
26
- tcg_temp_free_i32(addr);
30
+++ b/tests/avocado/reverse_debugging.py
27
}
31
@@ -XXX,XX +XXX,XX @@ def reverse_debugging(self, shift=7, args=None):
28
/* PRIMASK */
32
vm.shutdown()
29
if (a->I) {
33
30
- addr = tcg_const_i32(16);
34
class ReverseDebugging_X86_64(ReverseDebugging):
31
+ addr = tcg_constant_i32(16);
35
+ """
32
gen_helper_v7m_msr(cpu_env, addr, tmp);
36
+ :avocado: tags=accel:tcg
33
- tcg_temp_free_i32(addr);
37
+ """
34
}
38
+
35
gen_rebuild_hflags(s, false);
39
REG_PC = 0x10
36
- tcg_temp_free_i32(tmp);
40
REG_CS = 0x12
37
gen_lookup_tb(s);
41
def get_pc(self, g):
38
return true;
42
@@ -XXX,XX +XXX,XX @@ def test_x86_64_pc(self):
39
}
43
self.reverse_debugging()
44
45
class ReverseDebugging_AArch64(ReverseDebugging):
46
+ """
47
+ :avocado: tags=accel:tcg
48
+ """
49
+
50
REG_PC = 32
51
52
# unidentified gitlab timeout problem
40
--
53
--
41
2.25.1
54
2.34.1
55
56
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Now that the cortex-a15 is under CONFIG_TCG, use as default CPU for a
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
KVM-only build the 'max' cpu.
5
Message-id: 20220426163043.100432-34-richard.henderson@linaro.org
5
6
Note that we cannot use 'host' here because the qtests can run without
7
any other accelerator (than qtest) and 'host' depends on KVM being
8
enabled.
9
10
Signed-off-by: Fabiano Rosas <farosas@suse.de>
11
Acked-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
14
---
8
target/arm/translate.c | 16 +++++-----------
15
hw/arm/virt.c | 4 ++++
9
1 file changed, 5 insertions(+), 11 deletions(-)
16
1 file changed, 4 insertions(+)
10
17
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
18
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
20
--- a/hw/arm/virt.c
14
+++ b/target/arm/translate.c
21
+++ b/hw/arm/virt.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CLRM(DisasContext *s, arg_CLRM *a)
22
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
16
23
mc->minimum_page_bits = 12;
17
s->eci_handled = true;
24
mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
18
25
mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
19
- zero = tcg_const_i32(0);
26
+#ifdef CONFIG_TCG
20
+ zero = tcg_constant_i32(0);
27
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
21
for (i = 0; i < 15; i++) {
28
+#else
22
if (extract32(a->list, i, 1)) {
29
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("max");
23
/* Clear R[i] */
30
+#endif
24
@@ -XXX,XX +XXX,XX @@ static bool trans_CLRM(DisasContext *s, arg_CLRM *a)
31
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
25
* Clear APSR (by calling the MSR helper with the same argument
32
mc->kvm_type = virt_kvm_type;
26
* as for "MSR APSR_nzcvqg, Rn": mask = 0b1100, SYSM=0)
33
assert(!mc->get_hotplug_handler);
27
*/
28
- TCGv_i32 maskreg = tcg_const_i32(0xc << 8);
29
- gen_helper_v7m_msr(cpu_env, maskreg, zero);
30
- tcg_temp_free_i32(maskreg);
31
+ gen_helper_v7m_msr(cpu_env, tcg_constant_i32(0xc00), zero);
32
}
33
- tcg_temp_free_i32(zero);
34
clear_eci_state(s);
35
return true;
36
}
37
@@ -XXX,XX +XXX,XX @@ static bool trans_DLS(DisasContext *s, arg_DLS *a)
38
store_reg(s, 14, tmp);
39
if (a->size != 4) {
40
/* DLSTP: set FPSCR.LTPSIZE */
41
- tmp = tcg_const_i32(a->size);
42
- store_cpu_field(tmp, v7m.ltpsize);
43
+ store_cpu_field(tcg_constant_i32(a->size), v7m.ltpsize);
44
s->base.is_jmp = DISAS_UPDATE_NOCHAIN;
45
}
46
return true;
47
@@ -XXX,XX +XXX,XX @@ static bool trans_WLS(DisasContext *s, arg_WLS *a)
48
*/
49
bool ok = vfp_access_check(s);
50
assert(ok);
51
- tmp = tcg_const_i32(a->size);
52
- store_cpu_field(tmp, v7m.ltpsize);
53
+ store_cpu_field(tcg_constant_i32(a->size), v7m.ltpsize);
54
/*
55
* LTPSIZE updated, but MVE_NO_PRED will always be the same thing (0)
56
* when we take this upcoming exit from this TB, so gen_jmp_tb() is OK.
57
@@ -XXX,XX +XXX,XX @@ static bool trans_LE(DisasContext *s, arg_LE *a)
58
gen_set_label(loopend);
59
if (a->tp) {
60
/* Exits from tail-pred loops must reset LTPSIZE to 4 */
61
- tmp = tcg_const_i32(4);
62
- store_cpu_field(tmp, v7m.ltpsize);
63
+ store_cpu_field(tcg_constant_i32(4), v7m.ltpsize);
64
}
65
/* End TB, continuing to following insn */
66
gen_jmp_tb(s, s->base.pc_next, 1);
67
--
34
--
68
2.25.1
35
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Fabiano Rosas <farosas@suse.de>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20220426163043.100432-30-richard.henderson@linaro.org
5
Acked-by: Thomas Huth <thuth@redhat.com>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate.c | 11 +++--------
8
tests/qtest/arm-cpu-features.c | 28 ++++++++++++++++++----------
9
1 file changed, 3 insertions(+), 8 deletions(-)
9
1 file changed, 18 insertions(+), 10 deletions(-)
10
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
11
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
13
--- a/tests/qtest/arm-cpu-features.c
14
+++ b/target/arm/translate.c
14
+++ b/tests/qtest/arm-cpu-features.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_ADR(DisasContext *s, arg_ri *a)
15
@@ -XXX,XX +XXX,XX @@
16
16
#define SVE_MAX_VQ 16
17
static bool trans_MOVW(DisasContext *s, arg_MOVW *a)
17
18
#define MACHINE "-machine virt,gic-version=max -accel tcg "
19
-#define MACHINE_KVM "-machine virt,gic-version=max -accel kvm -accel tcg "
20
+#define MACHINE_KVM "-machine virt,gic-version=max -accel kvm "
21
#define QUERY_HEAD "{ 'execute': 'query-cpu-model-expansion', " \
22
" 'arguments': { 'type': 'full', "
23
#define QUERY_TAIL "}}"
24
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
18
{
25
{
19
- TCGv_i32 tmp;
26
g_test_init(&argc, &argv, NULL);
20
-
27
21
if (!ENABLE_ARCH_6T2) {
28
- qtest_add_data_func("/arm/query-cpu-model-expansion",
22
return false;
29
- NULL, test_query_cpu_model_expansion);
30
+ if (qtest_has_accel("tcg")) {
31
+ qtest_add_data_func("/arm/query-cpu-model-expansion",
32
+ NULL, test_query_cpu_model_expansion);
33
+ }
34
+
35
+ if (!g_str_equal(qtest_get_arch(), "aarch64")) {
36
+ goto out;
37
+ }
38
39
/*
40
* For now we only run KVM specific tests with AArch64 QEMU in
41
* order avoid attempting to run an AArch32 QEMU with KVM on
42
* AArch64 hosts. That won't work and isn't easy to detect.
43
*/
44
- if (g_str_equal(qtest_get_arch(), "aarch64") && qtest_has_accel("kvm")) {
45
+ if (qtest_has_accel("kvm")) {
46
/*
47
* This tests target the 'host' CPU type, so register it only if
48
* KVM is available.
49
*/
50
qtest_add_data_func("/arm/kvm/query-cpu-model-expansion",
51
NULL, test_query_cpu_model_expansion_kvm);
52
- }
53
54
- if (g_str_equal(qtest_get_arch(), "aarch64")) {
55
- qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-max-vq-8",
56
- NULL, sve_tests_sve_max_vq_8);
57
- qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-off",
58
- NULL, sve_tests_sve_off);
59
qtest_add_data_func("/arm/kvm/query-cpu-model-expansion/sve-off",
60
NULL, sve_tests_sve_off_kvm);
23
}
61
}
24
62
25
- tmp = tcg_const_i32(a->imm);
63
+ if (qtest_has_accel("tcg")) {
26
- store_reg(s, a->rd, tmp);
64
+ qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-max-vq-8",
27
+ store_reg(s, a->rd, tcg_constant_i32(a->imm));
65
+ NULL, sve_tests_sve_max_vq_8);
28
return true;
66
+ qtest_add_data_func("/arm/max/query-cpu-model-expansion/sve-off",
29
}
67
+ NULL, sve_tests_sve_off);
30
68
+ }
31
@@ -XXX,XX +XXX,XX @@ static bool trans_UMAAL(DisasContext *s, arg_UMAAL *a)
69
+
32
t0 = load_reg(s, a->rm);
70
+out:
33
t1 = load_reg(s, a->rn);
71
return g_test_run();
34
tcg_gen_mulu2_i32(t0, t1, t0, t1);
35
- zero = tcg_const_i32(0);
36
+ zero = tcg_constant_i32(0);
37
t2 = load_reg(s, a->ra);
38
tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero);
39
tcg_temp_free_i32(t2);
40
t2 = load_reg(s, a->rd);
41
tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero);
42
tcg_temp_free_i32(t2);
43
- tcg_temp_free_i32(zero);
44
store_reg(s, a->ra, t0);
45
store_reg(s, a->rd, t1);
46
return true;
47
@@ -XXX,XX +XXX,XX @@ static bool op_crc32(DisasContext *s, arg_rrr *a, bool c, MemOp sz)
48
default:
49
g_assert_not_reached();
50
}
51
- t3 = tcg_const_i32(1 << sz);
52
+ t3 = tcg_constant_i32(1 << sz);
53
if (c) {
54
gen_helper_crc32c(t1, t1, t2, t3);
55
} else {
56
gen_helper_crc32(t1, t1, t2, t3);
57
}
58
tcg_temp_free_i32(t2);
59
- tcg_temp_free_i32(t3);
60
store_reg(s, a->rd, t1);
61
return true;
62
}
72
}
63
--
73
--
64
2.25.1
74
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Fabiano Rosas <farosas@suse.de>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
These tests set -accel tcg, so restrict them to when TCG is present.
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
5
Message-id: 20220426163043.100432-33-richard.henderson@linaro.org
5
Signed-off-by: Fabiano Rosas <farosas@suse.de>
6
Acked-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
target/arm/translate.c | 12 ++++--------
10
tests/qtest/meson.build | 4 ++--
9
1 file changed, 4 insertions(+), 8 deletions(-)
11
1 file changed, 2 insertions(+), 2 deletions(-)
10
12
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
13
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
15
--- a/tests/qtest/meson.build
14
+++ b/target/arm/translate.c
16
+++ b/tests/qtest/meson.build
15
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
17
@@ -XXX,XX +XXX,XX @@ qtests_arm = \
16
{
18
# TODO: once aarch64 TCG is fixed on ARM 32 bit host, make bios-tables-test unconditional
17
int i, j, n, list, mem_idx;
19
qtests_aarch64 = \
18
bool user = a->u;
20
(cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
19
- TCGv_i32 addr, tmp, tmp2;
21
- (config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-test'] : []) + \
20
+ TCGv_i32 addr, tmp;
22
- (config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? ['tpm-tis-device-swtpm-test'] : []) + \
21
23
+ (config_all.has_key('CONFIG_TCG') and config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? \
22
if (user) {
24
+ ['tpm-tis-device-test', 'tpm-tis-device-swtpm-test'] : []) + \
23
/* STM (user) */
25
(config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
24
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
26
(config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test'] : []) + \
25
27
['arm-cpu-features',
26
if (user && i != 15) {
27
tmp = tcg_temp_new_i32();
28
- tmp2 = tcg_const_i32(i);
29
- gen_helper_get_user_reg(tmp, cpu_env, tmp2);
30
- tcg_temp_free_i32(tmp2);
31
+ gen_helper_get_user_reg(tmp, cpu_env, tcg_constant_i32(i));
32
} else {
33
tmp = load_reg(s, i);
34
}
35
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
36
bool loaded_base;
37
bool user = a->u;
38
bool exc_return = false;
39
- TCGv_i32 addr, tmp, tmp2, loaded_var;
40
+ TCGv_i32 addr, tmp, loaded_var;
41
42
if (user) {
43
/* LDM (user), LDM (exception return) */
44
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
45
tmp = tcg_temp_new_i32();
46
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
47
if (user) {
48
- tmp2 = tcg_const_i32(i);
49
- gen_helper_set_user_reg(cpu_env, tmp2, tmp);
50
- tcg_temp_free_i32(tmp2);
51
+ gen_helper_set_user_reg(cpu_env, tcg_constant_i32(i), tmp);
52
tcg_temp_free_i32(tmp);
53
} else if (i == a->rn) {
54
loaded_var = tmp;
55
--
28
--
56
2.25.1
29
2.34.1
diff view generated by jsdifflib
Deleted patch
1
The Arm FEAT_TTL architectural feature allows the guest to provide an
2
optional hint in an AArch64 TLB invalidate operation about which
3
translation table level holds the leaf entry for the address being
4
invalidated. QEMU's TLB implementation doesn't need that hint, and
5
we correctly ignore the (previously RES0) bits in TLB invalidate
6
operation values that are now used for the TTL field. So we can
7
simply advertise support for it in our 'max' CPU.
8
1
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220426160422.2353158-2-peter.maydell@linaro.org
12
---
13
docs/system/arm/emulation.rst | 1 +
14
target/arm/cpu64.c | 1 +
15
2 files changed, 2 insertions(+)
16
17
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/emulation.rst
20
+++ b/docs/system/arm/emulation.rst
21
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
22
- FEAT_TLBIOS (TLB invalidate instructions in Outer Shareable domain)
23
- FEAT_TLBIRANGE (TLB invalidate range instructions)
24
- FEAT_TTCNP (Translation table Common not private translations)
25
+- FEAT_TTL (Translation Table Level)
26
- FEAT_TTST (Small translation tables)
27
- FEAT_UAO (Unprivileged Access Override control)
28
- FEAT_VHE (Virtualization Host Extensions)
29
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu64.c
32
+++ b/target/arm/cpu64.c
33
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
34
t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* TTCNP */
35
t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
36
t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */
37
+ t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
38
cpu->isar.id_aa64mmfr2 = t;
39
40
t = cpu->isar.id_aa64zfr0;
41
--
42
2.25.1
diff view generated by jsdifflib
Deleted patch
1
The description in the Arm ARM of the requirements of FEAT_BBM is
2
admirably clear on the guarantees it provides software, but slightly
3
more obscure on what that means for implementations. The description
4
of the equivalent SMMU feature in the SMMU specification (IHI0070D.b
5
section 3.21.1) is perhaps a bit more detailed and includes some
6
example valid implementation choices. (The SMMU version of this
7
feature is slightly tighter than the CPU version: the CPU is permitted
8
to raise TLB Conflict aborts in some situations that the SMMU may
9
not. This doesn't matter for QEMU because we don't want to do TLB
10
Conflict aborts anyway.)
11
1
12
The informal summary of FEAT_BBM is that it is about permitting an OS
13
to switch a range of memory between "covered by a huge page" and
14
"covered by a sequence of normal pages" without having to engage in
15
the 'break-before-make' dance that has traditionally been
16
necessary. The 'break-before-make' sequence is:
17
18
* replace the old translation table entry with an invalid entry
19
* execute a DSB insn
20
* execute a broadcast TLB invalidate insn
21
* execute a DSB insn
22
* write the new translation table entry
23
* execute a DSB insn
24
25
The point of this is to ensure that no TLB can simultaneously contain
26
TLB entries for the old and the new entry, which would traditionally
27
be UNPREDICTABLE (allowing the CPU to generate a TLB Conflict fault
28
or to use a random mishmash of values from the old and the new
29
entry). FEAT_BBM level 2 says "for the specific case where the only
30
thing that changed is the size of the block, the TLB is guaranteed
31
not to do weird things even if there are multiple entries for an
32
address", which means that software can now do:
33
34
* replace old translation table entry with new entry
35
* DSB
36
* broadcast TLB invalidate
37
* DSB
38
39
As the SMMU spec notes, valid ways to do this include:
40
41
* if there are multiple entries in the TLB for an address,
42
choose one of them and use it, ignoring the others
43
* if there are multiple entries in the TLB for an address,
44
throw them all out and do a page table walk to get a new one
45
46
QEMU's page table walk implementation for Arm CPUs already meets the
47
requirements for FEAT_BBM level 2. When we cache an entry in our TCG
48
TLB, we do so only for the specific (non-huge) page that the address
49
is in, and there is no way for the TLB data structure to ever have
50
more than one TLB entry for that page. (We handle huge pages only in
51
that we track what part of the address space is covered by huge pages
52
so that a TLB invalidate operation for an address in a huge page
53
results in an invalidation of the whole TLB.) We ignore the Contiguous
54
bit in page table entries, so we don't have to do anything for the
55
parts of FEAT_BBM that deal with changis to the Contiguous bit.
56
57
FEAT_BBM level 2 also requires that the nT bit in block descriptors
58
must be ignored; since commit 39a1fd25287f5dece5 we do this.
59
60
It's therefore safe for QEMU to advertise FEAT_BBM level 2 by
61
setting ID_AA64MMFR2_EL1.BBM to 2.
62
63
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
64
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
65
Message-id: 20220426160422.2353158-3-peter.maydell@linaro.org
66
---
67
docs/system/arm/emulation.rst | 1 +
68
target/arm/cpu64.c | 1 +
69
2 files changed, 2 insertions(+)
70
71
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
72
index XXXXXXX..XXXXXXX 100644
73
--- a/docs/system/arm/emulation.rst
74
+++ b/docs/system/arm/emulation.rst
75
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
76
- FEAT_AA32HPD (AArch32 hierarchical permission disables)
77
- FEAT_AA32I8MM (AArch32 Int8 matrix multiplication instructions)
78
- FEAT_AES (AESD and AESE instructions)
79
+- FEAT_BBM at level 2 (Translation table break-before-make levels)
80
- FEAT_BF16 (AArch64 BFloat16 instructions)
81
- FEAT_BTI (Branch Target Identification)
82
- FEAT_DIT (Data Independent Timing instructions)
83
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/arm/cpu64.c
86
+++ b/target/arm/cpu64.c
87
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
88
t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
89
t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */
90
t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
91
+ t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */
92
cpu->isar.id_aa64mmfr2 = t;
93
94
t = cpu->isar.id_aa64zfr0;
95
--
96
2.25.1
diff view generated by jsdifflib