Subversion Repositories Kolibri OS

Rev

Rev 5221 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Disassemble from a buffer, for GNU.
  2.    Copyright (C) 1993-2015 Free Software Foundation, Inc.
  3.  
  4.    This file is part of the GNU opcodes library.
  5.  
  6.    This library is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 3, or (at your option)
  9.    any later version.
  10.  
  11.    It is distributed in the hope that it will be useful, but WITHOUT
  12.    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13.    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
  14.    License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with this program; if not, write to the Free Software
  18.    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  19.    MA 02110-1301, USA.  */
  20.  
  21. #include "sysdep.h"
  22. #include "dis-asm.h"
  23. #include <errno.h>
  24. #include "opintl.h"
  25.  
  26. /* Get LENGTH bytes from info's buffer, at target address memaddr.
  27.    Transfer them to myaddr.  */
  28. int
  29. buffer_read_memory (bfd_vma memaddr,
  30.                     bfd_byte *myaddr,
  31.                     unsigned int length,
  32.                     struct disassemble_info *info)
  33. {
  34.   unsigned int opb = info->octets_per_byte;
  35.   unsigned int end_addr_offset = length / opb;
  36.   unsigned int max_addr_offset = info->buffer_length / opb;
  37.   unsigned int octets = (memaddr - info->buffer_vma) * opb;
  38.  
  39.   if (memaddr < info->buffer_vma
  40.       || memaddr - info->buffer_vma > max_addr_offset
  41.       || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset
  42.       || (info->stop_vma && (memaddr >= info->stop_vma
  43.                              || memaddr + end_addr_offset > info->stop_vma)))
  44.     /* Out of bounds.  Use EIO because GDB uses it.  */
  45.     return EIO;
  46.   memcpy (myaddr, info->buffer + octets, length);
  47.  
  48.   return 0;
  49. }
  50.  
  51. /* Print an error message.  We can assume that this is in response to
  52.    an error return from buffer_read_memory.  */
  53.  
  54. void
  55. perror_memory (int status,
  56.                bfd_vma memaddr,
  57.                struct disassemble_info *info)
  58. {
  59.   if (status != EIO)
  60.     /* Can't happen.  */
  61.     info->fprintf_func (info->stream, _("Unknown error %d\n"), status);
  62.   else
  63.     {
  64.       char buf[30];
  65.  
  66.       /* Actually, address between memaddr and memaddr + len was
  67.          out of bounds.  */
  68.       sprintf_vma (buf, memaddr);
  69.       info->fprintf_func (info->stream,
  70.                           _("Address 0x%s is out of bounds.\n"), buf);
  71.     }
  72. }
  73.  
  74. /* This could be in a separate file, to save miniscule amounts of space
  75.    in statically linked executables.  */
  76.  
  77. /* Just print the address is hex.  This is included for completeness even
  78.    though both GDB and objdump provide their own (to print symbolic
  79.    addresses).  */
  80.  
  81. void
  82. generic_print_address (bfd_vma addr, struct disassemble_info *info)
  83. {
  84.   char buf[30];
  85.  
  86.   sprintf_vma (buf, addr);
  87.   (*info->fprintf_func) (info->stream, "0x%s", buf);
  88. }
  89.  
  90. /* Just return true.  */
  91.  
  92. int
  93. generic_symbol_at_address (bfd_vma addr ATTRIBUTE_UNUSED,
  94.                            struct disassemble_info *info ATTRIBUTE_UNUSED)
  95. {
  96.   return 1;
  97. }
  98.  
  99. /* Just return TRUE.  */
  100.  
  101. bfd_boolean
  102. generic_symbol_is_valid (asymbol * sym ATTRIBUTE_UNUSED,
  103.                          struct disassemble_info *info ATTRIBUTE_UNUSED)
  104. {
  105.   return TRUE;
  106. }
  107.