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

📄 mips_mts.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* LDL: Load Double-Word Left */fastcall void MTS_PROTO(ldl)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t r_mask,naddr;   m_uint64_t data;   u_int m_shift;   void *haddr;   naddr = vaddr & ~(0x07);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_LDL,8,MTS_READ,&data);   if (likely(haddr != NULL))      data = vmtoh64(*(m_uint64_t *)haddr);   m_shift = (vaddr & 0x07) << 3;   r_mask = (1ULL << m_shift) - 1;   data <<= m_shift;   cpu->gpr[reg] &= r_mask;   cpu->gpr[reg] |= data;}/* LDR: Load Double-Word Right */fastcall void MTS_PROTO(ldr)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t r_mask,naddr;   m_uint64_t data;   u_int m_shift;   void *haddr;   naddr = vaddr & ~(0x07);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_LDR,8,MTS_READ,&data);   if (likely(haddr != NULL))      data = vmtoh64(*(m_uint64_t *)haddr);   m_shift = ((vaddr & 0x07) + 1) << 3;   r_mask = (1ULL << m_shift) - 1;   data >>= (64 - m_shift);      cpu->gpr[reg] &= ~r_mask;   cpu->gpr[reg] |= data;}/* SWL: Store Word Left */fastcall void MTS_PROTO(swl)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t d_mask,naddr;   m_uint64_t data;   u_int r_shift;   void *haddr;   naddr = vaddr & ~(0x03ULL);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SWL,4,MTS_READ,&data);   if (likely(haddr != NULL))      data = vmtoh32(*(m_uint32_t *)haddr);   r_shift = (vaddr & 0x03) << 3;   d_mask = 0xffffffff >> r_shift;   data &= ~d_mask;   data |= (cpu->gpr[reg] & 0xffffffff) >> r_shift;   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SWL,4,MTS_WRITE,&data);   if (likely(haddr != NULL)) *(m_uint32_t *)haddr = htovm32(data);}/* SWR: Store Word Right */fastcall void MTS_PROTO(swr)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t d_mask,naddr;   m_uint64_t data;   u_int r_shift;   void *haddr;   naddr = vaddr & ~(0x03);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SWR,4,MTS_READ,&data);   if (likely(haddr != NULL))      data = vmtoh32(*(m_uint32_t *)haddr);   r_shift = ((vaddr & 0x03) + 1) << 3;   d_mask = 0xffffffff >> r_shift;   data &= d_mask;   data |= (cpu->gpr[reg] << (32 - r_shift)) & 0xffffffff;   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SWR,4,MTS_WRITE,&data);   if (likely(haddr != NULL)) *(m_uint32_t *)haddr = htovm32(data);}/* SDL: Store Double-Word Left */fastcall void MTS_PROTO(sdl)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t d_mask,naddr;   m_uint64_t data;   u_int r_shift;   void *haddr;   naddr = vaddr & ~(0x07);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SDL,8,MTS_READ,&data);   if (likely(haddr != NULL))      data = vmtoh64(*(m_uint64_t *)haddr);   r_shift = (vaddr & 0x07) << 3;   d_mask = 0xffffffffffffffffULL >> r_shift;   data &= ~d_mask;   data |= cpu->gpr[reg] >> r_shift;   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SDL,8,MTS_WRITE,&data);   if (likely(haddr != NULL)) *(m_uint64_t *)haddr = htovm64(data);}/* SDR: Store Double-Word Right */fastcall void MTS_PROTO(sdr)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t d_mask,naddr;   m_uint64_t data;   u_int r_shift;   void *haddr;   naddr = vaddr & ~(0x07);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SDR,8,MTS_READ,&data);   if (likely(haddr != NULL))      data = vmtoh64(*(m_uint64_t *)haddr);   r_shift = ((vaddr & 0x07) + 1) << 3;   d_mask = 0xffffffffffffffffULL >> r_shift;   data &= d_mask;   data |= cpu->gpr[reg] << (64 - r_shift);   haddr = MTS_PROTO(access)(cpu,naddr,MIPS_MEMOP_SDR,8,MTS_WRITE,&data);   if (likely(haddr != NULL)) *(m_uint64_t *)haddr = htovm64(data);}/* LL: Load Linked */fastcall void MTS_PROTO(ll)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t data;   void *haddr;   haddr = MTS_PROTO(access)(cpu,vaddr,MIPS_MEMOP_LL,4,MTS_READ,&data);   if (likely(haddr != NULL)) data = vmtoh32(*(m_uint32_t *)haddr);   cpu->gpr[reg] = sign_extend(data,32);   cpu->ll_bit = 1;}/* SC: Store Conditional */fastcall void MTS_PROTO(sc)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t data;   void *haddr;   if (cpu->ll_bit) {      data = cpu->gpr[reg] & 0xffffffff;      haddr = MTS_PROTO(access)(cpu,vaddr,MIPS_MEMOP_SC,4,MTS_WRITE,&data);      if (likely(haddr != NULL)) *(m_uint32_t *)haddr = htovm32(data);   }   cpu->gpr[reg] = cpu->ll_bit;}/* SDC1: Store Double-Word from Coprocessor 1 */fastcall void MTS_PROTO(sdc1)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int reg){   m_uint64_t data;   void *haddr;   data = cpu->fpu.reg[reg];   haddr = MTS_PROTO(access)(cpu,vaddr,MIPS_MEMOP_SDC1,8,MTS_WRITE,&data);   if (likely(haddr != NULL)) *(m_uint64_t *)haddr = htovm64(data);}/* CACHE: Cache operation */fastcall void MTS_PROTO(cache)(cpu_mips_t *cpu,m_uint64_t vaddr,u_int op){   mips64_jit_tcb_t *block;   m_uint32_t pc_hash;#if DEBUG_CACHE   cpu_log(cpu->gen,           "MTS","CACHE: PC=0x%llx, vaddr=0x%llx, cache=%u, code=%u\n",           cpu->pc, vaddr, op & 0x3, op >> 2);#endif   if (cpu->exec_blk_map) {      pc_hash = mips64_jit_get_pc_hash(vaddr);      block = cpu->exec_blk_map[pc_hash];      if (block && (block->start_pc == (vaddr & MIPS_MIN_PAGE_MASK))) {#if DEBUG_CACHE         cpu_log(cpu->gen,"MTS",                 "CACHE: removing compiled page at 0x%llx, pc=0x%llx\n",                 block->start_pc,cpu->pc);#endif         cpu->exec_blk_map[pc_hash] = NULL;         mips64_jit_tcb_free(cpu,block,TRUE);      }      else      {#if DEBUG_CACHE         cpu_log(cpu->gen,"MTS",                 "CACHE: trying to remove page 0x%llx with pc=0x%llx\n",                 vaddr, cpu->pc);#endif               }   }}/* === MTS Cache Management ============================================= *//* MTS map/unmap/rebuild "API" functions */void MTS_PROTO(api_map)(cpu_mips_t *cpu,m_uint64_t vaddr,m_uint64_t paddr,                        m_uint32_t len,int cache_access,int tlb_index){   /* nothing to do, the cache will be filled on-the-fly */}void MTS_PROTO(api_unmap)(cpu_mips_t *cpu,m_uint64_t vaddr,m_uint32_t len,                          m_uint32_t val,int tlb_index){   /* Invalidate the TLB entry or the full cache if no index is specified */   if (tlb_index != -1)      MTS_PROTO(invalidate_tlb_entry)(cpu,tlb_index);   else      MTS_PROTO(invalidate_cache)(cpu);}void MTS_PROTO(api_rebuild)(cpu_gen_t *cpu){   MTS_PROTO(invalidate_cache)(CPU_MIPS64(cpu));}/* ======================================================================== *//* Initialize memory access vectors */void MTS_PROTO(init_memop_vectors)(cpu_mips_t *cpu){   /* XXX TODO:    *  - LD/SD forbidden in Supervisor/User modes with 32-bit addresses.    */   cpu->addr_mode = MTS_ADDR_SIZE;   /* API vectors */   cpu->mts_map     = MTS_PROTO(api_map);   cpu->mts_unmap   = MTS_PROTO(api_unmap);   /* Memory lookup operation */   cpu->mem_op_lookup = MTS_PROTO(lookup);   /* Translation operation */   cpu->translate = MTS_PROTO(translate);   /* Shutdown operation */   cpu->mts_shutdown = MTS_PROTO(shutdown);   /* Rebuild MTS data structures */   cpu->gen->mts_rebuild = MTS_PROTO(api_rebuild);   /* Show statistics */   cpu->gen->mts_show_stats = MTS_PROTO(show_stats);   /* Load Operations */   cpu->mem_op_fn[MIPS_MEMOP_LB] = MTS_PROTO(lb);   cpu->mem_op_fn[MIPS_MEMOP_LBU] = MTS_PROTO(lbu);   cpu->mem_op_fn[MIPS_MEMOP_LH] = MTS_PROTO(lh);   cpu->mem_op_fn[MIPS_MEMOP_LHU] = MTS_PROTO(lhu);   cpu->mem_op_fn[MIPS_MEMOP_LW] = MTS_PROTO(lw);   cpu->mem_op_fn[MIPS_MEMOP_LWU] = MTS_PROTO(lwu);   cpu->mem_op_fn[MIPS_MEMOP_LD] = MTS_PROTO(ld);   cpu->mem_op_fn[MIPS_MEMOP_LDL] = MTS_PROTO(ldl);   cpu->mem_op_fn[MIPS_MEMOP_LDR] = MTS_PROTO(ldr);   /* Store Operations */   cpu->mem_op_fn[MIPS_MEMOP_SB] = MTS_PROTO(sb);   cpu->mem_op_fn[MIPS_MEMOP_SH] = MTS_PROTO(sh);   cpu->mem_op_fn[MIPS_MEMOP_SW] = MTS_PROTO(sw);   cpu->mem_op_fn[MIPS_MEMOP_SD] = MTS_PROTO(sd);   /* Load Left/Right operations */   cpu->mem_op_fn[MIPS_MEMOP_LWL] = MTS_PROTO(lwl);   cpu->mem_op_fn[MIPS_MEMOP_LWR] = MTS_PROTO(lwr);   cpu->mem_op_fn[MIPS_MEMOP_LDL] = MTS_PROTO(ldl);   cpu->mem_op_fn[MIPS_MEMOP_LDR] = MTS_PROTO(ldr);   /* Store Left/Right operations */   cpu->mem_op_fn[MIPS_MEMOP_SWL] = MTS_PROTO(swl);   cpu->mem_op_fn[MIPS_MEMOP_SWR] = MTS_PROTO(swr);   cpu->mem_op_fn[MIPS_MEMOP_SDL] = MTS_PROTO(sdl);   cpu->mem_op_fn[MIPS_MEMOP_SDR] = MTS_PROTO(sdr);   /* LL/SC - Load Linked / Store Conditional */   cpu->mem_op_fn[MIPS_MEMOP_LL] = MTS_PROTO(ll);   cpu->mem_op_fn[MIPS_MEMOP_SC] = MTS_PROTO(sc);   /* Coprocessor 1 memory access functions */   cpu->mem_op_fn[MIPS_MEMOP_LDC1] = MTS_PROTO(ldc1);   cpu->mem_op_fn[MIPS_MEMOP_SDC1] = MTS_PROTO(sdc1);   /* Cache Operation */   cpu->mem_op_fn[MIPS_MEMOP_CACHE] = MTS_PROTO(cache);}#undef MTS_ADDR_SIZE#undef MTS_NAME#undef MTS_NAME_UP#undef MTS_PROTO#undef MTS_PROTO_UP#undef MTS_ENTRY#undef MTS_CHUNK

⌨️ 快捷键说明

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