亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flatmem.c

?? realview22.rar
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* flatmem.c - Fast ARMulator memory interface.
 * (formerly known as armflat.c.)
 * Copyright (C) Advanced RISC Machines Limited, 1995-1998. 
 * Copyright (C) 1998-2001  ARM Limited.
 * All rights reserved.
 *
 * RCS $Revision: 1.1.2.31.2.3 $
 * Checkin $Date: 2003/09/24 16:40:02 $
 * Revising $Author: dsinclai $
 */

#include <string.h>             /* for memset */
#include <ctype.h>              /* for toupper */
#include "rdi.h"
#include "rdi_priv.h"
#include "rdi_prop.h"

#include "simplelinks.h"
#include "armul_callbackid.h"
#include "perip2rdi.h"         /* Perip2Memret */
#include "minperip.h"
#include "addcounter.h"
#include "armul_lib.h"         /* for ARMul_SIRange() */
#include "armul_agent.h"       /* for ARMulAgent_* */
#define ACDTEST(FUNC,RET) if (FUNC == RDIError_BufferFull) \
                               RET = RDIError_BufferFull

#include "armul_mem.h" /* for ARMul_Cycles ... */
#include "rdi_conf.h"
#include "armul_cnf.h"
#include "clxlist.h"
#include "armul_cyc.h"
#define NO_BYTELANES

/* NUL_BIU owns ABus now. */
/* #define FLAT_OWNS_ABUS */

/* debug options */
#ifndef NDEBUG
# if 1
#  define VERBOSE_NewLeafPageAllocated
# else
#  define VERBOSE_BUS
#  define VERBOSE_PERIPHERAL_ICYCLES
#  define VERBOSE_MEM_TYPE
#  define VERBOSE_CYCLE_DESC
# endif
#endif

#ifdef VERBOSE_DABORT
# define return_PERIP_DABORT \
    printf("\n*** Flatmem returns PERIP_DABORT ***\n"); \
    return_PERIP_DABORT
#else
# define return_PERIP_DABORT return PERIP_DABORT
#endif

#ifdef HOST_ENDIAN_BIG
# define HostEndian 1
#elif defined(HOST_ENDIAN_LITTLE)
# define HostEndian 0
#else
# error "HOST_ENDIAN_UNKNOWN"
#endif


#define NUMPAGES 64 * 1024
#define ARMFLAT_PAGESIZE 64 * 1024
#define PAGEBITS 16
#define OFFSETBITS_WORD 0xfffc

typedef struct {
  ARMword memory[ARMFLAT_PAGESIZE/4];
} mempage;

typedef struct {
  mempage *page[NUMPAGES];
} memory;

BEGIN_STATE_DECL(Flatmem)
  /* things that need to be accessed quickly at the start */
  unsigned read_bigend, write_bigend;
  unsigned int sa_memacc_flag;
  ARMul_Cycles cycles;
  ARMul_Cycles saved_cycles;
  ARMTime saved_bus_BusyUntil;
  ARMword LowestPeripheralAddress, HighestPeripheralAddress;


  ARMword byteAddrXor,hwordAddrXor; /* for reads */

#ifdef FLAT_OWNS_ABUS /*F*/
 /* Was ARMul_State->as_ABus */
  ARMul_Bus fm_ABus;
#endif
  ARMul_Bus *p_ABus;
  ARMul_MemInterface bus_mem;
  ARMul_MemInterfaceRef mem_ref;


  memory mem;                 /* big data structure in the middle */
                              /* things that are rarely accessed at the end */
  ARMul_MemType memtype;
  bool memory_byte_sex;         /* memory bytesex is fixed */
    bool BaseMemoryEnabled;
double clk;

    ARMTime clk_speed;

    struct GenericAccessCallback *NewPageAllocated;

    RDI_AgentHandle agent;
    bool bI_Cycles;
  char *mf_CycleNames[16];
END_STATE_DECL(Flatmem) /*  toplevel; */

