OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [mem-break.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Simulate breakpoints by patching locations in the target system, for GDB.
/* Simulate breakpoints by patching locations in the target system, for GDB.
   Copyright 1990, 1991, 1995 Free Software Foundation, Inc.
   Copyright 1990, 1991, 1995 Free Software Foundation, Inc.
   Contributed by Cygnus Support.  Written by John Gilmore.
   Contributed by Cygnus Support.  Written by John Gilmore.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
#include "defs.h"
#include "defs.h"
 
 
/* This file is only useful if BREAKPOINT is set.  If not, we punt.  */
/* This file is only useful if BREAKPOINT is set.  If not, we punt.  */
 
 
#include "symtab.h"
#include "symtab.h"
#include "breakpoint.h"
#include "breakpoint.h"
#include "inferior.h"
#include "inferior.h"
#include "target.h"
#include "target.h"
 
 
 
 
/* Use the program counter to determine the contents and size
/* Use the program counter to determine the contents and size
   of a breakpoint instruction.  If no target-dependent macro
   of a breakpoint instruction.  If no target-dependent macro
   BREAKPOINT_FROM_PC has been defined to implement this function,
   BREAKPOINT_FROM_PC has been defined to implement this function,
   assume that the breakpoint doesn't depend on the PC, and
   assume that the breakpoint doesn't depend on the PC, and
   use the values of the BIG_BREAKPOINT and LITTLE_BREAKPOINT macros.
   use the values of the BIG_BREAKPOINT and LITTLE_BREAKPOINT macros.
   Return a pointer to a string of bytes that encode a breakpoint
   Return a pointer to a string of bytes that encode a breakpoint
   instruction, stores the length of the string to *lenptr,
   instruction, stores the length of the string to *lenptr,
   and optionally adjust the pc to point to the correct memory location
   and optionally adjust the pc to point to the correct memory location
   for inserting the breakpoint.  */
   for inserting the breakpoint.  */
 
 
unsigned char *
unsigned char *
memory_breakpoint_from_pc (pcptr, lenptr)
memory_breakpoint_from_pc (pcptr, lenptr)
     CORE_ADDR *pcptr;
     CORE_ADDR *pcptr;
     int *lenptr;
     int *lenptr;
{
{
  /* {BIG_,LITTLE_}BREAKPOINT is the sequence of bytes we insert for a
  /* {BIG_,LITTLE_}BREAKPOINT is the sequence of bytes we insert for a
     breakpoint.  On some machines, breakpoints are handled by the
     breakpoint.  On some machines, breakpoints are handled by the
     target environment and we don't have to worry about them here.  */
     target environment and we don't have to worry about them here.  */
#ifdef BIG_BREAKPOINT
#ifdef BIG_BREAKPOINT
  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
    {
    {
      static unsigned char big_break_insn[] = BIG_BREAKPOINT;
      static unsigned char big_break_insn[] = BIG_BREAKPOINT;
      *lenptr = sizeof (big_break_insn);
      *lenptr = sizeof (big_break_insn);
      return big_break_insn;
      return big_break_insn;
    }
    }
#endif
#endif
#ifdef LITTLE_BREAKPOINT
#ifdef LITTLE_BREAKPOINT
  if (TARGET_BYTE_ORDER != BIG_ENDIAN)
  if (TARGET_BYTE_ORDER != BIG_ENDIAN)
    {
    {
      static unsigned char little_break_insn[] = LITTLE_BREAKPOINT;
      static unsigned char little_break_insn[] = LITTLE_BREAKPOINT;
      *lenptr = sizeof (little_break_insn);
      *lenptr = sizeof (little_break_insn);
      return little_break_insn;
      return little_break_insn;
    }
    }
#endif
#endif
#ifdef BREAKPOINT
#ifdef BREAKPOINT
  {
  {
    static unsigned char break_insn[] = BREAKPOINT;
    static unsigned char break_insn[] = BREAKPOINT;
    *lenptr = sizeof (break_insn);
    *lenptr = sizeof (break_insn);
    return break_insn;
    return break_insn;
  }
  }
#endif
#endif
  *lenptr = 0;
  *lenptr = 0;
  return NULL;
  return NULL;
}
}
 
 
 
 
/* Insert a breakpoint on targets that don't have any better breakpoint
/* Insert a breakpoint on targets that don't have any better breakpoint
   support.  We read the contents of the target location and stash it,
   support.  We read the contents of the target location and stash it,
   then overwrite it with a breakpoint instruction.  ADDR is the target
   then overwrite it with a breakpoint instruction.  ADDR is the target
   location in the target machine.  CONTENTS_CACHE is a pointer to
   location in the target machine.  CONTENTS_CACHE is a pointer to
   memory allocated for saving the target contents.  It is guaranteed
   memory allocated for saving the target contents.  It is guaranteed
   by the caller to be long enough to save BREAKPOINT_LEN bytes (this
   by the caller to be long enough to save BREAKPOINT_LEN bytes (this
   is accomplished via BREAKPOINT_MAX).  */
   is accomplished via BREAKPOINT_MAX).  */
 
 
