MachineCheckFaults and AlignmentFaults are now generated by the ISA, rather than...
authorGabe Black <gblack@eecs.umich.edu>
Mon, 27 Feb 2006 08:57:15 +0000 (03:57 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 27 Feb 2006 08:57:15 +0000 (03:57 -0500)
arch/alpha/alpha_memory.cc:
cpu/base_dyn_inst.cc:
dev/alpha_console.cc:
dev/pcidev.hh:
dev/sinic.cc:
    MachineCheckFaults are now generated by the ISA, rather than being created directly.

--HG--
extra : convert_revision : 34a7da41639e93be21ed70dac681b27480008d19

arch/alpha/alpha_memory.cc
arch/alpha/faults.cc
arch/alpha/faults.hh
cpu/base_dyn_inst.cc
dev/alpha_console.cc
dev/pcidev.hh
dev/sinic.cc

index b2a829711d3da7608493a5b8f63443f28309e94a..11baed1066050d100420b23b0c0d6bb984de3ce8 100644 (file)
@@ -380,7 +380,7 @@ AlphaITB::translate(MemReqPtr &req) const
 
     // check that the physical address is ok (catch bad physical addresses)
     if (req->paddr & ~PAddrImplMask)
-        return new MachineCheckFault;
+        return genMachineCheckFault();
 
     checkCacheability(req);
 
@@ -511,7 +511,7 @@ AlphaDTB::translate(MemReqPtr &req, bool write) const
         fault(req, write ? MM_STAT_WR_MASK : 0);
         DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->vaddr,
                 req->size);
-        return new AlignmentFault;
+        return genAlignmentFault();
     }
 
     if (pc & 0x1) {
@@ -621,7 +621,7 @@ AlphaDTB::translate(MemReqPtr &req, bool write) const
 
     // check that the physical address is ok (catch bad physical addresses)
     if (req->paddr & ~PAddrImplMask)
-        return new MachineCheckFault;
+        return genMachineCheckFault();
 
     checkCacheability(req);
 
index bbddadabf29ab79a13878b716da3867e2ab46161..1df0de7c1179d0be5f31c5ed97fda791fb49988f 100644 (file)
@@ -32,6 +32,10 @@ FaultName AlphaFault::_name = "alphafault";
 FaultVect AlphaFault::_vect = 0x0000;
 FaultStat AlphaFault::_stat;
 
+FaultVect AlphaMachineCheckFault::_vect = 0x0401;
+
+FaultVect AlphaAlignmentFault::_vect = 0x0301;
+
 FaultName ResetFault::_name = "reset";
 FaultVect ResetFault::_vect = 0x0001;
 FaultStat ResetFault::_stat;
index bd5163a7d1642e562d892676fe44ea300fe8c41e..2004c09114e86facb103cfeb6b4399df465c2041 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "sim/faults.hh"
 
-// The reasoning behind the name and vect functions is in sim/faults.hh
+// The design of the "name" and "vect" functions is in sim/faults.hh
 
 typedef const Addr FaultVect;
 
@@ -47,6 +47,32 @@ class AlphaFault : public FaultBase
     virtual FaultStat & stat() {return _stat;}
 };
 
+class AlphaMachineCheckFault : public MachineCheckFault
+{
+  private:
+    static FaultVect _vect;
+  public:
+    FaultVect vect() {return _vect;}
+};
+
+class AlphaAlignmentFault : public AlignmentFault
+{
+  private:
+    static FaultVect _vect;
+  public:
+    FaultVect vect() {return _vect;}
+};
+
+static inline Fault genMachineCheckFault()
+{
+    return new AlphaMachineCheckFault;
+}
+
+static inline Fault genAlignmentFault()
+{
+    return new AlphaAlignmentFault;
+}
+
 class ResetFault : public AlphaFault
 {
   private:
@@ -215,7 +241,4 @@ class IntegerOverflowFault : public AlphaFault
     FaultStat & stat() {return _stat;}
 };
 
-//Fault * ListOfFaults[];
-//int NumFaults;
-
 #endif // __FAULTS_HH__
