aboutsummaryrefslogtreecommitdiff
path: root/sim/common/sim-close.c
blob: a1458d443e0211903f68422eb534c28828542bd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/* Miscellaneous simulator utilities.

   Copyright (C) 2005-2015 Free Software Foundation, Inc.
   Contributed by Analog Devices, Inc. and Stephane Carrez.

   This file is part of simulators.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "sim-main.h"
#include "sim-module.h"
#include "gdb/remote-sim.h"

/* Generic implementation of sim_close that works with simulators that use
   sim-module for all custom runtime options.  */

#ifndef SIM_CLOSE_HOOK
# define SIM_CLOSE_HOOK(sd, quitting)
#endif

void
sim_close (SIM_DESC sd, int quitting)
{
  SIM_CLOSE_HOOK (sd, quitting);

  /* If cgen is active, close it down.  */
#ifdef CGEN_ARCH
# define __cgen_cpu_close(arch) arch##_cgen_cpu_close
# define _cgen_cpu_close(arch) __cgen_cpu_close (arch)
# define cgen_cpu_close _cgen_cpu_close (CGEN_ARCH)
  cgen_cpu_close (CPU_CPU_DESC (STATE_CPU (sd, 0)));
#endif

  /* Shut down all registered/active modules.  */
  sim_module_uninstall (sd);

  /* Ensure that any resources allocated through the callback
     mechanism are released.  */
  sim_io_shutdown (sd);

  /* Break down all of the cpus.  */
  sim_cpu_free_all (sd);

  /* Finally break down the sim state itself.  */
  sim_state_free (sd);
}