/* Initialize the frv simulator. */ void frv_term (SIM_DESC sd) { /* If the timer is enabled, and model profiling was not originally enabled, then turn it off again. This is the only place we can currently gain control to do this. */ if (frv_interrupt_state.timer.enabled && ! frv_save_profile_model_p) sim_profile_set_option (current_state, "-model", PROFILE_MODEL_IDX, "0"); }
static SIM_RC scache_option_handler (SIM_DESC sd, sim_cpu *cpu, int opt, char *arg, int is_command) { switch (opt) { case 'c' : if (WITH_SCACHE) { if (arg != NULL) { unsigned int n = (unsigned int) strtoul (arg, NULL, 0); if (n < MIN_SCACHE_SIZE) { sim_io_eprintf (sd, "invalid scache size `%u', must be at least %u", n, MIN_SCACHE_SIZE); return SIM_RC_FAIL; } /* Ensure it's a multiple of 2. */ if ((n & (n - 1)) != 0) { unsigned int i; sim_io_eprintf (sd, "scache size `%u' not a multiple of 2\n", n); /* Round up to nearest multiple of 2. */ for (i = 1; i && i < n; i <<= 1) continue; if (i) { n = i; sim_io_eprintf (sd, "rounding scache size up to %u\n", n); } } if (cpu == NULL) STATE_SCACHE_SIZE (sd) = n; else CPU_SCACHE_SIZE (cpu) = n; } else { if (cpu == NULL) STATE_SCACHE_SIZE (sd) = SCACHE_DEFAULT_CACHE_SIZE; else CPU_SCACHE_SIZE (cpu) = SCACHE_DEFAULT_CACHE_SIZE; } } else sim_io_eprintf (sd, "Simulator execution cache not enabled, `--scache-size' ignored\n"); break; case OPTION_PROFILE_SCACHE : if (WITH_SCACHE && WITH_PROFILE_SCACHE_P) { /* FIXME: handle cpu != NULL. */ return sim_profile_set_option (sd, "-scache", PROFILE_SCACHE_IDX, arg); } else sim_io_eprintf (sd, "Simulator cache profiling not compiled in, `--profile-scache' ignored\n"); break; } return SIM_RC_OK; }
static SIM_RC frv_option_handler (SIM_DESC sd, sim_cpu *current_cpu, int opt, char *arg, int is_command) { switch (opt) { case 'p' : if (! WITH_PROFILE) sim_io_eprintf (sd, "Profiling not compiled in, `-p' ignored\n"); else { unsigned mask = PROFILE_USEFUL_MASK; if (WITH_PROFILE_CACHE_P) mask |= (1 << PROFILE_CACHE_IDX); if (WITH_PROFILE_PARALLEL_P) mask |= (1 << PROFILE_PARALLEL_IDX); return set_profile_option_mask (sd, "profile", mask, arg); } break; case OPTION_FRV_DATA_CACHE: parse_cache_option (sd, arg, "data_cache", 1/*is_data_cache*/); return SIM_RC_OK; case OPTION_FRV_INSN_CACHE: parse_cache_option (sd, arg, "insn_cache", 0/*is_data_cache*/); return SIM_RC_OK; case OPTION_FRV_PROFILE_CACHE: if (WITH_PROFILE_CACHE_P) return sim_profile_set_option (sd, "-cache", PROFILE_CACHE_IDX, arg); else sim_io_eprintf (sd, "Cache profiling not compiled in, `--profile-cache' ignored\n"); break; case OPTION_FRV_PROFILE_PARALLEL: if (WITH_PROFILE_PARALLEL_P) { unsigned mask = (1 << PROFILE_MODEL_IDX) | (1 << PROFILE_PARALLEL_IDX); return set_profile_option_mask (sd, "-parallel", mask, arg); } else sim_io_eprintf (sd, "Parallel profiling not compiled in, `--profile-parallel' ignored\n"); break; case OPTION_FRV_TIMER: { char *chp = arg; address_word cycles, interrupt; chp = parse_size (chp, &cycles); if (chp == arg) { sim_io_eprintf (sd, "Cycle count required for --timer\n"); return SIM_RC_FAIL; } if (*chp != ',') { sim_io_eprintf (sd, "Interrupt number required for --timer\n"); return SIM_RC_FAIL; } chp = parse_size (chp + 1, &interrupt); if (interrupt < 1 || interrupt > 15) { sim_io_eprintf (sd, "Interrupt number for --timer must be greater than 0 and less that 16\n"); return SIM_RC_FAIL; } frv_interrupt_state.timer.enabled = 1; frv_interrupt_state.timer.value = cycles; frv_interrupt_state.timer.current = 0; frv_interrupt_state.timer.interrupt = FRV_INTERRUPT_LEVEL_1 + interrupt - 1; } return SIM_RC_OK; case OPTION_FRV_MEMORY_LATENCY: { int i; char *chp = arg; address_word cycles; chp = parse_size (chp, &cycles); if (chp == arg) { sim_io_eprintf (sd, "Cycle count required for --memory-latency\n"); return SIM_RC_FAIL; } for (i = 0; i < MAX_NR_PROCESSORS; ++i) { SIM_CPU *current_cpu = STATE_CPU (sd, i); FRV_CACHE *insn_cache = CPU_INSN_CACHE (current_cpu); FRV_CACHE *data_cache = CPU_DATA_CACHE (current_cpu); insn_cache->memory_latency = cycles; data_cache->memory_latency = cycles; } } return SIM_RC_OK; default: sim_io_eprintf (sd, "Unknown FRV option %d\n", opt); return SIM_RC_FAIL; } return SIM_RC_FAIL; }