X86: Get PCI config space to work, and adjust address space prefix numbering scheme.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 27 Feb 2008 04:38:01 +0000 (23:38 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 27 Feb 2008 04:38:01 +0000 (23:38 -0500)
--HG--
extra : convert_revision : 2b382f478ee8cde3a35aa4c105196f200bc7afa6

configs/common/FSConfig.py
src/arch/x86/miscregs.hh
src/arch/x86/mmaped_ipr.hh
src/arch/x86/tlb.cc
src/arch/x86/tlb.hh
src/arch/x86/x86_traits.hh
src/dev/x86/Opteron.py
src/dev/x86/opteron.cc

index 6d7634106d25565d00c9475c51f60a4e187946a9..44c13ef782c906cd7f6cb1a4abf39972a925a6da 100644 (file)
@@ -156,7 +156,7 @@ def makeLinuxMipsSystem(mem_mode, mdesc = None):
     return self
 
 def x86IOAddress(port):
-    IO_address_space_base = 0x1000000000000000
+    IO_address_space_base = 0x8000000000000000
     return IO_address_space_base + port;
 
 def makeLinuxX86System(mem_mode, mdesc = None):
@@ -189,6 +189,7 @@ def makeLinuxX86System(mem_mode, mdesc = None):
 
     # Platform
     self.opteron = Opteron()
+    self.opteron.attachIO(self.iobus)
 
     self.intrctrl = IntrControl()
 
index 36b953526bdd5d9e26e7a1a22490f4f90d83d6cc..2bf647150a1b860e1a0aa1432444a2381adfacdb 100644 (file)
@@ -339,6 +339,8 @@ namespace X86ISA
 
         //XXX Add "Model-Specific Registers"
 
+        MISCREG_PCI_CONFIG_ADDRESS,
+
         NUM_MISCREGS
     };
 
index 9184ec4dc9d94d78a954728eaab026bc65cd84cd..36c0baacae419b7a0e38ce088fbf51df9bee3afa 100644 (file)
@@ -64,6 +64,7 @@
  * ISA-specific helper functions for memory mapped IPR accesses.
  */
 
+#include "arch/x86/miscregs.hh"
 #include "config/full_system.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
@@ -88,8 +89,13 @@ namespace X86ISA
 #if !FULL_SYSTEM
         panic("Shouldn't have a memory mapped register in SE\n");
 #else
-        xc->setMiscReg(pkt->getAddr() / sizeof(MiscReg),
-                gtoh(pkt->get<uint64_t>()));
+        MiscRegIndex index = (MiscRegIndex)(pkt->getAddr() / sizeof(MiscReg));
+        if (index == MISCREG_PCI_CONFIG_ADDRESS) {
+            xc->setMiscReg(index, gtoh(pkt->get<uint32_t>()));
+        } else {
+            xc->setMiscReg(pkt->getAddr() / sizeof(MiscReg),
+                    gtoh(pkt->get<uint64_t>()));
+        }
 #endif
         return xc->getCpuPtr()->ticks(1);
     }
index 2e6ea4a22ba1d0b700ca42b99a3fb05037239e53..acac3081a7ebaeff85e05aab346b9bf6107a2a6c 100644 (file)
@@ -76,7 +76,7 @@
 
 namespace X86ISA {
 
-TLB::TLB(const Params *p) : SimObject(p), size(p->size)
+TLB::TLB(const Params *p) : SimObject(p), configAddress(0), size(p->size)
 {
     tlb = new TlbEntry[size];
     std::memset(tlb, 0, sizeof(TlbEntry) * size);
@@ -147,6 +147,12 @@ TLB::invalidateAll()
     }
 }
 
