Blame sim/frv/sim-if.c

Packit Service 706eca
/* Main simulator entry points specific to the FRV.
Packit Service 706eca
   Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit Service 706eca
   Contributed by Red Hat.
Packit Service 706eca
Packit Service 706eca
This file is part of the GNU simulators.
Packit Service 706eca
Packit Service 706eca
This program is free software; you can redistribute it and/or modify
Packit Service 706eca
it under the terms of the GNU General Public License as published by
Packit Service 706eca
the Free Software Foundation; either version 3 of the License, or
Packit Service 706eca
(at your option) any later version.
Packit Service 706eca
Packit Service 706eca
This program is distributed in the hope that it will be useful,
Packit Service 706eca
but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 706eca
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 706eca
GNU General Public License for more details.
Packit Service 706eca
Packit Service 706eca
You should have received a copy of the GNU General Public License
Packit Service 706eca
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 706eca
Packit Service 706eca
#define WANT_CPU
Packit Service 706eca
#define WANT_CPU_FRVBF
Packit Service 706eca
#include "sim-main.h"
Packit Service 706eca
#ifdef HAVE_STDLIB_H
Packit Service 706eca
#include <stdlib.h>
Packit Service 706eca
#endif
Packit Service 706eca
#include "sim-options.h"
Packit Service 706eca
#include "libiberty.h"
Packit Service 706eca
#include "bfd.h"
Packit Service 706eca
#include "elf-bfd.h"
Packit Service 706eca
Packit Service 706eca
static void free_state (SIM_DESC);
Packit Service 706eca
static void print_frv_misc_cpu (SIM_CPU *cpu, int verbose);
Packit Service 706eca

Packit Service 706eca
/* Cover function of sim_state_free to free the cpu buffers as well.  */
Packit Service 706eca
Packit Service 706eca
static void
Packit Service 706eca
free_state (SIM_DESC sd)
Packit Service 706eca
{
Packit Service 706eca
  if (STATE_MODULES (sd) != NULL)
Packit Service 706eca
    sim_module_uninstall (sd);
Packit Service 706eca
  sim_cpu_free_all (sd);
Packit Service 706eca
  sim_state_free (sd);
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
/* Create an instance of the simulator.  */
Packit Service 706eca
Packit Service 706eca
SIM_DESC
Packit Service 706eca
sim_open (kind, callback, abfd, argv)
Packit Service 706eca
     SIM_OPEN_KIND kind;
Packit Service 706eca
     host_callback *callback;
Packit Service 706eca
     bfd *abfd;
Packit Service 706eca
     char * const *argv;
Packit Service 706eca
{
Packit Service 706eca
  char c;
Packit Service 706eca
  int i;
Packit Service 706eca
  unsigned long elf_flags = 0;
Packit Service 706eca
  SIM_DESC sd = sim_state_alloc (kind, callback);
Packit Service 706eca
Packit Service 706eca
  /* The cpu data is kept in a separately allocated chunk of memory.  */
Packit Service 706eca
  if (sim_cpu_alloc_all (sd, 1, cgen_cpu_max_extra_bytes ()) != SIM_RC_OK)
Packit Service 706eca
    {
Packit Service 706eca
      free_state (sd);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
#if 0 /* FIXME: pc is in mach-specific struct */
Packit Service 706eca
  /* FIXME: watchpoints code shouldn't need this */
Packit Service 706eca
  {
Packit Service 706eca
    SIM_CPU *current_cpu = STATE_CPU (sd, 0);
Packit Service 706eca
    STATE_WATCHPOINTS (sd)->pc = &(PC);
Packit Service 706eca
    STATE_WATCHPOINTS (sd)->sizeof_pc = sizeof (PC);
Packit Service 706eca
  }
Packit Service 706eca
#endif
Packit Service 706eca
Packit Service 706eca
  if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
Packit Service 706eca
    {
Packit Service 706eca
      free_state (sd);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  /* These options override any module options.
Packit Service 706eca
     Obviously ambiguity should be avoided, however the caller may wish to
Packit Service 706eca
     augment the meaning of an option.  */
Packit Service 706eca
  sim_add_option_table (sd, NULL, frv_options);
Packit Service 706eca
Packit Service 706eca
  /* The parser will print an error message for us, so we silently return.  */
Packit Service 706eca
  if (sim_parse_args (sd, argv) != SIM_RC_OK)
Packit Service 706eca
    {
Packit Service 706eca
      free_state (sd);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  /* Allocate core managed memory if none specified by user.
Packit Service 706eca
     Use address 4 here in case the user wanted address 0 unmapped.  */
Packit Service 706eca
  if (sim_core_read_buffer (sd, NULL, read_map, &c, 4, 1) == 0)
Packit Service 706eca
    sim_do_commandf (sd, "memory region 0,0x%lx", FRV_DEFAULT_MEM_SIZE);
Packit Service 706eca
Packit Service 706eca
  /* check for/establish the reference program image */
Packit Service 706eca
  if (sim_analyze_program (sd,
Packit Service 706eca
			   (STATE_PROG_ARGV (sd) != NULL
Packit Service 706eca
			    ? *STATE_PROG_ARGV (sd)
Packit Service 706eca
			    : NULL),
Packit Service 706eca
			   abfd) != SIM_RC_OK)
Packit Service 706eca
    {
Packit Service 706eca
      free_state (sd);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  /* set machine and architecture correctly instead of defaulting to frv */
Packit Service 706eca
  {
Packit Service 706eca
    bfd *prog_bfd = STATE_PROG_BFD (sd);
Packit Service 706eca
    if (prog_bfd != NULL)
Packit Service 706eca
      {
Packit Service 706eca
	struct elf_backend_data *backend_data;
Packit Service 706eca
Packit Service 706eca
	if (bfd_get_arch (prog_bfd) != bfd_arch_frv)
Packit Service 706eca
	  {
Packit Service 706eca
	    sim_io_eprintf (sd, "%s: \"%s\" is not a FRV object file\n",
Packit Service 706eca
			    STATE_MY_NAME (sd),
Packit Service 706eca
			    bfd_get_filename (prog_bfd));
Packit Service 706eca
	    free_state (sd);
Packit Service 706eca
	    return 0;
Packit Service 706eca
	  }
Packit Service 706eca
Packit Service 706eca
	backend_data = get_elf_backend_data (prog_bfd);
Packit Service 706eca
Packit Service 706eca
	if (backend_data != NULL)
Packit Service 706eca
	  backend_data->elf_backend_object_p (prog_bfd);
Packit Service 706eca
Packit Service 706eca
	elf_flags = elf_elfheader (prog_bfd)->e_flags;
Packit Service 706eca
      }
Packit Service 706eca
  }
Packit Service 706eca
Packit Service 706eca
  /* Establish any remaining configuration options.  */
Packit Service 706eca
  if (sim_config (sd) != SIM_RC_OK)
Packit Service 706eca
    {
Packit Service 706eca
      free_state (sd);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  if (sim_post_argv_init (sd) != SIM_RC_OK)
Packit Service 706eca
    {
Packit Service 706eca
      free_state (sd);
Packit Service 706eca
      return 0;
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  /* Open a copy of the cpu descriptor table.  */
Packit Service 706eca
  {
Packit Service 706eca
    CGEN_CPU_DESC cd = frv_cgen_cpu_open_1 (STATE_ARCHITECTURE (sd)->printable_name,
Packit Service 706eca
					     CGEN_ENDIAN_BIG);
Packit Service 706eca
    for (i = 0; i < MAX_NR_PROCESSORS; ++i)
Packit Service 706eca
      {
Packit Service 706eca
	SIM_CPU *cpu = STATE_CPU (sd, i);
Packit Service 706eca
	CPU_CPU_DESC (cpu) = cd;
Packit Service 706eca
	CPU_DISASSEMBLER (cpu) = sim_cgen_disassemble_insn;
Packit Service 706eca
	CPU_ELF_FLAGS (cpu) = elf_flags;
Packit Service 706eca
      }
Packit Service 706eca
    frv_cgen_init_dis (cd);
Packit Service 706eca
  }
Packit Service 706eca
Packit Service 706eca
  /* Initialize various cgen things not done by common framework.
Packit Service 706eca
     Must be done after frv_cgen_cpu_open.  */
Packit Service 706eca
  cgen_init (sd);
Packit Service 706eca
Packit Service 706eca
  /* CPU specific initialization.  */
Packit Service 706eca
  for (i = 0; i < MAX_NR_PROCESSORS; ++i)
Packit Service 706eca
    {
Packit Service 706eca
      SIM_CPU* cpu = STATE_CPU (sd, i);
Packit Service 706eca
      frv_initialize (cpu, sd);
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return sd;
Packit Service 706eca
}
Packit Service 706eca
Packit Service 706eca
void
Packit Service 706eca
frv_sim_close (sd, quitting)
Packit Service 706eca
     SIM_DESC sd;
Packit Service 706eca
     int quitting;
Packit Service 706eca
{
Packit Service 706eca
  int i;
Packit Service 706eca
  /* Terminate cache support.  */
Packit Service 706eca
  for (i = 0; i < MAX_NR_PROCESSORS; ++i)
Packit Service 706eca
    {
Packit Service 706eca
      SIM_CPU* cpu = STATE_CPU (sd, i);
Packit Service 706eca
      frv_cache_term (CPU_INSN_CACHE (cpu));
Packit Service 706eca
      frv_cache_term (CPU_DATA_CACHE (cpu));
Packit Service 706eca
    }
Packit Service 706eca
}
Packit Service 706eca

Packit Service 706eca
SIM_RC
Packit Service 706eca
sim_create_inferior (sd, abfd, argv, envp)
Packit Service 706eca
     SIM_DESC sd;
Packit Service 706eca
     bfd *abfd;
Packit Service 706eca
     char * const *argv;
Packit Service 706eca
     char * const *envp;
Packit Service 706eca
{
Packit Service 706eca
  SIM_CPU *current_cpu = STATE_CPU (sd, 0);
Packit Service 706eca
  SIM_ADDR addr;
Packit Service 706eca
Packit Service 706eca
  if (abfd != NULL)
Packit Service 706eca
    addr = bfd_get_start_address (abfd);
Packit Service 706eca
  else
Packit Service 706eca
    addr = 0;
Packit Service 706eca
  sim_pc_set (current_cpu, addr);
Packit Service 706eca
Packit Service 706eca
  /* Standalone mode (i.e. `run`) will take care of the argv for us in
Packit Service 706eca
     sim_open() -> sim_parse_args().  But in debug mode (i.e. 'target sim'
Packit Service 706eca
     with `gdb`), we need to handle it because the user can change the
Packit Service 706eca
     argv on the fly via gdb's 'run'.  */
Packit Service 706eca
  if (STATE_PROG_ARGV (sd) != argv)
Packit Service 706eca
    {
Packit Service 706eca
      freeargv (STATE_PROG_ARGV (sd));
Packit Service 706eca
      STATE_PROG_ARGV (sd) = dupargv (argv);
Packit Service 706eca
    }
Packit Service 706eca
Packit Service 706eca
  return SIM_RC_OK;
Packit Service 706eca
}