From 640e9515ea99dc2c9ba5d24cb6e04bf4bfc8d934 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:03:36 +0100 Subject: [PATCH 01/11] Utilise magic memory tree interface for stk500v2.c --- src/stk500v2.c | 176 ++++++++++++++++--------------------------------- 1 file changed, 58 insertions(+), 118 deletions(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index 10c4b685..f43a56a4 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -292,27 +292,17 @@ static void stk600_setup_xprog(PROGRAMMER *pgm); static void stk600_setup_isp(PROGRAMMER *pgm); static int stk600_xprog_program_enable(const PROGRAMMER *pgm, const AVRPART *p); -void stk500v2_setup(PROGRAMMER * pgm) -{ - if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) { - pmsg_error("out of memory allocating private data\n"); - exit(1); - } - memset(pgm->cookie, 0, sizeof(struct pdata)); +void stk500v2_setup(PROGRAMMER *pgm) { + pgm->cookie = mmt_malloc(sizeof(struct pdata)); PDATA(pgm)->command_sequence = 1; PDATA(pgm)->boot_start = ULONG_MAX; PDATA(pgm)->xtal = str_starts(pgmid, "scratchmonkey") ? SCRATCHMONKEY_XTAL : STK500V2_XTAL; } -static void stk500v2_jtagmkII_setup(PROGRAMMER * pgm) -{ +static void stk500v2_jtagmkII_setup(PROGRAMMER *pgm) { void *mycookie, *theircookie; - if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) { - pmsg_error("out of memory allocating private data\n"); - exit(1); - } - memset(pgm->cookie, 0, sizeof(struct pdata)); + pgm->cookie = mmt_malloc(sizeof(struct pdata)); PDATA(pgm)->command_sequence = 1; /* @@ -326,15 +316,10 @@ static void stk500v2_jtagmkII_setup(PROGRAMMER * pgm) PDATA(pgm)->chained_pdata = theircookie; } -static void stk500v2_jtag3_setup(PROGRAMMER * pgm) -{ +static void stk500v2_jtag3_setup(PROGRAMMER *pgm) { void *mycookie, *theircookie; - if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) { - pmsg_error("out of memory allocating private data\n"); - exit(1); - } - memset(pgm->cookie, 0, sizeof(struct pdata)); + pgm->cookie = mmt_malloc(sizeof(struct pdata)); PDATA(pgm)->command_sequence = 1; /* @@ -348,35 +333,31 @@ static void stk500v2_jtag3_setup(PROGRAMMER * pgm) PDATA(pgm)->chained_pdata = theircookie; } -void stk500v2_teardown(PROGRAMMER * pgm) -{ - free(pgm->cookie); +void stk500v2_teardown(PROGRAMMER *pgm) { + mmt_free(pgm->cookie); pgm->cookie = NULL; } -static void stk500v2_jtagmkII_teardown(PROGRAMMER * pgm) -{ +static void stk500v2_jtagmkII_teardown(PROGRAMMER *pgm) { void *mycookie; - free(PDATA(pgm)->flash_pagecache); - free(PDATA(pgm)->eeprom_pagecache); + mmt_free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); mycookie = pgm->cookie; pgm->cookie = PDATA(pgm)->chained_pdata; jtagmkII_teardown(pgm); - free(mycookie); + mmt_free(mycookie); } -static void stk500v2_jtag3_teardown(PROGRAMMER * pgm) -{ - void *mycookie; +static void stk500v2_jtag3_teardown(PROGRAMMER *pgm) { + void *mycookie = pgm->cookie; - mycookie = pgm->cookie; pgm->cookie = PDATA(pgm)->chained_pdata; jtag3_teardown(pgm); - free(mycookie); + mmt_free(mycookie); } @@ -469,10 +450,7 @@ static int stk500v2_jtagmkII_send(const PROGRAMMER *pgm, unsigned char *data, si sz = 3 + data[2]; } - if ((cmdbuf = malloc(len + 3)) == NULL) { - pmsg_error("out of memory for command packet\n"); - exit(1); - } + cmdbuf = mmt_malloc(len + 3); PROGRAMMER *pgmcp = pgm_dup(pgm); pgmcp->cookie = PDATA(pgm)->chained_pdata; cmdbuf[0] = CMND_ISP_PACKET; @@ -480,7 +458,7 @@ static int stk500v2_jtagmkII_send(const PROGRAMMER *pgm, unsigned char *data, si cmdbuf[2] = (sz >> 8) & 0xff; memcpy(cmdbuf + 3, data, len); rv = jtagmkII_send(pgmcp, cmdbuf, len + 3); - free(cmdbuf); + mmt_free(cmdbuf); pgm_free(pgmcp); return rv; @@ -493,17 +471,13 @@ static int stk500v2_jtag3_send(const PROGRAMMER *pgm, unsigned char *data, size_ unsigned char *cmdbuf; int rv; - if ((cmdbuf = malloc(len + 1)) == NULL) { - pmsg_error("out of memory for command packet\n"); - exit(1); - } - + cmdbuf = mmt_malloc(len + 1); PROGRAMMER *pgmcp = pgm_dup(pgm); pgmcp->cookie = PDATA(pgm)->chained_pdata; cmdbuf[0] = SCOPE_AVR_ISP; memcpy(cmdbuf + 1, data, len); rv = jtag3_send(pgmcp, cmdbuf, len + 1); - free(cmdbuf); + mmt_free(cmdbuf); pgm_free(pgmcp); return rv; @@ -596,7 +570,7 @@ static int stk500v2_jtagmkII_recv(const PROGRAMMER *pgm, unsigned char *msg, return -1; } memcpy(msg, jtagmsg + 1, rv - 1); - free(jtagmsg); + free(jtagmsg); // Sic! jtagmsg was malloc'd return rv; } @@ -625,11 +599,11 @@ static int stk500v2_jtag3_recv(const PROGRAMMER *pgm, unsigned char *msg, } if (jtagmsg[0] != SCOPE_AVR_ISP) { pmsg_error("message is not AVR ISP: 0x%02x\n", jtagmsg[0]); - free(jtagmsg); + mmt_free(jtagmsg); return -1; } memcpy(msg, jtagmsg + 1, rv - 1); - free(jtagmsg); + mmt_free(jtagmsg); return rv; } @@ -1158,15 +1132,15 @@ retry: cmd[1] = CMD3_SIGN_ON; cmd[2] = cmd[3] = 0; if (jtag3_command(pgmcp, cmd, 4, &resp, "AVR sign-on") >= 0) { - free(resp); + mmt_free(resp); cmd[1] = CMD3_START_DW_DEBUG; if (jtag3_command(pgmcp, cmd, 4, &resp, "start DW debug") >= 0) { - free(resp); + mmt_free(resp); cmd[1] = CMD3_MONCON_DISABLE; if (jtag3_command(pgmcp, cmd, 3, &resp, "MonCon disable") >= 0) - free(resp); + mmt_free(resp); } } pgm_free(pgmcp); @@ -1353,17 +1327,10 @@ static int stk500v2_initialize(const PROGRAMMER *pgm, const AVRPART *p) { PDATA(pgm)->eeprom_pagesize = m->page_size; } } - free(PDATA(pgm)->flash_pagecache); - free(PDATA(pgm)->eeprom_pagecache); - if ((PDATA(pgm)->flash_pagecache = malloc(PDATA(pgm)->flash_pagesize)) == NULL) { - pmsg_error("out of memory\n"); - return -1; - } - if ((PDATA(pgm)->eeprom_pagecache = malloc(PDATA(pgm)->eeprom_pagesize)) == NULL) { - pmsg_error("out of memory\n"); - free(PDATA(pgm)->flash_pagecache); - return -1; - } + mmt_free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); + PDATA(pgm)->flash_pagecache = mmt_malloc(PDATA(pgm)->flash_pagesize); + PDATA(pgm)->eeprom_pagecache = mmt_malloc(PDATA(pgm)->eeprom_pagesize); PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; if (p->flags & AVRPART_IS_AT90S1200) { @@ -1421,7 +1388,7 @@ static int stk500v2_jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { jtag3_send(pgmcp, parm, 2); if (jtag3_recv(pgmcp, &resp) > 0) - free(resp); + mmt_free(resp); // Read or write SUFFER register if (PDATA(pgm)->suffer_get || PDATA(pgm)->suffer_set) { @@ -1478,7 +1445,7 @@ static int stk500v2_jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { } } - free(pgmcp); + mmt_free(pgmcp); /* * Examine the avrpart's memory definitions, and initialize the page @@ -1501,18 +1468,11 @@ static int stk500v2_jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { PDATA(pgm)->eeprom_pagesize = m->page_size; } } - free(PDATA(pgm)->flash_pagecache); - free(PDATA(pgm)->eeprom_pagecache); - if ((PDATA(pgm)->flash_pagecache = malloc(PDATA(pgm)->flash_pagesize)) == NULL) { - pmsg_error("out of memory\n"); - return -1; - } - if ((PDATA(pgm)->eeprom_pagecache = malloc(PDATA(pgm)->eeprom_pagesize)) == NULL) { - pmsg_error("out of memory\n"); - free(PDATA(pgm)->flash_pagecache); - return -1; - } - PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; + mmt_free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); + PDATA(pgm)->flash_pagecache = mmt_malloc(PDATA(pgm)->flash_pagesize); + PDATA(pgm)->eeprom_pagecache = mmt_malloc(PDATA(pgm)->eeprom_pagesize); + PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long) -1L; return pgm->program_enable(pgm, p); } @@ -1672,18 +1632,11 @@ static int stk500hv_initialize(const PROGRAMMER *pgm, const AVRPART *p, enum hvm PDATA(pgm)->eeprom_pagesize = m->page_size; } } - free(PDATA(pgm)->flash_pagecache); - free(PDATA(pgm)->eeprom_pagecache); - if ((PDATA(pgm)->flash_pagecache = malloc(PDATA(pgm)->flash_pagesize)) == NULL) { - pmsg_error("out of memory\n"); - return -1; - } - if ((PDATA(pgm)->eeprom_pagecache = malloc(PDATA(pgm)->eeprom_pagesize)) == NULL) { - pmsg_error("out of memory\n"); - free(PDATA(pgm)->flash_pagecache); - return -1; - } - PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; + mmt_free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); + PDATA(pgm)->flash_pagecache = mmt_malloc(PDATA(pgm)->flash_pagesize); + PDATA(pgm)->eeprom_pagecache = mmt_malloc(PDATA(pgm)->eeprom_pagesize); + PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long) -1L; return pgm->program_enable(pgm, p); } @@ -1706,9 +1659,9 @@ static void stk500v2_jtag3_disable(const PROGRAMMER *pgm) { unsigned char buf[16]; int result; - free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->flash_pagecache); PDATA(pgm)->flash_pagecache = NULL; - free(PDATA(pgm)->eeprom_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); PDATA(pgm)->eeprom_pagecache = NULL; buf[0] = CMD_LEAVE_PROGMODE_ISP; @@ -1748,9 +1701,9 @@ static void stk500hv_disable(const PROGRAMMER *pgm, enum hvmode mode) { unsigned char buf[16]; int result; - free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->flash_pagecache); PDATA(pgm)->flash_pagecache = NULL; - free(PDATA(pgm)->eeprom_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); PDATA(pgm)->eeprom_pagecache = NULL; buf[0] = mode == PPMODE? CMD_LEAVE_PROGMODE_PP: @@ -4319,19 +4272,14 @@ static int stk600_xprog_command(const PROGRAMMER *pgm, unsigned char *b, else s = cmdsize; - if ((newb = malloc(s + 1)) == 0) { - pmsg_error("out of memory\n"); - return -1; - } - + newb = mmt_malloc(s + 1); newb[0] = CMD_XPROG; memcpy(newb + 1, b, cmdsize); rv = stk500v2_command(pgm, newb, cmdsize + 1, responsesize + 1); - if (rv == 0) { + if (rv == 0) memcpy(b, newb + 1, responsesize); - } - free(newb); + mmt_free(newb); return rv; } @@ -4650,13 +4598,9 @@ static int stk600_xprog_paged_load(const PROGRAMMER *pgm, const AVRPART *p, cons offset = addr; addr += mem->offset; - if ((b = malloc(page_size + 2)) == NULL) { - pmsg_error("out of memory\n"); - return -1; - } - + b = mmt_malloc(page_size + 2); if (stk500v2_loadaddr(pgm, use_ext_addr) < 0) { - free(b); + mmt_free(b); return -1; } @@ -4674,7 +4618,7 @@ static int stk600_xprog_paged_load(const PROGRAMMER *pgm, const AVRPART *p, cons b[7] = page_size; if (stk600_xprog_command(pgm, b, 8, page_size + 2) < 0) { pmsg_error("XPRG_CMD_READ_MEM failed\n"); - free(b); + mmt_free(b); return -1; } memcpy(mem->buf + offset, b + 2, page_size); @@ -4685,7 +4629,7 @@ static int stk600_xprog_paged_load(const PROGRAMMER *pgm, const AVRPART *p, cons addr += page_size; n_bytes -= page_size; } - free(b); + mmt_free(b); return n_bytes_orig; } @@ -4759,13 +4703,9 @@ static int stk600_xprog_paged_write(const PROGRAMMER *pgm, const AVRPART *p, con offset = addr; addr += mem->offset; - if ((b = malloc(page_size + 9)) == NULL) { - pmsg_error("out of memory\n"); - return -1; - } - + b = mmt_malloc(page_size + 9); if (stk500v2_loadaddr(pgm, use_ext_addr) < 0) { - free(b); + mmt_free(b); return -1; } @@ -4786,7 +4726,7 @@ static int stk600_xprog_paged_write(const PROGRAMMER *pgm, const AVRPART *p, con */ if (page_size % 256 != 0) { pmsg_error("page size not multiple of 256\n"); - free(b); + mmt_free(b); return -1; } unsigned int chunk; @@ -4809,7 +4749,7 @@ static int stk600_xprog_paged_write(const PROGRAMMER *pgm, const AVRPART *p, con memcpy(b + 9, mem->buf + offset, writesize); if (stk600_xprog_command(pgm, b, 256 + 9, 2) < 0) { pmsg_error("XPRG_CMD_WRITE_MEM failed\n"); - free(b); + mmt_free(b); return -1; } if (n_bytes < 256) @@ -4842,7 +4782,7 @@ static int stk600_xprog_paged_write(const PROGRAMMER *pgm, const AVRPART *p, con memcpy(b + 9, mem->buf + offset, writesize); if (stk600_xprog_command(pgm, b, page_size + 9, 2) < 0) { pmsg_error("XPRG_CMD_WRITE_MEM failed\n"); - free(b); + mmt_free(b); return -1; } if (n_bytes < page_size) @@ -4853,7 +4793,7 @@ static int stk600_xprog_paged_write(const PROGRAMMER *pgm, const AVRPART *p, con n_bytes -= page_size; } } - free(b); + mmt_free(b); return n_bytes_orig; } From f1105afb4759c707d4f5ee7e595b4537dc85139a Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:07:26 +0100 Subject: [PATCH 02/11] Add mmt_free() definition --- src/avrdude.h | 1 + src/jtagmkII.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/avrdude.h b/src/avrdude.h index c679a654..6b777d30 100644 --- a/src/avrdude.h +++ b/src/avrdude.h @@ -44,6 +44,7 @@ extern const char *pgmid; // Programmer -c string #define mmt_strdup(s) cfg_strdup(__func__, s) #define mmt_malloc(n) cfg_malloc(__func__, n) #define mmt_realloc(p, n) cfg_realloc(__func__, p, n) +#define mmt_free(p) free(p) int avrdude_message2(FILE *fp, int lno, const char *file, const char *func, int msgmode, int msglvl, const char *format, ...); diff --git a/src/jtagmkII.c b/src/jtagmkII.c index 0266ce9f..ae1e6d81 100644 --- a/src/jtagmkII.c +++ b/src/jtagmkII.c @@ -539,7 +539,7 @@ static int jtagmkII_recv_frame(const PROGRAMMER *pgm, unsigned char **msg, msglen, MAX_MESSAGE); state = sSTART; headeridx = 0; - } else if ((buf = malloc(msglen + 10)) == NULL) { + } else if ((buf = malloc(msglen + 10)) == NULL) { // Sic! malloc is OK here pmsg_error("out of memory\n"); ignorpkt++; } else { From cae0815d15c9712b0a9d3d13205f85215f8ec321 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:08:00 +0100 Subject: [PATCH 03/11] Make static functions greppable --- src/stk500v2.c | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index f43a56a4..8683005b 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -361,9 +361,7 @@ static void stk500v2_jtag3_teardown(PROGRAMMER *pgm) { } -static unsigned short -b2_to_u16(unsigned char *b) -{ +static unsigned short b2_to_u16(unsigned char *b) { unsigned short l; l = b[0]; l += (unsigned)b[1] << 8; @@ -371,16 +369,12 @@ b2_to_u16(unsigned char *b) return l; } -static void -u16_to_b2(unsigned char *b, unsigned short l) -{ +static void u16_to_b2(unsigned char *b, unsigned short l) { b[0] = l & 0xff; b[1] = (l >> 8) & 0xff; } -static double -f_to_kHz_MHz(double f, const char **unit) -{ +static double f_to_kHz_MHz(double f, const char **unit) { if (f >= 1e6) { f /= 1e6; *unit = "MHz"; @@ -1019,12 +1013,10 @@ static int stk500hvsp_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { return stk500hv_chip_erase(pgm, p, HVSPMODE); } -static struct -{ +static struct { unsigned int state; const char *description; -} connection_status[] = -{ +} connection_status[] = { { STATUS_CONN_FAIL_SDO, "SDO fail" }, { STATUS_CONN_FAIL_RST, "RST fail" }, { STATUS_CONN_FAIL_SCK, "SCK fail" }, @@ -1037,9 +1029,7 @@ static struct * strings in the table above, plus 2 characters for separation. * Currently, this is 76 chars. */ -static void -stk500v2_translate_conn_status(unsigned char status, char *msg) -{ +static void stk500v2_translate_conn_status(unsigned char status, char *msg) { size_t i; int need_comma; From 0f62968695c944eb948e6c0d037c6d79fa8207dc Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:22:23 +0100 Subject: [PATCH 04/11] Move static table to local data and simplify function --- src/stk500v2.c | 52 ++++++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index 8683005b..d3873898 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -1013,43 +1013,33 @@ static int stk500hvsp_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { return stk500hv_chip_erase(pgm, p, HVSPMODE); } -static struct { - unsigned int state; - const char *description; -} connection_status[] = { - { STATUS_CONN_FAIL_SDO, "SDO fail" }, - { STATUS_CONN_FAIL_RST, "RST fail" }, - { STATUS_CONN_FAIL_SCK, "SCK fail" }, - { STATUS_TGT_NOT_DETECTED, "Target not detected" }, - { STATUS_TGT_REVERSE_INSERTED, "Target reverse inserted" }, -}; - /* * Max length of returned message is the sum of all the description - * strings in the table above, plus 2 characters for separation. - * Currently, this is 76 chars. + * strings in the table below, plus 2 characters for separation each. + * Currently, this is 74 chars plus the terminating nul. */ static void stk500v2_translate_conn_status(unsigned char status, char *msg) { - size_t i; - int need_comma; + struct { + unsigned int state; + const char *description; + } const conn_status[] = { + { STATUS_CONN_FAIL_SDO, "SDO fail" }, + { STATUS_CONN_FAIL_RST, "RST fail" }, + { STATUS_CONN_FAIL_SCK, "SCK fail" }, + { STATUS_TGT_NOT_DETECTED, "Target not detected" }, + { STATUS_TGT_REVERSE_INSERTED, "Target reverse inserted" }, + }; - *msg = 0; - need_comma = 0; - - for (i = 0; - i < sizeof connection_status / sizeof connection_status[0]; - i++) - { - if ((status & connection_status[i].state) != 0) - { - if (need_comma) - strcat(msg, ", "); - strcat(msg, connection_status[i].description); - need_comma = 1; - } + *msg = 0; + for(size_t i = 0; i < sizeof conn_status / sizeof *conn_status; i++) { + if(status & conn_status[i].state) { + if(*msg) + strcat(msg, ", "); + strcat(msg, conn_status[i].description); } - if (*msg == 0) - sprintf(msg, "Unknown status 0x%02x", status); + } + if(*msg == 0) + sprintf(msg, "Unknown status 0x%02x", status); } From ce65a1484fb490736cc9ad4bd8c2ebae6af9bccd Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:54:47 +0100 Subject: [PATCH 05/11] Make static table local const --- src/stk500v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index d3873898..f9c93c93 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -3225,7 +3225,7 @@ static int stk500v2_get_varef(const PROGRAMMER *pgm, unsigned int chan, double * static int stk500v2_set_fosc(const PROGRAMMER *pgm, double v) { int fosc; unsigned char prescale, cmatch; - static unsigned ps[] = { + const unsigned ps[] = { 1, 8, 32, 64, 128, 256, 1024 }; size_t idx; From 8e836461e1f41b33cacaf4a6ae93f77f26f96cea Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:55:29 +0100 Subject: [PATCH 06/11] Make static table const --- src/stk500v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index f9c93c93..5f89c140 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -3280,7 +3280,7 @@ static int stk500v2_get_fosc(const PROGRAMMER *pgm, double *v) { /* The list of SCK frequencies supported by the AVRISP mkII, as listed * in AVR069 */ -static double avrispmkIIfreqs[] = { +static const double avrispmkIIfreqs[] = { 8000000, 4000000, 2000000, 1000000, 500000, 250000, 125000, 96386, 89888, 84211, 79208, 74767, 70797, 67227, 64000, 61069, 58395, 55945, 51613, 49690, 47905, 46243, 43244, From 0f7c6a1d462a134b66bfb3521051350af7965554 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sat, 20 Apr 2024 01:59:52 +0100 Subject: [PATCH 07/11] Add sanity checks --- src/stk500v2.c | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index 5f89c140..40727cd7 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -3302,21 +3302,21 @@ static const double avrispmkIIfreqs[] = { 65.0, 61.9, 59.0, 56.3, 53.6, 51.1 }; +#define NavrispmkIIfreqs (sizeof avrispmkIIfreqs / sizeof *avrispmkIIfreqs) + static int stk500v2_set_sck_period_mk2(const PROGRAMMER *pgm, double v) { size_t i; - for (i = 0; i < sizeof(avrispmkIIfreqs) / sizeof(avrispmkIIfreqs[0]); i++) { - if (1 / avrispmkIIfreqs[i] >= v) + for(i = 0; i < NavrispmkIIfreqs; i++) + if(1 / avrispmkIIfreqs[i] >= v) break; - } - if (i >= sizeof(avrispmkIIfreqs) / sizeof(avrispmkIIfreqs[0])) { + if(i >= NavrispmkIIfreqs) { pmsg_error("invalid SCK period: %g\n", v); return -1; } - msg_notice2("Using p = %.2f us for SCK (param = %d)\n", - 1000000 / avrispmkIIfreqs[i], (int) i); + msg_notice2("Using p = %.2f us for SCK (i = %d)\n", 1e6 / avrispmkIIfreqs[i], (int) i); return stk500v2_setparm(pgm, PARAM_SCK_DURATION, i); } @@ -3399,7 +3399,7 @@ static double stk500v2_sck_to_us(const PROGRAMMER *pgm, unsigned char dur) { x = 1.0 / x; x /= 24.0; x *= (double)PDATA(pgm)->xtal; - return 1E6 / x; + return 1e6 / x; } @@ -3730,13 +3730,13 @@ static double stk500v2_sck_duration_value(const PROGRAMMER *pgm) { switch (PDATA(pgm)->pgmtype) { case PGMTYPE_STK500: - stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration); - return stk500v2_sck_to_us(pgm, sck_duration); + return stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration) < 0? 0: + stk500v2_sck_to_us(pgm, sck_duration); case PGMTYPE_AVRISP_MKII: case PGMTYPE_JTAGICE_MKII: - stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration); - return 1.0e6 / avrispmkIIfreqs[sck_duration]; + return stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration) < 0 || + sck_duration >= NavrispmkIIfreqs? 0: 1e6 / avrispmkIIfreqs[sck_duration]; case PGMTYPE_JTAGICE3: { @@ -3744,14 +3744,13 @@ static double stk500v2_sck_duration_value(const PROGRAMMER *pgm) { cmd[0] = CMD_GET_SCK; if (stk500v2_jtag3_send(pgm, cmd, 1) >= 0 && stk500v2_jtag3_recv(pgm, cmd, 4) >= 2) { unsigned int sck = cmd[1] | (cmd[2] << 8); - return (1E6 / (1000.0 * sck)); + return sck? 1E6 / (1000.0 * sck): 0; } return 0; } case PGMTYPE_STK600: - stk500v2_getparm2(pgm, PARAM2_SCK_DURATION, &sck_stk600); - return (sck_stk600 + 1) / 8.0; + return stk500v2_getparm2(pgm, PARAM2_SCK_DURATION, &sck_stk600) < 0? 0: (sck_stk600 + 1) / 8.0; default: return sck_duration * 8.0e6 / PDATA(pgm)->xtal + 0.05; @@ -3816,9 +3815,8 @@ static double stk500v2_fosc_value(const PROGRAMMER *pgm) { case PGMTYPE_AVRISP_MKII: case PGMTYPE_JTAGICE_MKII: - if (stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration) < 0) - return 0.0; - return 1e6 / avrispmkIIfreqs[sck_duration]; + return stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration) < 0 || + sck_duration >= NavrispmkIIfreqs? 0: 1e6 / avrispmkIIfreqs[sck_duration]; case PGMTYPE_STK600: if (stk500v2_getparm2(pgm, PARAM2_CLOCK_CONF, &clock_conf) < 0) From b9801e8d6671eeedb3f8fb1d4f1081b035c8d542 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sun, 21 Apr 2024 14:28:38 +0100 Subject: [PATCH 08/11] Use mmt_free() instead of free() --- src/stk500v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index 40727cd7..b923666c 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -564,7 +564,7 @@ static int stk500v2_jtagmkII_recv(const PROGRAMMER *pgm, unsigned char *msg, return -1; } memcpy(msg, jtagmsg + 1, rv - 1); - free(jtagmsg); // Sic! jtagmsg was malloc'd + mmt_free(jtagmsg); return rv; } From db4bf53480e8ae199485b86df95afae2945f3785 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Sun, 21 Apr 2024 15:37:09 +0100 Subject: [PATCH 09/11] Revoke comment --- src/jtagmkII.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jtagmkII.c b/src/jtagmkII.c index ae1e6d81..0266ce9f 100644 --- a/src/jtagmkII.c +++ b/src/jtagmkII.c @@ -539,7 +539,7 @@ static int jtagmkII_recv_frame(const PROGRAMMER *pgm, unsigned char **msg, msglen, MAX_MESSAGE); state = sSTART; headeridx = 0; - } else if ((buf = malloc(msglen + 10)) == NULL) { // Sic! malloc is OK here + } else if ((buf = malloc(msglen + 10)) == NULL) { pmsg_error("out of memory\n"); ignorpkt++; } else { From a5ce726a8aa95758203d24a255bb4b5d4bfecef0 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 15:17:46 +0100 Subject: [PATCH 10/11] return LIBAVRDUDE_EXIT instead of exit(0) --- src/libavrdude.h | 1 + src/stk500v2.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libavrdude.h b/src/libavrdude.h index 453b22a0..60cf4ebf 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -59,6 +59,7 @@ typedef uint32_t pinmask_t; #define LIBAVRDUDE_NOTSUPPORTED (-2) // operation not supported #define LIBAVRDUDE_SOFTFAIL (-3) // returned, eg, by avr_signature() if caller // might proceed with chip erase +#define LIBAVRDUDE_EXIT (-4) // End all operations in this session /* formerly lists.h */ diff --git a/src/stk500v2.c b/src/stk500v2.c index b923666c..926076a8 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -1913,7 +1913,7 @@ static int stk500v2_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) } msg_error(" -xxtal=[M|k] Set programmer xtal frequency\n"); msg_error(" -xhelp Show this help menu and exit\n"); - exit(0); + return LIBAVRDUDE_EXIT;; } pmsg_error("invalid extended parameter %s\n", extended_param); @@ -2048,7 +2048,7 @@ static int stk500v2_jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extp if(str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap")) msg_error(" -xmode=avr|pic Set programmer to AVR or PIC mode, then exit\n"); msg_error (" -xhelp Show this help menu and exit\n"); - exit(0); + return LIBAVRDUDE_EXIT;; } pmsg_error("invalid extended parameter %s\n", extended_param); From e6017fecb6ad2bedbe6b012754ac9ed231470838 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Mon, 22 Apr 2024 15:47:54 +0100 Subject: [PATCH 11/11] Render double teardown() harmless in stk500v2 --- src/stk500v2.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/stk500v2.c b/src/stk500v2.c index 926076a8..4eba393c 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -339,25 +339,30 @@ void stk500v2_teardown(PROGRAMMER *pgm) { } static void stk500v2_jtagmkII_teardown(PROGRAMMER *pgm) { - void *mycookie; + if(pgm->cookie) { + mmt_free(PDATA(pgm)->flash_pagecache); + mmt_free(PDATA(pgm)->eeprom_pagecache); - mmt_free(PDATA(pgm)->flash_pagecache); - mmt_free(PDATA(pgm)->eeprom_pagecache); + void *mycookie = pgm->cookie; + pgm->cookie = PDATA(pgm)->chained_pdata; + jtagmkII_teardown(pgm); + pgm->cookie = mycookie; + } - mycookie = pgm->cookie; - pgm->cookie = PDATA(pgm)->chained_pdata; - jtagmkII_teardown(pgm); - - mmt_free(mycookie); + mmt_free(pgm->cookie); + pgm->cookie = NULL; } static void stk500v2_jtag3_teardown(PROGRAMMER *pgm) { - void *mycookie = pgm->cookie; + if(pgm->cookie) { + void *mycookie = pgm->cookie; + pgm->cookie = PDATA(pgm)->chained_pdata; + jtag3_teardown(pgm); + pgm->cookie = mycookie; + } - pgm->cookie = PDATA(pgm)->chained_pdata; - jtag3_teardown(pgm); - - mmt_free(mycookie); + mmt_free(pgm->cookie); + pgm->cookie = NULL; }