util/cse_serger: Add command `create-cse-region`

This change adds a new command `create-cse-region` to cse_serger tool
which takes as inputs offset:size and file for different CSE
partitions and generates the entire CSE region image.

BUG=b:189177186

Change-Id: Ib087f5516e5beb6390831ef4e34b0b067d3fbc8b
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/58215
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
This commit is contained in:
Furquan Shaikh 2021-10-10 23:07:09 -07:00 committed by Furquan Shaikh
parent 8b4ca15d7e
commit bf848ad4b2
1 changed files with 100 additions and 0 deletions

View File

@ -22,6 +22,7 @@ static struct params {
const char *version_str; const char *version_str;
const char *input_file; const char *input_file;
struct region layout_regions[BP_TOTAL]; struct region layout_regions[BP_TOTAL];
const char *layout_files[BP_TOTAL];
} params; } params;
static const struct { static const struct {
@ -640,6 +641,20 @@ static int allocate_buffer(struct buffer *buff, struct buffer *wbuff, const char
return 0; return 0;
} }
static size_t get_cse_region_end_offset(void)
{
size_t offset = 0;
size_t end_offset;
for (size_t i = 0; i < BP_TOTAL; i++) {
end_offset = region_end(&params.layout_regions[i]);
if (end_offset > offset)
offset = end_offset;
}
return offset;
}
static int fill_layout_buffer(struct buffer *buff) static int fill_layout_buffer(struct buffer *buff)
{ {
struct buffer wbuff; struct buffer wbuff;
@ -672,6 +687,58 @@ static int cmd_create_layout(void)
return 0; return 0;
} }
static int cmd_create_cse_region(void)
{
size_t file_size = get_cse_region_end_offset();
struct buffer cse_buff, layout_buff;
if (fill_layout_buffer(&layout_buff))
return -1;
if (file_size == 0)
file_size = buffer_size(&layout_buff);
file_size = ALIGN_UP(file_size, BUFF_SIZE_ALIGN);
if (buffer_create(&cse_buff, file_size, "CSE buff")) {
ERROR("CSE buffer creation error!\n");
return -1;
}
memset(buffer_get(&cse_buff), 0xff, buffer_size(&cse_buff));
memcpy(buffer_get(&cse_buff), buffer_get(&layout_buff), buffer_size(&layout_buff));
for (size_t i = 0; i < BP_TOTAL; i++) {
struct buffer wbuff, rbuff;
if (region_sz(&params.layout_regions[i]) == 0)
continue;
buffer_clone(&wbuff, &cse_buff);
buffer_seek(&wbuff, region_offset(&params.layout_regions[i]));
if (params.layout_files[i] == NULL) {
if (i == 0) {
ERROR("File name not provided for DP!\n");
} else {
ERROR("File name not provided for BP%zd!\n", i);
}
return -1;
}
if (buffer_from_file(&rbuff, params.layout_files[i])) {
ERROR("Failed to read %s\n", params.layout_files[i]);
return -1;
}
assert(buffer_size(&wbuff) >= buffer_size(&rbuff));
memcpy(buffer_get(&wbuff), buffer_get(&rbuff), buffer_size(&rbuff));
}
buffer_write_file(&cse_buff, params.image_name);
return 0;
}
static int cmd_create_bpdt(void) static int cmd_create_bpdt(void)
{ {
struct buffer buff; struct buffer buff;
@ -776,6 +843,7 @@ static struct command {
{ "print-layout", "v:?", cmd_print_layout, false }, { "print-layout", "v:?", cmd_print_layout, false },
{ "create-bpdt", "v:?", cmd_create_bpdt, false }, { "create-bpdt", "v:?", cmd_create_bpdt, false },
{ "add", "f:n:t:v:?", cmd_add, true }, { "add", "f:n:t:v:?", cmd_add, true },
{ "create-cse-region", "v:?", cmd_create_cse_region, false },
}; };
enum { enum {
@ -785,6 +853,11 @@ enum {
LONGOPT_BP3, LONGOPT_BP3,
LONGOPT_BP4, LONGOPT_BP4,
LONGOPT_DATA, LONGOPT_DATA,
LONGOPT_BP1_FILE,
LONGOPT_BP2_FILE,
LONGOPT_BP3_FILE,
LONGOPT_BP4_FILE,
LONGOPT_DATA_FILE,
LONGOPT_END, LONGOPT_END,
}; };
@ -796,10 +869,15 @@ static struct option long_options[] = {
{"sub_partition", no_argument, 0, 's'}, {"sub_partition", no_argument, 0, 's'},
{"version", required_argument, 0, 'v'}, {"version", required_argument, 0, 'v'},
{"bp1", required_argument, 0, LONGOPT_BP1}, {"bp1", required_argument, 0, LONGOPT_BP1},
{"bp1_file", required_argument, 0, LONGOPT_BP1_FILE},
{"bp2", required_argument, 0, LONGOPT_BP2}, {"bp2", required_argument, 0, LONGOPT_BP2},
{"bp2_file", required_argument, 0, LONGOPT_BP2_FILE},
{"bp3", required_argument, 0, LONGOPT_BP3}, {"bp3", required_argument, 0, LONGOPT_BP3},
{"bp3_file", required_argument, 0, LONGOPT_BP3_FILE},
{"bp4", required_argument, 0, LONGOPT_BP4}, {"bp4", required_argument, 0, LONGOPT_BP4},
{"bp4_file", required_argument, 0, LONGOPT_BP4_FILE},
{"dp", required_argument, 0, LONGOPT_DATA}, {"dp", required_argument, 0, LONGOPT_DATA},
{"dp_file", required_argument, 0, LONGOPT_DATA_FILE},
{NULL, 0, 0, 0 } {NULL, 0, 0, 0 }
}; };
@ -826,6 +904,8 @@ static void usage(const char *name)
" print [-s][-n NAME][-t TYPE]\n" " print [-s][-n NAME][-t TYPE]\n"
" dump [-o DIR][-n NAME]\n" " dump [-o DIR][-n NAME]\n"
" create-layout --dp <offset:size> --bp* <offset:size> -v VERSION\n" " create-layout --dp <offset:size> --bp* <offset:size> -v VERSION\n"
" create-cse-region --dp <offset:size> --dp_file <FILE> --bp* <offset:size>"
" --bp*_file <FILE> -v VERSION\n"
" print-layout -v VERSION\n" " print-layout -v VERSION\n"
" create-bpdt -v VERSION\n" " create-bpdt -v VERSION\n"
" add [-n NAME][-t TYPE][-f INPUT_FILE]\n" " add [-n NAME][-t TYPE][-f INPUT_FILE]\n"
@ -837,10 +917,15 @@ static void usage(const char *name)
" -t TYPE : Sub-partition type\n" " -t TYPE : Sub-partition type\n"
" -v VERSION : BPDT version\n" " -v VERSION : BPDT version\n"
" --dp <offset:size> : Offset and size of data partition\n" " --dp <offset:size> : Offset and size of data partition\n"
" --dp_file <FILE> : File for data partition\n"
" --bp1 <offset:size> : Offset and size of BP1\n" " --bp1 <offset:size> : Offset and size of BP1\n"
" --bp1_file <FILE> : File for BP1 partition\n"
" --bp2 <offset:size> : Offset and size of BP2\n" " --bp2 <offset:size> : Offset and size of BP2\n"
" --bp2_file <FILE> : File for BP2 partition\n"
" --bp3 <offset:size> : Offset and size of BP3\n" " --bp3 <offset:size> : Offset and size of BP3\n"
" --bp3_file <FILE> : File for BP3 partition\n"
" --bp4 <offset:size> : Offset and size of BP4\n" " --bp4 <offset:size> : Offset and size of BP4\n"
" --bp4_file <FILE> : File for BP4 partition\n"
"\n", "\n",
name, name); name, name);
} }
@ -920,6 +1005,21 @@ int main(int argc, char **argv)
case LONGOPT_DATA: case LONGOPT_DATA:
parse_region(&params.layout_regions[DP], optarg); parse_region(&params.layout_regions[DP], optarg);
break; break;
case LONGOPT_BP1_FILE:
params.layout_files[BP1] = optarg;
break;
case LONGOPT_BP2_FILE:
params.layout_files[BP2] = optarg;
break;
case LONGOPT_BP3_FILE:
params.layout_files[BP3] = optarg;
break;
case LONGOPT_BP4_FILE:
params.layout_files[BP4] = optarg;
break;
case LONGOPT_DATA_FILE:
params.layout_files[DP] = optarg;
break;
case 'h': case 'h':
case '?': case '?':
default: default: