changeset ac2c268bf4f1 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=ac2c268bf4f1
description:
X86: Rework interrupt pins to allow one to many connections.
diffstat:
16 files changed, 209 insertions(+), 70 deletions(-)
src/dev/x86/Cmos.py | 4 +
src/dev/x86/I82094AA.py | 5 +-
src/dev/x86/I8254.py | 4 +
src/dev/x86/I8259.py | 8 ++-
src/dev/x86/SouthBridge.py | 21 +++++++--
src/dev/x86/X86IntPin.py | 24 ++++++++---
src/dev/x86/cmos.cc | 4 +
src/dev/x86/cmos.hh | 6 +-
src/dev/x86/i82094aa.cc | 20 ++++++++-
src/dev/x86/i82094aa.hh | 9 +---
src/dev/x86/i8254.cc | 7 ++-
src/dev/x86/i8254.hh | 4 -
src/dev/x86/i8259.cc | 38 +++++++++++------
src/dev/x86/i8259.hh | 11 +----
src/dev/x86/intdev.cc | 18 ++++++--
src/dev/x86/intdev.hh | 96 ++++++++++++++++++++++++++++++++++++--------
diffs (truncated from 575 to 300 lines):
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/Cmos.py
--- a/src/dev/x86/Cmos.py Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/Cmos.py Sat Jan 31 23:33:54 2009 -0800
@@ -29,6 +29,7 @@
from m5.params import *
from m5.proxy import *
from Device import BasicPioDevice
+from X86IntPin import X86IntSourcePin
class Cmos(BasicPioDevice):
type = 'Cmos'
@@ -36,4 +37,5 @@
time = Param.Time('01/01/2009',
"System time to use ('Now' for actual time)")
pio_latency = Param.Latency('1ns', "Programmed IO latency in simticks")
- int_pin = Param.X86IntPin('Pin to signal RTC alarm interrupts to')
+ int_pin = Param.X86IntSourcePin(X86IntSourcePin(),
+ 'Pin to signal RTC alarm interrupts to')
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/I82094AA.py
--- a/src/dev/x86/I82094AA.py Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/I82094AA.py Sat Jan 31 23:33:54 2009 -0800
@@ -29,7 +29,7 @@
from m5.params import *
from m5.proxy import *
from Device import BasicPioDevice
-from X86IntPin import X86IntPin
+from X86IntPin import X86IntSinkPin
class I82094AA(BasicPioDevice):
type = 'I82094AA'
@@ -37,6 +37,7 @@
pio_latency = Param.Latency('1ns', "Programmed IO latency in simticks")
pio_addr = Param.Addr("Device address")
int_port = Port("Port for sending and receiving interrupt messages")
+ external_int_pic = Param.I8259("External PIC, if any")
def pin(self, line):
- return X86IntPin(device=self, line=line)
+ return X86IntSinkPin(device=self, number=line)
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/I8254.py
--- a/src/dev/x86/I8254.py Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/I8254.py Sat Jan 31 23:33:54 2009 -0800
@@ -29,9 +29,11 @@
from m5.params import *
from m5.proxy import *
from Device import BasicPioDevice
+from X86IntPin import X86IntSourcePin
class I8254(BasicPioDevice):
type = 'I8254'
cxx_class = 'X86ISA::I8254'
pio_latency = Param.Latency('1ns', "Programmed IO latency in simticks")
- int_pin = Param.X86IntPin('Pin to signal timer interrupts to')
+ int_pin = Param.X86IntSourcePin(X86IntSourcePin(),
+ 'Pin to signal timer interrupts to')
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/I8259.py
--- a/src/dev/x86/I8259.py Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/I8259.py Sat Jan 31 23:33:54 2009 -0800
@@ -29,7 +29,7 @@
from m5.params import *
from m5.proxy import *
from Device import BasicPioDevice
-from X86IntPin import X86IntPin
+from X86IntPin import X86IntSourcePin, X86IntSinkPin
class X86I8259CascadeMode(Enum):
map = {'I8259Master' : 0,
@@ -41,8 +41,10 @@
type = 'I8259'
cxx_class='X86ISA::I8259'
pio_latency = Param.Latency('1ns', "Programmed IO latency in simticks")
- output = Param.X86IntPin('The pin this I8259 drives')
+ output = Param.X86IntSourcePin(X86IntSourcePin(),
+ 'The pin this I8259 drives')
mode = Param.X86I8259CascadeMode('How this I8259 is cascaded')
+ slave = Param.I8259('Slave I8259, if any')
def pin(self, line):
- return X86IntPin(device=self, line=line)
+ return X86IntSinkPin(device=self, number=line)
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/SouthBridge.py
--- a/src/dev/x86/SouthBridge.py Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/SouthBridge.py Sat Jan 31 23:33:54 2009 -0800
@@ -34,6 +34,7 @@
from I8254 import I8254
from I8259 import I8259
from PcSpeaker import PcSpeaker
+from X86IntPin import X86IntLine
from m5.SimObject import SimObject
def x86IOAddress(port):
@@ -52,6 +53,9 @@
_pit = I8254(pio_addr=x86IOAddress(0x40))
_speaker = PcSpeaker(pio_addr=x86IOAddress(0x61))
_io_apic = I82094AA(pio_addr=0xFEC00000)
+ # This is to make sure the interrupt lines are instantiated. Don't use
+ # it for anything directly.
+ int_lines = VectorParam.X86IntLine([], "Interrupt lines")
pic1 = Param.I8259(_pic1, "Master PIC")
pic2 = Param.I8259(_pic2, "Slave PIC")
@@ -61,13 +65,20 @@
speaker = Param.PcSpeaker(_speaker, "PC speaker")
io_apic = Param.I82094AA(_io_apic, "I/O APIC")
+ def connectPins(self, source, sink):
+ self.int_lines.append(X86IntLine(source=source, sink=sink))
+
def attachIO(self, bus):
- # Make internal connections
- self.pic1.output = self.io_apic.pin(0)
- self.pic2.output = self.pic1.pin(2)
- self.cmos.int_pin = self.pic2.pin(0)
- self.pit.int_pin = self.pic1.pin(0)
+ # Route interupt signals
+ self.connectPins(self.pic1.output, self.io_apic.pin(0))
+ self.connectPins(self.pic2.output, self.pic1.pin(2))
+ self.connectPins(self.cmos.int_pin, self.pic2.pin(0))
+ self.connectPins(self.pit.int_pin, self.pic1.pin(0))
+ self.connectPins(self.pit.int_pin, self.io_apic.pin(2))
+ # Tell the devices about each other
+ self.pic1.slave = self.pic2
self.speaker.i8254 = self.pit
+ self.io_apic.external_int_pic = self.pic1
# Connect to the bus
self.cmos.pio = bus.port
self.dma1.pio = bus.port
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/X86IntPin.py
--- a/src/dev/x86/X86IntPin.py Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/X86IntPin.py Sat Jan 31 23:33:54 2009 -0800
@@ -29,9 +29,23 @@
from m5.params import *
from m5.SimObject import SimObject
-class X86IntPin(SimObject):
- type = 'X86IntPin'
- cxx_class = 'X86ISA::IntPin'
+# A generic pin to drive an interrupt signal generated by a device.
+class X86IntSourcePin(SimObject):
+ type = 'X86IntSourcePin'
+ cxx_class = 'X86ISA::IntSourcePin'
- line = Param.Int("Interrupt line for this pin")
- device = Param.SimObject("Device which handles interrupts")
+# A generic pin to receive an interrupt signal generated by another device.
+class X86IntSinkPin(SimObject):
+ type = 'X86IntSinkPin'
+ cxx_class = 'X86ISA::IntSinkPin'
+
+ device = Param.SimObject("Device this pin belongs to")
+ number = Param.Int("The pin number on the device")
+
+# An interrupt line which is driven by a source pin and drives a sink pin.
+class X86IntLine(SimObject):
+ type = 'X86IntLine'
+ cxx_class = 'X86ISA::IntLine'
+
+ source = Param.X86IntSourcePin("Pin driving this line")
+ sink = Param.X86IntSinkPin("Pin driven by this line")
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/cmos.cc
--- a/src/dev/x86/cmos.cc Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/cmos.cc Sat Jan 31 23:33:54 2009 -0800
@@ -36,7 +36,9 @@
X86ISA::Cmos::X86RTC::handleEvent()
{
assert(intPin);
- intPin->signalInterrupt();
+ intPin->raise();
+ //XXX This is a hack.
+ intPin->lower();
}
Tick
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/cmos.hh
--- a/src/dev/x86/cmos.hh Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/cmos.hh Sat Jan 31 23:33:54 2009 -0800
@@ -38,7 +38,7 @@
namespace X86ISA
{
-class IntPin;
+class IntSourcePin;
class Cmos : public BasicPioDevice
{
@@ -57,10 +57,10 @@
class X86RTC : public MC146818
{
protected:
- IntPin * intPin;
+ IntSourcePin * intPin;
public:
X86RTC(EventManager *em, const std::string &n, const struct tm time,
- bool bcd, Tick frequency, IntPin * _intPin) :
+ bool bcd, Tick frequency, IntSourcePin * _intPin) :
MC146818(em, n, time, bcd, frequency), intPin(_intPin)
{
}
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/i82094aa.cc
--- a/src/dev/x86/i82094aa.cc Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/i82094aa.cc Sat Jan 31 23:33:54 2009 -0800
@@ -36,7 +36,8 @@
#include "sim/system.hh"
X86ISA::I82094AA::I82094AA(Params *p) : PioDevice(p), IntDev(this),
- latency(p->pio_latency), pioAddr(p->pio_addr), extIntPic(NULL)
+ latency(p->pio_latency), pioAddr(p->pio_addr),
+ extIntPic(p->external_int_pic)
{
// This assumes there's only one I/O APIC in the system
id = sys->numContexts();
@@ -47,6 +48,7 @@
entry.mask = 1;
for (int i = 0; i < TableSize; i++) {
redirTable[i] = entry;
+ pinStates[i] = false;
}
}
@@ -209,6 +211,22 @@
}
}
+void
+X86ISA::I82094AA::raiseInterruptPin(int number)
+{
+ assert(number < TableSize);
+ if (!pinStates[number])
+ signalInterrupt(number);
+ pinStates[number] = true;
+}
+
+void
+X86ISA::I82094AA::lowerInterruptPin(int number)
+{
+ assert(number < TableSize);
+ pinStates[number] = false;
+}
+
X86ISA::I82094AA *
I82094AAParams::create()
{
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/i82094aa.hh
--- a/src/dev/x86/i82094aa.hh Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/i82094aa.hh Sat Jan 31 23:33:54 2009 -0800
@@ -77,6 +77,7 @@
static const uint8_t APICVersion = 0x14;
RedirTableEntry redirTable[TableSize];
+ bool pinStates[TableSize];
public:
typedef I82094AAParams Params;
@@ -89,12 +90,6 @@
I82094AA(Params *p);
- void
- setExtIntPic(I8259 * pic)
- {
- extIntPic = pic;
- }
-
Tick read(PacketPtr pkt);
Tick write(PacketPtr pkt);
@@ -123,6 +118,8 @@
}
void signalInterrupt(int line);
+ void raiseInterruptPin(int number);
+ void lowerInterruptPin(int number);
};
}; // namespace X86ISA
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/i8254.cc
--- a/src/dev/x86/i8254.cc Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/i8254.cc Sat Jan 31 23:33:54 2009 -0800
@@ -37,8 +37,11 @@
X86ISA::I8254::counterInterrupt(unsigned int num)
{
DPRINTF(I8254, "Interrupt from counter %d.\n", num);
- if (num == 0)
- intPin->signalInterrupt();
+ if (num == 0) {
+ intPin->raise();
+ //XXX This is a hack.
+ intPin->lower();
+ }
}
Tick
diff -r e0d0e58cfd8d -r ac2c268bf4f1 src/dev/x86/i8254.hh
--- a/src/dev/x86/i8254.hh Sat Jan 31 23:26:43 2009 -0800
+++ b/src/dev/x86/i8254.hh Sat Jan 31 23:33:54 2009 -0800
@@ -38,7 +38,7 @@
namespace X86ISA
{
-class IntPin;
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev