⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptrace.c

📁 RISC处理器仿真分析程序。可以用于研究通用RISC处理器的指令和架构设计。在linux下编译
💻 C
字号:
/* * ptrace.c - pipeline tracing routines * * This file is a part of the SimpleScalar tool suite written by * Todd M. Austin as a part of the Multiscalar Research Project. *   * The tool suite is currently maintained by Doug Burger and Todd M. Austin. *  * Copyright (C) 1994, 1995, 1996, 1997 by Todd M. Austin * * This source file is distributed "as is" in the hope that it will be * useful.  The tool set comes with no warranty, and no author or * distributor accepts any responsibility for the consequences of its * use.  *  * Everyone is granted permission to copy, modify and redistribute * this tool set under the following conditions: *  *    This source code is distributed for non-commercial use only.  *    Please contact the maintainer for restrictions applying to  *    commercial use. * *    Permission is granted to anyone to make or distribute copies *    of this source code, either as received or modified, in any *    medium, provided that all copyright notices, permission and *    nonwarranty notices are preserved, and that the distributor *    grants the recipient permission for further redistribution as *    permitted by this document. * *    Permission is granted to distribute this file in compiled *    or executable form under the same conditions that apply for *    source code, provided that either: * *    A. it is accompanied by the corresponding machine-readable *       source code, *    B. it is accompanied by a written offer, with no time limit, *       to give anyone a machine-readable copy of the corresponding *       source code in return for reimbursement of the cost of *       distribution.  This written offer must permit verbatim *       duplication by anyone, or *    C. it is distributed by someone who received only the *       executable form, and is accompanied by a copy of the *       written offer of source code that they received concurrently. * * In other words, you are welcome to use, share and improve this * source file.  You are forbidden to forbid anyone else to use, share * and improve what you give them. * * INTERNET: dburger@cs.wisc.edu * US Mail:  1210 W. Dayton Street, Madison, WI 53706 * * $Id: ptrace.c,v 1.1 1997/03/11 01:32:15 taustin Exp taustin $ * * $Log: ptrace.c,v $ * Revision 1.1  1997/03/11  01:32:15  taustin * Initial revision * * */#include <stdio.h>#include <stdlib.h>#include "misc.h"#include "ss.h"#include "range.h"#include "ptrace.h"/* pipetrace file */FILE *ptrace_outfd = NULL;/* pipetracing is active */int ptrace_active = FALSE;/* pipetracing range */struct range_range_t ptrace_range;/* one-shot switch for pipetracing */int ptrace_oneshot = FALSE;/* open pipeline trace */voidptrace_open(char *fname,		/* output filename */	    char *range)		/* trace range */{  char *errstr;  /* parse the output range */  if (!range)    {      /* no range */      errstr = range_parse_range(":", &ptrace_range);      if (errstr)	panic("cannot parse pipetrace range, use: {<start>}:{<end>}");      ptrace_active = TRUE;    }  else    {      errstr = range_parse_range(range, &ptrace_range);      if (errstr)	fatal("cannot parse pipetrace range, use: {<start>}:{<end>}");      ptrace_active = FALSE;    }  if (ptrace_range.start.ptype != ptrace_range.end.ptype)    fatal("range endpoints are not of the same type");  /* open output trace file */  if (!fname || !strcmp(fname, "-") || !strcmp(fname, "stderr"))    ptrace_outfd = stderr;  else if (!strcmp(fname, "stdout"))    ptrace_outfd = stdout;  else    {      ptrace_outfd = fopen(fname, "w");      if (!ptrace_outfd)	fatal("cannot open pipetrace output file `%s'", fname);    }}/* close pipeline trace */voidptrace_close(void){  if (ptrace_outfd != NULL && ptrace_outfd != stderr && ptrace_outfd != stdout)    fclose(ptrace_outfd);}/* declare a new instruction */void__ptrace_newinst(unsigned int iseq,	/* instruction sequence number */		 SS_INST_TYPE inst,	/* new instruction */		 SS_ADDR_TYPE pc,	/* program counter of instruction */		 SS_ADDR_TYPE addr)	/* address referenced, if load/store */{  fprintf(ptrace_outfd, "+ %u 0x%08x 0x%08x ", iseq, pc, addr);  ss_print_insn(inst, addr, ptrace_outfd);  fprintf(ptrace_outfd, "\n");  if (ptrace_outfd == stderr || ptrace_outfd == stdout)    fflush(ptrace_outfd);}/* declare a new uop */void__ptrace_newuop(unsigned int iseq,	/* instruction sequence number */		char *uop_desc,		/* new uop description */		SS_ADDR_TYPE pc,	/* program counter of instruction */		SS_ADDR_TYPE addr)	/* address referenced, if load/store */{  fprintf(ptrace_outfd, "+ %u 0x%08x 0x%08x [%s]\n", iseq, pc, addr, uop_desc);  if (ptrace_outfd == stderr || ptrace_outfd == stdout)    fflush(ptrace_outfd);}/* declare instruction retirement or squash */void__ptrace_endinst(unsigned int iseq)	/* instruction sequence number */{  fprintf(ptrace_outfd, "- %u\n", iseq);  if (ptrace_outfd == stderr || ptrace_outfd == stdout)    fflush(ptrace_outfd);}/* declare a new cycle */void__ptrace_newcycle(SS_TIME_TYPE cycle)	/* new cycle */{  fprintf(ptrace_outfd, "@ %.0f\n", (double)cycle);  if (ptrace_outfd == stderr || ptrace_outfd == stdout)    fflush(ptrace_outfd);}/* indicate instruction transition to a new pipeline stage */void__ptrace_newstage(unsigned int iseq,	/* instruction sequence number */		  char *pstage,		/* pipeline stage entered */		  unsigned int pevents)/* pipeline events while in stage */{  fprintf(ptrace_outfd, "* %u %s 0x%08x\n", iseq, pstage, pevents);  if (ptrace_outfd == stderr || ptrace_outfd == stdout)    fflush(ptrace_outfd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -