From eb7d32907679c2f19e3bc896a76484f537bc986d Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Wed, 22 Sep 2004 18:25:06 -0400 Subject: 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 --- SConscript | 1 + arch/alpha/alpha_memory.cc | 9 +++++---- arch/alpha/ev5.cc | 2 +- kern/linux/linux_system.cc | 14 +++++++------- sim/system.cc | 3 +++ 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"); -- cgit v1.2.3