Home | History | Annotate | Line # | Download | only in common
sim-module.c revision 1.3.2.1
      1 /* Module support.
      2 
      3    Copyright 1996-2015 Free Software Foundation, Inc.
      4 
      5    Contributed by Cygnus Support.
      6 
      7 This file is part of GDB, the GNU debugger.
      8 
      9 This program is free software; you can redistribute it and/or modify
     10 it under the terms of the GNU General Public License as published by
     11 the Free Software Foundation; either version 3 of the License, or
     12 (at your option) any later version.
     13 
     14 This program is distributed in the hope that it will be useful,
     15 but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17 GNU General Public License for more details.
     18 
     19 You should have received a copy of the GNU General Public License
     20 along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     21 
     22 #include "config.h"
     23 #include "sim-main.h"
     24 #include "sim-io.h"
     25 #include "sim-options.h"
     26 #include "sim-assert.h"
     27 
     28 #if WITH_HW
     29 #include "sim-hw.h"
     30 #endif
     31 
     32 #ifdef HAVE_DV_SOCKSER
     33 /* TODO: Shouldn't have device models here.  */
     34 #include "dv-sockser.h"
     35 #endif
     36 
     37 #include "libiberty.h"
     38 
     39 /* List of all modules.  */
     40 static MODULE_INSTALL_FN * const modules[] = {
     41   standard_install,
     42   sim_events_install,
     43 #ifdef SIM_HAVE_MODEL
     44   sim_model_install,
     45 #endif
     46 #if WITH_ENGINE
     47   sim_engine_install,
     48 #endif
     49 #if WITH_TRACE_ANY_P
     50   trace_install,
     51 #endif
     52 #if WITH_PROFILE
     53   profile_install,
     54 #endif
     55   sim_core_install,
     56 #ifndef SIM_HAVE_FLATMEM
     57   /* FIXME: should handle flatmem as well FLATMEM */
     58   sim_memopt_install,
     59 #endif
     60 #if WITH_WATCHPOINTS
     61   sim_watchpoint_install,
     62 #endif
     63 #if WITH_SCACHE
     64   scache_install,
     65 #endif
     66 #if WITH_HW
     67   sim_hw_install,
     68 #endif
     69 #ifdef HAVE_DV_SOCKSER
     70   /* TODO: Shouldn't have device models here.  */
     71   dv_sockser_install,
     72 #endif
     73   /* Configured in [simulator specific] additional modules.  */
     74 #ifdef MODULE_LIST
     75   MODULE_LIST
     76 #endif
     77   0
     78 };
     79 
     80 /* Functions called from sim_open.  */
     82 
     83 /* Initialize common parts before argument processing.  */
     84 
     85 SIM_RC
     86 sim_pre_argv_init (SIM_DESC sd, const char *myname)
     87 {
     88   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
     89   SIM_ASSERT (STATE_MODULES (sd) == NULL);
     90 
     91   STATE_MY_NAME (sd) = myname + strlen (myname);
     92   while (STATE_MY_NAME (sd) > myname && STATE_MY_NAME (sd)[-1] != '/')
     93     --STATE_MY_NAME (sd);
     94 
     95   /* Set the cpu names to default values.  */
     96   {
     97     int i;
     98     for (i = 0; i < MAX_NR_PROCESSORS; ++i)
     99       {
    100 	char *name;
    101 	if (asprintf (&name, "cpu%d", i) < 0)
    102 	  return SIM_RC_FAIL;
    103 	CPU_NAME (STATE_CPU (sd, i)) = name;
    104       }
    105   }
    106 
    107   sim_config_default (sd);
    108 
    109   /* Install all configured in modules.  */
    110   if (sim_module_install (sd) != SIM_RC_OK)
    111     return SIM_RC_FAIL;
    112 
    113   return SIM_RC_OK;
    114 }
    115 
    116 /* Initialize common parts after argument processing.  */
    117 
    118 SIM_RC
    119 sim_post_argv_init (SIM_DESC sd)
    120 {
    121   int i;
    122   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    123   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    124 
    125   /* Set the cpu->state backlinks for each cpu.  */
    126   for (i = 0; i < MAX_NR_PROCESSORS; ++i)
    127     {
    128       CPU_STATE (STATE_CPU (sd, i)) = sd;
    129       CPU_INDEX (STATE_CPU (sd, i)) = i;
    130     }
    131 
    132   if (sim_module_init (sd) != SIM_RC_OK)
    133     return SIM_RC_FAIL;
    134 
    135   return SIM_RC_OK;
    136 }
    137 
    138 /* Install all modules.
    140    If this fails, no modules are left installed.  */
    141 
    142 SIM_RC
    143 sim_module_install (SIM_DESC sd)
    144 {
    145   MODULE_INSTALL_FN * const *modp;
    146 
    147   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    148   SIM_ASSERT (STATE_MODULES (sd) == NULL);
    149 
    150   STATE_MODULES (sd) = ZALLOC (struct module_list);
    151   for (modp = modules; *modp != NULL; ++modp)
    152     {
    153       if ((*modp) (sd) != SIM_RC_OK)
    154 	{
    155 	  sim_module_uninstall (sd);
    156 	  SIM_ASSERT (STATE_MODULES (sd) == NULL);
    157 	  return SIM_RC_FAIL;
    158 	}
    159     }
    160   return SIM_RC_OK;
    161 }
    162 
    163 /* Called after all modules have been installed and after argv
    164    has been processed.  */
    165 
    166 SIM_RC
    167 sim_module_init (SIM_DESC sd)
    168 {
    169   struct module_list *modules = STATE_MODULES (sd);
    170   MODULE_INIT_LIST *modp;
    171 
    172   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    173   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    174 
    175   for (modp = modules->init_list; modp != NULL; modp = modp->next)
    176     {
    177       if ((*modp->fn) (sd) != SIM_RC_OK)
    178 	return SIM_RC_FAIL;
    179     }
    180   return SIM_RC_OK;
    181 }
    182 
    183 /* Called when ever the simulator is resumed */
    184 
    185 SIM_RC
    186 sim_module_resume (SIM_DESC sd)
    187 {
    188   struct module_list *modules = STATE_MODULES (sd);
    189   MODULE_RESUME_LIST *modp;
    190 
    191   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    192   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    193 
    194   for (modp = modules->resume_list; modp != NULL; modp = modp->next)
    195     {
    196       if ((*modp->fn) (sd) != SIM_RC_OK)
    197 	return SIM_RC_FAIL;
    198     }
    199   return SIM_RC_OK;
    200 }
    201 
    202 /* Called when ever the simulator is suspended */
    203 
    204 SIM_RC
    205 sim_module_suspend (SIM_DESC sd)
    206 {
    207   struct module_list *modules = STATE_MODULES (sd);
    208   MODULE_SUSPEND_LIST *modp;
    209 
    210   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    211   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    212 
    213   for (modp = modules->suspend_list; modp != NULL; modp = modp->next)
    214     {
    215       if ((*modp->fn) (sd) != SIM_RC_OK)
    216 	return SIM_RC_FAIL;
    217     }
    218   return SIM_RC_OK;
    219 }
    220 
    221 /* Uninstall installed modules, called by sim_close.  */
    222 
    223 void
    224 sim_module_uninstall (SIM_DESC sd)
    225 {
    226   struct module_list *modules = STATE_MODULES (sd);
    227   MODULE_UNINSTALL_LIST *modp;
    228 
    229   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    230   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    231 
    232   /* Uninstall the modules.  */
    233   for (modp = modules->uninstall_list; modp != NULL; modp = modp->next)
    234     (*modp->fn) (sd);
    235 
    236   /* clean-up init list */
    237   {
    238     MODULE_INIT_LIST *n, *d;
    239     for (d = modules->init_list; d != NULL; d = n)
    240       {
    241 	n = d->next;
    242 	free (d);
    243       }
    244   }
    245 
    246   /* clean-up resume list */
    247   {
    248     MODULE_RESUME_LIST *n, *d;
    249     for (d = modules->resume_list; d != NULL; d = n)
    250       {
    251 	n = d->next;
    252 	free (d);
    253       }
    254   }
    255 
    256   /* clean-up suspend list */
    257   {
    258     MODULE_SUSPEND_LIST *n, *d;
    259     for (d = modules->suspend_list; d != NULL; d = n)
    260       {
    261 	n = d->next;
    262 	free (d);
    263       }
    264   }
    265 
    266   /* clean-up uninstall list */
    267   {
    268     MODULE_UNINSTALL_LIST *n, *d;
    269     for (d = modules->uninstall_list; d != NULL; d = n)
    270       {
    271 	n = d->next;
    272 	free (d);
    273       }
    274   }
    275 
    276   /* clean-up info list */
    277   {
    278     MODULE_INFO_LIST *n, *d;
    279     for (d = modules->info_list; d != NULL; d = n)
    280       {
    281 	n = d->next;
    282 	free (d);
    283       }
    284   }
    285 
    286   free (modules);
    287   STATE_MODULES (sd) = NULL;
    288 }
    289 
    290 /* Called when ever simulator info is needed */
    291 
    292 void
    293 sim_module_info (SIM_DESC sd, int verbose)
    294 {
    295   struct module_list *modules = STATE_MODULES (sd);
    296   MODULE_INFO_LIST *modp;
    297 
    298   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    299   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    300 
    301   for (modp = modules->info_list; modp != NULL; modp = modp->next)
    302     {
    303       (*modp->fn) (sd, verbose);
    304     }
    305 }
    306 
    307 /* Add FN to the init handler list.
    309    init in the same order as the install. */
    310 
    311 void
    312 sim_module_add_init_fn (SIM_DESC sd, MODULE_INIT_FN fn)
    313 {
    314   struct module_list *modules = STATE_MODULES (sd);
    315   MODULE_INIT_LIST *l = ZALLOC (MODULE_INIT_LIST);
    316   MODULE_INIT_LIST **last;
    317 
    318   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    319   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    320 
    321   last = &modules->init_list;
    322   while (*last != NULL)
    323     last = &((*last)->next);
    324 
    325   l->fn = fn;
    326   l->next = NULL;
    327   *last = l;
    328 }
    329 
    330 /* Add FN to the resume handler list.
    331    resume in the same order as the install. */
    332 
    333 void
    334 sim_module_add_resume_fn (SIM_DESC sd, MODULE_RESUME_FN fn)
    335 {
    336   struct module_list *modules = STATE_MODULES (sd);
    337   MODULE_RESUME_LIST *l = ZALLOC (MODULE_RESUME_LIST);
    338   MODULE_RESUME_LIST **last;
    339 
    340   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    341   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    342 
    343   last = &modules->resume_list;
    344   while (*last != NULL)
    345     last = &((*last)->next);
    346 
    347   l->fn = fn;
    348   l->next = NULL;
    349   *last = l;
    350 }
    351 
    352 /* Add FN to the init handler list.
    353    suspend in the reverse order to install. */
    354 
    355 void
    356 sim_module_add_suspend_fn (SIM_DESC sd, MODULE_SUSPEND_FN fn)
    357 {
    358   struct module_list *modules = STATE_MODULES (sd);
    359   MODULE_SUSPEND_LIST *l = ZALLOC (MODULE_SUSPEND_LIST);
    360   MODULE_SUSPEND_LIST **last;
    361 
    362   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    363   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    364 
    365   last = &modules->suspend_list;
    366   while (*last != NULL)
    367     last = &((*last)->next);
    368 
    369   l->fn = fn;
    370   l->next = modules->suspend_list;
    371   modules->suspend_list = l;
    372 }
    373 
    374 /* Add FN to the uninstall handler list.
    375    Uninstall in reverse order to install.  */
    376 
    377 void
    378 sim_module_add_uninstall_fn (SIM_DESC sd, MODULE_UNINSTALL_FN fn)
    379 {
    380   struct module_list *modules = STATE_MODULES (sd);
    381   MODULE_UNINSTALL_LIST *l = ZALLOC (MODULE_UNINSTALL_LIST);
    382 
    383   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    384   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    385 
    386   l->fn = fn;
    387   l->next = modules->uninstall_list;
    388   modules->uninstall_list = l;
    389 }
    390 
    391 /* Add FN to the info handler list.
    392    Report info in the same order as the install. */
    393 
    394 void
    395 sim_module_add_info_fn (SIM_DESC sd, MODULE_INFO_FN fn)
    396 {
    397   struct module_list *modules = STATE_MODULES (sd);
    398   MODULE_INFO_LIST *l = ZALLOC (MODULE_INFO_LIST);
    399   MODULE_INFO_LIST **last;
    400 
    401   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    402   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    403 
    404   last = &modules->info_list;
    405   while (*last != NULL)
    406     last = &((*last)->next);
    407 
    408   l->fn = fn;
    409   l->next = NULL;
    410   *last = l;
    411 }
    412