Skip to content

Commit a27f33d

Browse files
committed
Fixed fall-back mechanism on platforms with large flash blocks (STM32)
1 parent d3d938d commit a27f33d

1 file changed

Lines changed: 22 additions & 14 deletions

File tree

src/loader.c

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,31 @@ static int wolfBoot_copy_sector(struct wolfBoot_image *src, struct wolfBoot_imag
3838
if (dst->part == PART_SWAP)
3939
dst_sector_offset = 0;
4040
#ifdef EXT_FLASH
41+
uint8_t buffer[FLASHBUFFER_SIZE];
4142
if (PART_IS_EXT(src)) {
42-
uint8_t buffer[FLASHBUFFER_SIZE];
4343
wb_flash_erase(dst, dst_sector_offset, WOLFBOOT_SECTOR_SIZE);
44-
while (pos < WOLFBOOT_SECTOR_SIZE) {
45-
ext_flash_read((uint32_t)(src->hdr) + src_sector_offset + pos, (void *)buffer, FLASHBUFFER_SIZE);
46-
wb_flash_write(dst, dst_sector_offset + pos, buffer, FLASHBUFFER_SIZE);
44+
while (pos < WOLFBOOT_SECTOR_SIZE)
45+
if (src_sector_offset + pos < (src->fw_size + IMAGE_HEADER_SIZE + FLASHBUFFER_SIZE)) {
46+
ext_flash_read((uint32_t)(src->hdr) + src_sector_offset + pos, (void *)buffer, FLASHBUFFER_SIZE);
47+
wb_flash_write(dst, dst_sector_offset + pos, buffer, FLASHBUFFER_SIZE);
48+
}
4749
pos += FLASHBUFFER_SIZE;
4850
}
4951
return pos;
5052
}
5153
#endif
5254
wb_flash_erase(dst, dst_sector_offset, WOLFBOOT_SECTOR_SIZE);
5355
while (pos < WOLFBOOT_SECTOR_SIZE) {
54-
uint8_t *orig = (uint8_t*)(src->hdr + src_sector_offset + pos);
55-
wb_flash_write(dst, dst_sector_offset + pos, orig, FLASHBUFFER_SIZE);
56+
if (src_sector_offset + pos < (src->fw_size + IMAGE_HEADER_SIZE + FLASHBUFFER_SIZE)) {
57+
uint8_t *orig = (uint8_t*)(src->hdr + src_sector_offset + pos);
58+
wb_flash_write(dst, dst_sector_offset + pos, orig, FLASHBUFFER_SIZE);
59+
}
5660
pos += FLASHBUFFER_SIZE;
5761
}
5862
return pos;
5963
}
6064

61-
static int wolfBoot_update(void)
65+
static int wolfBoot_update(int fallback_allowed)
6266
{
6367
uint32_t total_size = 0;
6468
const uint32_t sector_size = WOLFBOOT_SECTOR_SIZE;
@@ -91,7 +95,8 @@ static int wolfBoot_update(void)
9195
return -1;
9296
}
9397
#ifndef ALLOW_DOWNGRADE
94-
if (wolfBoot_update_firmware_version() <= wolfBoot_current_firmware_version())
98+
if ( !fallback_allowed &&
99+
(wolfBoot_update_firmware_version() <= wolfBoot_current_firmware_version()) )
95100
return -1;
96101
#endif
97102
}
@@ -109,23 +114,26 @@ static int wolfBoot_update(void)
109114
if ((wolfBoot_get_sector_flag(PART_UPDATE, sector, &flag) != 0) || (flag == SECT_FLAG_NEW)) {
110115
flag = SECT_FLAG_SWAPPING;
111116
wolfBoot_copy_sector(&update, &swap, sector);
112-
wolfBoot_set_sector_flag(PART_UPDATE, sector, flag);
117+
if (((sector + 1) * sector_size) < WOLFBOOT_PARTITION_SIZE)
118+
wolfBoot_set_sector_flag(PART_UPDATE, sector, flag);
113119
}
114120
if (flag == SECT_FLAG_SWAPPING) {
115121
uint32_t size = total_size - (sector * sector_size);
116122
if (size > sector_size)
117123
size = sector_size;
118124
flag = SECT_FLAG_BACKUP;
119125
wolfBoot_copy_sector(&boot, &update, sector);
120-
wolfBoot_set_sector_flag(PART_UPDATE, sector, flag);
126+
if (((sector + 1) * sector_size) < WOLFBOOT_PARTITION_SIZE)
127+
wolfBoot_set_sector_flag(PART_UPDATE, sector, flag);
121128
}
122129
if (flag == SECT_FLAG_BACKUP) {
123130
uint32_t size = total_size - (sector * sector_size);
124131
if (size > sector_size)
125132
size = sector_size;
126133
flag = SECT_FLAG_UPDATED;
127134
wolfBoot_copy_sector(&swap, &boot, sector);
128-
wolfBoot_set_sector_flag(PART_UPDATE, sector, flag);
135+
if (((sector + 1) * sector_size) < WOLFBOOT_PARTITION_SIZE)
136+
wolfBoot_set_sector_flag(PART_UPDATE, sector, flag);
129137
}
130138
sector++;
131139
}
@@ -149,15 +157,15 @@ static void wolfBoot_start(void)
149157
uint8_t st;
150158
struct wolfBoot_image boot, update;
151159
if ((wolfBoot_get_partition_state(PART_UPDATE, &st) == 0) && (st == IMG_STATE_UPDATING)) {
152-
wolfBoot_update();
160+
wolfBoot_update(0);
153161
} else if ((wolfBoot_get_partition_state(PART_BOOT, &st) == 0) && (st == IMG_STATE_TESTING)) {
154162
wolfBoot_update_trigger();
155-
wolfBoot_update();
163+
wolfBoot_update(1);
156164
}
157165
if ((wolfBoot_open_image(&boot, PART_BOOT) < 0) ||
158166
(wolfBoot_verify_integrity(&boot) < 0) ||
159167
(wolfBoot_verify_authenticity(&boot) < 0)) {
160-
if (wolfBoot_update() < 0) {
168+
if (wolfBoot_update(1) < 0) {
161169
while(1)
162170
/* panic */;
163171
}

0 commit comments

Comments
 (0)