25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: cpu_sh.c,v 1.6 2005/09/04 14:38:17 debug Exp $ |
* $Id: cpu_sh.c,v 1.9 2006/02/17 18:38:30 debug Exp $ |
29 |
* |
* |
30 |
* Hitachi SuperH ("SH") CPU emulation. |
* Hitachi SuperH ("SH") CPU emulation. |
31 |
* |
* |
72 |
|
|
73 |
if (cpu->is_32bit) { |
if (cpu->is_32bit) { |
74 |
cpu->update_translation_table = sh32_update_translation_table; |
cpu->update_translation_table = sh32_update_translation_table; |
75 |
cpu->invalidate_translation_caches_paddr = |
cpu->invalidate_translation_caches = |
76 |
sh32_invalidate_translation_caches_paddr; |
sh32_invalidate_translation_caches; |
77 |
cpu->invalidate_code_translation = |
cpu->invalidate_code_translation = |
78 |
sh32_invalidate_code_translation; |
sh32_invalidate_code_translation; |
79 |
} else { |
} else { |
80 |
cpu->update_translation_table = sh_update_translation_table; |
cpu->update_translation_table = sh_update_translation_table; |
81 |
cpu->invalidate_translation_caches_paddr = |
cpu->invalidate_translation_caches = |
82 |
sh_invalidate_translation_caches_paddr; |
sh_invalidate_translation_caches; |
83 |
cpu->invalidate_code_translation = |
cpu->invalidate_code_translation = |
84 |
sh_invalidate_code_translation; |
sh_invalidate_code_translation; |
85 |
} |
} |
126 |
void sh_cpu_register_dump(struct cpu *cpu, int gprs, int coprocs) |
void sh_cpu_register_dump(struct cpu *cpu, int gprs, int coprocs) |
127 |
{ |
{ |
128 |
char *symbol; |
char *symbol; |
129 |
uint64_t offset, tmp; |
uint64_t offset; |
130 |
int i, x = cpu->cpu_id, nregs = cpu->cd.sh.compact? 16 : 64; |
int i, x = cpu->cpu_id, nregs = cpu->cd.sh.compact? 16 : 64; |
131 |
int bits32 = cpu->cd.sh.bits == 32; |
int bits32 = cpu->cd.sh.bits == 32; |
132 |
|
|
192 |
|
|
193 |
|
|
194 |
/* |
/* |
|
* sh_cpu_show_full_statistics(): |
|
|
* |
|
|
* Show detailed statistics on opcode usage on each cpu. |
|
|
*/ |
|
|
void sh_cpu_show_full_statistics(struct machine *m) |
|
|
{ |
|
|
fatal("sh_cpu_show_full_statistics(): TODO\n"); |
|
|
} |
|
|
|
|
|
|
|
|
/* |
|
|
* sh_cpu_tlbdump(): |
|
|
* |
|
|
* Called from the debugger to dump the TLB in a readable format. |
|
|
* x is the cpu number to dump, or -1 to dump all CPUs. |
|
|
* |
|
|
* If rawflag is nonzero, then the TLB contents isn't formated nicely, |
|
|
* just dumped. |
|
|
*/ |
|
|
void sh_cpu_tlbdump(struct machine *m, int x, int rawflag) |
|
|
{ |
|
|
fatal("sh_cpu_tlbdump(): TODO\n"); |
|
|
} |
|
|
|
|
|
|
|
|
/* |
|
195 |
* sh_cpu_interrupt(): |
* sh_cpu_interrupt(): |
196 |
*/ |
*/ |
197 |
int sh_cpu_interrupt(struct cpu *cpu, uint64_t irq_nr) |
int sh_cpu_interrupt(struct cpu *cpu, uint64_t irq_nr) |
221 |
int sh_cpu_disassemble_instr_compact(struct cpu *cpu, unsigned char *instr, |
int sh_cpu_disassemble_instr_compact(struct cpu *cpu, unsigned char *instr, |
222 |
int running, uint64_t dumpaddr, int bintrans) |
int running, uint64_t dumpaddr, int bintrans) |
223 |
{ |
{ |
224 |
uint64_t offset, addr; |
uint64_t addr; |
225 |
uint16_t iword; |
uint16_t iword; |
226 |
int hi4, lo4, lo8, r8, r4; |
int hi4, lo4, lo8, r8, r4; |
|
char *symbol, *mnem = "ERROR"; |
|
227 |
|
|
228 |
if (cpu->byte_order == EMUL_BIG_ENDIAN) |
if (cpu->byte_order == EMUL_BIG_ENDIAN) |
229 |
iword = (instr[0] << 8) + instr[1]; |
iword = (instr[0] << 8) + instr[1]; |
544 |
int sh_cpu_disassemble_instr(struct cpu *cpu, unsigned char *instr, |
int sh_cpu_disassemble_instr(struct cpu *cpu, unsigned char *instr, |
545 |
int running, uint64_t dumpaddr, int bintrans) |
int running, uint64_t dumpaddr, int bintrans) |
546 |
{ |
{ |
547 |
uint64_t offset, addr; |
uint64_t offset; |
548 |
uint32_t iword; |
uint32_t iword; |
549 |
int hi6; |
char *symbol; |
|
char *symbol, *mnem = "ERROR"; |
|
550 |
|
|
551 |
if (running) |
if (running) |
552 |
dumpaddr = cpu->pc; |
dumpaddr = cpu->pc; |