Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] rimage: Add support for multiple toml file #179

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 38 additions & 3 deletions src/adsp_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -2337,15 +2337,50 @@ static int adsp_parse_config_fd(FILE *fd, struct image *image)
return ret;
}

static void copy_file(FILE *src, FILE *dst)
{
char ch;
while ((ch = fgetc(src)) != EOF)
fputc(ch, dst);
}

static FILE* adsp_conf_files_open(const struct adsp_conf_files *files, const char *mode)
{
FILE *file, *out_file;
int i;

out_file = fopen(files->out_file, "w");
if (!out_file) {
file_error("unable to open file for writing", files->out_file);
return NULL;
}

/* Merge multiple input toml files into one */
for (i = 0; i < files->file_count; i++) {
fprintf(out_file, "## File path: %s\n", files->file[i]);
file = fopen(files->file[i], "r");
if (!file) {
file_error("unable to open file for reading", files->file[i]);
fclose(out_file);
return NULL;
}
copy_file(file, out_file);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use file pointer as parameter is not always proposed, directly read and write is also very simple.
btw, how about fread/fwrite? since toml file is not big.

fclose(file);
fprintf(out_file, "\n\n");
}
fclose(out_file);
return fopen(files->out_file, mode);
}

/* public function, fully handle parsing process */
int adsp_parse_config(const char *file, struct image *image)
int adsp_parse_config(const struct adsp_conf_files *files, struct image *image)
{
FILE *fd;
int ret;

fd = fopen(file, "r");
fd = adsp_conf_files_open(files, "r");
if (!fd)
return file_error("unable to open file for reading", file);
return file_error("unable to open file for reading", files->out_file);

ret = adsp_parse_config_fd(fd, image);
fclose(fd);
Expand Down
2 changes: 1 addition & 1 deletion src/include/rimage/adsp_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
#include <rimage/rimage.h>
#include <stdbool.h>

int adsp_parse_config(const char *file, struct image *image);
int adsp_parse_config(const struct adsp_conf_files *file, struct image *image);
void adsp_free(struct adsp *adsp);
7 changes: 7 additions & 0 deletions src/include/rimage/rimage.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#define MAX_MODULES 32
#define MAX_SUPPORTED_CONF_FILES 8

struct adsp;

Expand Down Expand Up @@ -128,6 +129,12 @@ struct adsp {
int exec_boot_ldr;
};

struct adsp_conf_files {
uint32 file_count;
char *file[MAX_SUPPORTED_CONF_FILES];
char *out_file;
};

int ri_manifest_sign_v1_5(struct image *image);
int ri_manifest_sign_v1_8(struct image *image);
int ri_manifest_sign_v2_5(struct image *image);
Expand Down
36 changes: 28 additions & 8 deletions src/rimage.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,14 @@ int main(int argc, char *argv[])
{
struct image image;
struct adsp *heap_adsp;
const char *adsp_config = NULL;
int opt, ret, i, first_non_opt;
struct adsp_conf_files files;
int opt, ret, first_non_opt;
int use_ext_man = 0;
unsigned int pv_bit = 0;
const char *adsp_desc_suffix = ".toml";
bool imr_type_override = false;
int i = 0;
size_t len;

memset(&image, 0, sizeof(image));

Expand Down Expand Up @@ -84,7 +87,8 @@ int main(int argc, char *argv[])
use_ext_man = 1;
break;
case 'c':
adsp_config = optarg;
files.file[i] = optarg;
i++;
break;
case 'y':
image.verify_file = optarg;
Expand All @@ -110,24 +114,38 @@ int main(int argc, char *argv[])
first_non_opt = optind;

/* we must have config */
if (!adsp_config) {
if (i == 0 || i >= MAX_SUPPORTED_CONF_FILES) {
usage(argv[0]);
fprintf(stderr, "error: must have adsp desc\n");
fprintf(stderr, "error: invalid number of adsp_desc provided\n");
return -EINVAL;
}
files.file_count = i;

/* requires private key */
if (!image.key_name) {
fprintf(stderr, "error: requires private key\n");
return -EINVAL;
}

/* make sure we have an outfile if not verifying */
if ((!image.out_file && !image.verify_file)) {
/* We are either signing or verifying an image, not both or neither */
if (!(!!image.out_file ^ !!image.verify_file)) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

possible to figure out a more easier expression for better understanding?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

" not both or neither " would this not imply to fail if !out_file == !verify_file ? Pls check my logic here though.

usage(argv[0]);
return -EINVAL;
}

/* Construct the output path for the final adsp_desc toml */
files.out_file = NULL;
if (image.out_file){
len = strlen(image.out_file);
files.out_file = malloc(len + strlen(adsp_desc_suffix) + 1);
strcpy(files.out_file, image.out_file);
} else {
len = strlen(image.verify_file);
files.out_file = malloc(len + strlen(adsp_desc_suffix) + 1);
strcpy(files.out_file, image.verify_file);
}
strcpy(files.out_file + len, adsp_desc_suffix);

/* firmware version: major.minor.micro */
if (image.fw_ver_string) {
ret = sscanf(image.fw_ver_string, "%hu.%hu.%hu",
Expand Down Expand Up @@ -161,7 +179,7 @@ int main(int argc, char *argv[])
}
image.adsp = heap_adsp;
memset(heap_adsp, 0, sizeof(*heap_adsp));
ret = adsp_parse_config(adsp_config, &image);
ret = adsp_parse_config(&files, &image);
if (ret < 0)
goto out;

Expand Down Expand Up @@ -272,5 +290,7 @@ int main(int argc, char *argv[])
if (image.out_fd)
fclose(image.out_fd);

free(files.out_file);

return ret;
}
Loading