/* Memory attributes support, for GDB.

   Copyright (C) 2001-2025 Free Software Foundation, Inc.

   This file is part of GDB.

   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
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef GDB_MEMATTR_H
#define GDB_MEMATTR_H

enum mem_access_mode
{
  MEM_NONE,                     /* Memory that is not physically present.  */
  MEM_RW,			/* read/write */
  MEM_RO,			/* read only */
  MEM_WO,			/* write only */

  /* Read/write, but special steps are required to write to it.  */
  MEM_FLASH
};

enum mem_access_width
{
  MEM_WIDTH_UNSPECIFIED,
  MEM_WIDTH_8,			/*  8 bit accesses */
  MEM_WIDTH_16,			/* 16  "      "    */
  MEM_WIDTH_32,			/* 32  "      "    */
  MEM_WIDTH_64			/* 64  "      "    */
};

/* The set of all attributes that can be set for a memory region.
  
   This structure was created so that memory attributes can be passed
   to target_ functions without exposing the details of memory region
   list, which would be necessary if these fields were simply added to
   the mem_region structure.

   FIXME: It would be useful if there was a mechanism for targets to
   add their own attributes.  For example, the number of wait states.  */
 
struct mem_attrib 
{
  static mem_attrib unknown ()
  {
    mem_attrib attrib;

    attrib.mode = MEM_NONE;

    return attrib;
  }

  /* read/write, read-only, or write-only */
  enum mem_access_mode mode = MEM_RW;

  enum mem_access_width width = MEM_WIDTH_UNSPECIFIED;

  /* enables hardware breakpoints */
  int hwbreak = 0;
  
  /* enables host-side caching of memory region data */
  int cache = 0;
  
  /* Enables memory verification.  After a write, memory is re-read
     to verify that the write was successful.  */
  int verify = 0;

  /* Block size.  Only valid if mode == MEM_FLASH.  */
  int blocksize = -1;
};

struct mem_region 
{
  /* Create a mem_region with default attributes.  */

  mem_region (CORE_ADDR lo_, CORE_ADDR hi_)
    : lo (lo_), hi (hi_)
  {}

  /* Create a mem_region with access mode MODE_, but otherwise default
     attributes.  */

  mem_region (CORE_ADDR lo_, CORE_ADDR hi_, mem_access_mode mode_)
    : lo (lo_), hi (hi_)
  {
    attrib.mode = mode_;
  }

  /* Create a mem_region with attributes ATTRIB_.  */

  mem_region (CORE_ADDR lo_, CORE_ADDR hi_, const mem_attrib &attrib_)
    : lo (lo_), hi (hi_), attrib (attrib_)
  {}

  bool operator< (const mem_region &other) const
  {
    return this->lo < other.lo;
  }

  /* Lowest address in the region.  */
  CORE_ADDR lo;
  /* Address past the highest address of the region. 
     If 0, upper bound is "infinity".  */
  CORE_ADDR hi;

  /* Item number of this memory region.  */
  int number = 0;

  /* Status of this memory region (enabled if true, otherwise
     disabled).  */
  bool enabled_p = true;

  /* Attributes for this region.  */
  mem_attrib attrib;
};

extern struct mem_region *lookup_mem_region (CORE_ADDR);

void invalidate_target_mem_regions (void);

#endif /* GDB_MEMATTR_H */
