gic_v3_cpu_interface.cc (13926:d6ebddee93a7) gic_v3_cpu_interface.cc (14057:786dbd2c3bfc)
1/*
2 * Copyright (c) 2018 Metempsy Technology Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 145 unchanged lines hidden (view full) ---

154 case MISCREG_ICC_AP0R3_EL1:
155 // only implemented if supporting 7 or more bits of priority
156 return 0;
157
158 // Interrupt Group 0 Enable register EL1
159 case MISCREG_ICC_IGRPEN0:
160 case MISCREG_ICC_IGRPEN0_EL1: {
161 if ((currEL() == EL1) && !inSecureState() && hcr_fmo) {
1/*
2 * Copyright (c) 2018 Metempsy Technology Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 145 unchanged lines hidden (view full) ---

154 case MISCREG_ICC_AP0R3_EL1:
155 // only implemented if supporting 7 or more bits of priority
156 return 0;
157
158 // Interrupt Group 0 Enable register EL1
159 case MISCREG_ICC_IGRPEN0:
160 case MISCREG_ICC_IGRPEN0_EL1: {
161 if ((currEL() == EL1) && !inSecureState() && hcr_fmo) {
162 return isa->readMiscRegNoEffect(MISCREG_ICV_IGRPEN0_EL1);
162 return readMiscReg(MISCREG_ICV_IGRPEN0_EL1);
163 }
164
165 break;
166 }
167
163 }
164
165 break;
166 }
167
168 case MISCREG_ICV_IGRPEN0_EL1: {
169 ICH_VMCR_EL2 ich_vmcr_el2 =
170 isa->readMiscRegNoEffect(MISCREG_ICH_VMCR_EL2);
171 value = ich_vmcr_el2.VENG0;
172 break;
173 }
174
168 // Interrupt Group 1 Enable register EL1
169 case MISCREG_ICC_IGRPEN1:
170 case MISCREG_ICC_IGRPEN1_EL1: {
171 if ((currEL() == EL1) && !inSecureState() && hcr_imo) {
175 // Interrupt Group 1 Enable register EL1
176 case MISCREG_ICC_IGRPEN1:
177 case MISCREG_ICC_IGRPEN1_EL1: {
178 if ((currEL() == EL1) && !inSecureState() && hcr_imo) {
172 return isa->readMiscRegNoEffect(MISCREG_ICV_IGRPEN1_EL1);
179 return readMiscReg(MISCREG_ICV_IGRPEN1_EL1);
173 }
174
175 break;
176 }
177
180 }
181
182 break;
183 }
184
185 case MISCREG_ICV_IGRPEN1_EL1: {
186 ICH_VMCR_EL2 ich_vmcr_el2 =
187 isa->readMiscRegNoEffect(MISCREG_ICH_VMCR_EL2);
188 value = ich_vmcr_el2.VENG1;
189 break;
190 }
191
178 // Interrupt Group 1 Enable register EL3
179 case MISCREG_ICC_MGRPEN1:
180 case MISCREG_ICC_IGRPEN1_EL3:
181 break;
182
183 // Running Priority Register
184 case MISCREG_ICC_RPR:
185 case MISCREG_ICC_RPR_EL1: {

--- 189 unchanged lines hidden (view full) ---

375 value = vbpr;
376 break;
377 }
378
379 // Interrupt Priority Mask Register
380 case MISCREG_ICC_PMR:
381 case MISCREG_ICC_PMR_EL1:
382 if ((currEL() == EL1) && !inSecureState() && (hcr_imo || hcr_fmo)) {
192 // Interrupt Group 1 Enable register EL3
193 case MISCREG_ICC_MGRPEN1:
194 case MISCREG_ICC_IGRPEN1_EL3:
195 break;
196
197 // Running Priority Register
198 case MISCREG_ICC_RPR:
199 case MISCREG_ICC_RPR_EL1: {

--- 189 unchanged lines hidden (view full) ---

389 value = vbpr;
390 break;
391 }
392
393 // Interrupt Priority Mask Register
394 case MISCREG_ICC_PMR:
395 case MISCREG_ICC_PMR_EL1:
396 if ((currEL() == EL1) && !inSecureState() && (hcr_imo || hcr_fmo)) {
383 return isa->readMiscRegNoEffect(MISCREG_ICV_PMR_EL1);
397 return readMiscReg(MISCREG_ICV_PMR_EL1);
384 }
385
386 if (haveEL(EL3) && !inSecureState() &&
387 (isa->readMiscRegNoEffect(MISCREG_SCR_EL3) & (1U << 2))) {
388 // Spec section 4.8.1
389 // For Non-secure access to ICC_PMR_EL1 when SCR_EL3.FIQ == 1:
390 if ((value & 0x80) == 0) {
391 // If the current priority mask value is in the range of

--- 4 unchanged lines hidden (view full) ---

396 // 0x80-0xFF a read access returns the Non-secure read of the
397 // current value.
398 value = (value << 1) & 0xff;
399 }
400 }
401
402 break;
403
398 }
399
400 if (haveEL(EL3) && !inSecureState() &&
401 (isa->readMiscRegNoEffect(MISCREG_SCR_EL3) & (1U << 2))) {
402 // Spec section 4.8.1
403 // For Non-secure access to ICC_PMR_EL1 when SCR_EL3.FIQ == 1:
404 if ((value & 0x80) == 0) {
405 // If the current priority mask value is in the range of

--- 4 unchanged lines hidden (view full) ---

410 // 0x80-0xFF a read access returns the Non-secure read of the
411 // current value.
412 value = (value << 1) & 0xff;
413 }
414 }
415
416 break;
417
418 case MISCREG_ICV_PMR_EL1: { // Priority Mask Register
419 ICH_VMCR_EL2 ich_vmcr_el2 =
420 isa->readMiscRegNoEffect(MISCREG_ICH_VMCR_EL2);
421
422 value = ich_vmcr_el2.VPMR;
423 break;
424 }
425
404 // Interrupt Acknowledge Register 0
405 case MISCREG_ICC_IAR0:
406 case MISCREG_ICC_IAR0_EL1: {
407 if ((currEL() == EL1) && !inSecureState() && hcr_fmo) {
408 return readMiscReg(MISCREG_ICV_IAR0_EL1);
409 }
410
411 uint32_t int_id;

--- 856 unchanged lines hidden (view full) ---

1268 val = icc_ctlr_el3;
1269 break;
1270 }
1271
1272 // Priority Mask Register
1273 case MISCREG_ICC_PMR:
1274 case MISCREG_ICC_PMR_EL1: {
1275 if ((currEL() == EL1) && !inSecureState() && (hcr_imo || hcr_fmo)) {
426 // Interrupt Acknowledge Register 0
427 case MISCREG_ICC_IAR0:
428 case MISCREG_ICC_IAR0_EL1: {
429 if ((currEL() == EL1) && !inSecureState() && hcr_fmo) {
430 return readMiscReg(MISCREG_ICV_IAR0_EL1);
431 }
432
433 uint32_t int_id;

--- 856 unchanged lines hidden (view full) ---

1290 val = icc_ctlr_el3;
1291 break;
1292 }
1293
1294 // Priority Mask Register
1295 case MISCREG_ICC_PMR:
1296 case MISCREG_ICC_PMR_EL1: {
1297 if ((currEL() == EL1) && !inSecureState() && (hcr_imo || hcr_fmo)) {
1276 return isa->setMiscRegNoEffect(MISCREG_ICV_PMR_EL1, val);
1298 return setMiscReg(MISCREG_ICV_PMR_EL1, val);
1277 }
1278
1279 val &= 0xff;
1280 SCR scr_el3 = isa->readMiscRegNoEffect(MISCREG_SCR_EL3);
1281
1282 if (haveEL(EL3) && !inSecureState() && (scr_el3.fiq)) {
1283 // Spec section 4.8.1
1284 // For Non-secure access to ICC_PMR_EL1 SCR_EL3.FIQ == 1:

--- 13 unchanged lines hidden (view full) ---

1298
1299 val = (val >> 1) | 0x80;
1300 }
1301
1302 val &= ~0U << (8 - PRIORITY_BITS);
1303 break;
1304 }
1305
1299 }
1300
1301 val &= 0xff;
1302 SCR scr_el3 = isa->readMiscRegNoEffect(MISCREG_SCR_EL3);
1303
1304 if (haveEL(EL3) && !inSecureState() && (scr_el3.fiq)) {
1305 // Spec section 4.8.1
1306 // For Non-secure access to ICC_PMR_EL1 SCR_EL3.FIQ == 1:

--- 13 unchanged lines hidden (view full) ---

1320
1321 val = (val >> 1) | 0x80;
1322 }
1323
1324 val &= ~0U << (8 - PRIORITY_BITS);
1325 break;
1326 }
1327
1328 case MISCREG_ICV_PMR_EL1: { // Priority Mask Register
1329 ICH_VMCR_EL2 ich_vmcr_el2 =
1330 isa->readMiscRegNoEffect(MISCREG_ICH_VMCR_EL2);
1331 ich_vmcr_el2.VPMR = val & 0xff;
1332
1333 isa->setMiscRegNoEffect(MISCREG_ICH_VMCR_EL2, ich_vmcr_el2);
1334 virtualUpdate();
1335 return;
1336 }
1337
1306 // Interrupt Group 0 Enable Register EL1
1307 case MISCREG_ICC_IGRPEN0:
1308 case MISCREG_ICC_IGRPEN0_EL1: {
1309 if ((currEL() == EL1) && !inSecureState() && hcr_fmo) {
1310 return setMiscReg(MISCREG_ICV_IGRPEN0_EL1, val);
1311 }
1312
1313 break;

--- 1158 unchanged lines hidden ---
1338 // Interrupt Group 0 Enable Register EL1
1339 case MISCREG_ICC_IGRPEN0:
1340 case MISCREG_ICC_IGRPEN0_EL1: {
1341 if ((currEL() == EL1) && !inSecureState() && hcr_fmo) {
1342 return setMiscReg(MISCREG_ICV_IGRPEN0_EL1, val);
1343 }
1344
1345 break;

--- 1158 unchanged lines hidden ---