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

📄 sim-main.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  Copyright (C) 1998, Cygnus Solutions    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.    */#ifndef SIM_MAIN_C#define SIM_MAIN_C#include "sim-main.h"#include "sim-assert.h"/*---------------------------------------------------------------------------*//*-- simulator engine -------------------------------------------------------*//*---------------------------------------------------------------------------*//* Description from page A-22 of the "MIPS IV Instruction Set" manual   (revision 3.1) *//* Translate a virtual address to a physical address and cache   coherence algorithm describing the mechanism used to resolve the   memory reference. Given the virtual address vAddr, and whether the   reference is to Instructions ot Data (IorD), find the corresponding   physical address (pAddr) and the cache coherence algorithm (CCA)   used to resolve the reference. If the virtual address is in one of   the unmapped address spaces the physical address and the CCA are   determined directly by the virtual address. If the virtual address   is in one of the mapped address spaces then the TLB is used to   determine the physical address and access type; if the required   translation is not present in the TLB or the desired access is not   permitted the function fails and an exception is taken.   NOTE: Normally (RAW == 0), when address translation fails, this   function raises an exception and does not return. */INLINE_SIM_MAIN(int)address_translation (SIM_DESC sd,		     sim_cpu * cpu,		     address_word cia,		     address_word vAddr,		     int IorD,		     int LorS,		     address_word * pAddr,		     int *CCA,		     int raw){  int res = -1;			/* TRUE : Assume good return */#ifdef DEBUG  sim_io_printf (sd, "AddressTranslation(0x%s,%s,%s,...);\n", pr_addr (vAddr), (IorD ? "isDATA" : "isINSTRUCTION"), (LorS ? "iSTORE" : "isLOAD"));#endif  /* Check that the address is valid for this memory model */  /* For a simple (flat) memory model, we simply pass virtual     addressess through (mostly) unchanged. */  vAddr &= 0xFFFFFFFF;  *pAddr = vAddr;		/* default for isTARGET */  *CCA = Uncached;		/* not used for isHOST */  return (res);}/* Description from page A-23 of the "MIPS IV Instruction Set" manual   (revision 3.1) *//* Prefetch data from memory. Prefetch is an advisory instruction for   which an implementation specific action is taken. The action taken   may increase performance, but must not change the meaning of the   program, or alter architecturally-visible state. */INLINE_SIM_MAIN (void)prefetch (SIM_DESC sd,	  sim_cpu *cpu,	  address_word cia,	  int CCA,	  address_word pAddr,	  address_word vAddr,	  int DATA,	  int hint){#ifdef DEBUG  sim_io_printf(sd,"Prefetch(%d,0x%s,0x%s,%d,%d);\n",CCA,pr_addr(pAddr),pr_addr(vAddr),DATA,hint);#endif /* DEBUG */  /* For our simple memory model we do nothing */  return;}/* Description from page A-22 of the "MIPS IV Instruction Set" manual   (revision 3.1) *//* Load a value from memory. Use the cache and main memory as   specified in the Cache Coherence Algorithm (CCA) and the sort of   access (IorD) to find the contents of AccessLength memory bytes   starting at physical location pAddr. The data is returned in the   fixed width naturally-aligned memory element (MemElem). The   low-order two (or three) bits of the address and the AccessLength   indicate which of the bytes within MemElem needs to be given to the   processor. If the memory access type of the reference is uncached   then only the referenced bytes are read from memory and valid   within the memory element. If the access type is cached, and the   data is not present in cache, an implementation specific size and   alignment block of memory is read and loaded into the cache to   satisfy a load reference. At a minimum, the block is the entire   memory element. */INLINE_SIM_MAIN (void)load_memory (SIM_DESC SD,	     sim_cpu *CPU,	     address_word cia,	     uword64* memvalp,	     uword64* memval1p,	     int CCA,	     unsigned int AccessLength,	     address_word pAddr,	     address_word vAddr,	     int IorD){  uword64 value = 0;  uword64 value1 = 0;#ifdef DEBUG  sim_io_printf(sd,"DBG: LoadMemory(%p,%p,%d,%d,0x%s,0x%s,%s)\n",memvalp,memval1p,CCA,AccessLength,pr_addr(pAddr),pr_addr(vAddr),(IorD ? "isDATA" : "isINSTRUCTION"));#endif /* DEBUG */#if defined(WARN_MEM)  if (CCA != uncached)    sim_io_eprintf(sd,"LoadMemory CCA (%d) is not uncached (currently all accesses treated as cached)\n",CCA);#endif /* WARN_MEM */  if (((pAddr & LOADDRMASK) + AccessLength) > LOADDRMASK)    {      /* In reality this should be a Bus Error */      sim_io_error (SD, "LOAD AccessLength of %d would extend over %d bit aligned boundary for physical address 0x%s\n",		    AccessLength,		    (LOADDRMASK + 1) << 3,		    pr_addr (pAddr));    }#if defined(TRACE)  dotrace (SD, CPU, tracefh,((IorD == isDATA) ? 0 : 2),(unsigned int)(pAddr&0xFFFFFFFF),(AccessLength + 1),"load%s",((IorD == isDATA) ? "" : " instruction"));#endif /* TRACE */    /* Read the specified number of bytes from memory.  Adjust for     host/target byte ordering/ Align the least significant byte     read. */  switch (AccessLength)    {    case AccessLength_QUADWORD:      {	unsigned_16 val = sim_core_read_aligned_16 (CPU, cia, read_map, pAddr);	value1 = VH8_16 (val);	value = VL8_16 (val);	break;      }    case AccessLength_DOUBLEWORD:      value = sim_core_read_aligned_8 (CPU, cia, read_map, pAddr);      break;    case AccessLength_SEPTIBYTE:      value = sim_core_read_misaligned_7 (CPU, cia, read_map, pAddr);      break;    case AccessLength_SEXTIBYTE:      value = sim_core_read_misaligned_6 (CPU, cia, read_map, pAddr);      break;    case AccessLength_QUINTIBYTE:      value = sim_core_read_misaligned_5 (CPU, cia, read_map, pAddr);      break;    case AccessLength_WORD:      value = sim_core_read_aligned_4 (CPU, cia, read_map, pAddr);      break;    case AccessLength_TRIPLEBYTE:      value = sim_core_read_misaligned_3 (CPU, cia, read_map, pAddr);      break;    case AccessLength_HALFWORD:      value = sim_core_read_aligned_2 (CPU, cia, read_map, pAddr);      break;    case AccessLength_BYTE:      value = sim_core_read_aligned_1 (CPU, cia, read_map, pAddr);      break;    default:      abort ();    }  #ifdef DEBUG  printf("DBG: LoadMemory() : (offset %d) : value = 0x%s%s\n",	 (int)(pAddr & LOADDRMASK),pr_uword64(value1),pr_uword64(value));#endif /* DEBUG */    /* See also store_memory. Position data in correct byte lanes. */  if (AccessLength <= LOADDRMASK)    {      if (BigEndianMem)	/* for big endian target, byte (pAddr&LOADDRMASK == 0) is	   shifted to the most significant byte position.  */	value <<= (((LOADDRMASK - (pAddr & LOADDRMASK)) - AccessLength) * 8);      else	/* For little endian target, byte (pAddr&LOADDRMASK == 0)	   is already in the correct postition. */	value <<= ((pAddr & LOADDRMASK) * 8);    }  #ifdef DEBUG  printf("DBG: LoadMemory() : shifted value = 0x%s%s\n",	 pr_uword64(value1),pr_uword64(value));#endif /* DEBUG */    *memvalp = value;  if (memval1p) *memval1p = value1;}/* Description from page A-23 of the "MIPS IV Instruction Set" manual   (revision 3.1) *//* Store a value to memory. The specified data is stored into the   physical location pAddr using the memory hierarchy (data caches and   main memory) as specified by the Cache Coherence Algorithm   (CCA). The MemElem contains the data for an aligned, fixed-width   memory element (word for 32-bit processors, doubleword for 64-bit   processors), though only the bytes that will actually be stored to   memory need to be valid. The low-order two (or three) bits of pAddr   and the AccessLength field indicates which of the bytes within the   MemElem data should actually be stored; only these bytes in memory   will be changed. */INLINE_SIM_MAIN (void)store_memory (SIM_DESC SD,	      sim_cpu *CPU,	      address_word cia,	      int CCA,	      unsigned int AccessLength,	      uword64 MemElem,	      uword64 MemElem1,   /* High order 64 bits */	      address_word pAddr,	      address_word vAddr){#ifdef DEBUG  sim_io_printf(sd,"DBG: StoreMemory(%d,%d,0x%s,0x%s,0x%s,0x%s)\n",CCA,AccessLength,pr_uword64(MemElem),pr_uword64(MemElem1),pr_addr(pAddr),pr_addr(vAddr));#endif /* DEBUG */  #if defined(WARN_MEM)  if (CCA != uncached)    sim_io_eprintf(sd,"StoreMemory CCA (%d) is not uncached (currently all accesses treated as cached)\n",CCA);#endif /* WARN_MEM */    if (((pAddr & LOADDRMASK) + AccessLength) > LOADDRMASK)    sim_io_error (SD, "STORE AccessLength of %d would extend over %d bit aligned boundary for physical address 0x%s\n",		  AccessLength,		  (LOADDRMASK + 1) << 3,		  pr_addr(pAddr));  #if defined(TRACE)  dotrace (SD, CPU, tracefh,1,(unsigned int)(pAddr&0xFFFFFFFF),(AccessLength + 1),"store");#endif /* TRACE */  #ifdef DEBUG  printf("DBG: StoreMemory: offset = %d MemElem = 0x%s%s\n",(unsigned int)(pAddr & LOADDRMASK),pr_uword64(MemElem1),pr_uword64(MemElem));#endif /* DEBUG */    /* See also load_memory. Position data in correct byte lanes. */  if (AccessLength <= LOADDRMASK)    {      if (BigEndianMem)	/* for big endian target, byte (pAddr&LOADDRMASK == 0) is	   shifted to the most significant byte position.  */	MemElem >>= (((LOADDRMASK - (pAddr & LOADDRMASK)) - AccessLength) * 8);      else

⌨️ 快捷键说明

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