vgic.cc (10565:23593fdaadcd) vgic.cc (10905:a6ca6831e775)
1/*
2 * Copyright (c) 2013 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

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

51 hvAddr(p->hv_addr), pioDelay(p->pio_delay),
52 maintInt(p->ppint)
53{
54 for (int x = 0; x < VGIC_CPU_MAX; x++) {
55 postVIntEvent[x] = new PostVIntEvent(x, p->platform);
56 maintIntPosted[x] = false;
57 vIntPosted[x] = false;
58 }
1/*
2 * Copyright (c) 2013 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

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

51 hvAddr(p->hv_addr), pioDelay(p->pio_delay),
52 maintInt(p->ppint)
53{
54 for (int x = 0; x < VGIC_CPU_MAX; x++) {
55 postVIntEvent[x] = new PostVIntEvent(x, p->platform);
56 maintIntPosted[x] = false;
57 vIntPosted[x] = false;
58 }
59 for (int c = 0; c < VGIC_CPU_MAX; c++) {
60 memset(&vcpuData[c], 0, sizeof(struct vcpuIntData));
61 }
62 assert(sys->numRunningContexts() <= VGIC_CPU_MAX);
63}
64
65Tick
66VGic::read(PacketPtr pkt)
67{
68 Addr addr = pkt->getAddr();
69

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

432{
433 AddrRangeList ranges;
434 ranges.push_back(RangeSize(hvAddr, GICH_REG_SIZE));
435 ranges.push_back(RangeSize(vcpuAddr, GICV_SIZE));
436 return ranges;
437}
438
439void
59 assert(sys->numRunningContexts() <= VGIC_CPU_MAX);
60}
61
62Tick
63VGic::read(PacketPtr pkt)
64{
65 Addr addr = pkt->getAddr();
66

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

429{
430 AddrRangeList ranges;
431 ranges.push_back(RangeSize(hvAddr, GICH_REG_SIZE));
432 ranges.push_back(RangeSize(vcpuAddr, GICV_SIZE));
433 return ranges;
434}
435
436void
440VGic::serialize(std::ostream &os)
437VGic::serialize(CheckpointOut &cp) const
441{
442 Tick interrupt_time[VGIC_CPU_MAX];
443 for (uint32_t cpu = 0; cpu < VGIC_CPU_MAX; cpu++) {
444 interrupt_time[cpu] = 0;
445 if (postVIntEvent[cpu]->scheduled()) {
446 interrupt_time[cpu] = postVIntEvent[cpu]->when();
447 }
448 }
449
450 DPRINTF(Checkpoint, "Serializing VGIC\n");
451
452 SERIALIZE_ARRAY(interrupt_time, VGIC_CPU_MAX);
453 SERIALIZE_ARRAY(maintIntPosted, VGIC_CPU_MAX);
454 SERIALIZE_ARRAY(vIntPosted, VGIC_CPU_MAX);
455 SERIALIZE_SCALAR(vcpuAddr);
456 SERIALIZE_SCALAR(hvAddr);
457 SERIALIZE_SCALAR(pioDelay);
458 SERIALIZE_SCALAR(maintInt);
459
438{
439 Tick interrupt_time[VGIC_CPU_MAX];
440 for (uint32_t cpu = 0; cpu < VGIC_CPU_MAX; cpu++) {
441 interrupt_time[cpu] = 0;
442 if (postVIntEvent[cpu]->scheduled()) {
443 interrupt_time[cpu] = postVIntEvent[cpu]->when();
444 }
445 }
446
447 DPRINTF(Checkpoint, "Serializing VGIC\n");
448
449 SERIALIZE_ARRAY(interrupt_time, VGIC_CPU_MAX);
450 SERIALIZE_ARRAY(maintIntPosted, VGIC_CPU_MAX);
451 SERIALIZE_ARRAY(vIntPosted, VGIC_CPU_MAX);
452 SERIALIZE_SCALAR(vcpuAddr);
453 SERIALIZE_SCALAR(hvAddr);
454 SERIALIZE_SCALAR(pioDelay);
455 SERIALIZE_SCALAR(maintInt);
456
460 for (uint32_t cpu = 0; cpu < VGIC_CPU_MAX; cpu++) {
461 nameOut(os, csprintf("%s.vcpuData%d", name(), cpu));
462 uint32_t vctrl_val = vcpuData[cpu].vctrl;
463 SERIALIZE_SCALAR(vctrl_val);
464 uint32_t hcr_val = vcpuData[cpu].hcr;
465 SERIALIZE_SCALAR(hcr_val);
466 uint64_t eisr_val = vcpuData[cpu].eisr;
467 SERIALIZE_SCALAR(eisr_val);
468 uint8_t VMGrp0En_val = vcpuData[cpu].VMGrp0En;
469 SERIALIZE_SCALAR(VMGrp0En_val);
470 uint8_t VMGrp1En_val = vcpuData[cpu].VMGrp1En;
471 SERIALIZE_SCALAR(VMGrp1En_val);
472 uint8_t VMAckCtl_val = vcpuData[cpu].VMAckCtl;
473 SERIALIZE_SCALAR(VMAckCtl_val);
474 uint8_t VMFiqEn_val = vcpuData[cpu].VMFiqEn;
475 SERIALIZE_SCALAR(VMFiqEn_val);
476 uint8_t VMCBPR_val = vcpuData[cpu].VMCBPR;
477 SERIALIZE_SCALAR(VMCBPR_val);
478 uint8_t VEM_val = vcpuData[cpu].VEM;
479 SERIALIZE_SCALAR(VEM_val);
480 uint8_t VMABP_val = vcpuData[cpu].VMABP;
481 SERIALIZE_SCALAR(VMABP_val);
482 uint8_t VMBP_val = vcpuData[cpu].VMBP;
483 SERIALIZE_SCALAR(VMBP_val);
484 uint8_t VMPriMask_val = vcpuData[cpu].VMPriMask;
485 SERIALIZE_SCALAR(VMPriMask_val);
457 for (uint32_t cpu = 0; cpu < VGIC_CPU_MAX; cpu++)
458 vcpuData[cpu].serializeSection(cp, csprintf("vcpuData%d", cpu));
459}
486
460
487 for (int i = 0; i < NUM_LR; i++) {
488 uint32_t lr = vcpuData[cpu].LR[i];
489 nameOut(os, csprintf("%s.vcpuData%d.LR%d", name(), cpu, i));
490 SERIALIZE_SCALAR(lr);
491 }
461void
462VGic::vcpuIntData::serialize(CheckpointOut &cp) const
463{
464 uint32_t vctrl_val = vctrl;
465 SERIALIZE_SCALAR(vctrl_val);
466 uint32_t hcr_val = hcr;
467 SERIALIZE_SCALAR(hcr_val);
468 uint64_t eisr_val = eisr;
469 SERIALIZE_SCALAR(eisr_val);
470 uint8_t VMGrp0En_val = VMGrp0En;
471 SERIALIZE_SCALAR(VMGrp0En_val);
472 uint8_t VMGrp1En_val = VMGrp1En;
473 SERIALIZE_SCALAR(VMGrp1En_val);
474 uint8_t VMAckCtl_val = VMAckCtl;
475 SERIALIZE_SCALAR(VMAckCtl_val);
476 uint8_t VMFiqEn_val = VMFiqEn;
477 SERIALIZE_SCALAR(VMFiqEn_val);
478 uint8_t VMCBPR_val = VMCBPR;
479 SERIALIZE_SCALAR(VMCBPR_val);
480 uint8_t VEM_val = VEM;
481 SERIALIZE_SCALAR(VEM_val);
482 uint8_t VMABP_val = VMABP;
483 SERIALIZE_SCALAR(VMABP_val);
484 uint8_t VMBP_val = VMBP;
485 SERIALIZE_SCALAR(VMBP_val);
486 uint8_t VMPriMask_val = VMPriMask;
487 SERIALIZE_SCALAR(VMPriMask_val);
488
489 for (int i = 0; i < NUM_LR; i++) {
490 ScopedCheckpointSection sec_lr(cp, csprintf("LR%d", i));
491 paramOut(cp, "lr", LR[i]);
492 }
493}
494
492 }
493}
494
495void VGic::unserialize(Checkpoint *cp, const std::string &section)
495void VGic::unserialize(CheckpointIn &cp)
496{
497 DPRINTF(Checkpoint, "Unserializing Arm GIC\n");
498
499 Tick interrupt_time[VGIC_CPU_MAX];
500 UNSERIALIZE_ARRAY(interrupt_time, VGIC_CPU_MAX);
501 for (uint32_t cpu = 0; cpu < VGIC_CPU_MAX; cpu++) {
502 if (interrupt_time[cpu])
503 schedule(postVIntEvent[cpu], interrupt_time[cpu]);
504
496{
497 DPRINTF(Checkpoint, "Unserializing Arm GIC\n");
498
499 Tick interrupt_time[VGIC_CPU_MAX];
500 UNSERIALIZE_ARRAY(interrupt_time, VGIC_CPU_MAX);
501 for (uint32_t cpu = 0; cpu < VGIC_CPU_MAX; cpu++) {
502 if (interrupt_time[cpu])
503 schedule(postVIntEvent[cpu], interrupt_time[cpu]);
504
505 uint32_t tmp;
506 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
507 "vctrl_val", tmp);
508 vcpuData[cpu].vctrl = tmp;
509 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
510 "hcr_val", tmp);
511 vcpuData[cpu].hcr = tmp;
512 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
513 "eisr_val", vcpuData[cpu].eisr);
514 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
515 "VMGrp0En_val", vcpuData[cpu].VMGrp0En);
516 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
517 "VMGrp1En_val", vcpuData[cpu].VMGrp1En);
518 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
519 "VMAckCtl_val", vcpuData[cpu].VMAckCtl);
520 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
521 "VMFiqEn_val", vcpuData[cpu].VMFiqEn);
522 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
523 "VMCBPR_val", vcpuData[cpu].VMCBPR);
524 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
525 "VEM_val", vcpuData[cpu].VEM);
526 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
527 "VMABP_val", vcpuData[cpu].VMABP);
528 paramIn(cp, csprintf("%s.vcpuData%d", section, cpu),
529 "VMPriMask_val", vcpuData[cpu].VMPriMask);
530
531 for (int i = 0; i < NUM_LR; i++) {
532 paramIn(cp, csprintf("%s.vcpuData%d.LR%d", section, cpu, i),
533 "lr", tmp);
534 vcpuData[cpu].LR[i] = tmp;
535 }
505 vcpuData[cpu].unserializeSection(cp, csprintf("vcpuData%d", cpu));
536 }
537 UNSERIALIZE_ARRAY(maintIntPosted, VGIC_CPU_MAX);
538 UNSERIALIZE_ARRAY(vIntPosted, VGIC_CPU_MAX);
539 UNSERIALIZE_SCALAR(vcpuAddr);
540 UNSERIALIZE_SCALAR(hvAddr);
541 UNSERIALIZE_SCALAR(pioDelay);
542 UNSERIALIZE_SCALAR(maintInt);
543}
544
506 }
507 UNSERIALIZE_ARRAY(maintIntPosted, VGIC_CPU_MAX);
508 UNSERIALIZE_ARRAY(vIntPosted, VGIC_CPU_MAX);
509 UNSERIALIZE_SCALAR(vcpuAddr);
510 UNSERIALIZE_SCALAR(hvAddr);
511 UNSERIALIZE_SCALAR(pioDelay);
512 UNSERIALIZE_SCALAR(maintInt);
513}
514
515void
516VGic::vcpuIntData::unserialize(CheckpointIn &cp)
517{
518 paramIn(cp, "vctrl_val", vctrl);
519 paramIn(cp, "hcr_val", hcr);
520 paramIn(cp, "eisr_val", eisr);
521 paramIn(cp, "VMGrp0En_val", VMGrp0En);
522 paramIn(cp, "VMGrp1En_val", VMGrp1En);
523 paramIn(cp, "VMAckCtl_val", VMAckCtl);
524 paramIn(cp, "VMFiqEn_val", VMFiqEn);
525 paramIn(cp, "VMCBPR_val", VMCBPR);
526 paramIn(cp, "VEM_val", VEM);
527 paramIn(cp, "VMABP_val", VMABP);
528 paramIn(cp, "VMPriMask_val", VMPriMask);
529
530 for (int i = 0; i < NUM_LR; i++) {
531 ScopedCheckpointSection sec_lr(cp, csprintf("LR%d", i));
532 paramIn(cp, "lr", LR[i]);
533 }
534}
535
545VGic *
546VGicParams::create()
547{
548 return new VGic(this);
549}
536VGic *
537VGicParams::create()
538{
539 return new VGic(this);
540}