X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmemattr.c;h=8c46d7eb168ec78a07239c7a320b7793adc0d83d;hb=de4112fa387b662c7c7a1dd3e334a1274ca54d28;hp=ba642912926723221f1651499f0eb40e059aa61d;hpb=f4d650ecb379a6d7d92e60d43d9c9773a192395e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/memattr.c b/gdb/memattr.c index ba64291292..8c46d7eb16 100644 --- a/gdb/memattr.c +++ b/gdb/memattr.c @@ -1,4 +1,24 @@ -/* memattr.c */ +/* Memory attributes support, for GDB. + + Copyright 2001, 2002 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + #include "defs.h" #include "command.h" #include "gdbcmd.h" @@ -8,23 +28,13 @@ #include "language.h" #include "gdb_string.h" -/* FIXME: While this conflicts with the enum defined in breakpoint.h, - I used them to be consistant with how breakpoints, tracepoints, and - displays are implemented. It doesn't lose now because breakpoint.h - is not included. */ -enum enable -{ - disabled, - enabled -}; - const struct mem_attrib default_mem_attrib = { MEM_RW, /* mode */ MEM_WIDTH_UNSPECIFIED, - false, /* hwbreak */ - false, /* cache */ - false /* verify */ + 0, /* hwbreak */ + 0, /* cache */ + 0 /* verify */ }; static struct mem_region *mem_region_chain = NULL; @@ -34,11 +44,12 @@ static struct mem_region * create_mem_region (CORE_ADDR lo, CORE_ADDR hi, const struct mem_attrib *attrib) { - struct mem_region *n, *p, *new; + struct mem_region *n, *new; - if (lo > hi) + /* lo == hi is a useless empty region */ + if (lo >= hi) { - printf_unfiltered ("invalid memory region\n"); + printf_unfiltered ("invalid memory region: low >= high\n"); return NULL; } @@ -46,19 +57,20 @@ create_mem_region (CORE_ADDR lo, CORE_ADDR hi, while (n) { /* overlapping node */ - if ((lo >= n->lo && lo <= n->hi) || - (hi >= n->lo && hi <= n->hi)) + if ((lo >= n->lo && lo < n->hi) || + (hi > n->lo && hi <= n->hi)) { printf_unfiltered ("overlapping memory region\n"); return NULL; } + n = n->next; } new = xmalloc (sizeof (struct mem_region)); new->lo = lo; new->hi = hi; new->number = ++mem_number; - new->status = enabled; + new->enabled_p = 1; new->attrib = *attrib; /* link in new node */ @@ -97,7 +109,7 @@ lookup_mem_region (CORE_ADDR addr) for (m = mem_region_chain; m; m = m->next) { - if (m->status == enabled) + if (m->enabled_p == 1) { if (addr >= m->lo && addr < m->hi) return m; @@ -172,21 +184,21 @@ mem_command (char *args, int from_tty) #if 0 else if (strcmp (tok, "hwbreak") == 0) - attrib.hwbreak = true; + attrib.hwbreak = 1; else if (strcmp (tok, "swbreak") == 0) - attrib.hwbreak = false; + attrib.hwbreak = 0; #endif else if (strcmp (tok, "cache") == 0) - attrib.cache = true; + attrib.cache = 1; else if (strcmp (tok, "nocache") == 0) - attrib.cache = false; + attrib.cache = 0; #if 0 else if (strcmp (tok, "verify") == 0) - attrib.verify = true; + attrib.verify = 1; else if (strcmp (tok, "noverify") == 0) - attrib.verify = false; + attrib.verify = 0; #endif else @@ -209,16 +221,36 @@ mem_info_command (char *args, int from_tty) return; } - printf_filtered ("Memory regions now in effect:\n"); + printf_filtered ("Num "); + printf_filtered ("Enb "); + printf_filtered ("Low Addr "); + if (TARGET_ADDR_BIT > 32) + printf_filtered (" "); + printf_filtered ("High Addr "); + if (TARGET_ADDR_BIT > 32) + printf_filtered (" "); + printf_filtered ("Attrs "); + printf_filtered ("\n"); + for (m = mem_region_chain; m; m = m->next) { - printf_filtered ("%d: %c\t", + char *tmp; + printf_filtered ("%-3d %-3c\t", m->number, - m->status ? 'y' : 'n'); - printf_filtered ("%s - ", - local_hex_string_custom ((unsigned long) m->lo, "08l")); - printf_filtered ("%s\t", - local_hex_string_custom ((unsigned long) m->hi, "08l")); + m->enabled_p ? 'y' : 'n'); + if (TARGET_ADDR_BIT <= 32) + tmp = local_hex_string_custom ((unsigned long) m->lo, "08l"); + else + tmp = local_hex_string_custom ((unsigned long) m->lo, "016l"); + + printf_filtered ("%s ", tmp); + + if (TARGET_ADDR_BIT <= 32) + tmp = local_hex_string_custom ((unsigned long) m->hi, "08l"); + else + tmp = local_hex_string_custom ((unsigned long) m->hi, "016l"); + + printf_filtered ("%s ", tmp); /* Print a token for each attribute. @@ -300,7 +332,7 @@ mem_enable (int num) for (m = mem_region_chain; m; m = m->next) if (m->number == num) { - m->status = enabled; + m->enabled_p = 1; return; } printf_unfiltered ("No memory region number %d.\n", num); @@ -319,7 +351,7 @@ mem_enable_command (char *args, int from_tty) if (p == 0) { for (m = mem_region_chain; m; m = m->next) - m->status = enabled; + m->enabled_p = 1; } else while (*p) @@ -350,7 +382,7 @@ mem_disable (int num) for (m = mem_region_chain; m; m = m->next) if (m->number == num) { - m->status = disabled; + m->enabled_p = 0; return; } printf_unfiltered ("No memory region number %d.\n", num); @@ -369,7 +401,7 @@ mem_disable_command (char *args, int from_tty) if (p == 0) { for (m = mem_region_chain; m; m = m->next) - m->status = disabled; + m->enabled_p = 0; } else while (*p) @@ -475,21 +507,28 @@ void _initialize_mem () { add_com ("mem", class_vars, mem_command, - "Define attributes for memory region."); + "Define attributes for memory region.\n\ +Usage: mem [ ], \n\ +where may be rw (read/write), ro (read-only) or wo (write-only), \n\ + may be 8, 16, 32, or 64, and \n\ + may be cache or nocache"); add_cmd ("mem", class_vars, mem_enable_command, "Enable memory region.\n\ Arguments are the code numbers of the memory regions to enable.\n\ +Usage: enable mem \n\ Do \"info mem\" to see current list of code numbers.", &enablelist); add_cmd ("mem", class_vars, mem_disable_command, "Disable memory region.\n\ Arguments are the code numbers of the memory regions to disable.\n\ +Usage: disable mem \n\ Do \"info mem\" to see current list of code numbers.", &disablelist); add_cmd ("mem", class_vars, mem_delete_command, "Delete memory region.\n\ Arguments are the code numbers of the memory regions to delete.\n\ +Usage: delete mem \n\ Do \"info mem\" to see current list of code numbers.", &deletelist); add_info ("mem", mem_info_command,