@samitouri / QOSamiQemu / commits / 7bec1d4428

target/arm: GICv5 cpuif: Implement GIC CD* insns for setting config

Implement the GIC CDDIS, GIC CDEN, GIC CDAFF, GIC CDPEND and GIC CDHM system instructions. These are all simple wrappers around the equivalent gicv5_set_* functions, like GIC CDPRI. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Message-id: 20260327111700.795099-23-peter.maydell@linaro.org

Peter Maydell committed Mar 27, 2026 at 11:16 UTC 7bec1d4428d2a9f439b129b5e8d9244b577dee58
1 file changed +108
target/arm/tcg/gicv5-cpuif.c
+108
@@ -16,6 +16,25 @@ FIELD(GIC_CDPRI, ID, 0, 24)
16 FIELD(GIC_CDPRI, TYPE, 29, 3)
17 FIELD(GIC_CDPRI, PRIORITY, 35, 5)
18
19 +FIELD(GIC_CDDIS, ID, 0, 24)
20 +FIELD(GIC_CDDIS, TYPE, 29, 3)
21 +
22 +FIELD(GIC_CDEN, ID, 0, 24)
23 +FIELD(GIC_CDEN, TYPE, 29, 3)
24 +
25 +FIELD(GIC_CDAFF, ID, 0, 24)
26 +FIELD(GIC_CDAFF, IRM, 28, 1)
27 +FIELD(GIC_CDAFF, TYPE, 29, 3)
28 +FIELD(GIC_CDAFF, IAFFID, 32, 16)
29 +
30 +FIELD(GIC_CDPEND, ID, 0, 24)
31 +FIELD(GIC_CDPEND, TYPE, 29, 3)
32 +FIELD(GIC_CDPEND, PENDING, 32, 1)
33 +
34 +FIELD(GIC_CDHM, ID, 0, 24)
35 +FIELD(GIC_CDHM, TYPE, 29, 3)
36 +FIELD(GIC_CDHM, HM, 32, 1)
37 +
38 static GICv5Common *gicv5_get_gic(CPUARMState *env)
39 {
40 return env->gicv5state;
@@ -51,6 +70,30 @@ static GICv5Domain gicv5_current_phys_domain(CPUARMState *env)
70 return gicv5_logical_domain(env);
71 }
72
73 +static void gic_cddis_write(CPUARMState *env, const ARMCPRegInfo *ri,
74 + uint64_t value)
75 +{
76 + GICv5Common *gic = gicv5_get_gic(env);
77 + GICv5IntType type = FIELD_EX64(value, GIC_CDDIS, TYPE);
78 + uint32_t id = FIELD_EX64(value, GIC_CDDIS, ID);
79 + bool virtual = false;
80 + GICv5Domain domain = gicv5_current_phys_domain(env);
81 +
82 + gicv5_set_enabled(gic, id, false, domain, type, virtual);
83 +}
84 +
85 +static void gic_cden_write(CPUARMState *env, const ARMCPRegInfo *ri,
86 + uint64_t value)
87 +{
88 + GICv5Common *gic = gicv5_get_gic(env);
89 + GICv5IntType type = FIELD_EX64(value, GIC_CDEN, TYPE);
90 + uint32_t id = FIELD_EX64(value, GIC_CDEN, ID);
91 + bool virtual = false;
92 + GICv5Domain domain = gicv5_current_phys_domain(env);
93 +
94 + gicv5_set_enabled(gic, id, true, domain, type, virtual);
95 +}
96 +
97 static void gic_cdpri_write(CPUARMState *env, const ARMCPRegInfo *ri,
98 uint64_t value)
99 {
@@ -64,6 +107,46 @@ static void gic_cdpri_write(CPUARMState *env, const ARMCPRegInfo *ri,
107 gicv5_set_priority(gic, id, priority, domain, type, virtual);
108 }
109
110 +static void gic_cdaff_write(CPUARMState *env, const ARMCPRegInfo *ri,
111 + uint64_t value)
112 +{
113 + GICv5Common *gic = gicv5_get_gic(env);
114 + uint32_t iaffid = FIELD_EX64(value, GIC_CDAFF, IAFFID);
115 + GICv5RoutingMode irm = FIELD_EX64(value, GIC_CDAFF, IRM);
116 + GICv5IntType type = FIELD_EX64(value, GIC_CDAFF, TYPE);
117 + uint32_t id = FIELD_EX64(value, GIC_CDAFF, ID);
118 + bool virtual = false;
119 + GICv5Domain domain = gicv5_current_phys_domain(env);
120 +
121 + gicv5_set_target(gic, id, iaffid, irm, domain, type, virtual);
122 +}
123 +
124 +static void gic_cdpend_write(CPUARMState *env, const ARMCPRegInfo *ri,
125 + uint64_t value)
126 +{
127 + GICv5Common *gic = gicv5_get_gic(env);
128 + bool pending = FIELD_EX64(value, GIC_CDPEND, PENDING);
129 + GICv5IntType type = FIELD_EX64(value, GIC_CDPEND, TYPE);
130 + uint32_t id = FIELD_EX64(value, GIC_CDPEND, ID);
131 + bool virtual = false;
132 + GICv5Domain domain = gicv5_current_phys_domain(env);
133 +
134 + gicv5_set_pending(gic, id, pending, domain, type, virtual);
135 +}
136 +
137 +static void gic_cdhm_write(CPUARMState *env, const ARMCPRegInfo *ri,
138 + uint64_t value)
139 +{
140 + GICv5Common *gic = gicv5_get_gic(env);
141 + GICv5HandlingMode hm = FIELD_EX64(value, GIC_CDHM, HM);
142 + GICv5IntType type = FIELD_EX64(value, GIC_CDAFF, TYPE);
143 + uint32_t id = FIELD_EX64(value, GIC_CDAFF, ID);
144 + bool virtual = false;
145 + GICv5Domain domain = gicv5_current_phys_domain(env);
146 +
147 + gicv5_set_handling(gic, id, hm, domain, type, virtual);
148 +}
149 +
150 static const ARMCPRegInfo gicv5_cpuif_reginfo[] = {
151 /*
152 * Barrier: wait until the effects of a cpuif system register
@@ -86,11 +169,36 @@ static const ARMCPRegInfo gicv5_cpuif_reginfo[] = {
169 .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 0, .opc2 = 1,
170 .access = PL1_W, .type = ARM_CP_NOP,
171 },
172 + { .name = "GIC_CDDIS", .state = ARM_CP_STATE_AA64,
173 + .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 1, .opc2 = 0,
174 + .access = PL1_W, .type = ARM_CP_IO | ARM_CP_NO_RAW,
175 + .writefn = gic_cddis_write,
176 + },
177 + { .name = "GIC_CDEN", .state = ARM_CP_STATE_AA64,
178 + .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 1, .opc2 = 1,
179 + .access = PL1_W, .type = ARM_CP_IO | ARM_CP_NO_RAW,
180 + .writefn = gic_cden_write,
181 + },
182 { .name = "GIC_CDPRI", .state = ARM_CP_STATE_AA64,
183 .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 1, .opc2 = 2,
184 .access = PL1_W, .type = ARM_CP_IO | ARM_CP_NO_RAW,
185 .writefn = gic_cdpri_write,
186 },
187 + { .name = "GIC_CDAFF", .state = ARM_CP_STATE_AA64,
188 + .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 1, .opc2 = 3,
189 + .access = PL1_W, .type = ARM_CP_IO | ARM_CP_NO_RAW,
190 + .writefn = gic_cdaff_write,
191 + },
192 + { .name = "GIC_CDPEND", .state = ARM_CP_STATE_AA64,
193 + .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 1, .opc2 = 4,
194 + .access = PL1_W, .type = ARM_CP_IO | ARM_CP_NO_RAW,
195 + .writefn = gic_cdpend_write,
196 + },
197 + { .name = "GIC_CDHM", .state = ARM_CP_STATE_AA64,
198 + .opc0 = 1, .opc1 = 0, .crn = 12, .crm = 2, .opc2 = 1,
199 + .access = PL1_W, .type = ARM_CP_IO | ARM_CP_NO_RAW,
200 + .writefn = gic_cdhm_write,
201 + },
202 };
203
204 void define_gicv5_cpuif_regs(ARMCPU *cpu)