Change from alloca() to malloc()

git-svn-id: svn://svn.berlios.de/openocd/trunk@2407 b42882b7-edfa-0310-969c-e2dbd0fdcd60
__archive__
duane 2009-06-27 16:51:41 +00:00
parent 9c05c92c14
commit f538794bf6
1 changed files with 32 additions and 14 deletions

View File

@ -2121,19 +2121,25 @@ sam3_write(struct flash_bank_s *bank,
struct sam3_bank_private *pPrivate; struct sam3_bank_private *pPrivate;
uint8_t *pagebuffer; uint8_t *pagebuffer;
// incase we bail further below, set this to null
pagebuffer = NULL;
// ignore dumb requests // ignore dumb requests
if (count == 0) { if (count == 0) {
return ERROR_OK; r = ERROR_OK;
goto done;
} }
if (bank->target->state != TARGET_HALTED) { if (bank->target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted"); LOG_ERROR("Target not halted");
return ERROR_TARGET_NOT_HALTED; r = ERROR_TARGET_NOT_HALTED;
goto done;
} }
pPrivate = get_sam3_bank_private(bank); pPrivate = get_sam3_bank_private(bank);
if (!(pPrivate->probed)) { if (!(pPrivate->probed)) {
return ERROR_FLASH_BANK_NOT_PROBED; r = ERROR_FLASH_BANK_NOT_PROBED;
goto done;
} }
@ -2143,10 +2149,16 @@ sam3_write(struct flash_bank_s *bank,
(unsigned int)(offset), (unsigned int)(offset),
(unsigned int)(count), (unsigned int)(count),
(unsigned int)(pPrivate->size_bytes)); (unsigned int)(pPrivate->size_bytes));
return ERROR_FAIL; r = ERROR_FAIL;
goto done;
} }
pagebuffer = alloca(pPrivate->page_size); pagebuffer = malloc(pPrivate->page_size);
if( !pagebuffer ){
LOG_ERROR("No memory for %d Byte page buffer", (int)(pPrivate->page_size));
r = ERROR_FAIL;
goto done;
}
// what page do we start & end in? // what page do we start & end in?
page_cur = offset / pPrivate->page_size; page_cur = offset / pPrivate->page_size;
@ -2167,7 +2179,7 @@ sam3_write(struct flash_bank_s *bank,
LOG_DEBUG("Special case, all in one page"); LOG_DEBUG("Special case, all in one page");
r = sam3_page_read(pPrivate, page_cur, pagebuffer); r = sam3_page_read(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
page_offset = (offset & (pPrivate->page_size-1)); page_offset = (offset & (pPrivate->page_size-1));
@ -2177,9 +2189,10 @@ sam3_write(struct flash_bank_s *bank,
r = sam3_page_write(pPrivate, page_cur, pagebuffer); r = sam3_page_write(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
return ERROR_OK; r = ERROR_OK;
goto done;
} }
// non-aligned start // non-aligned start
@ -2189,7 +2202,7 @@ sam3_write(struct flash_bank_s *bank,
// read the partial // read the partial
r = sam3_page_read(pPrivate, page_cur, pagebuffer); r = sam3_page_read(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
// over-write with new data // over-write with new data
@ -2200,7 +2213,7 @@ sam3_write(struct flash_bank_s *bank,
r = sam3_page_write(pPrivate, page_cur, pagebuffer); r = sam3_page_write(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
count -= n; count -= n;
@ -2219,7 +2232,7 @@ sam3_write(struct flash_bank_s *bank,
(count >= pPrivate->page_size)) { (count >= pPrivate->page_size)) {
r = sam3_page_write(pPrivate, page_cur, buffer); r = sam3_page_write(pPrivate, page_cur, buffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
count -= pPrivate->page_size; count -= pPrivate->page_size;
buffer += pPrivate->page_size; buffer += pPrivate->page_size;
@ -2232,19 +2245,24 @@ sam3_write(struct flash_bank_s *bank,
// we have a partial page // we have a partial page
r = sam3_page_read(pPrivate, page_cur, pagebuffer); r = sam3_page_read(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
// data goes at start // data goes at start
memcpy(pagebuffer, buffer, count); memcpy(pagebuffer, buffer, count);
r = sam3_page_write(pPrivate, page_cur, pagebuffer); r = sam3_page_write(pPrivate, page_cur, pagebuffer);
if (r != ERROR_OK) { if (r != ERROR_OK) {
return r; goto done;
} }
buffer += count; buffer += count;
count -= count; count -= count;
} }
LOG_DEBUG("Done!"); LOG_DEBUG("Done!");
return ERROR_OK; r = ERROR_OK;
done:
if( pagebuffer ){
free(pagebuffer);
}
return r;
} }
static int static int