int
int
default_memory_insert_breakpoint (addr, contents_cache)
default_memory_insert_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     CORE_ADDR addr;
     char *contents_cache;
     char *contents_cache;
{
{
  int val;
  int val;
  unsigned char *bp;
  unsigned char *bp;
  int bplen;
  int bplen;
 
 
  /* Determine appropriate breakpoint contents and size for this address.  */
  /* Determine appropriate breakpoint contents and size for this address.  */
  bp = BREAKPOINT_FROM_PC (&addr, &bplen);
  bp = BREAKPOINT_FROM_PC (&addr, &bplen);
  if (bp == NULL)
  if (bp == NULL)
    error ("Software breakpoints not implemented for this target.");
    error ("Software breakpoints not implemented for this target.");
 
 
  /* Save the memory contents.  */
  /* Save the memory contents.  */
  val = target_read_memory (addr, contents_cache, bplen);
  val = target_read_memory (addr, contents_cache, bplen);
 
 
  /* Write the breakpoint.  */
  /* Write the breakpoint.  */
  if (val == 0)
  if (val == 0)
    val = target_write_memory (addr, (char *) bp, bplen);
    val = target_write_memory (addr, (char *) bp, bplen);
 
 
  return val;
  return val;
}
}
 
 
 
 
int
int
default_memory_remove_breakpoint (addr, contents_cache)
default_memory_remove_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     CORE_ADDR addr;
     char *contents_cache;
     char *contents_cache;
{
{
  unsigned char *bp;
  unsigned char *bp;
  int bplen;
  int bplen;
 
 
  /* Determine appropriate breakpoint contents and size for this address.  */
  /* Determine appropriate breakpoint contents and size for this address.  */
  bp = BREAKPOINT_FROM_PC (&addr, &bplen);
  bp = BREAKPOINT_FROM_PC (&addr, &bplen);
  if (bp == NULL)
  if (bp == NULL)
    error ("Software breakpoints not implemented for this target.");
    error ("Software breakpoints not implemented for this target.");
 
 
  return target_write_memory (addr, contents_cache, bplen);
  return target_write_memory (addr, contents_cache, bplen);
}
}
 
 
 
 
#if !defined(MEMORY_INSERT_BREAKPOINT)
#if !defined(MEMORY_INSERT_BREAKPOINT)
#define MEMORY_INSERT_BREAKPOINT(addr, contents_cache) \
#define MEMORY_INSERT_BREAKPOINT(addr, contents_cache) \
  default_memory_insert_breakpoint(addr, contents_cache)
  default_memory_insert_breakpoint(addr, contents_cache)
#endif
#endif
int
int
memory_insert_breakpoint (addr, contents_cache)
memory_insert_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     CORE_ADDR addr;
     char *contents_cache;
     char *contents_cache;
{
{
  return MEMORY_INSERT_BREAKPOINT(addr, contents_cache);
  return MEMORY_INSERT_BREAKPOINT(addr, contents_cache);
}
}
 
 
#if !defined(MEMORY_REMOVE_BREAKPOINT)
#if !defined(MEMORY_REMOVE_BREAKPOINT)
#define MEMORY_REMOVE_BREAKPOINT(addr, contents_cache) \
#define MEMORY_REMOVE_BREAKPOINT(addr, contents_cache) \
  default_memory_remove_breakpoint(addr, contents_cache)
  default_memory_remove_breakpoint(addr, contents_cache)
#endif
#endif
int
int
memory_remove_breakpoint (addr, contents_cache)
memory_remove_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     CORE_ADDR addr;
     char *contents_cache;
     char *contents_cache;
{
{
  return MEMORY_REMOVE_BREAKPOINT(addr, contents_cache);
  return MEMORY_REMOVE_BREAKPOINT(addr, contents_cache);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.