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

📄 ppc32.c

📁 思科路由器仿真器,用来仿7200系列得,可以在电脑上模拟路由器
💻 C
📖 第 1 页 / 共 2 页
字号:
      cpu->irq_pending = FALSE;      cpu->irq_check = FALSE;      return;   }   /* Clear the IRQ check flag */   cpu->irq_check = FALSE;   if (cpu->irq_pending && (cpu->msr & PPC32_MSR_EE)) {      cpu->irq_count++;      cpu->irq_pending = FALSE;      ppc32_trigger_exception(cpu,PPC32_EXC_EXT);   }}/* Trigger the decrementer exception */void ppc32_trigger_timer_irq(cpu_ppc_t *cpu){   cpu->timer_irq_count++;   if (cpu->msr & PPC32_MSR_EE)      ppc32_trigger_exception(cpu,PPC32_EXC_DEC);}/* Virtual breakpoint */fastcall void ppc32_run_breakpoint(cpu_ppc_t *cpu){   cpu_log(cpu->gen,"BREAKPOINT",           "Virtual breakpoint reached at IA=0x%8.8x\n",cpu->ia);   printf("[[[ Virtual Breakpoint reached at IA=0x%8.8x LR=0x%8.8x]]]\n",          cpu->ia,cpu->lr);   ppc32_dump_regs(cpu->gen);}/* Add a virtual breakpoint */int ppc32_add_breakpoint(cpu_gen_t *cpu,m_uint64_t ia){   cpu_ppc_t *pcpu = CPU_PPC32(cpu);   int i;   for(i=0;i<PPC32_MAX_BREAKPOINTS;i++)      if (!pcpu->breakpoints[i])         break;   if (i == PPC32_MAX_BREAKPOINTS)      return(-1);   pcpu->breakpoints[i] = ia;   pcpu->breakpoints_enabled = TRUE;   return(0);}/* Remove a virtual breakpoint */void ppc32_remove_breakpoint(cpu_gen_t *cpu,m_uint64_t ia){      cpu_ppc_t *pcpu = CPU_PPC32(cpu);   int i,j;   for(i=0;i<PPC32_MAX_BREAKPOINTS;i++)      if (pcpu->breakpoints[i] == ia)      {         for(j=i;j<PPC32_MAX_BREAKPOINTS-1;j++)            pcpu->breakpoints[j] = pcpu->breakpoints[j+1];         pcpu->breakpoints[PPC32_MAX_BREAKPOINTS-1] = 0;      }   for(i=0;i<PPC32_MAX_BREAKPOINTS;i++)      if (pcpu->breakpoints[i] != 0)         return;   pcpu->breakpoints_enabled = FALSE;}/* Set a register */void ppc32_reg_set(cpu_gen_t *cpu,u_int reg,m_uint64_t val){   if (reg < PPC32_GPR_NR)      CPU_PPC32(cpu)->gpr[reg] = (m_uint32_t)val;}/* Dump registers of a PowerPC processor */void ppc32_dump_regs(cpu_gen_t *cpu){    cpu_ppc_t *pcpu = CPU_PPC32(cpu);   int i;      printf("PowerPC Registers:\n");   for(i=0;i<PPC32_GPR_NR/4;i++) {      printf("  $%2d = 0x%8.8x  $%2d = 0x%8.8x"             "  $%2d = 0x%8.8x  $%2d = 0x%8.8x\n",             i*4, pcpu->gpr[i*4], (i*4)+1, pcpu->gpr[(i*4)+1],             (i*4)+2, pcpu->gpr[(i*4)+2], (i*4)+3, pcpu->gpr[(i*4)+3]);   }   printf("\n");   printf("  ia = 0x%8.8x, lr = 0x%8.8x\n", pcpu->ia, pcpu->lr);   printf("  cr = 0x%8.8x, msr = 0x%8.8x, xer = 0x%8.8x, dec = 0x%8.8x\n",           ppc32_get_cr(pcpu), pcpu->msr,           pcpu->xer | (pcpu->xer_ca << PPC32_XER_CA_BIT),           pcpu->dec);   printf("  sprg[0] = 0x%8.8x, sprg[1] = 0x%8.8x\n",          pcpu->sprg[0],pcpu->sprg[1]);   printf("  sprg[2] = 0x%8.8x, sprg[3] = 0x%8.8x\n",          pcpu->sprg[2],pcpu->sprg[3]);   printf("\n  IRQ count: %llu, IRQ false positives: %llu, "          "IRQ Pending: %u, IRQ Check: %s\n",          pcpu->irq_count,pcpu->irq_fp_count,pcpu->irq_pending,          pcpu->irq_check ? "yes" : "no");   printf("  Timer IRQ count: %llu, pending: %u, timer drift: %u\n\n",          pcpu->timer_irq_count,pcpu->timer_irq_pending,pcpu->timer_drift);   printf("  Device access count: %llu\n",cpu->dev_access_counter);   printf("\n");}/* Dump BAT registers */static void ppc32_dump_bat(cpu_ppc_t *cpu,int index){   int i;   for(i=0;i<PPC32_BAT_NR;i++)      printf("    BAT[%d] = 0x%8.8x 0x%8.8x\n",             i,cpu->bat[index][i].reg[0],cpu->bat[index][i].reg[1]);}/* Dump MMU registers */void ppc32_dump_mmu(cpu_gen_t *cpu){   cpu_ppc_t *pcpu = CPU_PPC32(cpu);   int i;   printf("PowerPC MMU Registers:\n");   printf(" - IBAT Registers:\n");   ppc32_dump_bat(pcpu,PPC32_IBAT_IDX);   printf(" - DBAT Registers:\n");   ppc32_dump_bat(pcpu,PPC32_DBAT_IDX);   printf(" - Segment Registers:\n");   for(i=0;i<PPC32_SR_NR;i++)      printf("    SR[%d] = 0x%8.8x\n",i,pcpu->sr[i]);   printf(" - SDR1: 0x%8.8x\n",pcpu->sdr1);}/* Load a raw image into the simulated memory */int ppc32_load_raw_image(cpu_ppc_t *cpu,char *filename,m_uint32_t vaddr){      struct stat file_info;   size_t len,clen;   m_uint32_t remain;   void *haddr;   FILE *bfd;   if (!(bfd = fopen(filename,"r"))) {      perror("fopen");      return(-1);   }   if (fstat(fileno(bfd),&file_info) == -1) {      perror("stat");      return(-1);   }   len = file_info.st_size;   printf("Loading RAW file '%s' at virtual address 0x%8.8x (size=%lu)\n",          filename,vaddr,(u_long)len);   while(len > 0)   {      haddr = cpu->mem_op_lookup(cpu,vaddr,PPC32_MTS_DCACHE);         if (!haddr) {         fprintf(stderr,"load_raw_image: invalid load address 0x%8.8x\n",                 vaddr);         return(-1);      }      if (len > PPC32_MIN_PAGE_SIZE)         clen = PPC32_MIN_PAGE_SIZE;      else         clen = len;      remain = MIPS_MIN_PAGE_SIZE;      remain -= (vaddr - (vaddr & MIPS_MIN_PAGE_MASK));            clen = m_min(clen,remain);      if (fread((u_char *)haddr,clen,1,bfd) != 1)         break;            vaddr += clen;      len -= clen;   }      fclose(bfd);   return(0);}/* Load an ELF image into the simulated memory */int ppc32_load_elf_image(cpu_ppc_t *cpu,char *filename,int skip_load,                         m_uint32_t *entry_point){   m_uint32_t vaddr,remain;   void *haddr;   Elf32_Ehdr *ehdr;   Elf32_Shdr *shdr;   Elf_Scn *scn;   Elf *img_elf;   size_t len,clen;   char *name;   int i,fd;   FILE *bfd;   if (!filename)      return(-1);#ifdef __CYGWIN__   fd = open(filename,O_RDONLY|O_BINARY);#else   fd = open(filename,O_RDONLY);#endif   if (fd == -1) {      perror("load_elf_image: open");      return(-1);   }   if (elf_version(EV_CURRENT) == EV_NONE) {      fprintf(stderr,"load_elf_image: library out of date\n");      return(-1);   }   if (!(img_elf = elf_begin(fd,ELF_C_READ,NULL))) {      fprintf(stderr,"load_elf_image: elf_begin: %s\n",              elf_errmsg(elf_errno()));      return(-1);   }   if (!(ehdr = elf32_getehdr(img_elf))) {      fprintf(stderr,"load_elf_image: invalid ELF file\n");      return(-1);   }   printf("Loading ELF file '%s'...\n",filename);   bfd = fdopen(fd,"rb");   if (!bfd) {      perror("load_elf_image: fdopen");      return(-1);   }   if (!skip_load) {      for(i=0;i<ehdr->e_shnum;i++) {         scn = elf_getscn(img_elf,i);         shdr = elf32_getshdr(scn);         name = elf_strptr(img_elf, ehdr->e_shstrndx, (size_t)shdr->sh_name);         len  = shdr->sh_size;         if (!(shdr->sh_flags & SHF_ALLOC) || !len)            continue;         fseek(bfd,shdr->sh_offset,SEEK_SET);         vaddr = shdr->sh_addr;         if (cpu->vm->debug_level > 0) {            printf("   * Adding section at virtual address 0x%8.8x "                   "(len=0x%8.8lx)\n",vaddr,(u_long)len);         }                  while(len > 0)         {            haddr = cpu->mem_op_lookup(cpu,vaddr,PPC32_MTS_DCACHE);            if (!haddr) {               fprintf(stderr,"load_elf_image: invalid load address 0x%x\n",                       vaddr);               return(-1);            }            if (len > PPC32_MIN_PAGE_SIZE)               clen = PPC32_MIN_PAGE_SIZE;            else               clen = len;            remain = PPC32_MIN_PAGE_SIZE;            remain -= (vaddr - (vaddr & PPC32_MIN_PAGE_MASK));            clen = m_min(clen,remain);            if (fread((u_char *)haddr,clen,1,bfd) < 1)               break;            vaddr += clen;            len -= clen;         }      }   } else {      printf("ELF loading skipped, using a ghost RAM file.\n");   }   printf("ELF entry point: 0x%x\n",ehdr->e_entry);   if (entry_point)      *entry_point = ehdr->e_entry;   elf_end(img_elf);   fclose(bfd);   return(0);}

⌨️ 快捷键说明

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