189 ICH_VMCR_EL2 ich_vmcr_el2 =
191 value = ich_vmcr_el2.VENG0;
207 ICH_VMCR_EL2 ich_vmcr_el2 =
209 value = ich_vmcr_el2.VENG1;
216 ICC_IGRPEN1_EL3 igrp_el3 = 0;
217 igrp_el3.EnableGrp1S = ((ICC_IGRPEN1_EL1)
isa->readMiscRegNoEffect(
220 igrp_el3.EnableGrp1NS = ((ICC_IGRPEN1_EL1)
isa->readMiscRegNoEffect(
231 (hcr_imo || hcr_fmo)) {
241 if ((rprio & 0x80) == 0) {
245 }
else if (rprio != 0xff) {
249 rprio = (rprio << 1) & 0xff;
280 ICH_LR_EL2 ich_lr_el2 =
286 value = ich_lr_el2.vINTID;
310 ICH_LR_EL2 ich_lr_el2 =
316 value = ich_lr_el2.vINTID;
343 ICH_VMCR_EL2 ich_vmcr_el2 =
346 value = ich_vmcr_el2.VBPR0;
352 ICH_VMCR_EL2 ich_vmcr_el2 =
355 if (ich_vmcr_el2.VCBPR) {
357 value = ich_vmcr_el2.VBPR0 + 1;
358 value = value < 7 ? value : 7;
360 value = ich_vmcr_el2.VBPR1;
377 if ((value & 0x80) == 0) {
381 }
else if (value != 0xff) {
385 value = (value << 1) & 0xff;
392 ICH_VMCR_EL2 ich_vmcr_el2 =
395 value = ich_vmcr_el2.VPMR;
414 activateIRQ(int_id,
hppi.group);
430 ICH_LR_EL2 ich_lr_el2 =
434 int_id = ich_lr_el2.vINTID;
443 ich_lr_el2.State = ICH_LR_EL2_STATE_INVALID;
470 activateIRQ(int_id,
hppi.group);
486 ICH_LR_EL2 ich_lr_el2 =
490 int_id = ich_lr_el2.vINTID;
499 ich_lr_el2.State = ICH_LR_EL2_STATE_INVALID;
519 ICC_SRE_EL1 icc_sre_el1 = 0;
537 ICC_SRE_EL2 icc_sre_el2 = 0;
541 icc_sre_el2.Enable = 1;
558 ICC_SRE_EL3 icc_sre_el3 = 0;
562 icc_sre_el3.Enable = 1;
583 ICC_CTLR_EL1 icc_ctlr_el1 = value;
584 icc_ctlr_el1.ExtRange = 0;
585 icc_ctlr_el1.RSS = 1;
586 icc_ctlr_el1.A3V = 1;
587 icc_ctlr_el1.SEIS = 0;
588 icc_ctlr_el1.IDbits = 1;
589 icc_ctlr_el1.PRIbits = PRIORITY_BITS - 1;
590 value = icc_ctlr_el1;
596 ICV_CTLR_EL1 icv_ctlr_el1 = value;
597 icv_ctlr_el1.RSS = 0;
598 icv_ctlr_el1.A3V = 1;
599 icv_ctlr_el1.SEIS = 0;
600 icv_ctlr_el1.IDbits = 1;
601 icv_ctlr_el1.PRIbits = 7;
602 value = icv_ctlr_el1;
618 ICC_CTLR_EL3 icc_ctlr_el3 = value;
619 icc_ctlr_el3.ExtRange = 0;
620 icc_ctlr_el3.RSS = 1;
621 icc_ctlr_el3.nDS = 0;
622 icc_ctlr_el3.A3V = 1;
623 icc_ctlr_el3.SEIS = 0;
624 icc_ctlr_el3.IDbits = 0;
625 icc_ctlr_el3.PRIbits = PRIORITY_BITS - 1;
626 value = icc_ctlr_el3;
678 ICH_VTR_EL2 ich_vtr_el2 = value;
682 ich_vtr_el2.IDbits = 1;
702 ICH_LR_EL2 ich_lr_el2 =
705 if ((ich_lr_el2.State == ICH_LR_EL2_STATE_INVALID) &&
706 (ich_lr_el2.HW || !ich_lr_el2.EOI)) {
707 value |= (1 << lr_idx);
722 value = value & 0xffffffff;
735 panic(
"Gicv3CPUInterface::readMiscReg(): unknown register %d (%s)",
739 DPRINTF(GIC,
"Gicv3CPUInterface::readMiscReg(): register %s value %#x\n",
747 bool do_virtual_update =
false;
748 DPRINTF(GIC,
"Gicv3CPUInterface::setMiscReg(): register %s value %#x\n",
806 int int_id =
val & 0xffffff;
831 int int_id =
val & 0xffffff;
841 if (drop_prio == 0xff) {
851 ICH_LR_EL2 ich_lr_el2 =
855 uint8_t lr_group_prio = ich_lr_el2.Priority & 0xf8;
857 if (lr_group ==
Gicv3::G0S && lr_group_prio == drop_prio) {
876 int int_id =
val & 0xffffff;
910 int int_id =
val & 0xffffff;
920 if (drop_prio == 0xff) {
930 ICH_LR_EL2 ich_lr_el2 =
934 uint8_t lr_group_prio = ich_lr_el2.Priority & 0xf8;
936 if (lr_group ==
Gicv3::G1NS && lr_group_prio == drop_prio) {
951 (hcr_imo || hcr_fmo)) {
955 int int_id =
val & 0xffffff;
975 bool irq_is_secure = !single_sec_state && (group !=
Gicv3::G1NS);
977 bool route_fiq_to_el3 = scr_el3.fiq;
978 bool route_irq_to_el3 = scr_el3.irq;
979 bool route_fiq_to_el2 = hcr_fmo;
980 bool route_irq_to_el2 = hcr_imo;
987 if (single_sec_state && irq_is_grp0 && !route_fiq_to_el3) {
991 if (!irq_is_secure && !irq_is_grp0 && !route_irq_to_el3) {
999 if (single_sec_state && irq_is_grp0 &&
1000 !route_fiq_to_el3 && !route_fiq_to_el2) {
1004 if (!irq_is_secure && !irq_is_grp0 &&
1005 !route_irq_to_el3 && !route_irq_to_el2) {
1009 if (irq_is_grp0 && !route_fiq_to_el3) {
1014 (!irq_is_secure || !single_sec_state) &&
1015 !route_irq_to_el3) {
1032 int int_id =
val & 0xffffff;
1076 ICC_CTLR_EL1 icc_ctlr_el1_s =
1088 ICC_CTLR_EL1 icc_ctlr_el1_ns =
1109 ICH_VMCR_EL2 ich_vmcr_el2 =
1112 if ((group ==
Gicv3::G1NS) && ich_vmcr_el2.VCBPR) {
1123 if (
val < min_VPBR) {
1128 ich_vmcr_el2.VBPR0 =
val;
1130 ich_vmcr_el2.VBPR1 =
val;
1134 do_virtual_update =
true;
1153 ICC_CTLR_EL1 requested_icc_ctlr_el1 =
val;
1154 ICC_CTLR_EL1 icc_ctlr_el1 =
1157 ICC_CTLR_EL3 icc_ctlr_el3 =
1171 icc_ctlr_el1.PMHE = requested_icc_ctlr_el1.PMHE;
1172 icc_ctlr_el3.PMHE = icc_ctlr_el1.PMHE;
1176 icc_ctlr_el1.PMHE = requested_icc_ctlr_el1.PMHE;
1180 icc_ctlr_el1.EOImode = requested_icc_ctlr_el1.EOImode;
1184 icc_ctlr_el3.EOImode_EL1S = icc_ctlr_el1.EOImode;
1187 icc_ctlr_el3.EOImode_EL1NS = icc_ctlr_el1.EOImode;
1198 icc_ctlr_el1.CBPR = requested_icc_ctlr_el1.CBPR;
1201 icc_ctlr_el3.CBPR_EL1S = icc_ctlr_el1.CBPR;
1203 icc_ctlr_el3.CBPR_EL1NS = icc_ctlr_el1.CBPR;
1208 icc_ctlr_el1.CBPR = requested_icc_ctlr_el1.CBPR;
1219 ICV_CTLR_EL1 requested_icv_ctlr_el1 =
val;
1220 ICV_CTLR_EL1 icv_ctlr_el1 =
1222 icv_ctlr_el1.EOImode = requested_icv_ctlr_el1.EOImode;
1223 icv_ctlr_el1.CBPR = requested_icv_ctlr_el1.CBPR;
1229 ICH_VMCR_EL2 ich_vmcr_el2 =
1231 ich_vmcr_el2.VCBPR = icv_ctlr_el1.CBPR;
1232 ich_vmcr_el2.VEOIM = icv_ctlr_el1.EOImode;
1250 ICC_CTLR_EL3 requested_icc_ctlr_el3 =
val;
1255 ICC_CTLR_EL1 icc_ctlr_el1_s =
1257 ICC_CTLR_EL1 icc_ctlr_el1_ns =
1262 icc_ctlr_el1_ns.EOImode = requested_icc_ctlr_el3.EOImode_EL1NS;
1265 icc_ctlr_el1_s.EOImode = requested_icc_ctlr_el3.EOImode_EL1S;
1267 icc_ctlr_el1_ns.CBPR = requested_icc_ctlr_el3.CBPR_EL1NS;
1269 icc_ctlr_el1_s.CBPR = requested_icc_ctlr_el3.CBPR_EL1S;
1276 ICC_CTLR_EL3 icc_ctlr_el3 =
1279 icc_ctlr_el3.RM = requested_icc_ctlr_el3.RM;
1280 icc_ctlr_el3.EOImode_EL1NS = requested_icc_ctlr_el3.EOImode_EL1NS;
1281 icc_ctlr_el3.EOImode_EL1S = requested_icc_ctlr_el3.EOImode_EL1S;
1282 icc_ctlr_el3.EOImode_EL3 = requested_icc_ctlr_el3.EOImode_EL3;
1283 icc_ctlr_el3.CBPR_EL1NS = requested_icc_ctlr_el3.CBPR_EL1NS;
1284 icc_ctlr_el3.CBPR_EL1S = requested_icc_ctlr_el3.CBPR_EL1S;
1306 if (!(old_icc_pmr_el1 & 0x80)) {
1320 val &= ~0
U << (8 - PRIORITY_BITS);
1325 ICH_VMCR_EL2 ich_vmcr_el2 =
1327 ich_vmcr_el2.VPMR =
val & 0xff;
1349 ICH_VMCR_EL2 ich_vmcr_el2 =
1351 ich_vmcr_el2.VENG0 =
enable;
1372 ICH_VMCR_EL2 ich_vmcr_el2 =
1374 ich_vmcr_el2.VENG1 =
enable;
1383 ICC_IGRPEN1_EL3 icc_igrpen1_el3 =
val;
1385 isa->setMiscRegNoEffect(
1387 isa->setMiscRegNoEffect(
1432 ICH_HCR_EL2 requested_ich_hcr_el2 =
val;
1433 ICH_HCR_EL2 ich_hcr_el2 =
1436 if (requested_ich_hcr_el2.EOIcount >= ich_hcr_el2.EOIcount)
1441 ich_hcr_el2.EOIcount = requested_ich_hcr_el2.EOIcount;
1444 ich_hcr_el2.TDIR = requested_ich_hcr_el2.TDIR;
1445 ich_hcr_el2.TSEI = requested_ich_hcr_el2.TSEI;
1446 ich_hcr_el2.TALL1 = requested_ich_hcr_el2.TALL1;;
1447 ich_hcr_el2.TALL0 = requested_ich_hcr_el2.TALL0;;
1448 ich_hcr_el2.TC = requested_ich_hcr_el2.TC;
1449 ich_hcr_el2.VGrp1DIE = requested_ich_hcr_el2.VGrp1DIE;
1450 ich_hcr_el2.VGrp1EIE = requested_ich_hcr_el2.VGrp1EIE;
1451 ich_hcr_el2.VGrp0DIE = requested_ich_hcr_el2.VGrp0DIE;
1452 ich_hcr_el2.VGrp0EIE = requested_ich_hcr_el2.VGrp0EIE;
1453 ich_hcr_el2.NPIE = requested_ich_hcr_el2.NPIE;
1454 ich_hcr_el2.LRENPIE = requested_ich_hcr_el2.LRENPIE;
1455 ich_hcr_el2.UIE = requested_ich_hcr_el2.UIE;
1456 ich_hcr_el2.En = requested_ich_hcr_el2.En;
1458 do_virtual_update =
true;
1465 ICH_LRC requested_ich_lrc =
val;
1466 ICH_LRC ich_lrc =
isa->readMiscRegNoEffect(
misc_reg);
1468 ich_lrc.State = requested_ich_lrc.State;
1469 ich_lrc.HW = requested_ich_lrc.HW;
1470 ich_lrc.Group = requested_ich_lrc.Group;
1476 ich_lrc.Priority = (requested_ich_lrc.Priority & 0xf8) |
1477 (ich_lrc.Priority & 0x07);
1488 if (requested_ich_lrc.HW == 0) {
1489 ich_lrc.EOI = requested_ich_lrc.EOI;
1491 ich_lrc.pINTID = requested_ich_lrc.pINTID;
1495 do_virtual_update =
true;
1503 val = (old_val & 0xffffffff00000000) | (
val & 0xffffffff);
1504 do_virtual_update =
true;
1510 ICH_LR_EL2 requested_ich_lr_el2 =
val;
1511 ICH_LR_EL2 ich_lr_el2 =
isa->readMiscRegNoEffect(
misc_reg);
1513 ich_lr_el2.State = requested_ich_lr_el2.State;
1514 ich_lr_el2.HW = requested_ich_lr_el2.HW;
1515 ich_lr_el2.Group = requested_ich_lr_el2.Group;
1521 ich_lr_el2.Priority = (requested_ich_lr_el2.Priority & 0xf8) |
1522 (ich_lr_el2.Priority & 0x07);
1533 if (requested_ich_lr_el2.HW == 0) {
1534 ich_lr_el2.EOI = requested_ich_lr_el2.EOI;
1536 ich_lr_el2.pINTID = requested_ich_lr_el2.pINTID;
1543 ich_lr_el2.vINTID = requested_ich_lr_el2.vINTID;
1546 do_virtual_update =
true;
1553 ICH_VMCR_EL2 requested_ich_vmcr_el2 =
val;
1554 ICH_VMCR_EL2 ich_vmcr_el2 =
1556 ich_vmcr_el2.VPMR = requested_ich_vmcr_el2.VPMR;
1559 if (requested_ich_vmcr_el2.VBPR0 < min_vpr0) {
1560 ich_vmcr_el2.VBPR0 = min_vpr0;
1562 ich_vmcr_el2.VBPR0 = requested_ich_vmcr_el2.VBPR0;
1565 uint8_t min_vpr1 = min_vpr0 + 1;
1567 if (requested_ich_vmcr_el2.VBPR1 < min_vpr1) {
1568 ich_vmcr_el2.VBPR1 = min_vpr1;
1570 ich_vmcr_el2.VBPR1 = requested_ich_vmcr_el2.VBPR1;
1573 ich_vmcr_el2.VEOIM = requested_ich_vmcr_el2.VEOIM;
1574 ich_vmcr_el2.VCBPR = requested_ich_vmcr_el2.VCBPR;
1575 ich_vmcr_el2.VENG1 = requested_ich_vmcr_el2.VENG1;
1576 ich_vmcr_el2.VENG0 = requested_ich_vmcr_el2.VENG0;
1616 panic(
"Gicv3CPUInterface::setMiscReg(): unknown register %d (%s)",
1622 if (do_virtual_update) {
ThreadContext is the external interface to all thread state for anything outside of the CPU.