revision 597:87cbdf62aa35
summary |
tree |
shortlog |
changelog |
graph |
changeset |
raw | bz2 | zip | gz changeset | 597:87cbdf62aa35 |
parent | 596:dfc0c93d882e |
child | 598:8798c3f0bf78 |
author | nkeynes |
date | Tue Jan 22 09:45:21 2008 +0000 (16 years ago) |
Initial VMA support for the SH4 disassembly
src/sh4/mmu.c | view | annotate | diff | log | ||
src/sh4/sh4.c | view | annotate | diff | log | ||
src/sh4/sh4core.h | view | annotate | diff | log | ||
src/sh4/sh4dasm.c | view | annotate | diff | log | ||
src/sh4/sh4dasm.in | view | annotate | diff | log |
1.1 --- a/src/sh4/mmu.c Mon Jan 21 11:59:46 2008 +00001.2 +++ b/src/sh4/mmu.c Tue Jan 22 09:45:21 2008 +00001.3 @@ -849,6 +849,41 @@1.4 }1.5 }1.7 +/**1.8 + * Translate address for disassembly purposes (ie performs an instruction1.9 + * lookup) - does not raise exceptions or modify any state, and ignores1.10 + * protection bits. Returns the translated address, or MMU_VMA_ERROR1.11 + * on translation failure.1.12 + */1.13 +sh4addr_t mmu_vma_to_phys_disasm( sh4vma_t vma )1.14 +{1.15 + if( vma & 0x80000000 ) {1.16 + if( vma < 0xC0000000 ) {1.17 + /* P1, P2 and P4 regions are pass-through (no translation) */1.18 + return VMA_TO_EXT_ADDR(vma);1.19 + } else if( vma >= 0xE0000000 && vma < 0xFFFFFF00 ) {1.20 + /* Not translatable */1.21 + return MMU_VMA_ERROR;1.22 + }1.23 + }1.24 +1.25 + uint32_t mmucr = MMIO_READ(MMU,MMUCR);1.26 + if( (mmucr & MMUCR_AT) == 0 ) {1.27 + return VMA_TO_EXT_ADDR(vma);1.28 + }1.29 +1.30 + int entryNo = mmu_itlb_lookup_vpn( vma );1.31 + if( entryNo == -2 ) {1.32 + entryNo = mmu_itlb_lookup_vpn_asid( vma );1.33 + }1.34 + if( entryNo < 0 ) {1.35 + return MMU_VMA_ERROR;1.36 + } else {1.37 + return (mmu_itlb[entryNo].ppn & mmu_itlb[entryNo].mask) |1.38 + (vma & (~mmu_itlb[entryNo].mask));1.39 + }1.40 +}1.41 +1.42 gboolean sh4_flush_store_queue( sh4addr_t addr )1.43 {1.44 uint32_t mmucr = MMIO_READ(MMU,MMUCR);
2.1 --- a/src/sh4/sh4.c Mon Jan 21 11:59:46 2008 +00002.2 +++ b/src/sh4/sh4.c Tue Jan 22 09:45:21 2008 +00002.3 @@ -358,3 +358,8 @@2.4 xf[10]*fv[2] + xf[14]*fv[3];2.5 }2.7 +gboolean sh4_has_page( sh4vma_t vma )2.8 +{2.9 + sh4addr_t addr = mmu_vma_to_phys_disasm(vma);2.10 + return addr != MMU_VMA_ERROR && mem_has_page(addr);2.11 +}
3.1 --- a/src/sh4/sh4core.h Mon Jan 21 11:59:46 2008 +00003.2 +++ b/src/sh4/sh4core.h Tue Jan 22 09:45:21 2008 +00003.3 @@ -110,6 +110,7 @@3.4 uint32_t sh4_read_sr(void);3.5 void sh4_write_sr(uint32_t val);3.6 void signsat48(void);3.7 +gboolean sh4_has_page( sh4vma_t vma );3.9 /* SH4 Memory */3.10 #define MMU_VMA_ERROR 0x80000003.11 @@ -132,6 +133,7 @@3.12 */3.13 sh4addr_t mmu_vma_to_phys_read( sh4vma_t addr );3.14 sh4addr_t mmu_vma_to_phys_write( sh4vma_t addr );3.15 +sh4addr_t mmu_vma_to_phys_disasm( sh4vma_t addr );3.17 int64_t sh4_read_quad( sh4addr_t addr );3.18 int32_t sh4_read_long( sh4addr_t addr );
4.1 --- a/src/sh4/sh4dasm.c Mon Jan 21 11:59:46 2008 +00004.2 +++ b/src/sh4/sh4dasm.c Tue Jan 22 09:45:21 2008 +00004.3 @@ -43,14 +43,15 @@4.6 const struct cpu_desc_struct sh4_cpu_desc =4.7 - { "SH4", sh4_disasm_instruction, sh4_execute_instruction, mem_has_page,4.8 + { "SH4", sh4_disasm_instruction, sh4_execute_instruction, sh4_has_page,4.9 sh4_set_breakpoint, sh4_clear_breakpoint, sh4_get_breakpoint, 2,4.10 (char *)&sh4r, sizeof(sh4r), sh4_reg_map,4.11 &sh4r.pc };4.13 -uint32_t sh4_disasm_instruction( uint32_t pc, char *buf, int len, char *opcode )4.14 +uint32_t sh4_disasm_instruction( sh4vma_t pc, char *buf, int len, char *opcode )4.15 {4.16 - uint16_t ir = sh4_read_word(pc);4.17 + sh4addr_t addr = mmu_vma_to_phys_disasm(pc);4.18 + uint16_t ir = sh4_read_word(addr);4.20 #define UNDEF(ir) snprintf( buf, len, "???? " );4.21 #define RN(ir) ((ir&0x0F00)>>8)4.22 @@ -1199,7 +1200,7 @@4.23 case 0x9:4.24 { /* MOV.W @(disp, PC), Rn */4.25 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<1;4.26 - snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+pc+4) );4.27 + snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+addr+4) );4.28 }4.29 break;4.30 case 0xA:4.31 @@ -1317,7 +1318,7 @@4.32 case 0xD:4.33 { /* MOV.L @(disp, PC), Rn */4.34 uint32_t Rn = ((ir>>8)&0xF); uint32_t disp = (ir&0xFF)<<2;4.35 - snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(pc&0xFFFFFFFC)+4) );4.36 + snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(addr&0xFFFFFFFC)+4) );4.37 }4.38 break;4.39 case 0xE:
5.1 --- a/src/sh4/sh4dasm.in Mon Jan 21 11:59:46 2008 +00005.2 +++ b/src/sh4/sh4dasm.in Tue Jan 22 09:45:21 2008 +00005.3 @@ -43,14 +43,15 @@5.6 const struct cpu_desc_struct sh4_cpu_desc =5.7 - { "SH4", sh4_disasm_instruction, sh4_execute_instruction, mem_has_page,5.8 + { "SH4", sh4_disasm_instruction, sh4_execute_instruction, sh4_has_page,5.9 sh4_set_breakpoint, sh4_clear_breakpoint, sh4_get_breakpoint, 2,5.10 (char *)&sh4r, sizeof(sh4r), sh4_reg_map,5.11 &sh4r.pc };5.13 -uint32_t sh4_disasm_instruction( uint32_t pc, char *buf, int len, char *opcode )5.14 +uint32_t sh4_disasm_instruction( sh4vma_t pc, char *buf, int len, char *opcode )5.15 {5.16 - uint16_t ir = sh4_read_word(pc);5.17 + sh4addr_t addr = mmu_vma_to_phys_disasm(pc);5.18 + uint16_t ir = sh4_read_word(addr);5.20 #define UNDEF(ir) snprintf( buf, len, "???? " );5.21 #define RN(ir) ((ir&0x0F00)>>8)5.22 @@ -188,7 +189,7 @@5.23 MOV.L @Rm+, Rn {: snprintf( buf, len, "MOV.L @R%d+, R%d", Rm, Rn ); :}5.24 MOV.L @(R0, Rm), Rn {: snprintf( buf, len, "MOV.L @(R0, R%d), R%d", Rm, Rn ); :}5.25 MOV.L @(disp, GBR), R0 {: snprintf( buf, len, "MOV.L @(%d, GBR), R0",disp ); :}5.26 -MOV.L @(disp, PC), Rn {: snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(pc&0xFFFFFFFC)+4) ); :}5.27 +MOV.L @(disp, PC), Rn {: snprintf( buf, len, "MOV.L @($%xh), R%d ; <- #%08x", disp + (pc & 0xFFFFFFFC) + 4, Rn, sh4_read_long(disp+(addr&0xFFFFFFFC)+4) ); :}5.28 MOV.L @(disp, Rm), Rn {: snprintf( buf, len, "MOV.L @(%d, R%d), R%d", disp, Rm, Rn ); :}5.29 MOV.W Rm, @Rn {: snprintf( buf, len, "MOV.W R%d, @R%d", Rm, Rn ); :}5.30 MOV.W Rm, @-Rn {: snprintf( buf, len, "MOV.W R%d, @-R%d", Rm, Rn ); :}5.31 @@ -199,7 +200,7 @@5.32 MOV.W @Rm+, Rn {: snprintf( buf, len, "MOV.W @R%d+, R%d", Rm, Rn ); :}5.33 MOV.W @(R0, Rm), Rn {: snprintf( buf, len, "MOV.W @(R0, R%d), R%d", Rm, Rn ); :}5.34 MOV.W @(disp, GBR), R0 {: snprintf( buf, len, "MOV.W @(%d, GBR), R0", disp ); :}5.35 -MOV.W @(disp, PC), Rn {: snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+pc+4) ); :}5.36 +MOV.W @(disp, PC), Rn {: snprintf( buf, len, "MOV.W @($%xh), R%d ; <- #%08x", disp + pc + 4, Rn, sh4_read_word(disp+addr+4) ); :}5.37 MOV.W @(disp, Rm), R0 {: snprintf( buf, len, "MOV.W @(%d, R%d), R0", disp, Rm ); :}5.38 MOVA @(disp, PC), R0 {: snprintf( buf, len, "MOVA @($%xh), R0", disp + (pc&0xFFFFFFFC) + 4 ); :}5.39 MOVCA.L R0, @Rn {: snprintf( buf, len, "MOVCA.L R0, @R%d", Rn ); :}
.