summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Saidi <saidi@eecs.umich.edu>2004-09-22 18:25:06 -0400
committerAli Saidi <saidi@eecs.umich.edu>2004-09-22 18:25:06 -0400
commiteb7d32907679c2f19e3bc896a76484f537bc986d (patch)
tree0b6875dc1970f18e6235e91021d81f0408350d2f
parent9adb64ec70047d7f8709399f67c74402753f6579 (diff)
downloadgem5-eb7d32907679c2f19e3bc896a76484f537bc986d.tar.xz
fix unaligned memory offset and some small fixes to interrupt binning
code arch/alpha/alpha_memory.cc: Fixed unaligned trap faults arch/alpha/ev5.cc: little more verbose faulting information kern/linux/linux_system.cc: more descriptive errors, and the correct offsets from symbols sim/system.cc: load local pal symbols --HG-- extra : convert_revision : 0c81badf77321d5e1a060dcae2d42204e5a1fc84
-rw-r--r--SConscript1
-rw-r--r--arch/alpha/alpha_memory.cc9
-rw-r--r--arch/alpha/ev5.cc2
-rw-r--r--kern/linux/linux_system.cc14
-rw-r--r--sim/system.cc3
5 files changed, 17 insertions, 12 deletions
diff --git a/SConscript b/SConscript
index 310a7dd90..75cbc48ee 100644
--- a/SConscript
+++ b/SConscript
@@ -382,6 +382,7 @@ extra_libraries = []
if env['USE_MYSQL']:
sources += mysql_sources
env.Append(CPPDEFINES = 'USE_MYSQL')
+ env.Append(CPPDEFINES = 'STATS_BINNING')
env.Append(CPPPATH=['/usr/local/include/mysql', '/usr/include/mysql'])
env.Append(LIBS=['z'])
if os.path.isdir('/usr/lib64'):
diff --git a/arch/alpha/alpha_memory.cc b/arch/alpha/alpha_memory.cc
index 9f5ab185e..4a350dbfc 100644
--- a/arch/alpha/alpha_memory.cc
+++ b/arch/alpha/alpha_memory.cc
@@ -492,10 +492,11 @@ AlphaDTB::translate(MemReqPtr &req, bool write) const
(AlphaISA::mode_type)DTB_CM_CM(ipr[AlphaISA::IPR_DTB_CM]);
- /* @todo this should actually be in there but for whatever reason
- * Its not working at present.
+ /**
+ * Check for alignment faults
*/
if (req->vaddr & (req->size - 1)) {
+ fault(req, write ? MM_STAT_WR_MASK : 0);
return Alignment_Fault;
}
@@ -510,8 +511,8 @@ AlphaDTB::translate(MemReqPtr &req, bool write) const
} else {
// verify that this is a good virtual address
if (!validVirtualAddress(req->vaddr)) {
- fault(req, ((write ? MM_STAT_WR_MASK : 0) | MM_STAT_BAD_VA_MASK |
- MM_STAT_ACV_MASK));
+ fault(req, (write ? MM_STAT_WR_MASK : 0) | MM_STAT_BAD_VA_MASK |
+ MM_STAT_ACV_MASK);
if (write) { write_acv++; } else { read_acv++; }
return DTB_Fault_Fault;
diff --git a/arch/alpha/ev5.cc b/arch/alpha/ev5.cc
index 70b717353..8b95e8b3d 100644
--- a/arch/alpha/ev5.cc
+++ b/arch/alpha/ev5.cc
@@ -164,7 +164,7 @@ AlphaISA::zeroRegisters(XC *xc)
void
ExecContext::ev5_trap(Fault fault)
{
- DPRINTF(Fault, "Fault %s\n", FaultName(fault));
+ DPRINTF(Fault, "Fault %s at PC: %#x\n", FaultName(fault), regs.pc);
cpu->recordEvent(csprintf("Fault %s", FaultName(fault)));
assert(!misspeculating());
diff --git a/kern/linux/linux_system.cc b/kern/linux/linux_system.cc
index 539bac649..fd5d48195 100644
--- a/kern/linux/linux_system.cc
+++ b/kern/linux/linux_system.cc
@@ -148,26 +148,26 @@ LinuxSystem::LinuxSystem(Params *p)
if (palSymtab->findAddress("sys_int_21", addr))
intStartEvent->schedule(addr + sizeof(MachInst) * 2);
else
- panic("could not find symbol\n");
+ panic("could not find symbol: sys_int_21\n");
intEndEvent = new InterruptEndEvent(&pcEventQueue, "intEndEvent");
if (palSymtab->findAddress("rti_to_kern", addr))
- intEndEvent->schedule(addr + sizeof(MachInst));
+ intEndEvent->schedule(addr) ;
else
- panic("could not find symbol\n");
+ panic("could not find symbol: rti_to_kern\n");
intEndEvent2 = new InterruptEndEvent(&pcEventQueue, "intEndEvent2");
if (palSymtab->findAddress("rti_to_user", addr))
- intEndEvent2->schedule(addr + sizeof(MachInst));
+ intEndEvent2->schedule(addr);
else
- panic("could not find symbol\n");
+ panic("could not find symbol: rti_to_user\n");
intEndEvent3 = new InterruptEndEvent(&pcEventQueue, "intEndEvent3");
if (kernelSymtab->findAddress("do_softirq", addr))
- intEndEvent3->schedule(addr + sizeof(MachInst));
+ intEndEvent3->schedule(addr + sizeof(MachInst) * 2);
else
- panic("could not find symbol\n");
+ panic("could not find symbol: do_softirq\n");
}
LinuxSystem::~LinuxSystem()
diff --git a/sim/system.cc b/sim/system.cc
index f59d8b32b..f8312e33b 100644
--- a/sim/system.cc
+++ b/sim/system.cc
@@ -100,6 +100,9 @@ System::System(Params *p)
if (!pal->loadGlobalSymbols(palSymtab))
panic("could not load pal symbols\n");
+ if (!pal->loadLocalSymbols(palSymtab))
+ panic("could not load pal symbols\n");
+
if (!kernel->loadGlobalSymbols(debugSymbolTable))
panic("could not load kernel symbols\n");