mirror of https://github.com/thesofproject/sof.git
debugability: rimage: extract .static_log_entries from elf
.static_log_entries section is extracted to logs dictionary to remove xtensa toolchain dependency from logs parser. Signed-off-by: ArturX Kloniecki <arturx.kloniecki@linux.intel.com>
This commit is contained in:
parent
fd628ec368
commit
202c655364
11
rimage/elf.c
11
rimage/elf.c
|
@ -87,6 +87,12 @@ static int elf_read_sections(struct image *image, struct module *module)
|
||||||
fprintf(stdout, " BSS module metadata section at index %d\n",
|
fprintf(stdout, " BSS module metadata section at index %d\n",
|
||||||
man_section_idx);
|
man_section_idx);
|
||||||
|
|
||||||
|
/* find log entries section */
|
||||||
|
module->logs_index = elf_find_section(image, module,
|
||||||
|
".static_log_entries");
|
||||||
|
fprintf(stdout, " static log entries section at index %d\n",
|
||||||
|
module->logs_index);
|
||||||
|
|
||||||
/* parse each section */
|
/* parse each section */
|
||||||
for (i = 0; i < hdr->e_shnum; i++) {
|
for (i = 0; i < hdr->e_shnum; i++) {
|
||||||
|
|
||||||
|
@ -281,6 +287,9 @@ static void elf_module_size(struct image *image, struct module *module,
|
||||||
fprintf(stdout, "\tHEAP\t");
|
fprintf(stdout, "\tHEAP\t");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SHT_NOTE:
|
||||||
|
fprintf(stdout, "\tNOTE\t");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -343,7 +352,7 @@ static void elf_module_limits(struct image *image, struct module *module)
|
||||||
section = &module->section[i];
|
section = &module->section[i];
|
||||||
|
|
||||||
/* module bss can sometimes be missed */
|
/* module bss can sometimes be missed */
|
||||||
if (i != module->bss_index) {
|
if (i != module->bss_index && i != module->logs_index) {
|
||||||
|
|
||||||
/* only check valid sections */
|
/* only check valid sections */
|
||||||
if (!(section->sh_flags & valid))
|
if (!(section->sh_flags & valid))
|
||||||
|
|
|
@ -67,6 +67,9 @@
|
||||||
#define SND_SOF_FW_ABI 1
|
#define SND_SOF_FW_ABI 1
|
||||||
#define SND_SOF_FW_SIG "Reef"
|
#define SND_SOF_FW_SIG "Reef"
|
||||||
|
|
||||||
|
#define SND_SOF_LOGS_SIG_SIZE 4
|
||||||
|
#define SND_SOF_LOGS_SIG "Logs"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Firmware module is made up of 1 . N blocks of different types. The
|
* Firmware module is made up of 1 . N blocks of different types. The
|
||||||
* Block header is used to determine where and how block is to be copied in the
|
* Block header is used to determine where and how block is to be copied in the
|
||||||
|
@ -114,4 +117,13 @@ struct snd_sof_fw_header {
|
||||||
uint32_t abi; /* version of header format */
|
uint32_t abi; /* version of header format */
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Logs dictionary file header.
|
||||||
|
*/
|
||||||
|
struct snd_sof_logs_header {
|
||||||
|
unsigned char sig[SND_SOF_LOGS_SIG_SIZE]; /* "Logs" */
|
||||||
|
uint32_t base_address; /* address of log entries section */
|
||||||
|
uint32_t data_length; /* amount of bytes following this header */
|
||||||
|
uint32_t data_offset; /* offset to first entry in this file */
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -345,6 +345,60 @@ static int simple_write_firmware(struct image *image)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int write_logs_dictionary(struct image *image)
|
||||||
|
{
|
||||||
|
struct snd_sof_logs_header header;
|
||||||
|
int i, ret = 0;
|
||||||
|
void *buffer = NULL;
|
||||||
|
|
||||||
|
memcpy(header.sig, SND_SOF_LOGS_SIG, SND_SOF_LOGS_SIG_SIZE);
|
||||||
|
header.data_offset = sizeof(struct snd_sof_logs_header);
|
||||||
|
|
||||||
|
for (i = 0; i < image->num_modules; i++) {
|
||||||
|
struct module *module = &image->module[i];
|
||||||
|
|
||||||
|
if (module->logs_index > 0) {
|
||||||
|
Elf32_Shdr *section = &module->section[module->logs_index];
|
||||||
|
|
||||||
|
header.base_address = section->sh_addr;
|
||||||
|
header.data_length = section->sh_size;
|
||||||
|
|
||||||
|
fwrite(&header, sizeof(struct snd_sof_logs_header), 1,
|
||||||
|
image->ldc_out_fd);
|
||||||
|
|
||||||
|
buffer = calloc(1, section->sh_size);
|
||||||
|
if (!buffer)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
fseek(module->fd, section->sh_offset, SEEK_SET);
|
||||||
|
size_t count = fread(buffer, 1, section->sh_size,
|
||||||
|
module->fd);
|
||||||
|
if (count != section->sh_size) {
|
||||||
|
fprintf(stderr, "error: can't read section %d\n",
|
||||||
|
-errno);
|
||||||
|
ret = -errno;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
count = fwrite(buffer, 1, section->sh_size,
|
||||||
|
image->ldc_out_fd);
|
||||||
|
if (count != section->sh_size) {
|
||||||
|
fprintf(stderr, "error: can't write section %d\n",
|
||||||
|
-errno);
|
||||||
|
ret = -errno;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "logs dictionary: size %d\n\n",
|
||||||
|
header.data_length + header.data_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
if (buffer)
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
const struct adsp machine_byt = {
|
const struct adsp machine_byt = {
|
||||||
.name = "byt",
|
.name = "byt",
|
||||||
.iram_base = BYT_IRAM_BASE,
|
.iram_base = BYT_IRAM_BASE,
|
||||||
|
|
|
@ -41,6 +41,7 @@ static void usage(char *name)
|
||||||
fprintf(stdout, "\t -v enable verbose output\n");
|
fprintf(stdout, "\t -v enable verbose output\n");
|
||||||
fprintf(stdout, "\t -r enable relocatable ELF files\n");
|
fprintf(stdout, "\t -r enable relocatable ELF files\n");
|
||||||
fprintf(stdout, "\t -s MEU signing offset\n");
|
fprintf(stdout, "\t -s MEU signing offset\n");
|
||||||
|
fprintf(stdout, "\t -p log dictionary outfile\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,11 +53,14 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
memset(&image, 0, sizeof(image));
|
memset(&image, 0, sizeof(image));
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "ho:m:vba:s:k:l:r")) != -1) {
|
while ((opt = getopt(argc, argv, "ho:p:m:vba:s:k:l:r")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'o':
|
case 'o':
|
||||||
image.out_file = optarg;
|
image.out_file = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'p':
|
||||||
|
image.ldc_out_file = optarg;
|
||||||
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
mach = optarg;
|
mach = optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -89,6 +93,8 @@ int main(int argc, char *argv[])
|
||||||
if (image.out_file == NULL || mach == NULL)
|
if (image.out_file == NULL || mach == NULL)
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
|
||||||
|
if (image.ldc_out_file == NULL)
|
||||||
|
image.ldc_out_file = "out.ldc";
|
||||||
|
|
||||||
/* find machine */
|
/* find machine */
|
||||||
for (i = 0; i < ARRAY_SIZE(machine); i++) {
|
for (i = 0; i < ARRAY_SIZE(machine); i++) {
|
||||||
|
@ -136,11 +142,23 @@ found:
|
||||||
ret = image.adsp->write_firmware_meu(&image);
|
ret = image.adsp->write_firmware_meu(&image);
|
||||||
else
|
else
|
||||||
ret = image.adsp->write_firmware(&image);
|
ret = image.adsp->write_firmware(&image);
|
||||||
|
|
||||||
|
unlink(image.ldc_out_file);
|
||||||
|
image.ldc_out_fd = fopen(image.ldc_out_file, "w");
|
||||||
|
if (image.ldc_out_fd == NULL) {
|
||||||
|
fprintf(stderr, "error: unable to open %s for writing %d\n",
|
||||||
|
image.ldc_out_file, errno);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ret = write_logs_dictionary(&image);
|
||||||
out:
|
out:
|
||||||
/* close files */
|
/* close files */
|
||||||
if (image.out_fd)
|
if (image.out_fd)
|
||||||
fclose(image.out_fd);
|
fclose(image.out_fd);
|
||||||
|
|
||||||
|
if (image.ldc_out_fd)
|
||||||
|
fclose(image.ldc_out_fd);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ struct module {
|
||||||
int num_bss;
|
int num_bss;
|
||||||
int fw_size;
|
int fw_size;
|
||||||
int bss_index;
|
int bss_index;
|
||||||
|
int logs_index;
|
||||||
|
|
||||||
/* sizes do not include any gaps */
|
/* sizes do not include any gaps */
|
||||||
int bss_size;
|
int bss_size;
|
||||||
|
@ -90,7 +91,9 @@ struct module {
|
||||||
struct image {
|
struct image {
|
||||||
|
|
||||||
const char *out_file;
|
const char *out_file;
|
||||||
|
const char *ldc_out_file;
|
||||||
FILE *out_fd;
|
FILE *out_fd;
|
||||||
|
FILE *ldc_out_fd;
|
||||||
void *pos;
|
void *pos;
|
||||||
|
|
||||||
const struct adsp *adsp;
|
const struct adsp *adsp;
|
||||||
|
@ -145,6 +148,8 @@ struct adsp {
|
||||||
struct fw_image_manifest *man;
|
struct fw_image_manifest *man;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int write_logs_dictionary(struct image *image);
|
||||||
|
|
||||||
void module_sha256_create(struct image *image);
|
void module_sha256_create(struct image *image);
|
||||||
void module_sha256_update(struct image *image, uint8_t *data, size_t bytes);
|
void module_sha256_update(struct image *image, uint8_t *data, size_t bytes);
|
||||||
void module_sha256_complete(struct image *image, uint8_t *hash);
|
void module_sha256_complete(struct image *image, uint8_t *hash);
|
||||||
|
|
Loading…
Reference in New Issue