changeset ed9c6b16e977 in /z/repo/m5 details: http://repo.m5sim.org/m5?cmd=changeset;node=ed9c6b16e977 description: Automated merge with ssh://h...@repo.m5sim.org/m5
diffstat: configs/common/Caches.py | 3 + configs/common/FSConfig.py | 11 +- src/arch/alpha/predecoder.hh | 6 + src/arch/arm/insts/branch.hh | 1 + src/arch/arm/insts/macromem.cc | 86 +- src/arch/arm/insts/macromem.hh | 21 + src/arch/arm/insts/mem.hh | 8 +- src/arch/arm/intregs.hh | 2 + src/arch/arm/isa.cc | 10 + src/arch/arm/isa/formats/fp.isa | 2 +- src/arch/arm/isa/insts/branch.isa | 35 +- src/arch/arm/isa/insts/ldr.isa | 25 +- src/arch/arm/isa/insts/m5ops.isa | 6 +- src/arch/arm/isa/insts/macromem.isa | 84 +- src/arch/arm/isa/insts/mem.isa | 25 +- src/arch/arm/isa/insts/misc.isa | 20 +- src/arch/arm/isa/insts/str.isa | 14 +- src/arch/arm/isa/operands.isa | 6 +- src/arch/arm/isa/templates/branch.isa | 37 + src/arch/arm/isa/templates/macromem.isa | 35 + src/arch/arm/isa/templates/mem.isa | 24 +- src/arch/arm/isa/templates/pred.isa | 32 + src/arch/arm/linux/process.cc | 34 +- src/arch/arm/linux/system.cc | 24 + src/arch/arm/linux/system.hh | 13 + src/arch/arm/miscregs.hh | 17 +- src/arch/arm/predecoder.hh | 13 +- src/arch/arm/types.hh | 13 + src/arch/mips/predecoder.hh | 6 + src/arch/power/predecoder.hh | 6 + src/arch/sparc/predecoder.hh | 7 + src/arch/x86/predecoder.hh | 6 + src/cpu/o3/comm.hh | 57 +- src/cpu/o3/commit.hh | 3 +- src/cpu/o3/commit_impl.hh | 28 +- src/cpu/o3/cpu.cc | 5 +- src/cpu/o3/fetch.hh | 4 +- src/cpu/o3/fetch_impl.hh | 15 +- src/cpu/o3/iew_impl.hh | 6 +- src/cpu/o3/lsq_unit_impl.hh | 4 +- src/cpu/simple/atomic.cc | 3 + src/cpu/simple/timing.cc | 4 + src/cpu/static_inst.hh | 1 + src/dev/io_device.cc | 3 + src/kern/linux/events.cc | 37 + src/kern/linux/events.hh | 27 + src/mem/cache/BaseCache.py | 1 + src/mem/cache/base.cc | 1 + src/mem/cache/base.hh | 5 + src/mem/cache/cache_impl.hh | 2 +- src/sim/pseudo_inst.cc | 34 + src/sim/pseudo_inst.hh | 1 + src/sim/syscall_emul.cc | 14 + src/sim/syscall_emul.hh | 2 + tests/SConscript | 3 +- tests/configs/inorder-timing.py | 6 +- tests/configs/memtest.py | 1 + tests/configs/o3-timing-mp.py | 1 + tests/configs/o3-timing.py | 6 +- tests/configs/pc-simple-atomic.py | 3 + tests/configs/pc-simple-timing.py | 1 + tests/configs/realview-o3.py | 99 + tests/configs/realview-simple-atomic.py | 1 + tests/configs/realview-simple-timing.py | 1 + tests/configs/simple-atomic-mp.py | 1 + tests/configs/simple-timing-mp.py | 1 + tests/configs/simple-timing.py | 6 +- tests/configs/tsunami-o3-dual.py | 2 + tests/configs/tsunami-o3.py | 2 + tests/configs/tsunami-simple-atomic-dual.py | 2 + tests/configs/tsunami-simple-atomic.py | 2 + tests/configs/tsunami-simple-timing-dual.py | 2 + tests/configs/tsunami-simple-timing.py | 2 + tests/long/00.gzip/ref/arm/linux/o3-timing/config.ini | 5 +- tests/long/00.gzip/ref/arm/linux/o3-timing/simout | 10 +- tests/long/00.gzip/ref/arm/linux/o3-timing/stats.txt | 782 ++-- tests/long/00.gzip/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/long/00.gzip/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/00.gzip/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/00.gzip/ref/arm/linux/simple-timing/config.ini | 5 +- tests/long/00.gzip/ref/arm/linux/simple-timing/simout | 10 +- tests/long/00.gzip/ref/arm/linux/simple-timing/stats.txt | 210 +- tests/long/10.linux-boot/ref/alpha/linux/tsunami-o3-dual/config.ini | 18 +- tests/long/10.linux-boot/ref/alpha/linux/tsunami-o3-dual/simout | 12 +- tests/long/10.linux-boot/ref/alpha/linux/tsunami-o3-dual/stats.txt | 1732 +++++----- tests/long/10.linux-boot/ref/alpha/linux/tsunami-o3/config.ini | 16 +- tests/long/10.linux-boot/ref/alpha/linux/tsunami-o3/simout | 12 +- tests/long/10.linux-boot/ref/alpha/linux/tsunami-o3/stats.txt | 934 ++-- tests/long/10.linux-boot/ref/arm/linux/realview-o3/config.ini | 950 +++++ tests/long/10.linux-boot/ref/arm/linux/realview-o3/simerr | 43 + tests/long/10.linux-boot/ref/arm/linux/realview-o3/simout | 16 + tests/long/10.linux-boot/ref/arm/linux/realview-o3/stats.txt | 750 ++++ tests/long/10.linux-boot/ref/arm/linux/realview-o3/status | 1 + tests/long/10.linux-boot/ref/arm/linux/realview-o3/system.terminal | 0 tests/long/10.mcf/ref/arm/linux/o3-timing/config.ini | 7 +- tests/long/10.mcf/ref/arm/linux/o3-timing/simout | 10 +- tests/long/10.mcf/ref/arm/linux/o3-timing/stats.txt | 787 ++-- tests/long/10.mcf/ref/arm/linux/simple-atomic/config.ini | 4 +- tests/long/10.mcf/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/10.mcf/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/10.mcf/ref/arm/linux/simple-timing/config.ini | 7 +- tests/long/10.mcf/ref/arm/linux/simple-timing/simout | 10 +- tests/long/10.mcf/ref/arm/linux/simple-timing/stats.txt | 182 +- tests/long/20.parser/ref/arm/linux/o3-timing/config.ini | 7 +- tests/long/20.parser/ref/arm/linux/o3-timing/simout | 10 +- tests/long/20.parser/ref/arm/linux/o3-timing/stats.txt | 782 ++-- tests/long/20.parser/ref/arm/linux/simple-atomic/config.ini | 4 +- tests/long/20.parser/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/20.parser/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/20.parser/ref/arm/linux/simple-timing/config.ini | 7 +- tests/long/20.parser/ref/arm/linux/simple-timing/simout | 10 +- tests/long/20.parser/ref/arm/linux/simple-timing/stats.txt | 250 +- tests/long/30.eon/ref/arm/linux/o3-timing/config.ini | 5 +- tests/long/30.eon/ref/arm/linux/o3-timing/simout | 12 +- tests/long/30.eon/ref/arm/linux/o3-timing/stats.txt | 773 ++-- tests/long/30.eon/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/long/30.eon/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/30.eon/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/30.eon/ref/arm/linux/simple-timing/config.ini | 5 +- tests/long/30.eon/ref/arm/linux/simple-timing/simout | 10 +- tests/long/30.eon/ref/arm/linux/simple-timing/stats.txt | 164 +- tests/long/40.perlbmk/ref/arm/linux/o3-timing/config.ini | 5 +- tests/long/40.perlbmk/ref/arm/linux/o3-timing/simout | 10 +- tests/long/40.perlbmk/ref/arm/linux/o3-timing/stats.txt | 777 ++-- tests/long/40.perlbmk/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/long/40.perlbmk/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/40.perlbmk/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/40.perlbmk/ref/arm/linux/simple-timing/config.ini | 5 +- tests/long/40.perlbmk/ref/arm/linux/simple-timing/simout | 10 +- tests/long/40.perlbmk/ref/arm/linux/simple-timing/stats.txt | 194 +- tests/long/50.vortex/ref/arm/linux/o3-timing/config.ini | 5 +- tests/long/50.vortex/ref/arm/linux/o3-timing/simout | 10 +- tests/long/50.vortex/ref/arm/linux/o3-timing/stats.txt | 803 ++-- tests/long/50.vortex/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/long/50.vortex/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/50.vortex/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/50.vortex/ref/arm/linux/simple-timing/config.ini | 5 +- tests/long/50.vortex/ref/arm/linux/simple-timing/simout | 10 +- tests/long/50.vortex/ref/arm/linux/simple-timing/stats.txt | 236 +- tests/long/60.bzip2/ref/arm/linux/o3-timing/config.ini | 5 +- tests/long/60.bzip2/ref/arm/linux/o3-timing/simout | 10 +- tests/long/60.bzip2/ref/arm/linux/o3-timing/stats.txt | 792 ++-- tests/long/60.bzip2/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/long/60.bzip2/ref/arm/linux/simple-atomic/simout | 10 +- tests/long/60.bzip2/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/60.bzip2/ref/arm/linux/simple-timing/config.ini | 5 +- tests/long/60.bzip2/ref/arm/linux/simple-timing/simout | 10 +- tests/long/60.bzip2/ref/arm/linux/simple-timing/stats.txt | 202 +- tests/long/70.twolf/ref/arm/linux/o3-timing/config.ini | 5 +- tests/long/70.twolf/ref/arm/linux/o3-timing/simout | 12 +- tests/long/70.twolf/ref/arm/linux/o3-timing/stats.txt | 778 ++-- tests/long/70.twolf/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/long/70.twolf/ref/arm/linux/simple-atomic/simout | 12 +- tests/long/70.twolf/ref/arm/linux/simple-atomic/stats.txt | 36 +- tests/long/70.twolf/ref/arm/linux/simple-timing/config.ini | 5 +- tests/long/70.twolf/ref/arm/linux/simple-timing/simout | 12 +- tests/long/70.twolf/ref/arm/linux/simple-timing/stats.txt | 160 +- tests/quick/00.hello/ref/arm/linux/o3-timing/config.ini | 3 + tests/quick/00.hello/ref/arm/linux/o3-timing/simout | 10 +- tests/quick/00.hello/ref/arm/linux/o3-timing/stats.txt | 746 ++-- tests/quick/00.hello/ref/arm/linux/simple-atomic/config.ini | 2 +- tests/quick/00.hello/ref/arm/linux/simple-atomic/simout | 10 +- tests/quick/00.hello/ref/arm/linux/simple-atomic/stats.txt | 34 +- tests/quick/00.hello/ref/arm/linux/simple-timing/config.ini | 5 +- tests/quick/00.hello/ref/arm/linux/simple-timing/simout | 10 +- tests/quick/00.hello/ref/arm/linux/simple-timing/stats.txt | 186 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-atomic/config.ini | 10 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-atomic/simout | 10 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-atomic/stats.txt | 358 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-atomic/status | 2 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-atomic/system.terminal | 0 tests/quick/10.linux-boot/ref/arm/linux/realview-simple-timing/config.ini | 10 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-timing/simout | 8 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-timing/stats.txt | 24 +- tests/quick/10.linux-boot/ref/arm/linux/realview-simple-timing/status | 2 +- 175 files changed, 9044 insertions(+), 6417 deletions(-) diffs (truncated from 21504 to 300 lines): diff -r b0ecadb07742 -r ed9c6b16e977 configs/common/Caches.py --- a/configs/common/Caches.py Thu Mar 17 17:08:35 2011 -0700 +++ b/configs/common/Caches.py Thu Mar 17 19:24:37 2011 -0500 @@ -34,6 +34,7 @@ latency = '1ns' mshrs = 10 tgts_per_mshr = 5 + is_top_level = True class L2Cache(BaseCache): assoc = 8 @@ -49,6 +50,7 @@ mshrs = 10 size = '1kB' tgts_per_mshr = 12 + is_top_level = True class IOCache(BaseCache): assoc = 8 @@ -58,3 +60,4 @@ size = '1kB' tgts_per_mshr = 12 forward_snoops = False + is_top_level = True diff -r b0ecadb07742 -r ed9c6b16e977 configs/common/FSConfig.py --- a/configs/common/FSConfig.py Thu Mar 17 17:08:35 2011 -0700 +++ b/configs/common/FSConfig.py Thu Mar 17 19:24:37 2011 -0500 @@ -201,13 +201,8 @@ self.membus = MemBus(bus_id=1) self.membus.badaddr_responder.warn_access = "warn" self.bridge = Bridge(delay='50ns', nack_delay='4ns') - self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()), zero = True) - self.diskmem = PhysicalMemory(range = AddrRange(Addr('128MB'), size = '128MB'), - file = disk('ael-arm.ext2')) self.bridge.side_a = self.iobus.port self.bridge.side_b = self.membus.port - self.physmem.port = self.membus.port - self.diskmem.port = self.membus.port self.mem_mode = mem_mode @@ -232,13 +227,19 @@ if bare_metal: # EOT character on UART will end the simulation self.realview.uart.end_on_eot = True + self.physmem = PhysicalMemory(range = AddrRange(Addr('256MB')), zero = True) else: + self.physmem = PhysicalMemory(range = AddrRange(Addr('128MB')), zero = True) + self.diskmem = PhysicalMemory(range = AddrRange(Addr('128MB'), size = '128MB'), + file = disk('ael-arm.ext2')) + self.diskmem.port = self.membus.port self.machine_type = machine_type self.kernel = binary('vmlinux.arm') self.boot_osflags = 'earlyprintk mem=128MB console=ttyAMA0' + \ ' lpj=19988480 norandmaps slram=slram0,0x8000000,+0x8000000' + \ ' mtdparts=slram0:- rw loglevel=8 root=/dev/mtdblock0' + self.physmem.port = self.membus.port self.realview.attachOnChipIO(self.membus) self.realview.attachIO(self.iobus) diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/alpha/predecoder.hh --- a/src/arch/alpha/predecoder.hh Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/alpha/predecoder.hh Thu Mar 17 19:24:37 2011 -0500 @@ -76,6 +76,12 @@ emiIsReady = false; } + void + reset(const ExtMachInst &old_emi) + { + reset(); + } + // Use this to give data to the predecoder. This should be used // when there is control flow. void diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/arm/insts/branch.hh --- a/src/arch/arm/insts/branch.hh Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/arm/insts/branch.hh Thu Mar 17 19:24:37 2011 -0500 @@ -57,6 +57,7 @@ int32_t _imm) : PredOp(mnem, _machInst, __opClass), imm(_imm) {} + }; // Conditionally Branch to a target computed with an immediate diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/arm/insts/macromem.cc --- a/src/arch/arm/insts/macromem.cc Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/arm/insts/macromem.cc Thu Mar 17 19:24:37 2011 -0500 @@ -58,8 +58,13 @@ { uint32_t regs = reglist; uint32_t ones = number_of_ones(reglist); - // Remember that writeback adds a uop - numMicroops = ones + (writeback ? 1 : 0) + 1; + // Remember that writeback adds a uop or two and the temp register adds one + numMicroops = ones + (writeback ? (load ? 2 : 1) : 0) + 1; + + // It's technically legal to do a lot of nothing + if (!ones) + numMicroops = 1; + microOps = new StaticInstPtr[numMicroops]; uint32_t addr = 0; @@ -70,28 +75,13 @@ addr += 4; StaticInstPtr *uop = microOps; - StaticInstPtr wbUop; - if (writeback) { - if (up) { - wbUop = new MicroAddiUop(machInst, rn, rn, ones * 4); - } else { - wbUop = new MicroSubiUop(machInst, rn, rn, ones * 4); - } - } // Add 0 to Rn and stick it in ureg0. // This is equivalent to a move. *uop = new MicroAddiUop(machInst, INTREG_UREG0, rn, 0); - // Write back at the start for loads. This covers the ldm exception return - // case where the base needs to be written in the old mode. Stores may need - // the original value of the base, but they don't change mode and can - // write back at the end like before. - if (load && writeback) { - *++uop = wbUop; - } - unsigned reg = 0; + unsigned regIdx = 0; bool force_user = user & !bits(reglist, 15); bool exception_ret = user & bits(reglist, 15); @@ -101,19 +91,28 @@ reg++; replaceBits(regs, reg, 0); - unsigned regIdx = reg; + regIdx = reg; if (force_user) { regIdx = intRegInMode(MODE_USER, regIdx); } if (load) { - if (reg == INTREG_PC && exception_ret) { - // This must be the exception return form of ldm. - *++uop = new MicroLdrRetUop(machInst, regIdx, - INTREG_UREG0, up, addr); + if (writeback && i == ones - 1) { + // If it's a writeback and this is the last register + // do the load into a temporary register which we'll move + // into the final one later + *++uop = new MicroLdrUop(machInst, INTREG_UREG1, INTREG_UREG0, + up, addr); } else { - *++uop = new MicroLdrUop(machInst, regIdx, - INTREG_UREG0, up, addr); + // Otherwise just do it normally + if (reg == INTREG_PC && exception_ret) { + // This must be the exception return form of ldm. + *++uop = new MicroLdrRetUop(machInst, regIdx, + INTREG_UREG0, up, addr); + } else { + *++uop = new MicroLdrUop(machInst, regIdx, + INTREG_UREG0, up, addr); + } } } else { *++uop = new MicroStrUop(machInst, regIdx, INTREG_UREG0, up, addr); @@ -125,8 +124,32 @@ addr -= 4; } - if (!load && writeback) { - *++uop = wbUop; + if (writeback && ones) { + // put the register update after we're done all loading + if (up) + *++uop = new MicroAddiUop(machInst, rn, rn, ones * 4); + else + *++uop = new MicroSubiUop(machInst, rn, rn, ones * 4); + + // If this was a load move the last temporary value into place + // this way we can't take an exception after we update the base + // register. + if (load && reg == INTREG_PC && exception_ret) { + *++uop = new MicroUopRegMovRet(machInst, 0, INTREG_UREG1); + warn("creating instruction with exception return at curTick:%d\n", + curTick()); + } else if (load) { + *++uop = new MicroUopRegMov(machInst, regIdx, INTREG_UREG1); + if (reg == INTREG_PC) { + (*uop)->setFlag(StaticInstBase::IsControl); + (*uop)->setFlag(StaticInstBase::IsCondControl); + (*uop)->setFlag(StaticInstBase::IsIndirectControl); + // This is created as a RAS POP + if (rn == INTREG_SP) + (*uop)->setFlag(StaticInstBase::IsReturn); + + } + } } (*uop)->setLastMicroop(); @@ -896,6 +919,15 @@ } std::string +MicroSetPCCPSR::generateDisassembly(Addr pc, const SymbolTable *symtab) const +{ + std::stringstream ss; + printMnemonic(ss); + ss << "[PC,CPSR]"; + return ss.str(); +} + +std::string MicroIntMov::generateDisassembly(Addr pc, const SymbolTable *symtab) const { std::stringstream ss; diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/arm/insts/macromem.hh --- a/src/arch/arm/insts/macromem.hh Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/arm/insts/macromem.hh Thu Mar 17 19:24:37 2011 -0500 @@ -134,6 +134,27 @@ { } }; + +/** + * Microops of the form + * PC = IntRegA + * CPSR = IntRegB + */ +class MicroSetPCCPSR : public MicroOp +{ + protected: + IntRegIndex ura, urb, urc; + + MicroSetPCCPSR(const char *mnem, ExtMachInst machInst, OpClass __opClass, + IntRegIndex _ura, IntRegIndex _urb, IntRegIndex _urc) + : MicroOp(mnem, machInst, __opClass), + ura(_ura), urb(_urb), urc(_urc) + { + } + + std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; +}; + /** * Microops of the form IntRegA = IntRegB */ diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/arm/insts/mem.hh --- a/src/arch/arm/insts/mem.hh Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/arm/insts/mem.hh Thu Mar 17 19:24:37 2011 -0500 @@ -97,14 +97,18 @@ IntRegIndex base; AddrMode mode; bool wb; - static const unsigned numMicroops = 2; + IntRegIndex ura, urb, urc; + static const unsigned numMicroops = 3; StaticInstPtr *uops; RfeOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, IntRegIndex _base, AddrMode _mode, bool _wb) : MightBeMicro(mnem, _machInst, __opClass), - base(_base), mode(_mode), wb(_wb), uops(NULL) + base(_base), mode(_mode), wb(_wb), + ura(INTREG_UREG0), urb(INTREG_UREG1), + urc(INTREG_UREG2), + uops(NULL) {} virtual diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/arm/intregs.hh --- a/src/arch/arm/intregs.hh Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/arm/intregs.hh Thu Mar 17 19:24:37 2011 -0500 @@ -110,6 +110,8 @@ INTREG_ZERO, // Dummy zero reg since there has to be one. INTREG_UREG0, + INTREG_UREG1, + INTREG_UREG2, INTREG_CONDCODES, INTREG_FPCONDCODES, diff -r b0ecadb07742 -r ed9c6b16e977 src/arch/arm/isa.cc --- a/src/arch/arm/isa.cc Thu Mar 17 17:08:35 2011 -0700 +++ b/src/arch/arm/isa.cc Thu Mar 17 19:24:37 2011 -0500 @@ -143,6 +143,16 @@ miscRegs[MISCREG_CPACR] = 0; miscRegs[MISCREG_FPSID] = 0x410430A0; + + // See section B4.1.84 of ARM ARM _______________________________________________ m5-dev mailing list m5-dev@m5sim.org http://m5sim.org/mailman/listinfo/m5-dev