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

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [gdb-5.0/] [opcodes/] [dis-buf.c] - Diff between revs 579 and 1765

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

Rev 579 Rev 1765
/* Disassemble from a buffer, for GNU.
/* Disassemble from a buffer, for GNU.
   Copyright (C) 1993, 1994, 1998, 1999 Free Software Foundation, Inc.
   Copyright (C) 1993, 1994, 1998, 1999 Free Software Foundation, Inc.
 
 
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, Boston, MA 02111-1307, USA.  */
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
#include "sysdep.h"
#include "sysdep.h"
#include "dis-asm.h"
#include "dis-asm.h"
#include <errno.h>
#include <errno.h>
#include "opintl.h"
#include "opintl.h"
 
 
/* Get LENGTH bytes from info's buffer, at target address memaddr.
/* Get LENGTH bytes from info's buffer, at target address memaddr.
   Transfer them to myaddr.  */
   Transfer them to myaddr.  */
int
int
buffer_read_memory (memaddr, myaddr, length, info)
buffer_read_memory (memaddr, myaddr, length, info)
     bfd_vma memaddr;
     bfd_vma memaddr;
     bfd_byte *myaddr;
     bfd_byte *myaddr;
     unsigned int length;
     unsigned int length;
     struct disassemble_info *info;
     struct disassemble_info *info;
{
{
  unsigned int opb = info->octets_per_byte;
  unsigned int opb = info->octets_per_byte;
  unsigned int end_addr_offset = length / opb;
  unsigned int end_addr_offset = length / opb;
  unsigned int max_addr_offset = info->buffer_length / opb;
  unsigned int max_addr_offset = info->buffer_length / opb;
  unsigned int octets = (memaddr - info->buffer_vma) * opb;
  unsigned int octets = (memaddr - info->buffer_vma) * opb;
 
 
  if (memaddr < info->buffer_vma
  if (memaddr < info->buffer_vma
      || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset)
      || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset)
    /* Out of bounds.  Use EIO because GDB uses it.  */
    /* Out of bounds.  Use EIO because GDB uses it.  */
    return EIO;
    return EIO;
  memcpy (myaddr, info->buffer + octets, length);
  memcpy (myaddr, info->buffer + octets, length);
 
 
  return 0;
  return 0;
}
}
 
 
/* Print an error message.  We can assume that this is in response to
/* Print an error message.  We can assume that this is in response to
   an error return from buffer_read_memory.  */
   an error return from buffer_read_memory.  */
void
void
perror_memory (status, memaddr, info)
perror_memory (status, memaddr, info)
     int status;
     int status;
     bfd_vma memaddr;
     bfd_vma memaddr;
     struct disassemble_info *info;
     struct disassemble_info *info;
{
{
  if (status != EIO)
  if (status != EIO)
    /* Can't happen.  */
    /* Can't happen.  */
    info->fprintf_func (info->stream, _("Unknown error %d\n"), status);
    info->fprintf_func (info->stream, _("Unknown error %d\n"), status);
  else
  else
    /* Actually, address between memaddr and memaddr + len was
    /* Actually, address between memaddr and memaddr + len was
       out of bounds.  */
       out of bounds.  */
    info->fprintf_func (info->stream,
    info->fprintf_func (info->stream,
                        _("Address 0x%x is out of bounds.\n"), memaddr);
                        _("Address 0x%x is out of bounds.\n"), memaddr);
}
}
 
 
/* This could be in a separate file, to save miniscule amounts of space
/* This could be in a separate file, to save miniscule amounts of space
   in statically linked executables.  */
   in statically linked executables.  */
 
 
/* Just print the address is hex.  This is included for completeness even
/* Just print the address is hex.  This is included for completeness even
   though both GDB and objdump provide their own (to print symbolic
   though both GDB and objdump provide their own (to print symbolic
   addresses).  */
   addresses).  */
 
 
void
void
generic_print_address (addr, info)
generic_print_address (addr, info)
     bfd_vma addr;
     bfd_vma addr;
     struct disassemble_info *info;
     struct disassemble_info *info;
{
{
  char buf[30];
  char buf[30];
 
 
  sprintf_vma (buf, addr);
  sprintf_vma (buf, addr);
  (*info->fprintf_func) (info->stream, "0x%s", buf);
  (*info->fprintf_func) (info->stream, "0x%s", buf);
}
}
 
 
/* Just concatenate the address as hex.  This is included for
/* Just concatenate the address as hex.  This is included for
   completeness even though both GDB and objdump provide their own (to
   completeness even though both GDB and objdump provide their own (to
   print symbolic addresses).  */
   print symbolic addresses).  */
 
 
void
void
generic_strcat_address (addr, buf, len)
generic_strcat_address (addr, buf, len)
     bfd_vma addr;
     bfd_vma addr;
     char *buf;
     char *buf;
     int len;
     int len;
{
{
  if (buf != (char *)NULL && len > 0)
  if (buf != (char *)NULL && len > 0)
    {
    {
      char tmpBuf[30];
      char tmpBuf[30];
 
 
      sprintf_vma (tmpBuf, addr);
      sprintf_vma (tmpBuf, addr);
      if ((strlen (buf) + strlen (tmpBuf)) <= (unsigned int) len)
      if ((strlen (buf) + strlen (tmpBuf)) <= (unsigned int) len)
        strcat (buf, tmpBuf);
        strcat (buf, tmpBuf);
      else
      else
        strncat (buf, tmpBuf, (len - strlen(buf)));
        strncat (buf, tmpBuf, (len - strlen(buf)));
    }
    }
  return;
  return;
}
}
 
 
/* Just return the given address.  */
/* Just return the given address.  */
 
 
int
int
generic_symbol_at_address (addr, info)
generic_symbol_at_address (addr, info)
     bfd_vma addr ATTRIBUTE_UNUSED;
     bfd_vma addr ATTRIBUTE_UNUSED;
     struct disassemble_info *info ATTRIBUTE_UNUSED;
     struct disassemble_info *info ATTRIBUTE_UNUSED;
{
{
  return 1;
  return 1;
}
}
 
 

powered by: WebSVN 2.1.0

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