#define toplevel FlatmemState

/*
 * ARMulator callbacks
 */
static unsigned ARMFlat_DebugEvents(void *handle, void *data)
{
  toplevel *top=(toplevel *)handle;  
  ARMul_Event *evt = (ARMul_Event *)data;
  if(evt->event == DebugEvent_RunCodeSequence)
  {
      /* save cycle counts */
      top->saved_bus_BusyUntil = top->p_ABus->bus_BusyUntil;
      top->saved_cycles = top->cycles;
  }
  if(evt->event == DebugEvent_EndCodeSequence)
  {
      /* restore cycle counts */
      top->p_ABus->bus_BusyUntil = top->saved_bus_BusyUntil;
      top->cycles = top->saved_cycles;
  }
    
  return FALSE;
}

static void ConfigChange(void *handle, unsigned bNewBigend)
{
  toplevel *top=(toplevel *)handle;
  /* bigendian swapping for reads is ALWAYS done by the memory model */
  top->read_bigend = bNewBigend; /* ((newValue & ARM_MMU_B) != 0); */

  top->byteAddrXor = ( top->read_bigend != HostEndian ) ? 3 : 0;
  top->hwordAddrXor = ( top->read_bigend != HostEndian ) ? 2 : 0;

#ifdef VERBOSE_CONFIGCHANGE
  printf("Flatmem:ConfigChange bNewBigend:%u\n",(unsigned)bNewBigend);
#endif


  /* If we have "fixed" bigend for the memory, then swapping for writes is
   * fixed, otherwise it is the same as for reads
   */
  if (top->memory_byte_sex == FALSE)
    top->write_bigend = top->read_bigend;
}

/* static void Interrupt(void *handle,unsigned int which) */
static unsigned Flatmem_ConfigEvents(void *handle, void *data)
{
  toplevel *top=(toplevel *)handle;
  ARMul_Event *evt = (ARMul_Event *)data;

  switch (evt->event)
  {
  case ConfigEvent_Reset:
    memset(&top->cycles,0,sizeof(top->cycles));
    top->p_ABus->bus_BusyUntil = 0;
    ARMul_BusLimits(top->p_ABus, &top->LowestPeripheralAddress,
                    &top->HighestPeripheralAddress, 1);

        break;
  case ConfigEvent_EndiannessChanged:
          ConfigChange(handle, evt->data1);
          break;
  default:
          return ARMFlat_DebugEvents(handle, data);
  }
  return FALSE;
}


static void ARMFlat_SetBaseMemoryEnable(toplevel *top, uint32 value)
{
    top->BaseMemoryEnabled = BOOLIFY(value);
}

#define GET_PRIMARY_ID(argx) (*(unsigned *)argx) 
#define GET_INDEXED_ID(argx,ndex) (((unsigned *)argx)[ndex])


