uint8_t extIntVector;
bool pendingInit;
uint8_t initVector;
+ bool pendingStartup;
+ uint8_t startupVector;
+ bool startedUp;
// This is a quick check whether any of the above (except ExtInt) are set.
bool pendingUnmaskableInt;
+ // A count of how many IPIs are in flight.
+ int pendingIPIs;
+
/*
* IRR and ISR maintenance.
*/
void
setRegArrayBit(ApicRegIndex base, uint8_t vector)
{
- regs[base + (vector % 32)] |= (1 << (vector >> 5));
+ regs[base + (vector / 32)] |= (1 << (vector % 32));
}
void
clearRegArrayBit(ApicRegIndex base, uint8_t vector)
{
- regs[base + (vector % 32)] &= ~(1 << (vector >> 5));
+ regs[base + (vector / 32)] &= ~(1 << (vector % 32));
}
bool
getRegArrayBit(ApicRegIndex base, uint8_t vector)
{
- return bits(regs[base + (vector % 32)], vector >> 5);
+ return bits(regs[base + (vector / 32)], vector % 5);
}
void requestInterrupt(uint8_t vector, uint8_t deliveryMode, bool level);
BaseCPU *cpu;
+ int initialApicId;
+
public:
/*
* Params stuff.
*/
typedef X86LocalApicParams Params;
- void
- setCPU(BaseCPU * newCPU)
- {
- cpu = newCPU;
- }
+ void setCPU(BaseCPU * newCPU);
void
setClock(Tick newClock)
return dynamic_cast<const Params *>(_params);
}
+ /*
+ * Initialize this object by registering it with the IO APIC.
+ */
+ void init();
+
/*
* Functions to interact with the interrupt port from IntDev.
*/
Tick read(PacketPtr pkt);
Tick write(PacketPtr pkt);
Tick recvMessage(PacketPtr pkt);
+ Tick recvResponse(PacketPtr pkt);
bool
triggerTimerInterrupt()
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.