From 287af39fb5445a52db6ca3f18237d0ff5833a039 Mon Sep 17 00:00:00 2001 From: Yi-Hsuan Deng Date: Thu, 21 May 2026 13:11:27 +0000 Subject: [PATCH] [rescue] Avoid large rodata initializer for dfu_ctx_t The `dfu_ctx_t` struct has a large buffer allocated for rescue transfers. Using a designated initializer for this struct produces a large, mostly zero-filled initializer in `rodata`, consuming approximately 2.5K of ROM_EXT flash space. To reclaim this space, this change replaces the designated initializer with manual field-by-field initialization, eliminating the bloated `rodata` payload. Change-Id: Ifbbdc4977104cc980677af2b8ca61507d592f1a3 Signed-off-by: Yi-Hsuan Deng --- .../silicon_creator/lib/rescue/rescue_spi.c | 8 ++++---- .../silicon_creator/lib/rescue/rescue_usb.c | 19 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/sw/device/silicon_creator/lib/rescue/rescue_spi.c b/sw/device/silicon_creator/lib/rescue/rescue_spi.c index 37ac20504eacb..da4e27a2a5429 100644 --- a/sw/device/silicon_creator/lib/rescue/rescue_spi.c +++ b/sw/device/silicon_creator/lib/rescue/rescue_spi.c @@ -78,10 +78,10 @@ void dfu_transport_result(dfu_ctx_t *ctx, rom_error_t result) { rom_error_t rescue_protocol(boot_data_t *bootdata, boot_log_t *boot_log, const owner_rescue_config_t *config) { - dfu_ctx_t ctx = { - .dfu_state = kDfuStateIdle, - .dfu_error = kDfuErrOk, - }; + dfu_ctx_t ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.dfu_state = kDfuStateIdle; + ctx.dfu_error = kDfuErrOk; dbg_printf("SPI-DFU rescue ready\r\n"); rescue_state_init(&ctx.state, bootdata, boot_log, config); spi_device_init( diff --git a/sw/device/silicon_creator/lib/rescue/rescue_usb.c b/sw/device/silicon_creator/lib/rescue/rescue_usb.c index 9d355039afa23..030dc4f9e9b80 100644 --- a/sw/device/silicon_creator/lib/rescue/rescue_usb.c +++ b/sw/device/silicon_creator/lib/rescue/rescue_usb.c @@ -7,6 +7,7 @@ #include "sw/device/lib/arch/device.h" #include "sw/device/lib/base/macros.h" +#include "sw/device/lib/base/memory.h" #include "sw/device/silicon_creator/lib/boot_data.h" #include "sw/device/silicon_creator/lib/dbg_print.h" #include "sw/device/silicon_creator/lib/drivers/lifecycle.h" @@ -164,16 +165,14 @@ void dfu_transport_result(dfu_ctx_t *ctx, rom_error_t result) { rom_error_t rescue_protocol(boot_data_t *bootdata, boot_log_t *boot_log, const owner_rescue_config_t *config) { set_serialnumber(); - dfu_ctx_t ctx = { - .ep0 = - { - .device_desc = &device_desc, - .config_desc = config_desc, - .string_desc = string_desc, - }, - .dfu_state = kDfuStateIdle, - .dfu_error = kDfuErrOk, - }; + dfu_ctx_t ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.ep0.device_desc = &device_desc; + ctx.ep0.config_desc = config_desc; + ctx.ep0.string_desc = string_desc; + ctx.dfu_state = kDfuStateIdle; + ctx.dfu_error = kDfuErrOk; + dbg_printf("USB-DFU rescue ready\r\n"); rescue_state_init(&ctx.state, bootdata, boot_log, config); pinmux_init_usb();