Commit 47d826e7 authored by Jamie McCrae's avatar Jamie McCrae Committed by Jamie
Browse files

boot: bootutil: swap_offset: Fix maximum application size



Fixes this functionality to have the maximum allowable application
size

Signed-off-by: default avatarJamie McCrae <jamie.mccrae@nordicsemi.no>
parent d5d3359e
Loading
Loading
Loading
Loading
+20 −25
Original line number Diff line number Diff line
@@ -307,23 +307,26 @@ static int app_max_sectors(struct boot_loader_state *state)
    uint32_t sz = 0;
    uint32_t sector_sz;
    uint32_t trailer_sz;
    uint32_t first_trailer_idx;
    uint32_t available_sectors_pri;
    uint32_t available_sectors_sec;
    uint32_t trailer_sectors = 0;

    sector_sz = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, 0);
    trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state));
    first_trailer_idx = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT);

    while (1) {
        sz += sector_sz;
        ++trailer_sectors;

        if  (sz >= trailer_sz) {
            break;
        }

        first_trailer_idx--;
    }

    return first_trailer_idx;
    available_sectors_pri = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT) - trailer_sectors;
    available_sectors_sec = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT) - 1;

    return (available_sectors_pri < available_sectors_sec ? available_sectors_pri : available_sectors_sec);
}

int boot_slots_compatible(struct boot_loader_state *state)
@@ -333,34 +336,35 @@ int boot_slots_compatible(struct boot_loader_state *state)
    size_t sector_sz_pri = 0;
    size_t sector_sz_sec = 0;
    size_t i;
    size_t num_usable_sectors_pri;
    size_t num_usable_sectors;

    num_sectors_pri = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT);
    num_sectors_sec = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT);
    num_usable_sectors_pri = app_max_sectors(state);
    num_usable_sectors = app_max_sectors(state);

    if ((num_sectors_pri != num_sectors_sec) &&
            ((num_sectors_pri + 1) != num_sectors_sec) &&
            ((num_usable_sectors_pri + 1) != (num_sectors_sec))) {
    if (num_sectors_pri != num_sectors_sec &&
        (num_sectors_pri + 1) != num_sectors_sec &&
        num_usable_sectors != (num_sectors_sec - 1)) {
        BOOT_LOG_WRN("Cannot upgrade: not a compatible amount of sectors");
        BOOT_LOG_DBG("slot0 sectors: %d, slot1 sectors: %d, usable slot0 sectors: %d",
        BOOT_LOG_DBG("slot0 sectors: %d, slot1 sectors: %d, usable sectors: %d",
                     (int)num_sectors_pri, (int)num_sectors_sec,
                     (int)(num_usable_sectors_pri - 1));
                     (int)(num_usable_sectors));
        return 0;
    } else if (num_sectors_pri > BOOT_MAX_IMG_SECTORS) {
        BOOT_LOG_WRN("Cannot upgrade: more sectors than allowed");
        return 0;
    }

    if ((num_usable_sectors_pri + 1) != num_sectors_sec) {
    if ((num_usable_sectors + 1) != num_sectors_sec) {
        BOOT_LOG_DBG("Non-optimal sector distribution, slot0 has %d usable sectors "
                     "but slot1 has %d usable sectors", (int)(num_usable_sectors_pri),
                     "but slot1 has %d usable sectors", (int)(num_usable_sectors),
                     ((int)num_sectors_sec - 1));
    }

    for (i = 0; i < num_sectors_pri; i++) {
    for (i = 0; i < num_usable_sectors; i++) {
        sector_sz_pri = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, i);
        sector_sz_sec = boot_img_sector_size(state, BOOT_SECONDARY_SLOT, i);

        if (sector_sz_pri != sector_sz_sec) {
            BOOT_LOG_WRN("Cannot upgrade: not same sector layout");
            return 0;
@@ -726,19 +730,10 @@ void swap_run(struct boot_loader_state *state, struct boot_status *bs,
int app_max_size(struct boot_loader_state *state)
{
    uint32_t sector_sz_primary;
    uint32_t sector_sz_secondary;
    uint32_t sz_primary;
    uint32_t sz_secondary;

    sector_sz_primary = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, 0);
    sector_sz_secondary = boot_img_sector_size(state, BOOT_SECONDARY_SLOT, 0);

    /* Account for image flags and move sector */
    sz_primary = app_max_sectors(state) * sector_sz_primary;
    sz_secondary = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT) * sector_sz_secondary -
                    sector_sz_primary;

    return (sz_primary <= sz_secondary ? sz_primary : sz_secondary);
    return app_max_sectors(state) * sector_sz_primary;
}

/* Compute the total size of the given image. Includes the size of the TLVs. */