Home | History | Annotate | Line # | Download | only in common
      1 /* CPU support.
      2    Copyright (C) 1998-2024 Free Software Foundation, Inc.
      3    Contributed by Cygnus Solutions.
      4 
      5 This file is part of GDB, the GNU debugger.
      6 
      7 This program is free software; you can redistribute it and/or modify
      8 it under the terms of the GNU General Public License as published by
      9 the Free Software Foundation; either version 3 of the License, or
     10 (at your option) any later version.
     11 
     12 This program is distributed in the hope that it will be useful,
     13 but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 /* This must come before any other includes.  */
     21 #include "defs.h"
     22 
     23 #include <stdlib.h>
     24 
     25 #include "bfd.h"
     26 
     27 #include "sim-main.h"
     28 
     29 /* Allocate space for all cpus in the simulator.
     30    Space for the cpu must currently exist prior to parsing ARGV.  */
     31 /* ??? wip.  better solution must wait.  */
     32 
     33 SIM_RC
     34 sim_cpu_alloc_all_extra (SIM_DESC sd, int ncpus, size_t extra_bytes)
     35 {
     36   int c;
     37 
     38   /* TODO: This should be a command line option for users to control.  */
     39   if (ncpus == 0)
     40     ncpus = MAX_NR_PROCESSORS;
     41 
     42   for (c = 0; c < ncpus; ++c)
     43     STATE_CPU (sd, c) = sim_cpu_alloc_extra (sd, extra_bytes);
     44 
     45   return SIM_RC_OK;
     46 }
     47 
     48 /* Allocate space for a cpu object.
     49    EXTRA_BYTES is additional space to allocate for the sim_cpu struct.  */
     50 
     51 sim_cpu *
     52 sim_cpu_alloc_extra (SIM_DESC sd, size_t extra_bytes)
     53 {
     54   sim_cpu *cpu = zalloc (sizeof (*cpu));
     55 
     56 #ifndef CGEN_ARCH
     57 # define cgen_cpu_max_extra_bytes(sd) 0
     58 #endif
     59   extra_bytes += cgen_cpu_max_extra_bytes (sd);
     60   if (extra_bytes)
     61     CPU_ARCH_DATA (cpu) = zalloc (extra_bytes);
     62 
     63   return cpu;
     64 }
     65 
     66 /* Free all resources held by all cpus.  */
     67 
     68 void
     69 sim_cpu_free_all (SIM_DESC sd)
     70 {
     71   int c;
     72 
     73   for (c = 0; c < MAX_NR_PROCESSORS; ++c)
     74     if (STATE_CPU (sd, c))
     75       sim_cpu_free (STATE_CPU (sd, c));
     76 }
     77 
     78 /* Free all resources used by CPU.  */
     79 
     80 void
     81 sim_cpu_free (sim_cpu *cpu)
     82 {
     83   free (CPU_ARCH_DATA (cpu));
     84   free (cpu);
     85 }
     86 
     87 /* PC utilities.  */
     89 
     90 sim_cia
     91 sim_pc_get (sim_cpu *cpu)
     92 {
     93   return (* CPU_PC_FETCH (cpu)) (cpu);
     94 }
     95 
     96 void
     97 sim_pc_set (sim_cpu *cpu, sim_cia newval)
     98 {
     99   (* CPU_PC_STORE (cpu)) (cpu, newval);
    100 }
    101