@samitouri / QOSamiQemu / commits / d4b14960f6

target/arm: Extract common code related to 'max' CPU

Extract common code related to 'max' CPU. This commit only move code used by the 32-bit 'max' CPU, but we will soon add the 64-bit counterpart, so name it generically as "cpu-max.c". Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com> Acked-by: Peter Maydell <peter.maydell@linaro.org> Message-Id: <20260526203722.79463-10-philmd@linaro.org>

Philippe Mathieu-Daudé committed Apr 8, 2026 at 15:30 UTC d4b14960f6a593e79d92d53011d970c4a598c4ce
3 files changed +107 -96
target/arm/cpu-max.c new
+106
@@ -0,0 +1,106 @@
1 +/*
2 + * QEMU ARM 'max' CPU
3 + *
4 + * Copyright (c) 2018 Linaro Ltd
5 + *
6 + * SPDX-License-Identifier: GPL-2.0-or-later
7 + */
8 +
9 +#include "qemu/osdep.h"
10 +#include "target/arm/internals.h"
11 +
12 +/* Share AArch32 -cpu max features with AArch64. */
13 +void aa32_max_features(ARMCPU *cpu)
14 +{
15 + uint32_t t;
16 + ARMISARegisters *isar = &cpu->isar;
17 +
18 + /* Add additional features supported by QEMU */
19 + t = GET_IDREG(isar, ID_ISAR5);
20 + t = FIELD_DP32(t, ID_ISAR5, AES, 2); /* FEAT_PMULL */
21 + t = FIELD_DP32(t, ID_ISAR5, SHA1, 1); /* FEAT_SHA1 */
22 + t = FIELD_DP32(t, ID_ISAR5, SHA2, 1); /* FEAT_SHA256 */
23 + t = FIELD_DP32(t, ID_ISAR5, CRC32, 1);
24 + t = FIELD_DP32(t, ID_ISAR5, RDM, 1); /* FEAT_RDM */
25 + t = FIELD_DP32(t, ID_ISAR5, VCMA, 1); /* FEAT_FCMA */
26 + SET_IDREG(isar, ID_ISAR5, t);
27 +
28 + t = GET_IDREG(isar, ID_ISAR6);
29 + t = FIELD_DP32(t, ID_ISAR6, JSCVT, 1); /* FEAT_JSCVT */
30 + t = FIELD_DP32(t, ID_ISAR6, DP, 1); /* Feat_DotProd */
31 + t = FIELD_DP32(t, ID_ISAR6, FHM, 1); /* FEAT_FHM */
32 + t = FIELD_DP32(t, ID_ISAR6, SB, 1); /* FEAT_SB */
33 + t = FIELD_DP32(t, ID_ISAR6, SPECRES, 1); /* FEAT_SPECRES */
34 + t = FIELD_DP32(t, ID_ISAR6, BF16, 1); /* FEAT_AA32BF16 */
35 + t = FIELD_DP32(t, ID_ISAR6, I8MM, 1); /* FEAT_AA32I8MM */
36 + SET_IDREG(isar, ID_ISAR6, t);
37 +
38 + t = cpu->isar.mvfr1;
39 + t = FIELD_DP32(t, MVFR1, FPHP, 3); /* FEAT_FP16 */
40 + t = FIELD_DP32(t, MVFR1, SIMDHP, 2); /* FEAT_FP16 */
41 + cpu->isar.mvfr1 = t;
42 +
43 + t = cpu->isar.mvfr2;
44 + t = FIELD_DP32(t, MVFR2, SIMDMISC, 3); /* SIMD MaxNum */
45 + t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
46 + cpu->isar.mvfr2 = t;
47 +
48 + FIELD_DP32_IDREG(isar, ID_MMFR3, PAN, 2); /* FEAT_PAN2 */
49 +
50 + t = GET_IDREG(isar, ID_MMFR4);
51 + t = FIELD_DP32(t, ID_MMFR4, HPDS, 2); /* FEAT_HPDS2 */
52 + t = FIELD_DP32(t, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
53 + t = FIELD_DP32(t, ID_MMFR4, CNP, 1); /* FEAT_TTCNP */
54 + t = FIELD_DP32(t, ID_MMFR4, XNX, 1); /* FEAT_XNX */
55 + t = FIELD_DP32(t, ID_MMFR4, EVT, 2); /* FEAT_EVT */
56 + SET_IDREG(isar, ID_MMFR4, t);
57 +
58 + FIELD_DP32_IDREG(isar, ID_MMFR5, ETS, 2); /* FEAT_ETS2 */
59 +
60 + t = GET_IDREG(isar, ID_PFR0);
61 + t = FIELD_DP32(t, ID_PFR0, CSV2, 2); /* FEAT_CSV2 */
62 + t = FIELD_DP32(t, ID_PFR0, DIT, 1); /* FEAT_DIT */
63 + t = FIELD_DP32(t, ID_PFR0, RAS, 1); /* FEAT_RAS */
64 + SET_IDREG(isar, ID_PFR0, t);
65 +
66 + t = GET_IDREG(isar, ID_PFR2);
67 + t = FIELD_DP32(t, ID_PFR2, CSV3, 1); /* FEAT_CSV3 */
68 + t = FIELD_DP32(t, ID_PFR2, SSBS, 1); /* FEAT_SSBS */
69 + SET_IDREG(isar, ID_PFR2, t);
70 +
71 + t = GET_IDREG(isar, ID_DFR0);
72 + t = FIELD_DP32(t, ID_DFR0, COPDBG, 10); /* FEAT_Debugv8p8 */
73 + t = FIELD_DP32(t, ID_DFR0, COPSDBG, 10); /* FEAT_Debugv8p8 */
74 + t = FIELD_DP32(t, ID_DFR0, PERFMON, 6); /* FEAT_PMUv3p5 */
75 + SET_IDREG(isar, ID_DFR0, t);
76 +
77 + /* Debug ID registers. */
78 +
79 + /* Bit[15] is RES1, Bit[13] and Bits[11:0] are RES0. */
80 + t = 0x00008000;
81 + t = FIELD_DP32(t, DBGDIDR, SE_IMP, 1);
82 + t = FIELD_DP32(t, DBGDIDR, NSUHD_IMP, 1);
83 + t = FIELD_DP32(t, DBGDIDR, VERSION, 10); /* FEAT_Debugv8p8 */
84 + t = FIELD_DP32(t, DBGDIDR, CTX_CMPS, 1);
85 + t = FIELD_DP32(t, DBGDIDR, BRPS, 5);
86 + t = FIELD_DP32(t, DBGDIDR, WRPS, 3);
87 + cpu->isar.dbgdidr = t;
88 +
89 + t = 0;
90 + t = FIELD_DP32(t, DBGDEVID, PCSAMPLE, 3);
91 + t = FIELD_DP32(t, DBGDEVID, WPADDRMASK, 1);
92 + t = FIELD_DP32(t, DBGDEVID, BPADDRMASK, 15);
93 + t = FIELD_DP32(t, DBGDEVID, VECTORCATCH, 0);
94 + t = FIELD_DP32(t, DBGDEVID, VIRTEXTNS, 1);
95 + t = FIELD_DP32(t, DBGDEVID, DOUBLELOCK, 1);
96 + t = FIELD_DP32(t, DBGDEVID, AUXREGS, 0);
97 + t = FIELD_DP32(t, DBGDEVID, CIDMASK, 0);
98 + cpu->isar.dbgdevid = t;
99 +
100 + /* Bits[31:4] are RES0. */
101 + t = 0;
102 + t = FIELD_DP32(t, DBGDEVID1, PCSROFFSET, 2);
103 + cpu->isar.dbgdevid1 = t;
104 +
105 + FIELD_DP32_IDREG(isar, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
106 +}
target/arm/meson.build
+1
@@ -9,6 +9,7 @@ arm_user_ss = ss.source_set()
9 arm_common_system_ss.add(files('gdbstub.c'))
10 arm_user_ss.add(files('gdbstub.c'))
11
12 +arm_ss.add(files('cpu-max.c'))
13 arm_ss.add(when: 'TARGET_AARCH64', if_true: files(
14 'cpu64.c',
15 ))
target/arm/tcg/cpu32.c
-96
@@ -18,102 +18,6 @@
18 #include "cpregs.h"
19
20
21 -/* Share AArch32 -cpu max features with AArch64. */
22 -void aa32_max_features(ARMCPU *cpu)
23 -{
24 - uint32_t t;
25 - ARMISARegisters *isar = &cpu->isar;
26 -
27 - /* Add additional features supported by QEMU */
28 - t = GET_IDREG(isar, ID_ISAR5);
29 - t = FIELD_DP32(t, ID_ISAR5, AES, 2); /* FEAT_PMULL */
30 - t = FIELD_DP32(t, ID_ISAR5, SHA1, 1); /* FEAT_SHA1 */
31 - t = FIELD_DP32(t, ID_ISAR5, SHA2, 1); /* FEAT_SHA256 */
32 - t = FIELD_DP32(t, ID_ISAR5, CRC32, 1);
33 - t = FIELD_DP32(t, ID_ISAR5, RDM, 1); /* FEAT_RDM */
34 - t = FIELD_DP32(t, ID_ISAR5, VCMA, 1); /* FEAT_FCMA */
35 - SET_IDREG(isar, ID_ISAR5, t);
36 -
37 - t = GET_IDREG(isar, ID_ISAR6);
38 - t = FIELD_DP32(t, ID_ISAR6, JSCVT, 1); /* FEAT_JSCVT */
39 - t = FIELD_DP32(t, ID_ISAR6, DP, 1); /* Feat_DotProd */
40 - t = FIELD_DP32(t, ID_ISAR6, FHM, 1); /* FEAT_FHM */
41 - t = FIELD_DP32(t, ID_ISAR6, SB, 1); /* FEAT_SB */
42 - t = FIELD_DP32(t, ID_ISAR6, SPECRES, 1); /* FEAT_SPECRES */
43 - t = FIELD_DP32(t, ID_ISAR6, BF16, 1); /* FEAT_AA32BF16 */
44 - t = FIELD_DP32(t, ID_ISAR6, I8MM, 1); /* FEAT_AA32I8MM */
45 - SET_IDREG(isar, ID_ISAR6, t);
46 -
47 - t = cpu->isar.mvfr1;
48 - t = FIELD_DP32(t, MVFR1, FPHP, 3); /* FEAT_FP16 */
49 - t = FIELD_DP32(t, MVFR1, SIMDHP, 2); /* FEAT_FP16 */
50 - cpu->isar.mvfr1 = t;
51 -
52 - t = cpu->isar.mvfr2;
53 - t = FIELD_DP32(t, MVFR2, SIMDMISC, 3); /* SIMD MaxNum */
54 - t = FIELD_DP32(t, MVFR2, FPMISC, 4); /* FP MaxNum */
55 - cpu->isar.mvfr2 = t;
56 -
57 - FIELD_DP32_IDREG(isar, ID_MMFR3, PAN, 2); /* FEAT_PAN2 */
58 -
59 - t = GET_IDREG(isar, ID_MMFR4);
60 - t = FIELD_DP32(t, ID_MMFR4, HPDS, 2); /* FEAT_HPDS2 */
61 - t = FIELD_DP32(t, ID_MMFR4, AC2, 1); /* ACTLR2, HACTLR2 */
62 - t = FIELD_DP32(t, ID_MMFR4, CNP, 1); /* FEAT_TTCNP */
63 - t = FIELD_DP32(t, ID_MMFR4, XNX, 1); /* FEAT_XNX */
64 - t = FIELD_DP32(t, ID_MMFR4, EVT, 2); /* FEAT_EVT */
65 - SET_IDREG(isar, ID_MMFR4, t);
66 -
67 - FIELD_DP32_IDREG(isar, ID_MMFR5, ETS, 2); /* FEAT_ETS2 */
68 -
69 - t = GET_IDREG(isar, ID_PFR0);
70 - t = FIELD_DP32(t, ID_PFR0, CSV2, 2); /* FEAT_CSV2 */
71 - t = FIELD_DP32(t, ID_PFR0, DIT, 1); /* FEAT_DIT */
72 - t = FIELD_DP32(t, ID_PFR0, RAS, 1); /* FEAT_RAS */
73 - SET_IDREG(isar, ID_PFR0, t);
74 -
75 - t = GET_IDREG(isar, ID_PFR2);
76 - t = FIELD_DP32(t, ID_PFR2, CSV3, 1); /* FEAT_CSV3 */
77 - t = FIELD_DP32(t, ID_PFR2, SSBS, 1); /* FEAT_SSBS */
78 - SET_IDREG(isar, ID_PFR2, t);
79 -
80 - t = GET_IDREG(isar, ID_DFR0);
81 - t = FIELD_DP32(t, ID_DFR0, COPDBG, 10); /* FEAT_Debugv8p8 */
82 - t = FIELD_DP32(t, ID_DFR0, COPSDBG, 10); /* FEAT_Debugv8p8 */
83 - t = FIELD_DP32(t, ID_DFR0, PERFMON, 6); /* FEAT_PMUv3p5 */
84 - SET_IDREG(isar, ID_DFR0, t);
85 -
86 - /* Debug ID registers. */
87 -
88 - /* Bit[15] is RES1, Bit[13] and Bits[11:0] are RES0. */
89 - t = 0x00008000;
90 - t = FIELD_DP32(t, DBGDIDR, SE_IMP, 1);
91 - t = FIELD_DP32(t, DBGDIDR, NSUHD_IMP, 1);
92 - t = FIELD_DP32(t, DBGDIDR, VERSION, 10); /* FEAT_Debugv8p8 */
93 - t = FIELD_DP32(t, DBGDIDR, CTX_CMPS, 1);
94 - t = FIELD_DP32(t, DBGDIDR, BRPS, 5);
95 - t = FIELD_DP32(t, DBGDIDR, WRPS, 3);
96 - cpu->isar.dbgdidr = t;
97 -
98 - t = 0;
99 - t = FIELD_DP32(t, DBGDEVID, PCSAMPLE, 3);
100 - t = FIELD_DP32(t, DBGDEVID, WPADDRMASK, 1);
101 - t = FIELD_DP32(t, DBGDEVID, BPADDRMASK, 15);
102 - t = FIELD_DP32(t, DBGDEVID, VECTORCATCH, 0);
103 - t = FIELD_DP32(t, DBGDEVID, VIRTEXTNS, 1);
104 - t = FIELD_DP32(t, DBGDEVID, DOUBLELOCK, 1);
105 - t = FIELD_DP32(t, DBGDEVID, AUXREGS, 0);
106 - t = FIELD_DP32(t, DBGDEVID, CIDMASK, 0);
107 - cpu->isar.dbgdevid = t;
108 -
109 - /* Bits[31:4] are RES0. */
110 - t = 0;
111 - t = FIELD_DP32(t, DBGDEVID1, PCSROFFSET, 2);
112 - cpu->isar.dbgdevid1 = t;
113 -
114 - FIELD_DP32_IDREG(isar, ID_DFR1, HPMN0, 1); /* FEAT_HPMN0 */
115 -}
116 -
21 /* CPU models. These are not needed for the AArch64 linux-user build. */
22 #if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
23