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 §ion) | 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} |