int_virt = Param.ArmPPI("Virtual timer interrupt")
int_hyp = Param.ArmPPI("Hypervisor timer interrupt")
+ # This value should be in theory initialized by the highest
+ # priviledged software. We do this in gem5 to avoid KVM
+ # complications (the gem5 firmware won't run at highest EL)
+ #
+ # PLEASE note: change this parameter only if using the gem5 bootloader
+ # Another real world bootloader might be changing the CNTFRQ register
+ # value, so this initial value will be discarded
+ cntfrq = Param.UInt64(0x1800000, "Value for the CNTFRQ timer register")
+
def generateDeviceTree(self, state):
node = FdtNode("timer")
}
}
+GenericTimer::CoreTimers::CoreTimers(GenericTimer &_parent,
+ ArmSystem &system, unsigned cpu,
+ ArmInterruptPin *_irqPhysS, ArmInterruptPin *_irqPhysNS,
+ ArmInterruptPin *_irqVirt, ArmInterruptPin *_irqHyp)
+ : parent(_parent),
+ cntfrq(parent.params()->cntfrq),
+ threadContext(system.getThreadContext(cpu)),
+ irqPhysS(_irqPhysS),
+ irqPhysNS(_irqPhysNS),
+ irqVirt(_irqVirt),
+ irqHyp(_irqHyp),
+ physS(csprintf("%s.phys_s_timer%d", parent.name(), cpu),
+ system, parent, parent.systemCounter,
+ _irqPhysS),
+ // This should really be phys_timerN, but we are stuck with
+ // arch_timer for backwards compatibility.
+ physNS(csprintf("%s.arch_timer%d", parent.name(), cpu),
+ system, parent, parent.systemCounter,
+ _irqPhysNS),
+ virt(csprintf("%s.virt_timer%d", parent.name(), cpu),
+ system, parent, parent.systemCounter,
+ _irqVirt),
+ hyp(csprintf("%s.hyp_timer%d", parent.name(), cpu),
+ system, parent, parent.systemCounter,
+ _irqHyp),
+ physEvStream{
+ EventFunctionWrapper([this]{ physEventStreamCallback(); },
+ csprintf("%s.phys_event_gen%d", parent.name(), cpu)), 0, 0
+ },
+ virtEvStream{
+ EventFunctionWrapper([this]{ virtEventStreamCallback(); },
+ csprintf("%s.virt_event_gen%d", parent.name(), cpu)), 0, 0
+ }
+{
+}
+
void
GenericTimer::CoreTimers::physEventStreamCallback()
{
public:
CoreTimers(GenericTimer &_parent, ArmSystem &system, unsigned cpu,
ArmInterruptPin *_irqPhysS, ArmInterruptPin *_irqPhysNS,
- ArmInterruptPin *_irqVirt, ArmInterruptPin *_irqHyp)
- : parent(_parent),
- threadContext(system.getThreadContext(cpu)),
- irqPhysS(_irqPhysS),
- irqPhysNS(_irqPhysNS),
- irqVirt(_irqVirt),
- irqHyp(_irqHyp),
- physS(csprintf("%s.phys_s_timer%d", parent.name(), cpu),
- system, parent, parent.systemCounter,
- _irqPhysS),
- // This should really be phys_timerN, but we are stuck with
- // arch_timer for backwards compatibility.
- physNS(csprintf("%s.arch_timer%d", parent.name(), cpu),
- system, parent, parent.systemCounter,
- _irqPhysNS),
- virt(csprintf("%s.virt_timer%d", parent.name(), cpu),
- system, parent, parent.systemCounter,
- _irqVirt),
- hyp(csprintf("%s.hyp_timer%d", parent.name(), cpu),
- system, parent, parent.systemCounter,
- _irqHyp),
- physEvStream{
- EventFunctionWrapper([this]{ physEventStreamCallback(); },
- csprintf("%s.phys_event_gen%d", parent.name(), cpu)), 0, 0
- },
- virtEvStream{
- EventFunctionWrapper([this]{ virtEventStreamCallback(); },
- csprintf("%s.virt_event_gen%d", parent.name(), cpu)), 0, 0
- }
- {
- cntfrq = 0x01800000;
- }
+ ArmInterruptPin *_irqVirt, ArmInterruptPin *_irqHyp);
+
+ /// Generic Timer parent reference
+ GenericTimer &parent;
/// System counter frequency as visible from this core
uint32_t cntfrq;
/// Hypervisor control register
CNTHCTL cnthctl;
- /// Generic Timer parent reference
- GenericTimer &parent;
-
/// Thread (HW) context associated to this PE implementation
ThreadContext *threadContext;