static int UnkRDIInfo(void *handle, unsigned type, ARMword *arg1,ARMword *arg2)
{
  toplevel *top = (toplevel *)handle;
  int  retVal = RDIError_UnimplementedMessage;

  if (!top->BaseMemoryEnabled)
      return retVal;

  switch(type) {
  case RDICycles: 
  {
        void *state = NULL; /* ARMul_State, top->state; */
    ARMTime total;
    ARMul_AddCounterValue64(state, arg1, arg2, top->cycles.NumScycles);
    ARMul_AddCounterValue64(state, arg1, arg2, top->cycles.NumNcycles);
    ARMul_AddCounterValue64(state, arg1, arg2, top->cycles.NumIcycles);
    ARMul_AddCounterValue64(state, arg1, arg2, top->cycles.NumCcycles);
    total = (top->cycles.NumScycles + top->cycles.NumNcycles +
             top->cycles.NumIcycles + top->cycles.NumCcycles);
    ARMul_AddCounterValue64(state, arg1, arg2, total);
    break; /* Allow more */
  }
  case RDIRequestCyclesDesc:
  {
          void *state = NULL;

          if (top->memtype == ARMul_MemType_PipelinedARM9 ||
              top->memtype == ARMul_MemType_StrongARM ||
              top->memtype == ARMul_MemType_ARM9)
          {
              if( top->memtype == ARMul_MemType_StrongARM) {
                  top->mf_CycleNames[1]="Core_ID";
                  top->mf_CycleNames[0]="Core_IOnly";
                  top->mf_CycleNames[2]="Core_Idles";
                  top->mf_CycleNames[3]="Core_DOnly";
              } else {
                  top->mf_CycleNames[1]="ID_Cycles";
                  top->mf_CycleNames[0]="IBus_Cycles";
                  top->mf_CycleNames[2]="Idle_Cycles";
                  top->mf_CycleNames[3]="DBus_Cycles";
              }
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2, 
                  top->mf_CycleNames[1] /*"ID_Cycles"*/), retVal);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2, 
                  top->mf_CycleNames[0]/*"IBus_Cycles"*/), retVal);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2,
                  top->mf_CycleNames[2]/*"Idle_Cycles"*/), retVal);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2,
                  top->mf_CycleNames[3]/*"DBus_Cycles"*/), retVal);
#ifdef VERBOSE_CYCLE_DESC
              printf("ARMflat RDIRequestCyclesDesc Harvard.\n");
#endif
          } else {
              top->mf_CycleNames[1]="S_Cycles";
              top->mf_CycleNames[0]="N_Cycles";
              top->mf_CycleNames[2]="I_Cycles";
              top->mf_CycleNames[3]="C_Cycles";
              if(!top->bI_Cycles)
                  ARMulif_ReadCycleNames(&top->mf_CycleNames[0],16,
                                         top->memtype,top->config);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2,
                  top->mf_CycleNames[1]/*"S_Cycles"*/), retVal);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2,
                  top->mf_CycleNames[0]/*"N_Cycles"*/), retVal);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2,
                  top->mf_CycleNames[2]/*"I_Cycles"*/), retVal);
              ACDTEST(ARMul_AddCounterDesc(
                  NULL, arg1, arg2,
                  top->mf_CycleNames[3]/*"C_Cycles"*/), retVal);
          }  
          ACDTEST(ARMul_AddCounterDesc(state, arg1, arg2, "Total"), retVal);
          break; /* Allow more */
  }

  case RDIProperty_SetAsNumeric:
  { /* Currently, only signals. */
      unsigned ID = (unsigned)arg1;
      switch (ID)
      {
      case RDIPropID_ARMSignal_BaseMemoryEnable:
          ARMFlat_SetBaseMemoryEnable(top,*arg2);
          ARMul_BusLimits(top->p_ABus, &top->LowestPeripheralAddress,
                          &top->HighestPeripheralAddress, 1);

          return RDIError_NoError;

      default: break;
      }
      break;
  }
  case RDIInfo_RegisterCallback:
  {
      unsigned ID = GET_PRIMARY_ID(arg1);
      switch(ID)
      {
      case ARMulCallbackID_NewLeafPageAllocated:
#ifdef VERBOSE_NewLeafPageAllocated
          printf("\nflatmem.c:RDIInfo_RegisterCallback:ARMulCallbackID_NewLeafPageAllocated\n");
#endif
          return ARMulif_InstallGenericAccessCallback(&top->NewPageAllocated,
                                              (GenericAccessCallback*)arg2);
      default: break;
      }
      break;

  }
  case RDIInfo_DeregisterCallback:
  {
      unsigned ID = GET_PRIMARY_ID(arg1);
      switch(ID)
      {
      case ARMulCallbackID_NewLeafPageAllocated:
          return ARMulif_RemoveGenericAccessCallback(&top->NewPageAllocated,
                                                     (void*)arg2);
      default: break;
      }
      break;
  }

  case RDIInfo_QueryMemInterface:
  {
      unsigned ID = GET_PRIMARY_ID(arg1);
      switch (ID) {
      case ARMulBusID_Memory: /* Leaf memory, usually flat */
          *(ARMul_MemInterface**)arg2 = top->mem_ref.mif;
          return RDIError_NoError;
      default:break;
      }
      break;
  }

