cpu->wakeup();
}
+
+void
+X86ISA::Interrupts::setCPU(BaseCPU * newCPU)
+{
+ cpu = newCPU;
+ assert(cpu);
+ regs[APIC_ID] = (cpu->cpuId() << 24);
+}
+
+
Tick
X86ISA::Interrupts::recvMessage(PacketPtr pkt)
{
- uint8_t id = 0;
+ uint8_t id = (regs[APIC_ID] >> 24);
Addr offset = pkt->getAddr() - x86InterruptAddress(id, 0);
assert(pkt->cmd == MemCmd::MessageReq);
switch(offset)
}
+void
+X86ISA::Interrupts::addressRanges(AddrRangeList &range_list)
+{
+ uint8_t id = (regs[APIC_ID] >> 24);
+ range_list.clear();
+ range_list.push_back(RangeEx(x86LocalAPICAddress(id, 0),
+ x86LocalAPICAddress(id, 0) + PageBytes));
+}
+
+
+void
+X86ISA::Interrupts::getIntAddrRange(AddrRangeList &range_list)
+{
+ uint8_t id = (regs[APIC_ID] >> 24);
+ range_list.clear();
+ range_list.push_back(RangeEx(x86InterruptAddress(id, 0),
+ x86InterruptAddress(id, 0) + PhysAddrAPICRangeSize));
+}
+
+
uint32_t
X86ISA::Interrupts::readReg(ApicRegIndex reg)
{
return;
}
+
+X86ISA::Interrupts::Interrupts(Params * p) :
+ BasicPioDevice(p), IntDev(this), latency(p->pio_latency), clock(0),
+ apicTimerEvent(this),
+ pendingSmi(false), smiVector(0),
+ pendingNmi(false), nmiVector(0),
+ pendingExtInt(false), extIntVector(0),
+ pendingInit(false), initVector(0),
+ pendingUnmaskableInt(false)
+{
+ pioSize = PageBytes;
+ memset(regs, 0, sizeof(regs));
+ //Set the local apic DFR to the flat model.
+ regs[APIC_DESTINATION_FORMAT] = (uint32_t)(-1);
+ ISRV = 0;
+ IRRV = 0;
+}
+
+
bool
X86ISA::Interrupts::checkInterrupts(ThreadContext *tc) const
{
*/
typedef X86LocalApicParams Params;
- void
- setCPU(BaseCPU * newCPU)
- {
- cpu = newCPU;
- }
+ void setCPU(BaseCPU * newCPU);
void
setClock(Tick newClock)
return entry.periodic;
}
- void addressRanges(AddrRangeList &range_list)
- {
- range_list.clear();
- range_list.push_back(RangeEx(x86LocalAPICAddress(0, 0),
- x86LocalAPICAddress(0, 0) + PageBytes));
- }
-
- void getIntAddrRange(AddrRangeList &range_list)
- {
- range_list.clear();
- range_list.push_back(RangeEx(x86InterruptAddress(0, 0),
- x86InterruptAddress(0, 0) + PhysAddrAPICRangeSize));
- }
+ void addressRanges(AddrRangeList &range_list);
+ void getIntAddrRange(AddrRangeList &range_list);
Port *getPort(const std::string &if_name, int idx = -1)
{
* Constructor.
*/
- Interrupts(Params * p)
- : BasicPioDevice(p), IntDev(this), latency(p->pio_latency), clock(0),
- apicTimerEvent(this),
- pendingSmi(false), smiVector(0),
- pendingNmi(false), nmiVector(0),
- pendingExtInt(false), extIntVector(0),
- pendingInit(false), initVector(0),
- pendingUnmaskableInt(false)
- {
- pioSize = PageBytes;
- memset(regs, 0, sizeof(regs));
- //Set the local apic DFR to the flat model.
- regs[APIC_DESTINATION_FORMAT] = (uint32_t)(-1);
- ISRV = 0;
- IRRV = 0;
- }
+ Interrupts(Params * p);
/*
* Functions for retrieving interrupts for the CPU to handle.