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

📄 interp.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  return upper - result >= result - lower ? upper : lower;}/* GET_LOOP_BOUNDS {EXTENDED}   These two functions compute the actual starting and ending point   of the repeat loop, based on the RS and RE registers (repeat start,    repeat stop).  The extended version is called for LDRC, and the   regular version is called for SETRC.  The difference is that for   LDRC, the loop start and end instructions are literally the ones   pointed to by RS and RE -- for SETRC, they're not (see docs).  */static struct loop_boundsget_loop_bounds_ext (rs, re, memory, mem_end, maskw, endianw)     int rs, re;     unsigned char *memory, *mem_end;     int maskw, endianw;{  struct loop_bounds loop;  /* FIXME: should I verify RS < RE?  */  loop.start = PT2H (RS);	/* FIXME not using the params?  */  loop.end   = PT2H (RE & ~1);	/* Ignore bit 0 of RE.  */  SKIP_INSN (loop.end);  if (loop.end >= mem_end)    loop.end = PT2H (0);  return loop;}static struct loop_boundsget_loop_bounds (rs, re, memory, mem_end, maskw, endianw)     int rs, re;     unsigned char *memory, *mem_end;     int maskw, endianw;{  struct loop_bounds loop;  if (SR_RC)    {      if (RS >= RE)	{	  loop.start = PT2H (RE - 4);	  SKIP_INSN (loop.start);	  loop.end = loop.start;	  if (RS - RE == 0)	    SKIP_INSN (loop.end);	  if (RS - RE <= 2)	    SKIP_INSN (loop.end);	  SKIP_INSN (loop.end);	}      else	{	  loop.start = PT2H (RS);	  loop.end = PT2H (RE - 4);	  SKIP_INSN (loop.end);	  SKIP_INSN (loop.end);	  SKIP_INSN (loop.end);	  SKIP_INSN (loop.end);	}      if (loop.end >= mem_end)	loop.end = PT2H (0);    }  else    loop.end = PT2H (0);  return loop;}static void ppi_insn ();#include "ppi.c"/* Set the memory size to the power of two provided. */voidsim_size (power)     int power;{  saved_state.asregs.msize = 1 << power;  sim_memory_size = power;  if (saved_state.asregs.memory)    {      free (saved_state.asregs.memory);    }  saved_state.asregs.memory =    (unsigned char *) calloc (64, saved_state.asregs.msize / 64);  if (!saved_state.asregs.memory)    {      fprintf (stderr,	       "Not enough VM for simulation of %d bytes of RAM\n",	       saved_state.asregs.msize);      saved_state.asregs.msize = 1;      saved_state.asregs.memory = (unsigned char *) calloc (1, 1);    }}static voidinit_dsp (abfd)     struct bfd *abfd;{  int was_dsp = target_dsp;  unsigned long mach = bfd_get_mach (abfd);  if (mach == bfd_mach_sh_dsp  ||       mach == bfd_mach_sh4al_dsp ||      mach == bfd_mach_sh3_dsp)    {      int ram_area_size, xram_start, yram_start;      int new_select;      target_dsp = 1;      if (mach == bfd_mach_sh_dsp)	{	  /* SH7410 (orig. sh-sdp):	     4KB each for X & Y memory;	     On-chip X RAM 0x0800f000-0x0800ffff	     On-chip Y RAM 0x0801f000-0x0801ffff  */	  xram_start = 0x0800f000;	  ram_area_size = 0x1000;	}      if (mach == bfd_mach_sh3_dsp || mach == bfd_mach_sh4al_dsp)	{	  /* SH7612:	     8KB each for X & Y memory;	     On-chip X RAM 0x1000e000-0x1000ffff	     On-chip Y RAM 0x1001e000-0x1001ffff  */	  xram_start = 0x1000e000;	  ram_area_size = 0x2000;	}      yram_start = xram_start + 0x10000;      new_select = ~(ram_area_size - 1);      if (saved_state.asregs.xyram_select != new_select)	{	  saved_state.asregs.xyram_select = new_select;	  free (saved_state.asregs.xmem);	  free (saved_state.asregs.ymem);	  saved_state.asregs.xmem = 	    (unsigned char *) calloc (1, ram_area_size);	  saved_state.asregs.ymem = 	    (unsigned char *) calloc (1, ram_area_size);	  /* Disable use of X / Y mmeory if not allocated.  */	  if (! saved_state.asregs.xmem || ! saved_state.asregs.ymem)	    {	      saved_state.asregs.xyram_select = 0;	      if (saved_state.asregs.xmem)		free (saved_state.asregs.xmem);	      if (saved_state.asregs.ymem)		free (saved_state.asregs.ymem);	    }	}      saved_state.asregs.xram_start = xram_start;      saved_state.asregs.yram_start = yram_start;      saved_state.asregs.xmem_offset = saved_state.asregs.xmem - xram_start;      saved_state.asregs.ymem_offset = saved_state.asregs.ymem - yram_start;    }  else    {      target_dsp = 0;      if (saved_state.asregs.xyram_select)	{	  saved_state.asregs.xyram_select = 0;	  free (saved_state.asregs.xmem);	  free (saved_state.asregs.ymem);	}    }  if (! saved_state.asregs.xyram_select)    {      saved_state.asregs.xram_start = 1;      saved_state.asregs.yram_start = 1;    }  if (saved_state.asregs.regstack == NULL)    saved_state.asregs.regstack =       calloc (512, sizeof *saved_state.asregs.regstack);  if (target_dsp != was_dsp)    {      int i, tmp;      for (i = (sizeof sh_dsp_table / sizeof sh_dsp_table[0]) - 1; i >= 0; i--)	{	  tmp = sh_jump_table[0xf000 + i];	  sh_jump_table[0xf000 + i] = sh_dsp_table[i];	  sh_dsp_table[i] = tmp;	}    }}static voidinit_pointers (){  host_little_endian = 0;  * (char*) &host_little_endian = 1;  host_little_endian &= 1;  if (saved_state.asregs.msize != 1 << sim_memory_size)    {      sim_size (sim_memory_size);    }  if (saved_state.asregs.profile && !profile_file)    {      profile_file = fopen ("gmon.out", "wb");      /* Seek to where to put the call arc data */      nsamples = (1 << sim_profile_size);      fseek (profile_file, nsamples * 2 + 12, 0);      if (!profile_file)	{	  fprintf (stderr, "Can't open gmon.out\n");	}      else	{	  saved_state.asregs.profile_hist =	    (unsigned short *) calloc (64, (nsamples * sizeof (short) / 64));	}    }}static voiddump_profile (){  unsigned int minpc;  unsigned int maxpc;  unsigned short *p;  int i;  p = saved_state.asregs.profile_hist;  minpc = 0;  maxpc = (1 << sim_profile_size);  fseek (profile_file, 0L, 0);  swapout (minpc << PROFILE_SHIFT);  swapout (maxpc << PROFILE_SHIFT);  swapout (nsamples * 2 + 12);  for (i = 0; i < nsamples; i++)    swapout16 (saved_state.asregs.profile_hist[i]);}static voidgotcall (from, to)     int from;     int to;{  swapout (from);  swapout (to);  swapout (1);}#define MMASKB ((saved_state.asregs.msize -1) & ~0)intsim_stop (sd)     SIM_DESC sd;{  raise_exception (SIGINT);  return 1;}voidsim_resume (sd, step, siggnal)     SIM_DESC sd;     int step, siggnal;{  register unsigned char *insn_ptr;  unsigned char *mem_end;  struct loop_bounds loop;  register int cycles = 0;  register int stalls = 0;  register int memstalls = 0;  register int insts = 0;  register int prevlock;#if 1  int thislock;#else  register int thislock;#endif  register unsigned int doprofile;  register int pollcount = 0;  /* endianw is used for every insn fetch, hence it makes sense to cache it.     endianb is used less often.  */  register int endianw = global_endianw;  int tick_start = get_now ();  void (*prev) ();  void (*prev_fpe) ();  register unsigned short *jump_table = sh_jump_table;  register int *R = &(saved_state.asregs.regs[0]);  /*register int T;*/#ifndef PR  register int PR;#endif  register int maskb = ~((saved_state.asregs.msize - 1) & ~0);  register int maskw = ~((saved_state.asregs.msize - 1) & ~1);  register int maskl = ~((saved_state.asregs.msize - 1) & ~3);  register unsigned char *memory;  register unsigned int sbit = ((unsigned int) 1 << 31);  prev = signal (SIGINT, control_c);  prev_fpe = signal (SIGFPE, SIG_IGN);  init_pointers ();  saved_state.asregs.exception = 0;  memory = saved_state.asregs.memory;  mem_end = memory + saved_state.asregs.msize;  if (RE & 1)    loop = get_loop_bounds_ext (RS, RE, memory, mem_end, maskw, endianw);  else    loop = get_loop_bounds     (RS, RE, memory, mem_end, maskw, endianw);  insn_ptr = PT2H (saved_state.asregs.pc);  CHECK_INSN_PTR (insn_ptr);#ifndef PR  PR = saved_state.asregs.sregs.named.pr;#endif  /*T = GET_SR () & SR_MASK_T;*/  prevlock = saved_state.asregs.prevlock;  thislock = saved_state.asregs.thislock;  doprofile = saved_state.asregs.profile;  /* If profiling not enabled, disable it by asking for     profiles infrequently. */  if (doprofile == 0)    doprofile = ~0; loop:  if (step && insn_ptr < saved_state.asregs.insn_end)    {      if (saved_state.asregs.exception)	/* This can happen if we've already been single-stepping and	   encountered a loop end.  */	saved_state.asregs.insn_end = insn_ptr;      else	{	  saved_state.asregs.exception = SIGTRAP;	  saved_state.asregs.insn_end = insn_ptr + 2;	}    }  while (insn_ptr < saved_state.asregs.insn_end)    {      register unsigned int iword = RIAT (insn_ptr);      register unsigned int ult;      register unsigned char *nip = insn_ptr + 2;#ifndef ACE_FAST      insts++;#endif    top:      if (tracing)	fprintf (stderr, "PC: %08x, insn: %04x\n", PH2T (insn_ptr), iword);#include "code.c"      in_delay_slot = 0;      insn_ptr = nip;      if (--pollcount < 0)	{	  pollcount = POLL_QUIT_INTERVAL;	  if ((*callback->poll_quit) != NULL	      && (*callback->poll_quit) (callback))	    {	      sim_stop (sd);	    }	    	}#ifndef ACE_FAST      prevlock = thislock;      thislock = 30;      cycles++;      if (cycles >= doprofile)	{	  saved_state.asregs.cycles += doprofile;	  cycles -= doprofile;	  if (saved_state.asregs.profile_hist)	    {	      int n = PH2T (insn_ptr) >> PROFILE_SHIFT;	      if (n < nsamples)		{		  int i = saved_state.asregs.profile_hist[n];		  if (i < 65000)		    saved_state.asregs.profile_hist[n] = i + 1;		}	    }	}#endif    }  if (saved_state.asregs.insn_end == loop.end)    {      saved_state.asregs.cregs.named.sr += SR_RC_INCREMENT;      if (SR_RC)	insn_ptr = loop.start;      else	{	  saved_state.asregs.insn_end = mem_end;	  loop.end = PT2H (0);	}      goto loop;    }  if (saved_state.asregs.exception == SIGILL      || saved_state.asregs.exception == SIGBUS)    {      insn_ptr -= 2;    }  /* Check for SIGBUS due to insn fetch.  */  else if (! saved_state.asregs.exception)    saved_state.asregs.exception = SIGBUS;  saved_state.asregs.ticks += get_now () - tick_start;  saved_state.asregs.cycles += cycles;  saved_state.asregs.stalls += stalls;  saved_state.asregs.memstalls += memstalls;  saved_state.asregs.insts += insts;  saved_state.asregs.pc = PH2T (insn_ptr);#ifndef PR  saved_state.asregs.sregs.named.pr = PR;#endif  saved_state.asregs.prevlock = prevlock;  saved_state.asregs.thislock = thislock;  if (profile_file)    {      dump_profile ();    }  signal (SIGFPE, prev_fpe);  signal (SIGINT, prev);}intsim_write (sd, addr, buffer, size)     SIM_DESC sd;     SIM_ADDR addr;     unsigned char *buffer;     int size;{  int i;  init_pointers ();  for (i = 0; i < size; i++)    {      saved_state.asregs.memory[(MMASKB & (addr + i)) ^ endianb] = buffer[i];    }  return size;}intsim_read (sd, addr, buffer, size)     SIM_DESC sd;     SIM_ADDR addr;     unsigned char *buffer;     int size;{  int i;  init_pointers ();  for (i = 0; i < size; i++)    {      buffer[i] = saved_state.asregs.memory[(MMASKB & (addr + i)) ^ endianb];    }  return size;}static int gdb_bank_number;enum {  REGBANK_MACH = 15,  REGBANK_IVN  = 16,  REGBANK_PR   = 17,  REGBANK_GBR  = 18,  REGBANK_MACL = 19};intsim_store_register (sd, rn, memory, length)     SIM_DESC sd;     int rn;     unsigned char *memory;     int length;{  unsigned val;  init_pointers ();  val = swap (* (int *) memory);  switch (rn)    {    case SIM_SH_R0_REGNUM: case SIM_SH_R1_REGNUM: case SIM_SH_R2_REGNUM:    case SIM_SH_R3_REGNUM: case SIM_SH_R4_REGNUM: case SIM_SH_R5_REGNUM:    case SIM_SH_R6_REGNUM: case SIM_SH_R7_REGNUM: case SIM_SH_R8_REGNUM:    case SIM_SH_R9_REGNUM: case SIM_SH_R10_REGNUM: case SIM_SH_R11_REGNUM:    case SIM_SH_R12_REGNUM: case SIM_SH_R13_REGNUM: case SIM_SH_R14_REGNUM:    case SIM_SH_R15_REGNUM:      saved_state.asregs.regs[rn] = val;      break;    case SIM_SH_PC_REGNUM:      saved_state.asregs.pc = val;      break;    case SIM_SH_PR_REGNUM:      PR = val;      break;    case SIM_SH_GBR_REGNUM:      GBR = val;      break;    case SIM_SH_VBR_REGNUM:      VBR = val;      break;    case SIM_SH_MACH_REGNUM:      MACH = val;      break;    case SIM_SH_MACL_REGNUM:      MACL = val;      break;    case SIM_SH_SR_REGNUM:      SET_SR (val);      break;    case SIM_SH_FPUL_REGNUM:      FPUL = val;      break;    case SIM_SH_FPSCR_REGNUM:      SET_FPSCR (val);      break;    case SIM_SH_FR0_REGNUM: case SIM_SH_FR1_REGNUM: case SIM_SH_FR2_REGNUM:    case SIM_SH_FR3_REGNUM: case SIM_SH_FR4_REGNUM: case SIM_SH_FR5_REGNUM:

⌨️ 快捷键说明

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