#ifdef FLAT_OWNS_ABUS
  case RDIInfo_QueryBus:
  {
      void **pBus = (void**)arg2;
      char const *name = (char const *)arg1;
      if (name[0]==(char)0 || name[1]==(char)0) {
          /* Flatmem only uses single-char names only so far. */
          switch(*name) {
          case '\0':
          case 'A':
              *pBus = top->p_ABus;
              return RDIError_NoError;
          default:
              break;
          }
      }
  }
#endif

  default: break;
  }
  return retVal;
}


/*
 * Predeclare the memory access functions so that the initialisation function
 * can fill them in
 */
#ifdef PIPELINED
static void NextCycle(void *,ARMword,ARMul_acc);
static void NextDCycle(void *,ARMword,ARMul_acc);
static void NextICycle(void *,ARMword,ARMul_acc);
#endif

#ifdef OldCode
static armul_MemAccAsync MemAccessAsync;
#endif
static void MemAccessHarvard(void *,ARMword,ARMword *,ARMul_acc, int *,
                                    ARMword,ARMword *,ARMul_acc, int *);
static int MemAccess(void *,ARMword,ARMword *,ARMul_acc);
static int MemAccessCached(void *,ARMword,ARMword *,ARMul_acc);
static int MemAccessThumb(void *,ARMword,ARMword *,ARMul_acc);
/* This expects D,I call-pairs, and accounts like Harvard. */
static int MemAccessSA(void *,ARMword,ARMword *,ARMul_acc);
#ifndef NO_BYTELANES
static int MemAccessBL(void *,ARMword,ARMword *,ARMul_acc);
#endif
#ifdef MEM_ACCESS2_DISTINCT
static int MemAccess2(void *,ARMword,ARMword *,ARMword *,ARMul_acc);
#endif
static unsigned int DataCacheBusy(void *);

static const ARMul_Cycles *Flat_ReadCycles(void *handle);
static unsigned long Flat_GetCycleLength(void *handle);
static unsigned Flat_MemInfo(void *handle, unsigned type, ARMword *pID,
                        uint64 *data);
static GenericAccessFunc flat_newPage;


/* Needed for VC++6 */
static double u64_to_dbl(uint64 v)
{
    int64 v2 = (int64)v;
    return (double)v2;
}



static ARMTime Flat_ReadClock(void *handle)
{
  /* returns a us count */
  toplevel *top=(toplevel *)handle;
  double t=(u64_to_dbl(top->cycles.NumNcycles) +
            u64_to_dbl(top->cycles.NumScycles) +
            u64_to_dbl(top->cycles.NumIcycles) +
            u64_to_dbl(top->cycles.NumCcycles))*top->clk;
#if 0
  printf("Flat_ReadClock->%f (clk=%f)\n",t,top->clk);
#endif
  return (ARMTime)(int64)t;
}

/* armmmu requires log2(0) == 0 */
static int flatmem_log2(unsigned int value)
{
    unsigned short n = 0;
    while( (value >>= 1) != 0 )
    {
        n++;
    }
    return n;
}


static int flatmem_masterInfo(toplevel *top, unsigned type,
                              ARMword *address, uint64 *data)
{
    return top->mem_ref.master_info ?
        top->mem_ref.master_info(top->mem_ref.handle,
                                    type,address,data) :
        RDIError_UnimplementedMessage;
}


