void helper_sleep(CPUSH4State *env) { CPUState *cs = CPU(sh_env_get_cpu(env)); cs->halted = 1; env->in_sleep = 1; raise_exception(env, EXCP_HLT, 0); }
static inline void QEMU_NORETURN raise_exception(CPUSH4State *env, int index, uintptr_t retaddr) { CPUState *cs = CPU(sh_env_get_cpu(env)); cs->exception_index = index; cpu_loop_exit_restore(cs, retaddr); }
void sh_intc_toggle_source(struct intc_source *source, int enable_adj, int assert_adj) { int enable_changed = 0; int pending_changed = 0; int old_pending; if ((source->enable_count == source->enable_max) && (enable_adj == -1)) enable_changed = -1; source->enable_count += enable_adj; if (source->enable_count == source->enable_max) enable_changed = 1; source->asserted += assert_adj; old_pending = source->pending; source->pending = source->asserted && (source->enable_count == source->enable_max); if (old_pending != source->pending) pending_changed = 1; if (pending_changed) { CPUState *cpu = CPU(sh_env_get_cpu(first_cpu)); if (source->pending) { source->parent->pending++; if (source->parent->pending == 1) { cpu_interrupt(cpu, CPU_INTERRUPT_HARD); } } else { source->parent->pending--; if (source->parent->pending == 0) { cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD); } } } if (enable_changed || assert_adj || pending_changed) { #ifdef DEBUG_INTC_SOURCES printf("sh_intc: (%d/%d/%d/%d) interrupt source 0x%x %s%s%s\n", source->parent->pending, source->asserted, source->enable_count, source->enable_max, source->vect, source->asserted ? "asserted " : assert_adj ? "deasserted" : "", enable_changed == 1 ? "enabled " : enable_changed == -1 ? "disabled " : "", source->pending ? "pending" : ""); #endif } }
void helper_ldtlb(CPUSH4State *env) { #ifdef CONFIG_USER_ONLY SuperHCPU *cpu = sh_env_get_cpu(env); /* XXXXX */ cpu_abort(CPU(cpu), "Unhandled ldtlb"); #else cpu_load_tlb(env); #endif }