static void engine_run_n (SIM_DESC sd, int next_cpu_nr, int nr_cpus, int max_insns, int fast_p) { int i; ENGINE_FN *engine_fns[MAX_NR_PROCESSORS]; for (i = 0; i < nr_cpus; ++i) { SIM_CPU *cpu = STATE_CPU (sd, i); engine_fns[i] = fast_p ? CPU_FAST_ENGINE_FN (cpu) : CPU_FULL_ENGINE_FN (cpu); prime_cpu (cpu, max_insns); } while (1) { SIM_ENGINE_PREFIX_HOOK (sd); /* FIXME: proper cycling of all of them, blah blah blah. */ while (next_cpu_nr != nr_cpus) { SIM_CPU *cpu = STATE_CPU (sd, next_cpu_nr); (* engine_fns[next_cpu_nr]) (cpu); ++next_cpu_nr; } SIM_ENGINE_POSTFIX_HOOK (sd); /* process any events */ if (sim_events_tick (sd)) sim_events_process (sd); } }
void sim_engine_run (SIM_DESC sd, int next_cpu_nr, int nr_cpus, int signal) { micromips_m32_instruction_word instruction_0; sim_cpu *cpu = STATE_CPU (sd, next_cpu_nr); micromips32_instruction_address cia = CPU_PC_GET (cpu); sd->isa_mode = ISA_MODE_MIPS32; while (1) { micromips32_instruction_address nia; /* Allow us to switch back from MIPS32 to microMIPS This covers two cases: 1. Setting the correct isa mode based on the start address from the elf header. 2. Setting the correct isa mode after a MIPS32 jump or branch instruction. */ if ((sd->isa_mode == ISA_MODE_MIPS32) && ((cia & 0x1) == ISA_MODE_MICROMIPS)) { sd->isa_mode = ISA_MODE_MICROMIPS; cia = cia & ~0x1; } #if defined (ENGINE_ISSUE_PREFIX_HOOK) ENGINE_ISSUE_PREFIX_HOOK (); #endif switch (sd->isa_mode) { case ISA_MODE_MICROMIPS: nia = micromips_instruction_decode (sd, cpu, cia, MICROMIPS_DELAYSLOT_SIZE_ANY); break; case ISA_MODE_MIPS32: instruction_0 = IMEM32 (cia); nia = micromips_m32_idecode_issue (sd, instruction_0, cia); break; default: nia = NULL_CIA; } #if defined (ENGINE_ISSUE_POSTFIX_HOOK) ENGINE_ISSUE_POSTFIX_HOOK (); #endif /* Update the instruction address */ cia = nia; /* process any events */ if (sim_events_tick (sd)) { CPU_PC_SET (cpu, cia); sim_events_process (sd); cia = CPU_PC_GET (cpu); } } }
void sim_engine_run (SIM_DESC sd, int next_cpu_nr, int nr_cpus, /* ignore */ int siggnal) /* ignore */ { sim_cpu *cpu = STATE_CPU (sd, next_cpu_nr); address_word cia = CPU_PC_GET (cpu); while (1) { address_word nia; #if defined (ENGINE_ISSUE_PREFIX_HOOK) ENGINE_ISSUE_PREFIX_HOOK (); #endif if ((cia & 1)) { m16_instruction_word instruction_0 = IMEM16 (cia); nia = m16_idecode_issue (sd, instruction_0, cia); } else { m32_instruction_word instruction_0 = IMEM32 (cia); nia = m32_idecode_issue (sd, instruction_0, cia); } #if defined (ENGINE_ISSUE_POSTFIX_HOOK) ENGINE_ISSUE_POSTFIX_HOOK (); #endif /* Update the instruction address */ cia = nia; /* process any events */ if (sim_events_tick (sd)) { CPU_PC_SET (CPU, cia); sim_events_process (sd); cia = CPU_PC_GET (CPU); } } }
static void engine_run_1 (SIM_DESC sd, int max_insns, int fast_p) { sim_cpu *cpu = STATE_CPU (sd, 0); ENGINE_FN *fn = fast_p ? CPU_FAST_ENGINE_FN (cpu) : CPU_FULL_ENGINE_FN (cpu); prime_cpu (cpu, max_insns); while (1) { SIM_ENGINE_PREFIX_HOOK (sd); (*fn) (cpu); SIM_ENGINE_POSTFIX_HOOK (sd); /* process any events */ if (sim_events_tick (sd)) sim_events_process (sd); } }
void sim_engine_run (SIM_DESC sd, int next_cpu_nr, /* ignore */ int nr_cpus, /* ignore */ int siggnal) /* ignore */ { bu32 ticks; SIM_CPU *cpu; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); cpu = STATE_CPU (sd, 0); while (1) { step_once (cpu); /* Process any events -- can't use tickn because it may advance right over the next event. */ for (ticks = 0; ticks < CYCLE_DELAY; ++ticks) if (sim_events_tick (sd)) sim_events_process (sd); } }
void sim_engine_run (SIM_DESC sd, int next_cpu_nr, /* ignore */ int nr_cpus, /* ignore */ int siggnal) /* ignore */ { sim_cia cia; sim_cpu *cpu; SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); cpu = STATE_CPU (sd, 0); cia = CIA_GET (cpu); while (1) { instruction_word insn = IMEM32 (cia); cia = idecode_issue (sd, insn, cia); /* process any events */ if (sim_events_tick (sd)) { CIA_SET (cpu, cia); sim_events_process (sd); } } }
int main (int argc, char **argv) { host_callback *cb = ZALLOC (host_callback); struct sim_state *sd = sim_state_alloc (0, cb); struct hw *me = ZALLOC (struct hw); sim_pre_argv_init (sd, "test-hw-events"); sim_post_argv_init (sd); me->system_of_hw = sd; printf ("Create hw-event-data\n"); { create_hw_alloc_data (me); create_hw_event_data (me); delete_hw_event_data (me); delete_hw_alloc_data (me); } printf ("Create hw-events\n"); { struct hw_event *a; struct hw_event *b; struct hw_event *c; struct hw_event *d; create_hw_alloc_data (me); create_hw_event_data (me); a = hw_event_queue_schedule (me, 0, NULL, NULL); b = hw_event_queue_schedule (me, 1, NULL, NULL); c = hw_event_queue_schedule (me, 2, NULL, NULL); d = hw_event_queue_schedule (me, 1, NULL, NULL); hw_event_queue_deschedule (me, c); hw_event_queue_deschedule (me, b); hw_event_queue_deschedule (me, a); hw_event_queue_deschedule (me, d); c = HW_ZALLOC (me, struct hw_event); hw_event_queue_deschedule (me, b); /* OOPS! */ hw_free (me, c); delete_hw_event_data (me); delete_hw_alloc_data (me); } printf ("Schedule hw-events\n"); { struct hw_event **e; int *n; int i; int nr = 4; e = HW_NZALLOC (me, struct hw_event *, nr); n = HW_NZALLOC (me, int, nr); create_hw_alloc_data (me); create_hw_event_data (me); for (i = 0; i < nr; i++) { n[i] = i; e[i] = hw_event_queue_schedule (me, i, test_handler, &n[i]); } sim_events_preprocess (sd, 1, 1); for (i = 0; i < nr; i++) { if (sim_events_tick (sd)) sim_events_process (sd); } for (i = 0; i < nr; i++) { if (n[i] != -i) abort (); hw_event_queue_deschedule (me, e[i]); } hw_free (me, n); hw_free (me, e); delete_hw_event_data (me); delete_hw_alloc_data (me); } return 0; }