For the XXX this is a hack, can you please use the newish hack() function?

Thanks,
   Nate

On Sun, Feb 1, 2009 at 5:18 PM, Gabe Black <[email protected]> wrote:
> 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
>
>
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to