+void
+TLB::setConfigAddress(uint32_t addr)
+{
+    configAddress = addr;
+}
+
 void
 TLB::invalidateNonGlobal()
 {
@@ -478,7 +484,19 @@ TLB::translate(RequestPtr &req, ThreadContext *tc, bool write, bool execute)
             // Make sure the address fits in the expected 16 bit IO address
             // space.
             assert(!(IOPort & ~0xFFFF));
-            req->setPaddr(PhysAddrPrefixIO | IOPort);
+            if (IOPort == 0xCF8 && req->getSize() == 4) {
+                req->setMmapedIpr(true);
+                req->setPaddr(MISCREG_PCI_CONFIG_ADDRESS * sizeof(MiscReg));
+            } else if ((IOPort & ~mask(2)) == 0xCFC) {
+                Addr configAddress =
+                    tc->readMiscRegNoEffect(MISCREG_PCI_CONFIG_ADDRESS);
+                if (bits(configAddress, 31, 31)) {
+                    req->setPaddr(PhysAddrPrefixPciConfig |
+                            bits(configAddress, 30, 0));
+                }
+            } else {
+                req->setPaddr(PhysAddrPrefixIO | IOPort);
+            }
             return NoFault;
         } else {
             panic("Access to unrecognized internal address space %#x.\n",
index a361c22917be1967786a63d3cb0345bec2449a50..d08d6fa686944afcdb5172f1299e1e1334a5c686 100644 (file)
@@ -90,6 +90,7 @@ namespace X86ISA
         friend class FakeDTLBFault;
 
         bool _allowNX;
+        uint32_t configAddress;
 
       public:
         bool allowNX() const
@@ -104,6 +105,8 @@ namespace X86ISA
 
         TlbEntry *lookup(Addr va, bool update_lru = true);
 
+        void setConfigAddress(uint32_t addr);
+
 #if FULL_SYSTEM
       protected:
 
index dc71de5003d7a1103f978b44fce1839d701581ab..d605ce218b929426c3fb5ba167b5026b9b1ee5fb 100644 (file)
@@ -88,7 +88,8 @@ namespace X86ISA
     const Addr IntAddrPrefixMSR = ULL(0x200000000);
     const Addr IntAddrPrefixIO = ULL(0x300000000);
 
-    const Addr PhysAddrPrefixIO = ULL(0x1000000000000000);
+    const Addr PhysAddrPrefixIO = ULL(0x8000000000000000);
+    const Addr PhysAddrPrefixPciConfig = ULL(0xC000000000000000);
 }
 
 #endif //__ARCH_X86_X86TRAITS_HH__
index 435ecccb6d8937b3d67160068cc7180613092543..cb015e2e7f3e977a35fde50723f5c56ae1821c12 100644 (file)
@@ -3,8 +3,16 @@ from m5.proxy import *
 from Device import BasicPioDevice, PioDevice, IsaFake, BadAddr
 from Uart import Uart8250
 from Platform import Platform
+from Pci import PciConfigAll
 from SimConsole import SimConsole
 
 class Opteron(Platform):
     type = 'Opteron'
     system = Param.System(Parent.any, "system")
+
+    pciconfig = PciConfigAll()
+
+    def attachIO(self, bus):
+        self.pciconfig.pio = bus.default
+        bus.responder_set = True
+        bus.responder = self.pciconfig
index df28e58de20846feac16a23ada8cecedd0dae493..ba46f2dfabba0b3f981f0d56afb334046ba86735 100644 (file)
@@ -36,6 +36,7 @@
 #include <string>
 #include <vector>
 
+#include "arch/x86/x86_traits.hh"
 #include "cpu/intr_control.hh"
 #include "dev/simconsole.hh"
 #include "dev/x86/opteron.hh"
@@ -95,8 +96,10 @@ Opteron::pciToDma(Addr pciAddr) const
 Addr
 Opteron::calcConfigAddr(int bus, int dev, int func)
 {
-    panic("Need implementation\n");
-    M5_DUMMY_RETURN
+    assert(func < 8);
+    assert(dev < 32);
+    assert(bus == 0);
+    return (PhysAddrPrefixPciConfig | (func << 8) | (dev << 11));
 }
 
 Opteron *