diff options
author | David Brownell <dbrownell@users.sourceforge.net> | 2010-01-13 23:33:25 -0800 |
---|---|---|
committer | David Brownell <dbrownell@users.sourceforge.net> | 2010-01-13 23:33:25 -0800 |
commit | 73566405b6e105b0a8b7f21db48331926bec97ad (patch) | |
tree | d1f38082d0c060b6220a265470b35685c8426907 /src/server | |
parent | d91941d5a01ca0b9d43571edc03ba18741076cca (diff) | |
download | openocd+libswd-73566405b6e105b0a8b7f21db48331926bec97ad.tar.gz openocd+libswd-73566405b6e105b0a8b7f21db48331926bec97ad.tar.bz2 openocd+libswd-73566405b6e105b0a8b7f21db48331926bec97ad.tar.xz openocd+libswd-73566405b6e105b0a8b7f21db48331926bec97ad.zip |
NOR: add optional "flash erase_address" sector padding
Add a NOR flash mechanism where erase_address ranges can be padded
out to sector boundaries, triggering a diagnostic:
> flash erase_address 0x0001f980 16
address range 0x0001f980 .. 0x0001f98f is not sector-aligned
Command handler execution failed
in procedure 'flash' called at file "command.c", line 647
called at file "command.c", line 361
>
> flash erase_address pad 0x0001f980 16
Adding extra erase range, 0x0001f800 to 0x0001f97f
Adding extra erase range, 0x0001f990 to 0x0001fbff
erased address 0x0001f980 (length 16) in 0.095975s (0.163 kb/s)
>
This addresses what would otherwise be something of a functional
regression. An earlier version of the interface had a dangerous
problem: it would silently erase data outside the range it was
told to erase. Fixing that bug turned up some folk who relied on
that unsafe behavior. (The classic problem with interface bugs!)
Now they can get that behavior again. If they really need it,
just specify "pad".
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/gdb_server.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 8018e6f9..4191cc2a 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -1928,9 +1928,19 @@ int gdb_v_packet(struct connection *connection, struct target *target, char *pac flash_set_dirty(); /* perform any target specific operations before the erase */ - target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_ERASE_START); - result = flash_erase_address_range(gdb_service->target, addr, length); - target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_ERASE_END); + target_call_event_callbacks(gdb_service->target, + TARGET_EVENT_GDB_FLASH_ERASE_START); + + /* vFlashErase:addr,length messages require region start and + * end to be "block" aligned ... if padding is ever needed, + * GDB will have become dangerously confused. + */ + result = flash_erase_address_range(gdb_service->target, + false, addr, length); + + /* perform any target specific operations after the erase */ + target_call_event_callbacks(gdb_service->target, + TARGET_EVENT_GDB_FLASH_ERASE_END); /* perform erase */ if (result != ERROR_OK) |