[Sound-open-firmware] [PATCH] rimage: manifest: Move text offset into non immutable ROM structure.
text_offset was added to an immutable ROM structure that would break some tools and cause instability. Fix this by creating a new structure for rimage manifest data that can be modified without breaking the ROM ABI.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com --- rimage/manifest.c | 18 +++++++++--------- src/include/uapi/manifest.h | 27 +++++++++++++++++---------- src/platform/apollolake/base_module.c | 20 +++++++++++--------- src/platform/cannonlake/base_module.c | 20 +++++++++++--------- src/platform/cannonlake/boot_module.c | 20 +++++++++++--------- 5 files changed, 59 insertions(+), 46 deletions(-)
diff --git a/rimage/manifest.c b/rimage/manifest.c index 337f82a4..243c194f 100644 --- a/rimage/manifest.c +++ b/rimage/manifest.c @@ -194,7 +194,7 @@ static int man_get_module_manifest(struct image *image, struct module *module, { Elf32_Shdr *section; struct sof_man_segment_desc *segment; - struct sof_man_module sof_mod; + struct sof_man_module_manifest sof_mod; size_t count; int ret, man_section_idx;
@@ -224,14 +224,14 @@ static int man_get_module_manifest(struct image *image, struct module *module,
/* configure man_module with sofmod data */ memcpy(man_module->struct_id, "$AME", 4); - man_module->entry_point = sof_mod.entry_point; - memcpy(man_module->name, sof_mod.name, SOF_MAN_MOD_NAME_LEN); - memcpy(man_module->uuid, sof_mod.uuid, 16); - man_module->affinity_mask = sof_mod.affinity_mask; - man_module->type.auto_start = sof_mod.type.auto_start; - man_module->type.domain_dp = sof_mod.type.domain_dp; - man_module->type.domain_ll = sof_mod.type.domain_ll; - man_module->type.load_type = sof_mod.type.load_type; + man_module->entry_point = sof_mod.module.entry_point; + memcpy(man_module->name, sof_mod.module.name, SOF_MAN_MOD_NAME_LEN); + memcpy(man_module->uuid, sof_mod.module.uuid, 16); + man_module->affinity_mask = sof_mod.module.affinity_mask; + man_module->type.auto_start = sof_mod.module.type.auto_start; + man_module->type.domain_dp = sof_mod.module.type.domain_dp; + man_module->type.domain_ll = sof_mod.module.type.domain_ll; + man_module->type.load_type = sof_mod.module.type.load_type;
/* read out text_fixup_size from memory mapping */ module->text_fixup_size = sof_mod.text_size; diff --git a/src/include/uapi/manifest.h b/src/include/uapi/manifest.h index e83725bd..f53a6628 100644 --- a/src/include/uapi/manifest.h +++ b/src/include/uapi/manifest.h @@ -75,7 +75,7 @@ union sof_man_segment_flags { } __attribute__((packed));
/* - * Module segment descriptor. + * Module segment descriptor. Used by ROM - Immutable. */ struct sof_man_segment_desc { union sof_man_segment_flags flags; @@ -93,7 +93,7 @@ struct sof_man_segment_desc { #define SOF_MAN_MOD_ID {'$', 'A', 'M', 'E'}
/* - * Each module has an entry in the FW header. + * Each module has an entry in the FW header. Used by ROM - Immutable. */ struct sof_man_module { uint8_t struct_id[SOF_MAN_MOD_ID_LEN]; /* SOF_MAN_MOD_ID */ @@ -102,7 +102,6 @@ struct sof_man_module { struct sof_man_module_type type; uint8_t hash[SOF_MAN_MOD_SHA256_LEN]; uint32_t entry_point; - uint32_t text_size; uint16_t cfg_offset; uint16_t cfg_count; uint32_t affinity_mask; @@ -112,7 +111,7 @@ struct sof_man_module { } __attribute__((packed));
/* - * Each module has a configuration in the FW header. + * Each module has a configuration in the FW header. Used by ROM - Immutable. */ struct sof_man_mod_config { uint32_t par[4]; /* module parameters */ @@ -138,9 +137,9 @@ struct sof_man_mod_config {
/* * The firmware has a standard header that is checked by the ROM on firmware - * loading. - * preload_page_count is used by DMA code loader and is entire image size on - * CNL. i.e. CNL: total size of the binary’s .text and .rodata + * loading. preload_page_count is used by DMA code loader and is entire + * image size on CNL. i.e. CNL: total size of the binary’s .text and .rodata + * Used by ROM - Immutable. */ struct sof_man_fw_header { uint8_t header_id[4]; @@ -163,7 +162,7 @@ struct sof_man_fw_header {
/* * Firmware manifest descriptor. This can contain N modules and N module - * configs. + * configs. Used by ROM - Immutable. */ struct sof_man_fw_desc { struct sof_man_fw_header header; @@ -181,7 +180,7 @@ struct sof_man_fw_desc { } __attribute__((packed));
/* - * Component Descriptor + * Component Descriptor. Used by ROM - Immutable. */ struct sof_man_component_desc { uint32_t reserved[2]; /* all 0 */ @@ -194,7 +193,7 @@ struct sof_man_component_desc {
/* - * Audio DSP extended metadata. + * Audio DSP extended metadata. Used by ROM - Immutable. */ struct sof_man_adsp_meta_file_ext { uint32_t ext_type; /* always 17 for ADSP extension */ @@ -204,6 +203,14 @@ struct sof_man_adsp_meta_file_ext { struct sof_man_component_desc comp_desc[1]; } __attribute__((packed));
+/* + * Module Manifest for rimage module metadata. Not used by ROM. + */ +struct sof_man_module_manifest { + struct sof_man_module module; + uint32_t text_size; +}; + /* utility to get module pointer from position */ static inline struct sof_man_module *sof_man_get_module( struct sof_man_fw_desc *desc, int index) diff --git a/src/platform/apollolake/base_module.c b/src/platform/apollolake/base_module.c index 56633c5b..141d7ba8 100644 --- a/src/platform/apollolake/base_module.c +++ b/src/platform/apollolake/base_module.c @@ -36,16 +36,18 @@ * the SOF executable image but is inserted by object copy as a ELF section * for parsing by rimage (to genrate the manifest). */ -struct sof_man_module apl_manifest = { - .name = "BASEFW", - .uuid = {0x2e, 0x9e, 0x86, 0xfc, 0xf8, 0x45, 0x45, 0x40, - 0xa4, 0x16, 0x89, 0x88, 0x0a, 0xe3, 0x20, 0xa9}, - .entry_point = REEF_TEXT_START, - .type = { - .load_type = SOF_MAN_MOD_TYPE_MODULE, - .domain_ll = 1, +struct sof_man_module_manifest apl_manifest = { + .module = { + .name = "BASEFW", + .uuid = {0x2e, 0x9e, 0x86, 0xfc, 0xf8, 0x45, 0x45, 0x40, + 0xa4, 0x16, 0x89, 0x88, 0x0a, 0xe3, 0x20, 0xa9}, + .entry_point = REEF_TEXT_START, + .type = { + .load_type = SOF_MAN_MOD_TYPE_MODULE, + .domain_ll = 1, + }, + .affinity_mask = 3, }, - .affinity_mask = 3, .text_size = REEF_TEXT_SIZE + L2_VECTOR_SIZE, };
diff --git a/src/platform/cannonlake/base_module.c b/src/platform/cannonlake/base_module.c index dd5d7199..ac1f8737 100644 --- a/src/platform/cannonlake/base_module.c +++ b/src/platform/cannonlake/base_module.c @@ -36,16 +36,18 @@ * the SOF executable image but is inserted by object copy as a ELF section * for parsing by rimage (to genrate the manifest). */ -struct sof_man_module cnl_manifest = { - .name = "BASEFW", - .uuid = {0x32, 0x8c, 0x39, 0x0e, 0xde, 0x5a, 0x4b, 0xba, - 0x93, 0xb1, 0xc5, 0x04, 0x32, 0x28, 0x0e, 0xe4}, - .entry_point = REEF_TEXT_START, - .type = { - .load_type = SOF_MAN_MOD_TYPE_MODULE, - .domain_ll = 1, +struct sof_man_module_manifest cnl_manifest = { + .module = { + .name = "BASEFW", + .uuid = {0x32, 0x8c, 0x39, 0x0e, 0xde, 0x5a, 0x4b, 0xba, + 0x93, 0xb1, 0xc5, 0x04, 0x32, 0x28, 0x0e, 0xe4}, + .entry_point = REEF_TEXT_START, + .type = { + .load_type = SOF_MAN_MOD_TYPE_MODULE, + .domain_ll = 1, + }, + .affinity_mask = 3, }, - .affinity_mask = 3, };
/* not used, but stops linker complaining */ diff --git a/src/platform/cannonlake/boot_module.c b/src/platform/cannonlake/boot_module.c index 7d965f5d..48374933 100644 --- a/src/platform/cannonlake/boot_module.c +++ b/src/platform/cannonlake/boot_module.c @@ -36,16 +36,18 @@ * the SOF executable image but is inserted by object copy as a ELF section * for parsing by rimage (to genrate the manifest). */ -struct sof_man_module cnl_bootldr_manifest = { - .name = "BRNGUP", - .uuid = {0xf3, 0xe4, 0x79, 0x2b, 0x75, 0x46, 0x49, 0xf6, - 0x89, 0xdf, 0x3b, 0xc1, 0x94, 0xa9, 0x1a, 0xeb}, - .entry_point = IMR_BOOT_LDR_TEXT_ENTRY_BASE, - .type = { - .load_type = SOF_MAN_MOD_TYPE_MODULE, - .domain_ll = 1, +struct sof_man_module_manifest cnl_bootldr_manifest = { + .module = { + .name = "BRNGUP", + .uuid = {0xf3, 0xe4, 0x79, 0x2b, 0x75, 0x46, 0x49, 0xf6, + 0x89, 0xdf, 0x3b, 0xc1, 0x94, 0xa9, 0x1a, 0xeb}, + .entry_point = IMR_BOOT_LDR_TEXT_ENTRY_BASE, + .type = { + .load_type = SOF_MAN_MOD_TYPE_MODULE, + .domain_ll = 1, + }, + .affinity_mask = 3, }, - .affinity_mask = 3, };
/* not used, but stops linker complaining */
participants (1)
-
Liam Girdwood