1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-22 06:18:07 +00:00

perf(core): optimize boot speed by checking empty image area by words

[no changelog]
This commit is contained in:
tychovrahe 2023-12-15 23:51:06 +01:00 committed by TychoVrahe
parent c3f84e2949
commit b3d1ba25d9

View File

@ -280,23 +280,42 @@ secbool check_image_contents(const image_header *const hdr, uint32_t firstskip,
return secfalse; return secfalse;
} }
uint32_t expected_word = expected_byte << 24 | expected_byte << 16 |
expected_byte << 8 | expected_byte;
while (offset < end_offset) { while (offset < end_offset) {
size_t bytes_to_check = MIN( size_t bytes_to_check = MIN(
IMAGE_CHUNK_SIZE - (offset % IMAGE_CHUNK_SIZE), end_offset - offset); IMAGE_CHUNK_SIZE - (offset % IMAGE_CHUNK_SIZE), end_offset - offset);
size_t words_to_check = bytes_to_check / sizeof(uint32_t);
size_t single_bytes_to_check = bytes_to_check % sizeof(uint32_t);
const uint8_t *data = const uint8_t *bytes = (const uint8_t *)flash_area_get_address(
(const uint8_t *)flash_area_get_address(area, offset, bytes_to_check); area, offset, single_bytes_to_check);
if (!data) { if (!bytes) {
return secfalse; return secfalse;
} }
for (size_t i = 0; i < bytes_to_check; i++) { for (size_t i = 0; i < single_bytes_to_check; i++) {
if (data[i] != expected_byte) { if (bytes[i] != expected_byte) {
return secfalse; return secfalse;
} }
} }
offset += bytes_to_check; offset += single_bytes_to_check;
const uint32_t *data = (const uint32_t *)flash_area_get_address(
area, offset, bytes_to_check - single_bytes_to_check);
if (!data) {
return secfalse;
}
for (size_t i = 0; i < words_to_check; i++) {
if (data[i] != expected_word) {
return secfalse;
}
}
offset += words_to_check * sizeof(uint32_t);
} }
} }