/* Update the next timeout time as difference between ttmr and ttcr */ void cpu_openrisc_timer_update(OpenRISCCPU *cpu) { uint32_t wait; uint64_t now, next; if (!cpu->env.is_counting) { return; } cpu_openrisc_count_update(cpu); now = or1k_timer->last_clk; if ((cpu->env.ttmr & TTMR_TP) <= (or1k_timer->ttcr & TTMR_TP)) { wait = TTMR_TP - (or1k_timer->ttcr & TTMR_TP) + 1; wait += cpu->env.ttmr & TTMR_TP; } else { wait = (cpu->env.ttmr & TTMR_TP) - (or1k_timer->ttcr & TTMR_TP); } next = now + (uint64_t)wait * TIMER_PERIOD; timer_mod(cpu->env.timer, next); }
void cpu_openrisc_count_stop(OpenRISCCPU *cpu) { is_counting = 0; cpu_openrisc_count_update(cpu); }
void cpu_openrisc_count_start(OpenRISCCPU *cpu) { is_counting = 1; cpu_openrisc_count_update(cpu); }
void cpu_openrisc_count_stop(OpenRISCCPU *cpu) { timer_del(cpu->env.timer); cpu_openrisc_count_update(cpu); cpu->env.is_counting = 0; }