Flash support part 1: memory maps
Vladimir Prus
vladimir@codesourcery.com
Tue Aug 1 05:11:00 GMT 2006
On Tuesday 01 August 2006 02:08, Mark Kettenis wrote:
> > + 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 '+'.
Ok.
> > === 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).
Yes. The remote implementation of to_memory_map uses TARGET_OBJECT_MEMORY_MAP,
but implementation for another target is not required to.
> 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...
Well, "struct memory_region" is too long and really a lot of lines will run
out of 80 columns immediately.
> > /* 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).
Ok.
>
> > +
> > +/* 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...
OK.
> > === 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.
.....
> You really don't have to say things twice ;-).
Ick. Either "patch" or "svk" is playing tricks on me.
Revised patch attached (changelog unchaged).
- Volodya
-------------- next part --------------
A non-text attachment was scrubbed...
Name: memory_map__gdb.diff
Type: text/x-diff
Size: 25682 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20060801/da501d34/attachment.bin>
More information about the Gdb-patches
mailing list