MachineCheckFaults and AlignmentFaults are now generated by the ISA, rather than being created directly.

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
This commit is contained in:
Gabe Black 2006-02-27 03:57:15 -05:00
parent 1a0b326f5d
commit 444f520f7e
7 changed files with 46 additions and 16 deletions

View file

@ -380,7 +380,7 @@ AlphaITB::translate(MemReqPtr &req) const
// check that the physical address is ok (catch bad physical addresses) // check that the physical address is ok (catch bad physical addresses)
if (req->paddr & ~PAddrImplMask) if (req->paddr & ~PAddrImplMask)
return new MachineCheckFault; return genMachineCheckFault();
checkCacheability(req); checkCacheability(req);
@ -511,7 +511,7 @@ AlphaDTB::translate(MemReqPtr &req, bool write) const
fault(req, write ? MM_STAT_WR_MASK : 0); fault(req, write ? MM_STAT_WR_MASK : 0);
DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->vaddr, DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->vaddr,
req->size); req->size);
return new AlignmentFault; return genAlignmentFault();
} }
if (pc & 0x1) { 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) // check that the physical address is ok (catch bad physical addresses)
if (req->paddr & ~PAddrImplMask) if (req->paddr & ~PAddrImplMask)
return new MachineCheckFault; return genMachineCheckFault();
checkCacheability(req); checkCacheability(req);

View file

@ -32,6 +32,10 @@ FaultName AlphaFault::_name = "alphafault";
FaultVect AlphaFault::_vect = 0x0000; FaultVect AlphaFault::_vect = 0x0000;
FaultStat AlphaFault::_stat; FaultStat AlphaFault::_stat;
FaultVect AlphaMachineCheckFault::_vect = 0x0401;
FaultVect AlphaAlignmentFault::_vect = 0x0301;
FaultName ResetFault::_name = "reset"; FaultName ResetFault::_name = "reset";
FaultVect ResetFault::_vect = 0x0001; FaultVect ResetFault::_vect = 0x0001;
FaultStat ResetFault::_stat; FaultStat ResetFault::_stat;

View file

@ -31,7 +31,7 @@
#include "sim/faults.hh" #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; typedef const Addr FaultVect;
@ -47,6 +47,32 @@ class AlphaFault : public FaultBase
virtual FaultStat & stat() {return _stat;} 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 class ResetFault : public AlphaFault
{ {
private: private:
@ -215,7 +241,4 @@ class IntegerOverflowFault : public AlphaFault
FaultStat & stat() {return _stat;} FaultStat & stat() {return _stat;}
}; };
//Fault * ListOfFaults[];
//int NumFaults;
#endif // __FAULTS_HH__ #endif // __FAULTS_HH__

View file

@ -45,6 +45,7 @@
#include "cpu/o3/alpha_cpu.hh" #include "cpu/o3/alpha_cpu.hh"
using namespace std; using namespace std;
using namespace TheISA;
#define NOHASH #define NOHASH
#ifndef NOHASH #ifndef NOHASH
@ -325,7 +326,7 @@ BaseDynInst<Impl>::mem_access(mem_cmd cmd, Addr addr, void *p, int nbytes)
break; break;
default: default:
fault = MachineCheckFault; fault = genMachineCheckFault();
break; break;
} }

View file

@ -182,7 +182,7 @@ AlphaConsole::read(MemReqPtr &req, uint8_t *data)
} }
break; break;
default: default:
return new MachineCheckFault; return genMachineCheckFault();
} }
return NoFault; return NoFault;
@ -202,7 +202,7 @@ AlphaConsole::write(MemReqPtr &req, const uint8_t *data)
val = *(uint64_t *)data; val = *(uint64_t *)data;
break; break;
default: default:
return new MachineCheckFault; return genMachineCheckFault();
} }
Addr daddr = req->paddr - (addr & EV5::PAddrImplMask); Addr daddr = req->paddr - (addr & EV5::PAddrImplMask);

View file

@ -260,6 +260,7 @@ class PciDev : public DmaDevice
inline Fault inline Fault
PciDev::readBar(MemReqPtr &req, uint8_t *data) PciDev::readBar(MemReqPtr &req, uint8_t *data)
{ {
using namespace TheISA;
if (isBAR(req->paddr, 0)) if (isBAR(req->paddr, 0))
return readBar0(req, req->paddr - BARAddrs[0], data); return readBar0(req, req->paddr - BARAddrs[0], data);
if (isBAR(req->paddr, 1)) if (isBAR(req->paddr, 1))
@ -272,12 +273,13 @@ PciDev::readBar(MemReqPtr &req, uint8_t *data)
return readBar4(req, req->paddr - BARAddrs[4], data); return readBar4(req, req->paddr - BARAddrs[4], data);
if (isBAR(req->paddr, 5)) if (isBAR(req->paddr, 5))
return readBar5(req, req->paddr - BARAddrs[5], data); return readBar5(req, req->paddr - BARAddrs[5], data);
return new MachineCheckFault; return genMachineCheckFault();
} }
inline Fault inline Fault
PciDev::writeBar(MemReqPtr &req, const uint8_t *data) PciDev::writeBar(MemReqPtr &req, const uint8_t *data)
{ {
using namespace TheISA;
if (isBAR(req->paddr, 0)) if (isBAR(req->paddr, 0))
return writeBar0(req, req->paddr - BARAddrs[0], data); return writeBar0(req, req->paddr - BARAddrs[0], data);
if (isBAR(req->paddr, 1)) 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); return writeBar4(req, req->paddr - BARAddrs[4], data);
if (isBAR(req->paddr, 5)) if (isBAR(req->paddr, 5))
return writeBar5(req, req->paddr - BARAddrs[5], data); return writeBar5(req, req->paddr - BARAddrs[5], data);
return new MachineCheckFault; return genMachineCheckFault();
} }
#endif // __DEV_PCIDEV_HH__ #endif // __DEV_PCIDEV_HH__

View file

@ -363,11 +363,11 @@ Device::read(MemReqPtr &req, uint8_t *data)
assert(config.command & PCI_CMD_MSE); assert(config.command & PCI_CMD_MSE);
Fault fault = readBar(req, data); 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", panic("address does not map to a BAR pa=%#x va=%#x size=%d",
req->paddr, req->vaddr, req->size); req->paddr, req->vaddr, req->size);
return new MachineCheckFault; return genMachineCheckFault();
} }
return fault; return fault;
@ -459,11 +459,11 @@ Device::write(MemReqPtr &req, const uint8_t *data)
assert(config.command & PCI_CMD_MSE); assert(config.command & PCI_CMD_MSE);
Fault fault = writeBar(req, data); 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", panic("address does not map to a BAR pa=%#x va=%#x size=%d",
req->paddr, req->vaddr, req->size); req->paddr, req->vaddr, req->size);
return new MachineCheckFault; return genMachineCheckFault();
} }
return fault; return fault;