📄 ppc32.c
字号:
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 + -