int ppc_read_effective_byte(uint32 addr, uint8 *result) { e500_core_t * current_core = get_current_core(); PPC_CPU_State* cpu = get_current_cpu(); uint32 p; int r; if (!(r = ppc_effective_to_physical(current_core, addr, PPC_MMU_READ, &p))) { //ppc_io_read_byte (¤t_core-> p); //printf("\nDBG:in %s,addr=0x%x,p=0x%x\n", __FUNCTION__, addr,p); //printf("DBG:ccsr=0x%x,CCSR_BASE=0x%x\n",current_core->ccsr.ccsr,GET_CCSR_BASE(current_core->ccsr.ccsr)); if(in_ccsr_range(p)){ int offset = p - current_core->get_ccsr_base(cpu->ccsr); skyeye_config_t* config = get_current_config(); *result = config->mach->mach_io_read_byte(cpu, offset); //*result = skyeye_config.mach->mach_io_read_byte(&gCPU, offset); //printf("In %s, offset=0x%x, *result=0x%x\n", __FUNCTION__, offset, *result); return r; } else{ if(bus_read(8, p, result) != 0){ } //fprintf(stderr,"in %s, can not find address 0x%x,pc=0x%x\n", __FUNCTION__, p, current_core->pc); //skyeye_exit(-1); } } return r; }
int FASTCALL ppc_write_effective_byte(uint32 addr, uint8 data) { uint32 p; int r; e500_core_t* current_core = get_current_core(); PPC_CPU_State* cpu = get_current_cpu(); if (!((r=ppc_effective_to_physical(current_core, addr, PPC_MMU_WRITE, &p)))) { //ppc_io_write_byte (¤t_core-> p, data); //printf("DBG:in %s,addr=0x%x,p=0x%x, data=0x%x, pc=0x%x\n", __FUNCTION__, addr,p, data, current_core->pc); //printf("DBG:ccsr=0x%x,CCSR_BASE=0x%x",current_core->ccsr.ccsr,GET_CCSR_BASE(current_core->ccsr.ccsr)); if(in_ccsr_range(p)){ int offset = p - current_core->get_ccsr_base(cpu->ccsr); //skyeye_config.mach->mach_io_write_byte(&gCPU, offset, data); skyeye_config_t* config = get_current_config(); config->mach->mach_io_write_byte(cpu, offset, data); return r; //printf("DBG:write to CCSR,value=0x%x,offset=0x%x\n", data, offset); } else{ bus_write(8, p, data); //fprintf(stderr,"in %s, can not find address 0x%x,pc=0x%x,ccsr=0x%x\n", __FUNCTION__, p, current_core->pc, gCPU.ccsr); //skyeye_exit(-1); } } return r; }
int FASTCALL ppc_write_effective_word(uint32 addr, uint32 data) { PPC_CPU_State* cpu = get_current_cpu(); e500_core_t * current_core = get_current_core(); uint32 p; int r; if(addr & 0x3){ //ppc_exception for unalign } if (!((r=ppc_effective_to_physical(current_core, addr, PPC_MMU_WRITE, &p)))) { if(in_ccsr_range(p)){ int offset = p - current_core->get_ccsr_base(cpu->ccsr); //skyeye_config.mach->mach_io_write_word(&gCPU, offset, data); skyeye_config_t* config = get_current_config(); config->mach->mach_io_write_word(cpu, offset, data); //printf("DBG:write to CCSR,value=0x%x,offset=0x%x,pc=0x%x\n", data, offset,current_core->pc); } else{ bus_write(32, p, data); //fprintf(stderr,"in %s, can not find address 0x%x,pc=0x%x,ccsr_base=0x%x, ccsr=0x%x\n", __FUNCTION__, p, current_core->pc, GET_CCSR_BASE(gCPU.ccsr), gCPU.ccsr); //skyeye_exit(-1); } } return r; }
static void per_cpu_step(e500_core_t * running_core){ uint32 real_addr; e500_core_t *core = running_core; /* sometimes, core->npc will changed by another core */ if(core->ipi_flag){ core->pc = core->npc; core->ipi_flag = 0; } core->step++; core->npc = core->pc + 4; switch( ppc_effective_to_physical(core, core->pc, PPC_MMU_CODE, &real_addr)) { case PPC_MMU_OK: break; /* we had TLB miss and need to jump to its handler */ case PPC_MMU_EXC: goto exec_npc; case PPC_MMU_FATAL: /* TLB miss */ fprintf(stderr, "TLB missed at 0x%x\n", core->pc); skyeye_exit(-1); default: /* TLB miss */ fprintf(stderr, "Something wrong during address translation at 0x%x\n", core->pc); skyeye_exit(-1); }; uint32 instr; if(bus_read(32, real_addr, &instr) != 0){ /* some error handler */ } //core->current_opc = ppc_word_from_BE(instr); core->current_opc = instr; ppc_exec_opc(core); //debug_log(core); exec_npc: if(!ppc_divisor){ core->dec_io_do_cycle(core); ppc_divisor = 0; } else ppc_divisor--; //core->pc = core->npc; core->pc = gCPU.core[core->pir].npc; core->pc = core->npc; }
int FASTCALL ppc_read_effective_word(uint32 addr, uint32 *result) { e500_core_t* current_core = get_current_core(); PPC_CPU_State* cpu = get_current_cpu(); uint32 p; int r; if (!(r = ppc_effective_to_physical(current_core, addr, PPC_MMU_READ, &p))) { if(in_ccsr_range(p)){ skyeye_config_t *config = get_current_config(); *result = config->mach->mach_io_read_word(cpu, (p - current_core->get_ccsr_base(cpu->ccsr))); } else{ if(bus_read(32, p, result) != 0){ } } } return r; }
int FASTCALL ppc_read_effective_half(uint32 addr, uint16 *result) { e500_core_t * current_core = get_current_core(); PPC_CPU_State* cpu = get_current_cpu(); uint32 p; int r; if (!(r = ppc_effective_to_physical(current_core, addr, PPC_MMU_READ, &p))) { //ppc_io_read_halfword(¤t_core-> p); //printf("DBG:ccsr=0x%x,CCSR_BASE=0x%x\n",current_core->ccsr.ccsr,GET_CCSR_BASE(current_core->ccsr.ccsr)); if(in_ccsr_range(p)){ //*result = skyeye_config.mach->mach_io_read_halfword(&gCPU, (p - GET_CCSR_BASE(gCPU.ccsr))); skyeye_config_t* config = get_current_config(); *result = config->mach->mach_io_read_halfword(cpu, (p - current_core->get_ccsr_base(cpu->ccsr))); } else{ if(bus_read(16, p, result) != 0){ } //fprintf(stderr,"in %s, can not find address 0x%x,pc=0x%x\n", __FUNCTION__, p, current_core->pc); //skyeye_exit(-1); } } return r; }