diff --git a/cmake/sysbuild/b0_mcuboot_signing.cmake b/cmake/sysbuild/b0_mcuboot_signing.cmake index 3ff9fbd98fe0..a404d3a2a335 100644 --- a/cmake/sysbuild/b0_mcuboot_signing.cmake +++ b/cmake/sysbuild/b0_mcuboot_signing.cmake @@ -138,7 +138,7 @@ if(SB_CONFIG_BOOTLOADER_MCUBOOT) if(SB_CONFIG_SECURE_BOOT_BUILD_S1_VARIANT_IMAGE) ncs_secure_boot_mcuboot_sign(s1_image "${bin_files}" "${signed_targets}" "") - set(extra_bin_data "signed_by_mcuboot_and_b0_s1_image.binload_address=$") + set(extra_bin_data "signed_by_mcuboot_and_b0_s1_image.binload_address=$;signed_by_mcuboot_and_b0_s1_image.binslot=1") endif() if(bin_files) @@ -156,6 +156,7 @@ if(SB_CONFIG_BOOTLOADER_MCUBOOT) ${extra_bin_data} "version_MCUBOOT=${SB_CONFIG_SECURE_BOOT_MCUBOOT_VERSION}" "version_B0=${mcuboot_fw_info_firmware_version}" + "signed_by_mcuboot_and_b0_mcuboot.binslot=0" DEPENDS ${signed_targets} ) endif() diff --git a/subsys/CMakeLists.txt b/subsys/CMakeLists.txt index 58a0d7e83d62..be969e651565 100644 --- a/subsys/CMakeLists.txt +++ b/subsys/CMakeLists.txt @@ -67,3 +67,4 @@ add_subdirectory(suit) add_subdirectory_ifdef(CONFIG_MGMT_SUITFU mgmt/suitfu) add_subdirectory_ifdef(CONFIG_DULT dult) add_subdirectory_ifdef(CONFIG_NRF_COMPRESS nrf_compress) +add_subdirectory(mgmt/mcumgr) diff --git a/subsys/Kconfig b/subsys/Kconfig index 37be60487f97..05bda2f953c8 100644 --- a/subsys/Kconfig +++ b/subsys/Kconfig @@ -28,6 +28,7 @@ rsource "nrf_rpc/Kconfig" rsource "zigbee/Kconfig" rsource "mgmt/fmfu/Kconfig" rsource "mgmt/suitfu/Kconfig" +rsource "mgmt/mcumgr/Kconfig" rsource "caf/Kconfig" rsource "ieee802154/Kconfig" rsource "dm/Kconfig" diff --git a/subsys/mgmt/mcumgr/CMakeLists.txt b/subsys/mgmt/mcumgr/CMakeLists.txt new file mode 100644 index 000000000000..88b201618140 --- /dev/null +++ b/subsys/mgmt/mcumgr/CMakeLists.txt @@ -0,0 +1,7 @@ +# +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +add_subdirectory(grp) diff --git a/subsys/mgmt/mcumgr/Kconfig b/subsys/mgmt/mcumgr/Kconfig new file mode 100644 index 000000000000..f5f49074cda4 --- /dev/null +++ b/subsys/mgmt/mcumgr/Kconfig @@ -0,0 +1,11 @@ +# +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +menu "Additional MCUmgr configuration" + +rsource "grp/Kconfig" + +endmenu diff --git a/subsys/mgmt/mcumgr/grp/CMakeLists.txt b/subsys/mgmt/mcumgr/grp/CMakeLists.txt new file mode 100644 index 000000000000..eb102c86b017 --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/CMakeLists.txt @@ -0,0 +1,7 @@ +# +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_OS os_mgmt) diff --git a/subsys/mgmt/mcumgr/grp/Kconfig b/subsys/mgmt/mcumgr/grp/Kconfig new file mode 100644 index 000000000000..d2eed051f4b5 --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/Kconfig @@ -0,0 +1,11 @@ +# +# Copyright (c) 2024 Nordic Semiconductor +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +menu "Additional MCUmgr group configuration" + +rsource "os_mgmt/Kconfig" + +endmenu diff --git a/subsys/mgmt/mcumgr/grp/os_mgmt/CMakeLists.txt b/subsys/mgmt/mcumgr/grp/os_mgmt/CMakeLists.txt new file mode 100644 index 000000000000..81ea1db57a66 --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/os_mgmt/CMakeLists.txt @@ -0,0 +1,10 @@ +# +# Copyright (c) 2024 Nordic Semiconductor ASA +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +if(CONFIG_MCUMGR_GRP_OS_BOOTLOADER_INFO_B0_ACTIVE_SLOT) + zephyr_library_amend() + zephyr_library_sources(src/os_mgmt_b0_active_slot.c) +endif() diff --git a/subsys/mgmt/mcumgr/grp/os_mgmt/Kconfig b/subsys/mgmt/mcumgr/grp/os_mgmt/Kconfig new file mode 100644 index 000000000000..94ecd3970b9c --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/os_mgmt/Kconfig @@ -0,0 +1,22 @@ +# +# Copyright (c) 2024 Nordic Semiconductor ASA +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +menu "Additional MCUmgr OS group management functionality" + +config MCUMGR_GRP_OS_BOOTLOADER_INFO_B0_ACTIVE_SLOT + bool "Bootloader info query for active b0 slot" + depends on MCUMGR_GRP_OS_BOOTLOADER_INFO + depends on BOOTLOADER_MCUBOOT + depends on MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 + depends on FW_INFO + depends on FW_INFO_API + depends on MCUMGR_MGMT_NOTIFICATION_HOOKS + depends on MCUMGR_GRP_OS_BOOTLOADER_INFO_HOOK + help + Enables a bootloader info command for `active_b0_slot` which will return the active b0 + image slot number, and can be used to determine which update image should be loaded. + +endmenu diff --git a/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt_b0_active_slot.c b/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt_b0_active_slot.c new file mode 100644 index 000000000000..2ce8cc55b670 --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt_b0_active_slot.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +#include +#include +#include +#include +#include +#include + +static enum mgmt_cb_return bootloader_info_hook(uint32_t event, enum mgmt_cb_return prev_status, + int32_t *rc, uint16_t *group, bool *abort_more, + void *data, size_t data_size) +{ + struct os_mgmt_bootloader_info_data *bootloader_info_data = + (struct os_mgmt_bootloader_info_data *)data; + + if (event != MGMT_EVT_OP_OS_MGMT_BOOTLOADER_INFO || data_size != + sizeof(*bootloader_info_data)) { + *rc = MGMT_ERR_EUNKNOWN; + return MGMT_CB_ERROR_RC; + } + + if (*(bootloader_info_data->decoded) >= 1 && (sizeof("active_b0_slot") - 1) == + bootloader_info_data->query->len && memcmp("active_b0_slot", + bootloader_info_data->query->value, + bootloader_info_data->query->len) == 0) { + const struct fw_info *s0_info = fw_info_find(PM_S0_ADDRESS); + const struct fw_info *s1_info = fw_info_find(PM_S1_ADDRESS); + + if (s0_info || s1_info) { + uint32_t active_slot; + bool ok; + + if (!s1_info || (s0_info && s0_info->version >= s1_info->version)) { + active_slot = 0; + } else if (!s0_info || (s1_info && s1_info->version > s0_info->version)) { + active_slot = 1; + } + + ok = zcbor_tstr_put_lit(bootloader_info_data->zse, "active") && + zcbor_uint32_put(bootloader_info_data->zse, active_slot); + *rc = (ok ? MGMT_ERR_EOK : MGMT_ERR_EMSGSIZE); + return MGMT_CB_ERROR_RC; + } + + /* Return response not valid error when active slot cannot be determined */ + *group = MGMT_GROUP_ID_OS; + *rc = OS_MGMT_ERR_QUERY_RESPONSE_VALUE_NOT_VALID; + return MGMT_CB_ERROR_ERR; + } + + return MGMT_CB_OK; +} + +static struct mgmt_callback cmd_bootloader_info_cb = { + .callback = bootloader_info_hook, + .event_id = MGMT_EVT_OP_OS_MGMT_BOOTLOADER_INFO, +}; + +static int os_mgmt_register_bootloader_info_hook_b0_active_slot(void) +{ + mgmt_callback_register(&cmd_bootloader_info_cb); + return 0; +} + +SYS_INIT(os_mgmt_register_bootloader_info_hook_b0_active_slot, APPLICATION, 0); diff --git a/sysbuild/CMakeLists.txt b/sysbuild/CMakeLists.txt index f6c5edf6c8ea..7dbe1ba7bfbd 100644 --- a/sysbuild/CMakeLists.txt +++ b/sysbuild/CMakeLists.txt @@ -394,6 +394,7 @@ function(${SYSBUILD_CURRENT_MODULE_NAME}_pre_cmake) set_property(TARGET ${DEFAULT_IMAGE} APPEND_STRING PROPERTY CONFIG "CONFIG_MCUBOOT_NETWORK_CORE_IMAGE_NUMBER=${SB_CONFIG_MCUBOOT_NETWORK_CORE_IMAGE_NUMBER}\n") set_property(TARGET ${DEFAULT_IMAGE} APPEND_STRING PROPERTY CONFIG "CONFIG_MCUBOOT_WIFI_PATCHES_IMAGE_NUMBER=${SB_CONFIG_MCUBOOT_WIFI_PATCHES_IMAGE_NUMBER}\n") set_property(TARGET ${DEFAULT_IMAGE} APPEND_STRING PROPERTY CONFIG "CONFIG_MCUBOOT_QSPI_XIP_IMAGE_NUMBER=${SB_CONFIG_MCUBOOT_QSPI_XIP_IMAGE_NUMBER}\n") + set_property(TARGET ${DEFAULT_IMAGE} APPEND_STRING PROPERTY CONFIG "CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER=${SB_CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER}\n") endif() if(SB_CONFIG_MCUBOOT_HARDWARE_DOWNGRADE_PREVENTION) diff --git a/west.yml b/west.yml index 06ca7ab69135..be098750ae6a 100644 --- a/west.yml +++ b/west.yml @@ -69,7 +69,7 @@ manifest: # https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/guides/modules.html - name: zephyr repo-path: sdk-zephyr - revision: 76a46cb2baf310a06bbdb0b1d7d99394ec04a671 + revision: 763e6a8ab82bd1a346a9b14a4b8fc7509c8441b6 import: # In addition to the zephyr repository itself, NCS also # imports the contents of zephyr/west.yml at the above