BEGIN_INIT(Flatmem)
{
    /* Leaf memory, usually flatmem  */
    static uint32 ID_Mem[2] = {ARMulBusID_Memory,0};

    ARMul_MemInterface *interf = 
        ARMulif_QueryMemInterface(&state->coredesc, &ID_Mem[0]); /* "mif" */
    ARMul_MemType memtype;
    bool_int verbose = ToolConf_DLookupBool(config,(tag_t)"VERBOSE",FALSE);
  memory *mem;
  unsigned page;
  ARMword clk_speed = 0;
  const char *option;
  toplevel *top=(toplevel *)state;
  if (top == NULL) 
          return RDIError_OutOfStore;

  /* If we didn't get the connection we wanted, to replace the
   * built-in armflat, then ask for the output of the bus-interface. */
  if (interf == NULL)
  {
    /* Output of NUL_BIU (from cache or uncached core) */
    static uint32 ID_Bus[2] = {ARMulBusID_Bus,0};
    interf = ARMulif_QueryMemInterface(&state->coredesc, &ID_Bus[0]);
  }


  top->bI_Cycles =  ToolConf_DLookupBool(config,(tag_t)"ICycles",FALSE);
#ifdef FLAT_OWNS_ABUS /*F*/
  top->p_ABus = &top->fm_ABus;
#endif


  if (!interf)
  {
      static uint32 ID_CORE[2] = {ARMulBusID_Core,0};
      interf = 
          ARMulif_QueryMemInterface(&state->coredesc, &ID_CORE[0]);
#ifdef VERBOSE /* Not really a failure - we expect this for uncached cores. */
      Hostif_PrettyPrint(hostif,config,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品影音先锋| 91美女精品福利| 亚洲日本一区二区| 日韩一区二区在线免费观看| 99精品视频中文字幕| 蜜桃精品视频在线| 亚洲精品免费播放| 久久久一区二区| 欧美一区二区成人| 欧美少妇xxx| 99亚偷拍自图区亚洲| 国产一区二区三区免费观看| 日韩在线观看一区二区| 亚洲三级在线播放| 国产无人区一区二区三区| 日韩一区二区电影在线| 91福利资源站| 91免费看视频| 成人动漫av在线| 国内精品久久久久影院色| 日日夜夜一区二区| 亚洲国产一二三| 亚洲精品你懂的| 亚洲欧美电影一区二区| 国产欧美日韩在线看| 久久婷婷国产综合精品青草| 欧美一区二区三区在线电影| 精品视频1区2区3区| 日本韩国一区二区三区| 97久久精品人人做人人爽50路| 国产精品18久久久| 懂色av一区二区三区蜜臀| 国产麻豆精品theporn| 蜜臀av性久久久久蜜臀aⅴ| 日韩电影在线观看电影| 日韩高清在线不卡| 麻豆freexxxx性91精品| 老司机精品视频导航| 蜜乳av一区二区| 免费人成黄页网站在线一区二区| 午夜视频在线观看一区| 天堂午夜影视日韩欧美一区二区| 亚洲成人高清在线| 三级一区在线视频先锋| 麻豆国产91在线播放| 国产一区二区电影| 国产精品一区三区| 成人福利在线看| 91福利视频网站| 久久久久国产精品麻豆| 久久众筹精品私拍模特| 日本一区二区三区国色天香| 国产精品免费丝袜| 亚洲欧洲精品一区二区三区| 一区二区三区免费在线观看| 亚洲丶国产丶欧美一区二区三区| 婷婷国产在线综合| 精品一区二区三区免费| 国产 日韩 欧美大片| 91丨porny丨蝌蚪视频| 欧美影片第一页| 日韩一区二区在线播放| 国产午夜精品福利| 亚洲精品国产品国语在线app| 亚洲va欧美va人人爽午夜| 美女性感视频久久| 国产高清视频一区| 色老汉一区二区三区| 欧美一卡二卡在线| 欧美高清在线精品一区| 亚洲国产一二三| 国产在线视频不卡二| 91亚洲精品久久久蜜桃网站 | 91麻豆精品秘密| 欧美日韩一区高清| 久久免费视频一区| 亚洲综合无码一区二区| 久草这里只有精品视频| 99视频超级精品| 91精品一区二区三区久久久久久| 日韩你懂的在线观看| 综合久久久久久| 免费成人在线网站| jlzzjlzz亚洲日本少妇| 欧美日韩国产片| 国产精品区一区二区三区| 亚洲国产毛片aaaaa无费看| 精品一区在线看| 91成人国产精品| 久久久久国产成人精品亚洲午夜| 亚洲成人精品影院| 不卡高清视频专区| 欧美v亚洲v综合ⅴ国产v| 一区二区三区小说| 国产精品亚洲第一区在线暖暖韩国| 日本黄色一区二区| 中文字幕欧美三区| 男女男精品网站| 欧美自拍偷拍一区| 国产亚洲欧洲997久久综合| 亚洲国产精品久久一线不卡| 国产成人一区在线| 欧美一级片免费看| 一区二区三区欧美视频| 成人午夜视频在线| 日韩欧美区一区二| 亚洲国产欧美在线| 91丨九色丨尤物| 国产欧美日韩精品一区| 日本成人在线一区| 欧美日本高清视频在线观看| 亚洲欧美日韩国产一区二区三区| 韩国视频一区二区| 欧美精选一区二区| 一区二区欧美在线观看| 成人激情免费电影网址| 久久久亚洲欧洲日产国码αv| 99re视频精品| 欧美激情综合五月色丁香小说| 麻豆一区二区在线| 91精品国产综合久久久久久漫画 | 欧美体内she精高潮| 国产精品久久久久久久久快鸭| 极品少妇xxxx精品少妇| 欧美一级日韩免费不卡| 天天综合天天综合色| 欧美日韩一区不卡| 亚洲电影欧美电影有声小说| 欧美视频在线观看一区| 亚洲一区二区三区爽爽爽爽爽 | 国产一区二区久久| 久久这里都是精品| 激情伊人五月天久久综合| 欧美一区二区高清| 美日韩一区二区| 欧美成人aa大片| 国内成人精品2018免费看| 欧美α欧美αv大片| 九九热在线视频观看这里只有精品| 欧美一区二区三区不卡| 青青草伊人久久| 欧美成人猛片aaaaaaa| 美女免费视频一区二区| 日韩欧美三级在线| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩一区二区三区免费观看| 日韩国产欧美在线视频| 日韩一级二级三级| 九九九久久久精品| 日本一区二区电影| 91啪亚洲精品| 亚洲电影第三页| 日韩三级电影网址| 国产高清不卡二三区| 国产精品看片你懂得| 91久久香蕉国产日韩欧美9色| 亚洲一级二级在线| 69p69国产精品| 国产一区二区看久久| 综合婷婷亚洲小说| 欧美色视频一区| 久久国产欧美日韩精品| 国产人伦精品一区二区| 99精品视频在线播放观看| 亚洲精品成人精品456| 欧美日韩国产成人在线免费| 久久99精品久久久久| 国产精品精品国产色婷婷| 欧美性大战久久久久久久蜜臀| 日韩电影免费在线| 欧美va亚洲va香蕉在线 | 日韩欧美亚洲一区二区| 国产91精品在线观看| 亚洲人123区| 欧美一区二区视频在线观看 | 日韩欧美亚洲国产另类| 粗大黑人巨茎大战欧美成人| 亚洲综合精品自拍| 精品成人一区二区三区| 色综合色狠狠综合色| 青青草成人在线观看| 国产欧美一区二区精品秋霞影院| 一道本成人在线| 久久精品av麻豆的观看方式| 国产精品对白交换视频| 欧美一区二区三区在线电影| 成人在线视频首页| 水蜜桃久久夜色精品一区的特点| 国产亚洲综合在线| 精品视频全国免费看| 欧美一级一区二区| 99久久综合99久久综合网站| 免费高清不卡av| 亚洲一区二区精品视频| 久久精品在这里| 欧美一级黄色录像| 色呦呦网站一区| 丁香天五香天堂综合| 另类欧美日韩国产在线| 有码一区二区三区|