From abb6fe6ca2e1299f939c73709adc32c1c2121bf0 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 12 Aug 2024 18:37:18 +0100 Subject: [PATCH] Refrain from erasing read-only parts of a memory --- src/term.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/term.c b/src/term.c index 85cb2d4c6..e097185b1 100644 --- a/src/term.c +++ b/src/term.c @@ -1193,16 +1193,47 @@ static int cmd_erase(const PROGRAMMER *pgm, const AVRPART *p, int argc, const ch return -1; } const char *args[] = {"write", memstr, "", "", "0xff", "...", NULL}; - // erase - if (argc == 2) { + // Erase + if (argc == 2 && pgm->readonly) { // Process intervals that are writable + int addr, start = 0, end, memend = mem->size - 1; + do { + for(addr = start; addr <= memend; addr++) + if(!pgm->readonly(pgm, p, mem, addr)) { + start = addr; + break; + } + if(addr > memend) + break; + end = memend; + for(addr = start+1; addr <= memend; addr++) + if(pgm->readonly(pgm, p, mem, addr)) { + end = addr-1; + break; + } + if(start <= end) { + char nums[2][128]; + sprintf(nums[0], "0x%04x", start); + sprintf(nums[1], "0x%04x", end-start+1); + args[2] = nums[0]; + args[3] = nums[1]; + if(cmd_write(pgm, p, 6, args) < 0) + return -1; + } + start = end+1; + } while (start <= memend); + + return 0; + } + + if(argc == 2) { args[2] = "0"; args[3] = "-1"; + return cmd_write(pgm, p, 6, args); } - // erase - else { - args[2] = argv[2]; - args[3] = argv[3]; - } + + // Erase + args[2] = argv[2]; + args[3] = argv[3]; return cmd_write(pgm, p, 6, args); }