Commit 1fceb9bd authored by Andrzej Puzdrowski's avatar Andrzej Puzdrowski Committed by David Brown
Browse files

zephyr: Added hooks for example



Example (very basic) hook implementation.
Added case description for test-build with these hooks
and multi-image feature.

Signed-off-by: default avatarAndrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
parent 2a29f5dc
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
CONFIG_UPDATEABLE_IMAGE_NUMBER=2

CONFIG_FLASH_SIMULATOR=y
CONFIG_FLASH_SIMULATOR_UNALIGNED_READ=y

CONFIG_BOOT_IMAGE_ACCESS_HOOKS=y
CONFIG_BOOT_IMAGE_ACCESS_HOOKS_FILE="hooks_sample.c"
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/delete-node/ &slot1_partition;
/delete-node/ &slot0_partition;
/delete-node/ &boot_partition;

&flash0 {
	partitions {
		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x000000000 0x00010000>;
		};
		slot0_partition: partition@10000 {
			label = "image-0";
			reg = <0x000010000 0x00000A000>;
		};
		slot1_partition: partition@1A000 {
			label = "image-1";
			reg = <0x00001A000 0x00000A000>;
		};
		slot3_partition: partition@24000 {
			label = "image-3";
			reg = <0x000024000 0x00000A000>;
		};
	};
};

/ {
	soc {
		flash_controller2: flash-controller@2 {
			compatible = "zephyr,sim-flash";
			reg = <0x00000000 DT_SIZE_K(40)>;

			#address-cells = <1>;
			#size-cells = <1>;
			erase-value = <0xff>;

			label = "flash_ctrl";

			flash_sim0: flash_sim@0 {
				status = "okay";
				compatible = "soc-nv-flash";
				label = "simulated_flash";
				erase-block-size = <4096>;
				write-block-size = <1>;
				reg = <0x00000000 DT_SIZE_K(40)>;

				partitions {
					compatible = "fixed-partitions";
					#address-cells = <1>;
					#size-cells = <1>;

					slot2_partition: partition@0 {
						label = "image-2";
						reg = <0x00000000 0x00000A000>;
					};
				};
			};
		};
	};
};
+95 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <assert.h>
#include <zephyr.h>
#include "bootutil/image.h"
#include "bootutil/bootutil.h"
#include "bootutil/fault_injection_hardening.h"
#include "flash_map_backend/flash_map_backend.h"

/* @retval 0: header was read/populated
 *         FIH_FAILURE: image is invalid,
 *         BOOT_HOOK_REGULAR if hook not implemented for the image-slot,
 *         othervise an error-code value.
 */
int boot_read_image_header_hook(int img_index, int slot,
                                struct image_header *img_hed)
{
    if (img_index == 1 && slot == 0) {
            img_hed->ih_magic = IMAGE_MAGIC;
            return 0;
    }

    return BOOT_HOOK_REGULAR;
}

/* @retval FIH_SUCCESS: image is valid,
 *         FIH_FAILURE: image is invalid,
 *         fih encoded BOOT_HOOK_REGULAR if hook not implemented for
 *         the image-slot.
 */
fih_int boot_image_check_hook(int img_index, int slot)
{
    if (img_index == 1 && slot == 0) {
        FIH_RET(FIH_SUCCESS);
    }

    FIH_RET(fih_int_encode(BOOT_HOOK_REGULAR));
}

int boot_perform_update_hook(int img_index, struct image_header *img_head,
                             const struct flash_area *area)
{
    if (img_index == 1) {
        return 0;
    }

    return BOOT_HOOK_REGULAR;
}

int boot_read_swap_state_primary_slot_hook(int image_index,
                                           struct boot_swap_state *state)
{
    if (image_index == 1) {
        state->magic = BOOT_MAGIC_UNSET;
        state->swap_type = BOOT_SWAP_TYPE_NONE;
        state->image_num = image_index ; // ?
        state->copy_done = BOOT_FLAG_UNSET;
        state->image_ok = BOOT_FLAG_UNSET;

        return 0;
    }

    return BOOT_HOOK_REGULAR;
}

int boot_copy_region_post_hook(int img_index, const struct flash_area *area,
                               size_t size)
{
    return 0;
}

int boot_serial_uploaded_hook(int img_index, const struct flash_area *area,
                               size_t size)
{
    return 0;
}

int boot_img_install_stat_hook(int image_index, int slot, int *img_install_stat)
{
    return BOOT_HOOK_REGULAR;
}
+7 −0
Original line number Diff line number Diff line
@@ -40,3 +40,10 @@ tests:
    integration_platforms:
      - nrf52840dk_nrf52840
    tags: bootloader_mcuboot
  sample.bootloader.mcuboot.hooks_multi:
    extra_args: DTC_OVERLAY_FILE=./boards/nrf52840dk_ram_multi.overlay
      OVERLAY_CONFIG=./boards/nrf52840dk_hooks_sample_overlay.conf
    platform_allow: nrf52840dk_nrf52840
    integration_platforms:
      - nrf52840dk_nrf52840
    tags: bootloader_mcuboot