Home | History | Annotate | Line # | Download | only in common
sim-module.c revision 1.6.4.1
      1 /* Module support.
      2 
      3    Copyright 1996-2017 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   sim_model_install,
     44   sim_engine_install,
     45 #if WITH_TRACE_ANY_P
     46   trace_install,
     47 #endif
     48 #if WITH_PROFILE
     49   profile_install,
     50 #endif
     51   sim_core_install,
     52   sim_memopt_install,
     53   sim_watchpoint_install,
     54 #if WITH_SCACHE
     55   scache_install,
     56 #endif
     57 #if WITH_HW
     58   sim_hw_install,
     59 #endif
     60 #ifdef HAVE_DV_SOCKSER
     61   /* TODO: Shouldn't have device models here.  */
     62   dv_sockser_install,
     63 #endif
     64   0
     65 };
     66 
     67 /* Functions called from sim_open.  */
     69 
     70 /* Initialize common parts before argument processing.  */
     71 
     72 SIM_RC
     73 sim_pre_argv_init (SIM_DESC sd, const char *myname)
     74 {
     75   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
     76   SIM_ASSERT (STATE_MODULES (sd) == NULL);
     77 
     78   STATE_MY_NAME (sd) = lbasename (myname);
     79 
     80   /* Set the cpu names to default values.  */
     81   {
     82     int i;
     83     for (i = 0; i < MAX_NR_PROCESSORS; ++i)
     84       {
     85 	char *name;
     86 	if (asprintf (&name, "cpu%d", i) < 0)
     87 	  return SIM_RC_FAIL;
     88 	CPU_NAME (STATE_CPU (sd, i)) = name;
     89       }
     90   }
     91 
     92   sim_config_default (sd);
     93 
     94   /* Install all configured in modules.  */
     95   if (sim_module_install (sd) != SIM_RC_OK)
     96     return SIM_RC_FAIL;
     97 
     98   return SIM_RC_OK;
     99 }
    100 
    101 /* Initialize common parts after argument processing.  */
    102 
    103 SIM_RC
    104 sim_post_argv_init (SIM_DESC sd)
    105 {
    106   int i;
    107   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    108   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    109 
    110   /* Set the cpu->state backlinks for each cpu.  */
    111   for (i = 0; i < MAX_NR_PROCESSORS; ++i)
    112     {
    113       CPU_STATE (STATE_CPU (sd, i)) = sd;
    114       CPU_INDEX (STATE_CPU (sd, i)) = i;
    115     }
    116 
    117   if (sim_module_init (sd) != SIM_RC_OK)
    118     return SIM_RC_FAIL;
    119 
    120   return SIM_RC_OK;
    121 }
    122 
    123 /* Install all modules.
    125    If this fails, no modules are left installed.  */
    126 
    127 SIM_RC
    128 sim_module_install (SIM_DESC sd)
    129 {
    130   MODULE_INSTALL_FN * const *modp;
    131 
    132   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    133   SIM_ASSERT (STATE_MODULES (sd) == NULL);
    134 
    135   STATE_MODULES (sd) = ZALLOC (struct module_list);
    136   for (modp = modules; *modp != NULL; ++modp)
    137     {
    138       if ((*modp) (sd) != SIM_RC_OK)
    139 	{
    140 	  sim_module_uninstall (sd);
    141 	  SIM_ASSERT (STATE_MODULES (sd) == NULL);
    142 	  return SIM_RC_FAIL;
    143 	}
    144     }
    145   return SIM_RC_OK;
    146 }
    147 
    148 /* Called after all modules have been installed and after argv
    149    has been processed.  */
    150 
    151 SIM_RC
    152 sim_module_init (SIM_DESC sd)
    153 {
    154   struct module_list *modules = STATE_MODULES (sd);
    155   MODULE_INIT_LIST *modp;
    156 
    157   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    158   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    159 
    160   for (modp = modules->init_list; modp != NULL; modp = modp->next)
    161     {
    162       if ((*modp->fn) (sd) != SIM_RC_OK)
    163 	return SIM_RC_FAIL;
    164     }
    165   return SIM_RC_OK;
    166 }
    167 
    168 /* Called when ever the simulator is resumed */
    169 
    170 SIM_RC
    171 sim_module_resume (SIM_DESC sd)
    172 {
    173   struct module_list *modules = STATE_MODULES (sd);
    174   MODULE_RESUME_LIST *modp;
    175 
    176   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    177   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    178 
    179   for (modp = modules->resume_list; modp != NULL; modp = modp->next)
    180     {
    181       if ((*modp->fn) (sd) != SIM_RC_OK)
    182 	return SIM_RC_FAIL;
    183     }
    184   return SIM_RC_OK;
    185 }
    186 
    187 /* Called when ever the simulator is suspended */
    188 
    189 SIM_RC
    190 sim_module_suspend (SIM_DESC sd)
    191 {
    192   struct module_list *modules = STATE_MODULES (sd);
    193   MODULE_SUSPEND_LIST *modp;
    194 
    195   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    196   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    197 
    198   for (modp = modules->suspend_list; modp != NULL; modp = modp->next)
    199     {
    200       if ((*modp->fn) (sd) != SIM_RC_OK)
    201 	return SIM_RC_FAIL;
    202     }
    203   return SIM_RC_OK;
    204 }
    205 
    206 /* Uninstall installed modules, called by sim_close.  */
    207 
    208 void
    209 sim_module_uninstall (SIM_DESC sd)
    210 {
    211   struct module_list *modules = STATE_MODULES (sd);
    212   MODULE_UNINSTALL_LIST *modp;
    213 
    214   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    215   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    216 
    217   /* Uninstall the modules.  */
    218   for (modp = modules->uninstall_list; modp != NULL; modp = modp->next)
    219     (*modp->fn) (sd);
    220 
    221   /* clean-up init list */
    222   {
    223     MODULE_INIT_LIST *n, *d;
    224     for (d = modules->init_list; d != NULL; d = n)
    225       {
    226 	n = d->next;
    227 	free (d);
    228       }
    229   }
    230 
    231   /* clean-up resume list */
    232   {
    233     MODULE_RESUME_LIST *n, *d;
    234     for (d = modules->resume_list; d != NULL; d = n)
    235       {
    236 	n = d->next;
    237 	free (d);
    238       }
    239   }
    240 
    241   /* clean-up suspend list */
    242   {
    243     MODULE_SUSPEND_LIST *n, *d;
    244     for (d = modules->suspend_list; d != NULL; d = n)
    245       {
    246 	n = d->next;
    247 	free (d);
    248       }
    249   }
    250 
    251   /* clean-up uninstall list */
    252   {
    253     MODULE_UNINSTALL_LIST *n, *d;
    254     for (d = modules->uninstall_list; d != NULL; d = n)
    255       {
    256 	n = d->next;
    257 	free (d);
    258       }
    259   }
    260 
    261   /* clean-up info list */
    262   {
    263     MODULE_INFO_LIST *n, *d;
    264     for (d = modules->info_list; d != NULL; d = n)
    265       {
    266 	n = d->next;
    267 	free (d);
    268       }
    269   }
    270 
    271   free (modules);
    272   STATE_MODULES (sd) = NULL;
    273 }
    274 
    275 /* Called when ever simulator info is needed */
    276 
    277 void
    278 sim_module_info (SIM_DESC sd, int verbose)
    279 {
    280   struct module_list *modules = STATE_MODULES (sd);
    281   MODULE_INFO_LIST *modp;
    282 
    283   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    284   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    285 
    286   for (modp = modules->info_list; modp != NULL; modp = modp->next)
    287     {
    288       (*modp->fn) (sd, verbose);
    289     }
    290 }
    291 
    292 /* Add FN to the init handler list.
    294    init in the same order as the install. */
    295 
    296 void
    297 sim_module_add_init_fn (SIM_DESC sd, MODULE_INIT_FN fn)
    298 {
    299   struct module_list *modules = STATE_MODULES (sd);
    300   MODULE_INIT_LIST *l = ZALLOC (MODULE_INIT_LIST);
    301   MODULE_INIT_LIST **last;
    302 
    303   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    304   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    305 
    306   last = &modules->init_list;
    307   while (*last != NULL)
    308     last = &((*last)->next);
    309 
    310   l->fn = fn;
    311   l->next = NULL;
    312   *last = l;
    313 }
    314 
    315 /* Add FN to the resume handler list.
    316    resume in the same order as the install. */
    317 
    318 void
    319 sim_module_add_resume_fn (SIM_DESC sd, MODULE_RESUME_FN fn)
    320 {
    321   struct module_list *modules = STATE_MODULES (sd);
    322   MODULE_RESUME_LIST *l = ZALLOC (MODULE_RESUME_LIST);
    323   MODULE_RESUME_LIST **last;
    324 
    325   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    326   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    327 
    328   last = &modules->resume_list;
    329   while (*last != NULL)
    330     last = &((*last)->next);
    331 
    332   l->fn = fn;
    333   l->next = NULL;
    334   *last = l;
    335 }
    336 
    337 /* Add FN to the init handler list.
    338    suspend in the reverse order to install. */
    339 
    340 void
    341 sim_module_add_suspend_fn (SIM_DESC sd, MODULE_SUSPEND_FN fn)
    342 {
    343   struct module_list *modules = STATE_MODULES (sd);
    344   MODULE_SUSPEND_LIST *l = ZALLOC (MODULE_SUSPEND_LIST);
    345   MODULE_SUSPEND_LIST **last;
    346 
    347   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    348   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    349 
    350   last = &modules->suspend_list;
    351   while (*last != NULL)
    352     last = &((*last)->next);
    353 
    354   l->fn = fn;
    355   l->next = modules->suspend_list;
    356   modules->suspend_list = l;
    357 }
    358 
    359 /* Add FN to the uninstall handler list.
    360    Uninstall in reverse order to install.  */
    361 
    362 void
    363 sim_module_add_uninstall_fn (SIM_DESC sd, MODULE_UNINSTALL_FN fn)
    364 {
    365   struct module_list *modules = STATE_MODULES (sd);
    366   MODULE_UNINSTALL_LIST *l = ZALLOC (MODULE_UNINSTALL_LIST);
    367 
    368   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    369   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    370 
    371   l->fn = fn;
    372   l->next = modules->uninstall_list;
    373   modules->uninstall_list = l;
    374 }
    375 
    376 /* Add FN to the info handler list.
    377    Report info in the same order as the install. */
    378 
    379 void
    380 sim_module_add_info_fn (SIM_DESC sd, MODULE_INFO_FN fn)
    381 {
    382   struct module_list *modules = STATE_MODULES (sd);
    383   MODULE_INFO_LIST *l = ZALLOC (MODULE_INFO_LIST);
    384   MODULE_INFO_LIST **last;
    385 
    386   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
    387   SIM_ASSERT (STATE_MODULES (sd) != NULL);
    388 
    389   last = &modules->info_list;
    390   while (*last != NULL)
    391     last = &((*last)->next);
    392 
    393   l->fn = fn;
    394   l->next = NULL;
    395   *last = l;
    396 }
    397