diff options
Diffstat (limited to 'sim/ppc/cpu.c')
-rw-r--r-- | sim/ppc/cpu.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/sim/ppc/cpu.c b/sim/ppc/cpu.c index 46ac19b..599a5d1 100644 --- a/sim/ppc/cpu.c +++ b/sim/ppc/cpu.c @@ -206,8 +206,16 @@ cpu_halt(cpu *processor, stop_reason reason, int signal) { - processor->program_counter = cia; - psim_halt(processor->system, processor->cpu_nr, cia, reason, signal); + if (processor == NULL) { + error("cpu_halt() processor=NULL, cia=0x%x, reason=%d, signal=%d\n", + cia, + reason, + signal); + } + else { + processor->program_counter = cia; + psim_halt(processor->system, processor->cpu_nr, cia, reason, signal); + } } @@ -235,12 +243,6 @@ cpu_data_map(cpu *processor) return processor->data_map; } -INLINE_CPU core * -cpu_core(cpu *processor) -{ - return processor->physical; -} - /* reservation access */ @@ -268,6 +270,14 @@ cpu_synchronize_context(cpu *processor) for (i = 0; i < IDECODE_CACHE_SIZE; i++) processor->icache[i].address = MASK(0,63); #endif + + /* don't allow the processor to change endian modes */ + if ((cpu_registers(processor)->msr & msr_little_endian_mode) + && CURRENT_TARGET_BYTE_ORDER != LITTLE_ENDIAN) { + error("vm_synchronize_context() - unsuported change of byte order\n"); + } + + /* update virtual memory */ vm_synchronize_context(processor->virtual, processor->regs.spr, processor->regs.sr, @@ -289,12 +299,33 @@ cpu_get_number_of_insns(cpu *processor) return processor->number_of_insns; } +static INLINE_CPU char * +cpu_add_commas(char *endbuf, long value) +{ + int comma = 3; + + *--endbuf = '\0'; + do { + if (comma-- == 0) + { + *--endbuf = ','; + comma = 2; + } + + *--endbuf = (value % 10) + '0'; + } while ((value /= 10) != 0); + + return endbuf; +} + INLINE_CPU void cpu_print_info(cpu *processor, int verbose) { - printf_filtered("CPU #%d executed %ld instructions.\n", + char buffer[20]; + + printf_filtered("CPU #%d executed %s instructions.\n", processor->cpu_nr+1, - processor->number_of_insns); + cpu_add_commas(buffer + sizeof(buffer), processor->number_of_insns)); } #endif /* _CPU_C_ */ |