From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31615 invoked by alias); 31 Jul 2006 22:09:36 -0000 Received: (qmail 31597 invoked by uid 22791); 31 Jul 2006 22:09:35 -0000 X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 31 Jul 2006 22:09:31 +0000 Received: from elgar.sibelius.xs4all.nl (root@elgar.sibelius.xs4all.nl [192.168.0.2]) by sibelius.xs4all.nl (8.13.4/8.13.4) with ESMTP id k6VM83Jq021606; Tue, 1 Aug 2006 00:08:03 +0200 (CEST) Received: from elgar.sibelius.xs4all.nl (kettenis@localhost.sibelius.xs4all.nl [127.0.0.1]) by elgar.sibelius.xs4all.nl (8.13.6/8.13.6) with ESMTP id k6VM83Pf031912; Tue, 1 Aug 2006 00:08:03 +0200 (CEST) Received: (from kettenis@localhost) by elgar.sibelius.xs4all.nl (8.13.6/8.13.6/Submit) id k6VM82PM012536; Tue, 1 Aug 2006 00:08:02 +0200 (CEST) Date: Mon, 31 Jul 2006 22:09:00 -0000 Message-Id: <200607312208.k6VM82PM012536@elgar.sibelius.xs4all.nl> From: Mark Kettenis To: vladimir@codesourcery.com CC: eliz@gnu.org, gdb-patches@sources.redhat.com In-reply-to: <200607311720.26487.vladimir@codesourcery.com> (message from Vladimir Prus on Mon, 31 Jul 2006 17:20:23 +0400) Subject: Re: Flash support part 1: memory maps References: <200607201341.34070.vladimir@codesourcery.com> <200607311700.42502.vladimir@codesourcery.com> <200607311720.26487.vladimir@codesourcery.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-07/txt/msg00441.txt.bz2 > From: Vladimir Prus > Date: Mon, 31 Jul 2006 17:20:23 +0400 > > === gdb/target.c > ================================================================== > --- gdb/target.c (/mirrors/gdb) (revision 326) > +++ gdb/target.c (/patches/memory_map/gdb) (revision 326) > @@ -1011,6 +1012,50 @@ > return target_xfer_memory (memaddr, bytes, len, 1); > } > > + > +VEC(memory_region) * > +target_memory_map (void) > +{ > + struct target_ops *t; > + > + for (t = current_target.beneath; t != NULL; t = t->beneath) > + if (t->to_memory_map != NULL) > + { > + VEC(memory_region) *result; > + int i; > + > + if (targetdebug) > + fprintf_unfiltered (gdb_stdlog, "target_memory_map\n"); > + > + result = t->to_memory_map (t); > + > + qsort (VEC_address (memory_region, result), > + VEC_length (memory_region, result), > + sizeof (memory_region), > + compare_memory_region_starting_address); > + > + /* Check that regions do not overlap. */ > + if (!VEC_empty (memory_region, result)) > + for (i = 0; i < VEC_length (memory_region, result) - 1; ++i) > + { > + memory_region *this_one = VEC_index (memory_region, result, i); > + memory_region *next_one = VEC_index > + (memory_region, result, i+1); Missing spaces around the '+'. > === gdb/target.h > ================================================================== > --- gdb/target.h (/mirrors/gdb) (revision 326) > +++ gdb/target.h (/patches/memory_map/gdb) (revision 326) > @@ -55,6 +55,8 @@ > #include "symtab.h" > #include "dcache.h" > #include "memattr.h" > +#include "vec.h" > +#include "memory-map.h" > > enum strata > { > @@ -194,7 +196,9 @@ > /* Transfer auxilliary vector. */ > TARGET_OBJECT_AUXV, > /* StackGhost cookie. See "sparc-tdep.c". */ > - TARGET_OBJECT_WCOOKIE > + TARGET_OBJECT_WCOOKIE, > + /* Target memory map in XML format. */ > + TARGET_OBJECT_MEMORY_MAP, I'm still not sure how this fits in. Certainly if my target already provides a memory map in a nice data structure I'm not supposed to convert that into XML am I? I should be able to just implement to_memory_map and convert it directly into a VEC(memory_region). Arghh, I just realize that memory_region is a typedef for struct memory_region. I'm not too big a fan of that practice, since I stop realizing that it really is a struct and start doing stupid things with it... > > /* Possible future objects: TARGET_OBJECT_FILE, TARGET_OBJECT_PROC, ... */ > }; > @@ -437,6 +441,20 @@ > gdb_byte *readbuf, const gdb_byte *writebuf, > ULONGEST offset, LONGEST len); > > + /* Returns the memory map for the target. The return value of 0 means > + that no memory map is available. If a memory address does not fall > + within any returned regions, it's assumed to be RAM. The returned > + memory regions should not overlap. > + > + The order of regions does not matter, as target_memory_map will > + sort regions by starting address anyway. For that reason, this > + function should not be called directly, only via target_memory_map. > + > + This method is expected to cache the data if fetching it is slow. > + The higher-level code has no way of knowing when memory map > + could change, and so can't do caching itself. */ > + VEC(memory_region) * (*to_memory_map) (struct target_ops *); That's not a multiplication isn't it? I think you should remove the space after that first '*' (indent is too stupid and parses this as a binary operator). > + > +/* Returns the value of attribute ATTR from expat attribute list ATTRS. > + If not found, calls 'error'. */ > +const XML_Char *xml_get_attribute_value(const XML_Char **attrs, > + const XML_Char *attr) > +{ const XML_Char * xml_get_attr... > + > +int compare_memory_region_starting_address (const void* a, const void *b) > +{ > + ULONGEST a_begin = ((memory_region *)a)->begin; > + ULONGEST b_begin = ((memory_region *)b)->begin; > + return a_begin - b_begin; > +} int compare_memort_region... > === gdb/memory-map.h > ================================================================== > --- gdb/memory-map.h (/mirrors/gdb) (revision 326) > +++ gdb/memory-map.h (/patches/memory_map/gdb) (revision 326) > @@ -0,0 +1,142 @@ > +/* Routines for handling XML memory maps provided by target. > + > + Copyright (C) 2006 > + 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., 51 Franklin Street, Fifth Floor, > + Boston, MA 02110-1301, USA. */ > + > + > +#ifndef MEMORY_MAP_H > +#define MEMORY_MAP_H > + > +#include "vec.h" > + > +/* Describes various kinds of memory regions. */ > +enum memory_region_type > + { > + /* Memory that can be freely written and read. */ > + TARGET_MEMORY_RAM, > + /* Memory that can't be written at all. */ > + TARGET_MEMORY_ROM, > + /* Memory that can be written only using special operations. */ > + TARGET_MEMORY_FLASH > + }; > + > +/* Describes properties of a memory range. */ > +typedef struct memory_region > + { > + /* The first address of the region. */ > + ULONGEST begin; > + /* The past-the-end address of the region. */ > + ULONGEST end; > + /* Type of the memory in this region. */ > + enum memory_region_type memory_type; > + /* The size of flash memory sector. Some flash chips have non-uniform > + sector sizes, for example small sectors at beginning and end. > + In this case gdb will have to have several memory_region objects each > + one having uniform sector size. > + This field is defined only of MEMORY_TYPE == TARGET_MEMORY_FLASH. */ > + unsigned flash_block_size; > + } memory_region; > + > +DEF_VEC_O(memory_region); > + > +/* Casts both A and B to memory_region, compares they starting addresses > + and returns value less than zero, equal to zero, or greater then zero > + if A's starting address is less than B's starting address, equal to, > + or greater then, respectively. This function is suitable for sorting > + vector of memory_regions with the qsort function. */ > +int compare_memory_region_starting_address (const void* a, const void *b); > + > +/* Parses XML memory map passed as argument and returns the memory > + regions it describes. On any error, emits error message and > + returns 0. Does not throw. Ownership of result is passed to the caller. */ > +VEC(memory_region) *parse_memory_map (const char *memory_map); > + > +#endif > +/* Routines for handling XML memory maps provided by target. > + > + Copyright (C) 2006 > + 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., 51 Franklin Street, Fifth Floor, > + Boston, MA 02110-1301, USA. */ > + > + > +#ifndef MEMORY_MAP_H > +#define MEMORY_MAP_H > + > +#include "vec.h" > + > +/* Describes various kinds of memory regions. */ > +enum memory_region_type > + { > + /* Memory that can be freely written and read. */ > + TARGET_MEMORY_RAM, > + /* Memory that can't be written at all. */ > + TARGET_MEMORY_ROM, > + /* Memory that can be written only using special operations. */ > + TARGET_MEMORY_FLASH > + }; > + > +/* Describes properties of a memory range. */ > +typedef struct memory_region > + { > + /* The first address of the region. */ > + ULONGEST begin; > + /* The past-the-end address of the region. */ > + ULONGEST end; > + /* Type of the memory in this region. */ > + enum memory_region_type memory_type; > + /* The size of flash memory sector. Some flash chips have non-uniform > + sector sizes, for example small sectors at beginning and end. > + In this case gdb will have to have several memory_region objects each > + one having uniform sector size. > + This field is defined only of MEMORY_TYPE == TARGET_MEMORY_FLASH. */ > + unsigned flash_block_size; > + } memory_region; > + > +DEF_VEC_O(memory_region); > + > +/* Casts both A and B to memory_region, compares they starting addresses > + and returns value less than zero, equal to zero, or greater then zero > + if A's starting address is less than B's starting address, equal to, > + or greater then, respectively. This function is suitable for sorting > + vector of memory_regions with the qsort function. */ > +int compare_memory_region_starting_address (const void* a, const void *b); > + > +/* Parses XML memory map passed as argument and returns the memory > + regions it describes. On any error, emits error message and > + returns 0. Does not throw. Ownership of result is passed to the caller. */ > +VEC(memory_region) *parse_memory_map (const char *memory_map); > + > +#endif You really don't have to say things twice ;-). Mark