SIM_RC sim_engine_install (SIM_DESC sd) { SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); sim_module_add_init_fn (sd, sim_engine_init); return SIM_RC_OK; }
SIM_RC sim_memopt_install (SIM_DESC sd) { SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); sim_add_option_table (sd, NULL, memory_options); sim_module_add_uninstall_fn (sd, sim_memory_uninstall); sim_module_add_init_fn (sd, sim_memory_init); return SIM_RC_OK; }
SIM_RC dv_sockser_install (SIM_DESC sd) { SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); if (sim_add_option_table (sd, NULL, sockser_options) != SIM_RC_OK) return SIM_RC_FAIL; sim_module_add_init_fn (sd, dv_sockser_init); sim_module_add_uninstall_fn (sd, dv_sockser_uninstall); return SIM_RC_OK; }
SIM_RC sim_hw_install (struct sim_state *sd) { SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); sim_add_option_table (sd, NULL, hw_options); sim_module_add_uninstall_fn (sd, sim_hw_uninstall); sim_module_add_init_fn (sd, sim_hw_init); STATE_HW (sd) = ZALLOC (struct sim_hw); STATE_HW (sd)->tree = hw_tree_create (sd, "core"); return SIM_RC_OK; }
SIM_RC scache_install (SIM_DESC sd) { sim_add_option_table (sd, NULL, scache_options); sim_module_add_init_fn (sd, scache_init); sim_module_add_uninstall_fn (sd, scache_uninstall); /* This is the default, it may be overridden on the command line. */ STATE_SCACHE_SIZE (sd) = WITH_SCACHE; return SIM_RC_OK; }
SIM_RC sim_core_install (SIM_DESC sd) { SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); /* establish the other handlers */ sim_module_add_uninstall_fn (sd, sim_core_uninstall); sim_module_add_init_fn (sd, sim_core_init); /* establish any initial data structures - none */ return SIM_RC_OK; }
SIM_RC sim_watchpoint_install (SIM_DESC sd) { sim_watchpoints *watch = STATE_WATCHPOINTS (sd); SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER); /* the basic command set */ sim_module_add_init_fn (sd, sim_watchpoint_init); sim_add_option_table (sd, NULL, watchpoint_options); /* fill in some details */ if (watch->interrupt_names == NULL) watch->interrupt_names = default_interrupt_names; watch->nr_interrupts = 0; while (watch->interrupt_names[watch->nr_interrupts] != NULL) watch->nr_interrupts++; /* generate more advansed commands */ { OPTION *int_options = NZALLOC (OPTION, 1 + (watch->nr_interrupts + 1) * nr_watchpoint_types); int interrupt_nr; for (interrupt_nr = 0; interrupt_nr <= watch->nr_interrupts; interrupt_nr++) { watchpoint_type type; for (type = 0; type < nr_watchpoint_types; type++) { char *name; int nr = interrupt_nr * nr_watchpoint_types + type; OPTION *option = &int_options[nr]; if (asprintf (&name, "watch-%s-%s", watchpoint_type_to_str (sd, type), interrupt_nr_to_str (sd, interrupt_nr)) < 0) return SIM_RC_FAIL; option->opt.name = name; option->opt.has_arg = required_argument; option->opt.val = type_to_option (sd, type, interrupt_nr); option->doc = ""; option->doc_name = ""; option->handler = watchpoint_option_handler; } } /* adjust first few entries so that they contain real documentation, the first entry includes a list of actions. */ { const char *prefix = "Watch the simulator, take ACTION in COUNT cycles (`+' for every COUNT cycles), ACTION is"; char *doc; int len = strlen (prefix) + 1; for (interrupt_nr = 0; interrupt_nr <= watch->nr_interrupts; interrupt_nr++) len += strlen (interrupt_nr_to_str (sd, interrupt_nr)) + 1; doc = NZALLOC (char, len); strcpy (doc, prefix); for (interrupt_nr = 0; interrupt_nr <= watch->nr_interrupts; interrupt_nr++) { strcat (doc, " "); strcat (doc, interrupt_nr_to_str (sd, interrupt_nr)); } int_options[0].doc_name = "watch-cycles-ACTION"; int_options[0].arg = "[+]COUNT"; int_options[0].doc = doc; } int_options[1].doc_name = "watch-pc-ACTION"; int_options[1].arg = "[!]ADDRESS"; int_options[1].doc = "Watch the PC, take ACTION when matches ADDRESS (in range ADDRESS,ADDRESS), `!' negates test"; int_options[2].doc_name = "watch-clock-ACTION"; int_options[2].arg = "[+]MILLISECONDS"; int_options[2].doc = "Watch the clock, take ACTION after MILLISECONDS (`+' for every MILLISECONDS)"; sim_add_option_table (sd, NULL, int_options); } return SIM_RC_OK; }