X86: Set the local APIC ID to something meaningful.
This commit is contained in:
parent
79a3a6aecb
commit
f668340f2c
2 changed files with 54 additions and 35 deletions
|
@ -286,10 +286,20 @@ X86ISA::Interrupts::requestInterrupt(uint8_t vector,
|
||||||
cpu->wakeup();
|
cpu->wakeup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
X86ISA::Interrupts::setCPU(BaseCPU * newCPU)
|
||||||
|
{
|
||||||
|
cpu = newCPU;
|
||||||
|
assert(cpu);
|
||||||
|
regs[APIC_ID] = (cpu->cpuId() << 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Tick
|
Tick
|
||||||
X86ISA::Interrupts::recvMessage(PacketPtr pkt)
|
X86ISA::Interrupts::recvMessage(PacketPtr pkt)
|
||||||
{
|
{
|
||||||
uint8_t id = 0;
|
uint8_t id = (regs[APIC_ID] >> 24);
|
||||||
Addr offset = pkt->getAddr() - x86InterruptAddress(id, 0);
|
Addr offset = pkt->getAddr() - x86InterruptAddress(id, 0);
|
||||||
assert(pkt->cmd == MemCmd::MessageReq);
|
assert(pkt->cmd == MemCmd::MessageReq);
|
||||||
switch(offset)
|
switch(offset)
|
||||||
|
@ -319,6 +329,26 @@ X86ISA::Interrupts::recvMessage(PacketPtr pkt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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
|
uint32_t
|
||||||
X86ISA::Interrupts::readReg(ApicRegIndex reg)
|
X86ISA::Interrupts::readReg(ApicRegIndex reg)
|
||||||
{
|
{
|
||||||
|
@ -479,6 +509,25 @@ X86ISA::Interrupts::setReg(ApicRegIndex reg, uint32_t val)
|
||||||
return;
|
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
|
bool
|
||||||
X86ISA::Interrupts::checkInterrupts(ThreadContext *tc) const
|
X86ISA::Interrupts::checkInterrupts(ThreadContext *tc) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -191,11 +191,7 @@ class Interrupts : public BasicPioDevice, IntDev
|
||||||
*/
|
*/
|
||||||
typedef X86LocalApicParams Params;
|
typedef X86LocalApicParams Params;
|
||||||
|
|
||||||
void
|
void setCPU(BaseCPU * newCPU);
|
||||||
setCPU(BaseCPU * newCPU)
|
|
||||||
{
|
|
||||||
cpu = newCPU;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
setClock(Tick newClock)
|
setClock(Tick newClock)
|
||||||
|
@ -225,19 +221,8 @@ class Interrupts : public BasicPioDevice, IntDev
|
||||||
return entry.periodic;
|
return entry.periodic;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addressRanges(AddrRangeList &range_list)
|
void addressRanges(AddrRangeList &range_list);
|
||||||
{
|
void getIntAddrRange(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));
|
|
||||||
}
|
|
||||||
|
|
||||||
Port *getPort(const std::string &if_name, int idx = -1)
|
Port *getPort(const std::string &if_name, int idx = -1)
|
||||||
{
|
{
|
||||||
|
@ -262,22 +247,7 @@ class Interrupts : public BasicPioDevice, IntDev
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Interrupts(Params * p)
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Functions for retrieving interrupts for the CPU to handle.
|
* Functions for retrieving interrupts for the CPU to handle.
|
||||||
|
|
Loading…
Reference in a new issue