(root)/
binutils-2.41/
opcodes/
dis-buf.c
       1  /* Disassemble from a buffer, for GNU.
       2     Copyright (C) 1993-2023 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    size_t end_addr_offset = length / opb;
      36    size_t max_addr_offset = info->buffer_length / opb;
      37    size_t 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        /* Actually, address between memaddr and memaddr + len was
      65  	 out of bounds.  */
      66        info->fprintf_func (info->stream,
      67  			  _("Address 0x%" PRIx64 " is out of bounds.\n"),
      68  			  (uint64_t) memaddr);
      69      }
      70  }
      71  
      72  /* This could be in a separate file, to save miniscule amounts of space
      73     in statically linked executables.  */
      74  
      75  /* Just print the address is hex.  This is included for completeness even
      76     though both GDB and objdump provide their own (to print symbolic
      77     addresses).  */
      78  
      79  void
      80  generic_print_address (bfd_vma addr, struct disassemble_info *info)
      81  {
      82    (*info->fprintf_func) (info->stream, "0x%08" PRIx64, (uint64_t) addr);
      83  }
      84  
      85  /* Just return NULL.  */
      86  
      87  asymbol *
      88  generic_symbol_at_address (bfd_vma addr ATTRIBUTE_UNUSED,
      89  			   struct disassemble_info *info ATTRIBUTE_UNUSED)
      90  {
      91    return NULL;
      92  }
      93  
      94  /* Just return TRUE.  */
      95  
      96  bool
      97  generic_symbol_is_valid (asymbol * sym ATTRIBUTE_UNUSED,
      98  			 struct disassemble_info *info ATTRIBUTE_UNUSED)
      99  {
     100    return true;
     101  }