index 633c0ee28d8da3221c3519406e7a4fa4985a566e..b3dffbf94a3109f7d71047ca4f2a05b904a2e851 100644 (file)
@@ -45,6 +45,7 @@
 #include "cpu/o3/alpha_cpu.hh"
 
 using namespace std;
+using namespace TheISA;
 
 #define NOHASH
 #ifndef NOHASH
@@ -325,7 +326,7 @@ BaseDynInst<Impl>::mem_access(mem_cmd cmd, Addr addr, void *p, int nbytes)
         break;
 
       default:
-        fault = MachineCheckFault;
+        fault = genMachineCheckFault();
         break;
     }
 
index 85134b435fb2c70e2bd42a95b9890aa864b4e41f..c8327736fbaf7d3bf680c6d7edf74ba2cc9a631a 100644 (file)
@@ -182,7 +182,7 @@ AlphaConsole::read(MemReqPtr &req, uint8_t *data)
             }
             break;
         default:
-            return new MachineCheckFault;
+            return genMachineCheckFault();
     }
 
     return NoFault;
@@ -202,7 +202,7 @@ AlphaConsole::write(MemReqPtr &req, const uint8_t *data)
         val = *(uint64_t *)data;
         break;
       default:
-        return new MachineCheckFault;
+        return genMachineCheckFault();
     }
 
     Addr daddr = req->paddr - (addr & EV5::PAddrImplMask);
index 4f08c2cf9d1a84a80ac903c485157f7021c3e5a6..bdfc6b93230f5d6ecb12018975aaef9348f0f5ad 100644 (file)
@@ -260,6 +260,7 @@ class PciDev : public DmaDevice
 inline Fault
 PciDev::readBar(MemReqPtr &req, uint8_t *data)
 {
+    using namespace TheISA;
     if (isBAR(req->paddr, 0))
         return readBar0(req, req->paddr - BARAddrs[0], data);
     if (isBAR(req->paddr, 1))
@@ -272,12 +273,13 @@ PciDev::readBar(MemReqPtr &req, uint8_t *data)
         return readBar4(req, req->paddr - BARAddrs[4], data);
     if (isBAR(req->paddr, 5))
         return readBar5(req, req->paddr - BARAddrs[5], data);
-    return new MachineCheckFault;
+    return genMachineCheckFault();
 }
 
 inline Fault
 PciDev::writeBar(MemReqPtr &req, const uint8_t *data)
 {
+    using namespace TheISA;
     if (isBAR(req->paddr, 0))
         return writeBar0(req, req->paddr - BARAddrs[0], data);
     if (isBAR(req->paddr, 1))
@@ -290,7 +292,7 @@ PciDev::writeBar(MemReqPtr &req, const uint8_t *data)
         return writeBar4(req, req->paddr - BARAddrs[4], data);
     if (isBAR(req->paddr, 5))
         return writeBar5(req, req->paddr - BARAddrs[5], data);
-    return new MachineCheckFault;
+    return genMachineCheckFault();
 }
 
 #endif // __DEV_PCIDEV_HH__
index 3f72268173d1ac198abafc93e40319d2354a3d06..ba643de4b07e878c60445e80d6627a7441b42070 100644 (file)
@@ -363,11 +363,11 @@ Device::read(MemReqPtr &req, uint8_t *data)
     assert(config.command & PCI_CMD_MSE);
     Fault fault = readBar(req, data);
 
-    if (fault->isA<MachineCheckFault>()) {
+    if (fault->isMachineCheckFault()) {
         panic("address does not map to a BAR pa=%#x va=%#x size=%d",
               req->paddr, req->vaddr, req->size);
 
-        return new MachineCheckFault;
+        return genMachineCheckFault();
     }
 
     return fault;
@@ -459,11 +459,11 @@ Device::write(MemReqPtr &req, const uint8_t *data)
     assert(config.command & PCI_CMD_MSE);
     Fault fault = writeBar(req, data);
 
-    if (fault->isA<MachineCheckFault>()) {
+    if (fault->isMachineCheckFault()) {
         panic("address does not map to a BAR pa=%#x va=%#x size=%d",
               req->paddr, req->vaddr, req->size);
 
-        return new MachineCheckFault;
+        return genMachineCheckFault();
     }
 
     return fault;