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
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
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);
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
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);
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
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);
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
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 ---