pseudo_inst.cc revision 1973
111507SCurtis.Dunham@arm.com/* 211507SCurtis.Dunham@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 311860Sandreas.hansson@arm.com * All rights reserved. 411860Sandreas.hansson@arm.com * 511860Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 611507SCurtis.Dunham@arm.com * modification, are permitted provided that the following conditions are 711860Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811860Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911860Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011860Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111860Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211507SCurtis.Dunham@arm.com * neither the name of the copyright holders nor the names of its 1311507SCurtis.Dunham@arm.com * contributors may be used to endorse or promote products derived from 1411507SCurtis.Dunham@arm.com * this software without specific prior written permission. 1511507SCurtis.Dunham@arm.com * 1611860Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711606Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811860Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911860Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011606Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111606Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211860Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311860Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411606Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511860Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611860Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711860Sandreas.hansson@arm.com */ 2811860Sandreas.hansson@arm.com 2911860Sandreas.hansson@arm.com#include <errno.h> 3011860Sandreas.hansson@arm.com#include <fcntl.h> 3111860Sandreas.hansson@arm.com#include <unistd.h> 3211860Sandreas.hansson@arm.com#include <cstdio> 3311860Sandreas.hansson@arm.com 3411860Sandreas.hansson@arm.com#include <string> 3511860Sandreas.hansson@arm.com 3611860Sandreas.hansson@arm.com#include "arch/alpha/pseudo_inst.hh" 3711860Sandreas.hansson@arm.com#include "arch/alpha/vtophys.hh" 3811860Sandreas.hansson@arm.com#include "cpu/base.hh" 3911860Sandreas.hansson@arm.com#include "cpu/sampler/sampler.hh" 4011860Sandreas.hansson@arm.com#include "cpu/exec_context.hh" 4111860Sandreas.hansson@arm.com#include "kern/kernel_stats.hh" 4211860Sandreas.hansson@arm.com#include "sim/param.hh" 4311860Sandreas.hansson@arm.com#include "sim/serialize.hh" 4411860Sandreas.hansson@arm.com#include "sim/sim_exit.hh" 4511860Sandreas.hansson@arm.com#include "sim/stat_control.hh" 4611860Sandreas.hansson@arm.com#include "sim/stats.hh" 4711860Sandreas.hansson@arm.com#include "sim/system.hh" 4811860Sandreas.hansson@arm.com#include "sim/debug.hh" 4911860Sandreas.hansson@arm.com#include "targetarch/vptr.hh" 5011507SCurtis.Dunham@arm.com 5111507SCurtis.Dunham@arm.comusing namespace std; 5211860Sandreas.hansson@arm.com 5311860Sandreas.hansson@arm.comextern Sampler *SampCPU; 5411860Sandreas.hansson@arm.com 5511860Sandreas.hansson@arm.comusing namespace Stats; 5611860Sandreas.hansson@arm.com 5711860Sandreas.hansson@arm.comnamespace AlphaPseudo 5811860Sandreas.hansson@arm.com{ 5911680SCurtis.Dunham@arm.com bool doStatisticsInsts; 6011860Sandreas.hansson@arm.com bool doCheckpointInsts; 6111860Sandreas.hansson@arm.com bool doQuiesce; 6211860Sandreas.hansson@arm.com 6311680SCurtis.Dunham@arm.com void 6411860Sandreas.hansson@arm.com arm(ExecContext *xc) 6511860Sandreas.hansson@arm.com { 6611860Sandreas.hansson@arm.com xc->kernelStats->arm(); 6711860Sandreas.hansson@arm.com } 6811860Sandreas.hansson@arm.com 6911860Sandreas.hansson@arm.com void 7011860Sandreas.hansson@arm.com quiesce(ExecContext *xc) 7111860Sandreas.hansson@arm.com { 7211860Sandreas.hansson@arm.com if (!doQuiesce) 7311860Sandreas.hansson@arm.com return; 7411860Sandreas.hansson@arm.com 7511860Sandreas.hansson@arm.com xc->suspend(); 7611860Sandreas.hansson@arm.com xc->kernelStats->quiesce(); 7711860Sandreas.hansson@arm.com } 7811860Sandreas.hansson@arm.com 7911860Sandreas.hansson@arm.com void 8011860Sandreas.hansson@arm.com ivlb(ExecContext *xc) 8111860Sandreas.hansson@arm.com { 8211860Sandreas.hansson@arm.com xc->kernelStats->ivlb(); 8311606Sandreas.sandberg@arm.com } 8411507SCurtis.Dunham@arm.com 8511507SCurtis.Dunham@arm.com void 8611860Sandreas.hansson@arm.com ivle(ExecContext *xc) 8711507SCurtis.Dunham@arm.com { 8811507SCurtis.Dunham@arm.com } 8911507SCurtis.Dunham@arm.com 9011507SCurtis.Dunham@arm.com void 9111507SCurtis.Dunham@arm.com m5exit_old(ExecContext *xc) 9211507SCurtis.Dunham@arm.com { 9311860Sandreas.hansson@arm.com SimExit(curTick, "m5_exit_old instruction encountered"); 9411507SCurtis.Dunham@arm.com } 9511507SCurtis.Dunham@arm.com 9611507SCurtis.Dunham@arm.com void 9711507SCurtis.Dunham@arm.com m5exit(ExecContext *xc) 9811507SCurtis.Dunham@arm.com { 9911507SCurtis.Dunham@arm.com Tick delay = xc->regs.intRegFile[16]; 10011860Sandreas.hansson@arm.com Tick when = curTick + delay * Clock::Int::ns; 10111860Sandreas.hansson@arm.com SimExit(when, "m5_exit instruction encountered"); 10211860Sandreas.hansson@arm.com } 10311570SCurtis.Dunham@arm.com 10411507SCurtis.Dunham@arm.com void 10511507SCurtis.Dunham@arm.com resetstats(ExecContext *xc) 10611507SCurtis.Dunham@arm.com { 10711507SCurtis.Dunham@arm.com if (!doStatisticsInsts) 10811507SCurtis.Dunham@arm.com return; 10911507SCurtis.Dunham@arm.com 11011507SCurtis.Dunham@arm.com Tick delay = xc->regs.intRegFile[16]; 11111507SCurtis.Dunham@arm.com Tick period = xc->regs.intRegFile[17]; 11211507SCurtis.Dunham@arm.com 11311507SCurtis.Dunham@arm.com Tick when = curTick + delay * Clock::Int::ns; 11411507SCurtis.Dunham@arm.com Tick repeat = period * Clock::Int::ns; 11511507SCurtis.Dunham@arm.com 11611507SCurtis.Dunham@arm.com using namespace Stats; 11711507SCurtis.Dunham@arm.com SetupEvent(Reset, when, repeat); 11811507SCurtis.Dunham@arm.com } 11911507SCurtis.Dunham@arm.com 12011507SCurtis.Dunham@arm.com void 12111507SCurtis.Dunham@arm.com dumpstats(ExecContext *xc) 12211507SCurtis.Dunham@arm.com { 12311507SCurtis.Dunham@arm.com if (!doStatisticsInsts) 12411507SCurtis.Dunham@arm.com return; 12511507SCurtis.Dunham@arm.com 12611507SCurtis.Dunham@arm.com Tick delay = xc->regs.intRegFile[16]; 12711507SCurtis.Dunham@arm.com Tick period = xc->regs.intRegFile[17]; 12811507SCurtis.Dunham@arm.com 12911507SCurtis.Dunham@arm.com Tick when = curTick + delay * Clock::Int::ns; 13011507SCurtis.Dunham@arm.com Tick repeat = period * Clock::Int::ns; 13111507SCurtis.Dunham@arm.com 13211507SCurtis.Dunham@arm.com using namespace Stats; 13311507SCurtis.Dunham@arm.com SetupEvent(Dump, when, repeat); 13411507SCurtis.Dunham@arm.com } 13511507SCurtis.Dunham@arm.com 13611507SCurtis.Dunham@arm.com void 13711507SCurtis.Dunham@arm.com addsymbol(ExecContext *xc) 13811507SCurtis.Dunham@arm.com { 13911507SCurtis.Dunham@arm.com Addr addr = xc->regs.intRegFile[16]; 14011507SCurtis.Dunham@arm.com char symb[100]; 14111507SCurtis.Dunham@arm.com CopyString(xc, symb, xc->regs.intRegFile[17], 100); 14211507SCurtis.Dunham@arm.com std::string symbol(symb); 14311507SCurtis.Dunham@arm.com 14411507SCurtis.Dunham@arm.com DPRINTF(Loader, "Loaded symbol: %s @ %#llx\n", symbol, addr); 14511507SCurtis.Dunham@arm.com 14611507SCurtis.Dunham@arm.com xc->system->kernelSymtab->insert(addr,symbol); 14711507SCurtis.Dunham@arm.com } 14811860Sandreas.hansson@arm.com 14911860Sandreas.hansson@arm.com void 15011860Sandreas.hansson@arm.com dumpresetstats(ExecContext *xc) 15111860Sandreas.hansson@arm.com { 15211860Sandreas.hansson@arm.com if (!doStatisticsInsts) 15311860Sandreas.hansson@arm.com return; 15411860Sandreas.hansson@arm.com 15511860Sandreas.hansson@arm.com Tick delay = xc->regs.intRegFile[16]; 15611754Sandreas.hansson@arm.com Tick period = xc->regs.intRegFile[17]; 15711860Sandreas.hansson@arm.com 15811860Sandreas.hansson@arm.com Tick when = curTick + delay * Clock::Int::ns; 15911860Sandreas.hansson@arm.com Tick repeat = period * Clock::Int::ns; 16011860Sandreas.hansson@arm.com 16111860Sandreas.hansson@arm.com using namespace Stats; 16211860Sandreas.hansson@arm.com SetupEvent(Dump|Reset, when, repeat); 16311860Sandreas.hansson@arm.com } 16411860Sandreas.hansson@arm.com 16511860Sandreas.hansson@arm.com void 16611860Sandreas.hansson@arm.com m5checkpoint(ExecContext *xc) 16711860Sandreas.hansson@arm.com { 16811606Sandreas.sandberg@arm.com if (!doCheckpointInsts) 16911570SCurtis.Dunham@arm.com return; 17011570SCurtis.Dunham@arm.com 17111570SCurtis.Dunham@arm.com Tick delay = xc->regs.intRegFile[16]; 17211507SCurtis.Dunham@arm.com Tick period = xc->regs.intRegFile[17]; 17311507SCurtis.Dunham@arm.com 17411507SCurtis.Dunham@arm.com Tick when = curTick + delay * Clock::Int::ns; 17511507SCurtis.Dunham@arm.com Tick repeat = period * Clock::Int::ns; 17611507SCurtis.Dunham@arm.com 17711507SCurtis.Dunham@arm.com Checkpoint::setup(when, repeat); 17811507SCurtis.Dunham@arm.com } 17911507SCurtis.Dunham@arm.com 18011507SCurtis.Dunham@arm.com void 18111507SCurtis.Dunham@arm.com readfile(ExecContext *xc) 18211507SCurtis.Dunham@arm.com { 18311507SCurtis.Dunham@arm.com const string &file = xc->cpu->system->params->readfile; 18411507SCurtis.Dunham@arm.com if (file.empty()) { 18511507SCurtis.Dunham@arm.com xc->regs.intRegFile[0] = ULL(0); 18611507SCurtis.Dunham@arm.com return; 18711507SCurtis.Dunham@arm.com } 18811507SCurtis.Dunham@arm.com 18911507SCurtis.Dunham@arm.com Addr vaddr = xc->regs.intRegFile[16]; 19011507SCurtis.Dunham@arm.com uint64_t len = xc->regs.intRegFile[17]; 19111507SCurtis.Dunham@arm.com uint64_t offset = xc->regs.intRegFile[18]; 19211507SCurtis.Dunham@arm.com uint64_t result = 0; 19311507SCurtis.Dunham@arm.com 19411507SCurtis.Dunham@arm.com int fd = ::open(file.c_str(), O_RDONLY, 0); 19511507SCurtis.Dunham@arm.com if (fd < 0) 19611507SCurtis.Dunham@arm.com panic("could not open file %s\n", file); 19711860Sandreas.hansson@arm.com 19811860Sandreas.hansson@arm.com if (::lseek(fd, offset, SEEK_SET) < 0) 19911860Sandreas.hansson@arm.com panic("could not seek: %s", strerror(errno)); 20011860Sandreas.hansson@arm.com 20111860Sandreas.hansson@arm.com char *buf = new char[len]; 20211860Sandreas.hansson@arm.com char *p = buf; 20311860Sandreas.hansson@arm.com while (len > 0) { 20411860Sandreas.hansson@arm.com int bytes = ::read(fd, p, len); 20511754Sandreas.hansson@arm.com if (bytes <= 0) 20611860Sandreas.hansson@arm.com break; 20711860Sandreas.hansson@arm.com 20811860Sandreas.hansson@arm.com p += bytes; 20911860Sandreas.hansson@arm.com result += bytes; 21011860Sandreas.hansson@arm.com len -= bytes; 21111860Sandreas.hansson@arm.com } 21211860Sandreas.hansson@arm.com 21311860Sandreas.hansson@arm.com close(fd); 21411860Sandreas.hansson@arm.com CopyIn(xc, vaddr, buf, result); 21511860Sandreas.hansson@arm.com delete [] buf; 21611680SCurtis.Dunham@arm.com xc->regs.intRegFile[0] = result; 21711606Sandreas.sandberg@arm.com } 21811860Sandreas.hansson@arm.com 21911860Sandreas.hansson@arm.com class Context : public ParamContext 22011680SCurtis.Dunham@arm.com { 22111680SCurtis.Dunham@arm.com public: 22211860Sandreas.hansson@arm.com Context(const string §ion) : ParamContext(section) {} 22311507SCurtis.Dunham@arm.com void checkParams(); 22411680SCurtis.Dunham@arm.com }; 22511860Sandreas.hansson@arm.com 22611860Sandreas.hansson@arm.com Context context("pseudo_inst"); 22711860Sandreas.hansson@arm.com 22811860Sandreas.hansson@arm.com Param<bool> __quiesce(&context, "quiesce", 22911860Sandreas.hansson@arm.com "enable quiesce instructions", 23011860Sandreas.hansson@arm.com true); 23111860Sandreas.hansson@arm.com Param<bool> __statistics(&context, "statistics", 23211860Sandreas.hansson@arm.com "enable statistics pseudo instructions", 23311860Sandreas.hansson@arm.com true); 23411860Sandreas.hansson@arm.com Param<bool> __checkpoint(&context, "checkpoint", 23511860Sandreas.hansson@arm.com "enable checkpoint pseudo instructions", 23611860Sandreas.hansson@arm.com true); 23711860Sandreas.hansson@arm.com 23811860Sandreas.hansson@arm.com void 23911860Sandreas.hansson@arm.com Context::checkParams() 24011860Sandreas.hansson@arm.com { 24111507SCurtis.Dunham@arm.com doQuiesce = __quiesce; 24211860Sandreas.hansson@arm.com doStatisticsInsts = __statistics; 24311860Sandreas.hansson@arm.com doCheckpointInsts = __checkpoint; 24411860Sandreas.hansson@arm.com } 24511860Sandreas.hansson@arm.com 24611860Sandreas.hansson@arm.com void debugbreak(ExecContext *xc) 24711507SCurtis.Dunham@arm.com { 24811680SCurtis.Dunham@arm.com debug_break(); 24911680SCurtis.Dunham@arm.com } 25011680SCurtis.Dunham@arm.com 25111507SCurtis.Dunham@arm.com void switchcpu(ExecContext *xc) 25211860Sandreas.hansson@arm.com { 25311860Sandreas.hansson@arm.com if (SampCPU) 25411860Sandreas.hansson@arm.com SampCPU->switchCPUs(); 25511860Sandreas.hansson@arm.com } 25611860Sandreas.hansson@arm.com} 25711860Sandreas.hansson@arm.com