summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--host/lib/crossystem.c37
-rw-r--r--host/lib/flashrom.c18
-rw-r--r--host/lib/include/flashrom.h38
-rw-r--r--tests/vb2_host_flashrom_tests.c54
-rw-r--r--tests/vb2_host_nvdata_flashrom_tests.c24
5 files changed, 92 insertions, 79 deletions
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index 7c3ee879..a5427c2d 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -821,21 +821,21 @@ int vb2_read_nv_storage_flashrom(struct vb2_context *ctx)
{
int index;
int vbnv_size = vb2_nv_get_size(ctx);
- uint8_t *flash_buf;
- uint32_t flash_size;
- if (flashrom_read(FLASHROM_PROGRAMMER_INTERNAL_AP, VBNV_FMAP_REGION,
- &flash_buf, &flash_size))
+ struct firmware_image image = {
+ .programmer = FLASHROM_PROGRAMMER_INTERNAL_AP,
+ };
+ if (flashrom_read(&image, VBNV_FMAP_REGION))
return -1;
- index = vb2_nv_index(flash_buf, flash_size, vbnv_size);
+ index = vb2_nv_index(image.data, image.size, vbnv_size);
if (index < 0) {
- free(flash_buf);
+ free(image.data);
return -1;
}
- memcpy(ctx->nvdata, &flash_buf[index * vbnv_size], vbnv_size);
- free(flash_buf);
+ memcpy(ctx->nvdata, &image.data[index * vbnv_size], vbnv_size);
+ free(image.data);
return 0;
}
@@ -845,34 +845,33 @@ int vb2_write_nv_storage_flashrom(struct vb2_context *ctx)
int current_index;
int next_index;
int vbnv_size = vb2_nv_get_size(ctx);
- uint8_t *flash_buf;
- uint32_t flash_size;
- if (flashrom_read(FLASHROM_PROGRAMMER_INTERNAL_AP, VBNV_FMAP_REGION,
- &flash_buf, &flash_size))
+ struct firmware_image image = {
+ .programmer = FLASHROM_PROGRAMMER_INTERNAL_AP,
+ };
+ if (flashrom_read(&image, VBNV_FMAP_REGION))
return -1;
- current_index = vb2_nv_index(flash_buf, flash_size, vbnv_size);
+ current_index = vb2_nv_index(image.data, image.size, vbnv_size);
if (current_index < 0) {
rv = -1;
goto exit;
}
next_index = current_index + 1;
- if (next_index * vbnv_size == flash_size) {
+ if (next_index * vbnv_size == image.size) {
/* VBNV is full. Erase and write at beginning. */
- memset(flash_buf, 0xff, flash_size);
+ memset(image.data, 0xff, image.size);
next_index = 0;
}
- memcpy(&flash_buf[next_index * vbnv_size], ctx->nvdata, vbnv_size);
- if (flashrom_write(FLASHROM_PROGRAMMER_INTERNAL_AP, VBNV_FMAP_REGION,
- flash_buf, flash_size)) {
+ memcpy(&image.data[next_index * vbnv_size], ctx->nvdata, vbnv_size);
+ if (flashrom_write(&image, VBNV_FMAP_REGION)) {
rv = -1;
goto exit;
}
exit:
- free(flash_buf);
+ free(image.data);
return rv;
}
diff --git a/host/lib/flashrom.c b/host/lib/flashrom.c
index e83dfb20..6ee5971b 100644
--- a/host/lib/flashrom.c
+++ b/host/lib/flashrom.c
@@ -103,15 +103,14 @@ static vb2_error_t run_flashrom(const char *const argv[])
return VB2_SUCCESS;
}
-vb2_error_t flashrom_read(const char *programmer, const char *region,
- uint8_t **data_out, uint32_t *size_out)
+vb2_error_t flashrom_read(struct firmware_image *image, const char *region)
{
char *tmpfile;
char region_param[PATH_MAX];
vb2_error_t rv;
- *data_out = NULL;
- *size_out = 0;
+ image->data = NULL;
+ image->size = 0;
VB2_TRY(write_temp_file(NULL, 0, &tmpfile));
@@ -122,7 +121,7 @@ vb2_error_t flashrom_read(const char *programmer, const char *region,
const char *const argv[] = {
FLASHROM_EXEC_NAME,
"-p",
- programmer,
+ image->programmer,
"-r",
region ? "-i" : tmpfile,
region ? region_param : NULL,
@@ -131,21 +130,20 @@ vb2_error_t flashrom_read(const char *programmer, const char *region,
rv = run_flashrom(argv);
if (rv == VB2_SUCCESS)
- rv = vb2_read_file(tmpfile, data_out, size_out);
+ rv = vb2_read_file(tmpfile, &image->data, &image->size);
unlink(tmpfile);
free(tmpfile);
return rv;
}
-vb2_error_t flashrom_write(const char *programmer, const char *region,
- uint8_t *data, uint32_t size)
+vb2_error_t flashrom_write(struct firmware_image *image, const char *region)
{
char *tmpfile;
char region_param[PATH_MAX];
vb2_error_t rv;
- VB2_TRY(write_temp_file(data, size, &tmpfile));
+ VB2_TRY(write_temp_file(image->data, image->size, &tmpfile));
if (region)
snprintf(region_param, sizeof(region_param), "%s:%s", region,
@@ -154,7 +152,7 @@ vb2_error_t flashrom_write(const char *programmer, const char *region,
const char *const argv[] = {
FLASHROM_EXEC_NAME,
"-p",
- programmer,
+ image->programmer,
"--noverify-all",
"-w",
region ? "-i" : tmpfile,
diff --git a/host/lib/include/flashrom.h b/host/lib/include/flashrom.h
index 560fbb0e..0d934424 100644
--- a/host/lib/include/flashrom.h
+++ b/host/lib/include/flashrom.h
@@ -12,39 +12,39 @@
#define FLASHROM_PROGRAMMER_INTERNAL_AP "host"
#define FLASHROM_PROGRAMMER_INTERNAL_EC "ec"
+/* Utilities for firmware images and (FMAP) sections */
+struct firmware_image {
+ /**
+ * programmer The name of the programmer to use. Use either
+ * FLASHROM_PROGRAMMER_INTERNAL_AP or,
+ * FLASHROM_PROGRAMMER_INTERNAL_EC
+ * for the AP and EC respectively.
+ */
+ const char *programmer;
+ uint32_t size; /* buffer size. */
+ uint8_t *data; /* data allocated buffer to read/write with. */
+};
+
/**
* Read using flashrom into an allocated buffer.
*
- * @param programmer The name of the programmer to use. There are
- * named constants FLASHROM_PROGRAMMER_INTERNAL_AP
- * and FLASHROM_PROGRAMMER_INTERNAL_EC available
- * for the AP and EC respectively, or a custom
- * programmer string can be provided.
+ * @param image The parameter that contains the programmer, buffer and
+ * size to use in the read operation.
* @param region The name of the fmap region to read, or NULL to
* read the entire flash chip.
- * @param data_out Output parameter of allocated buffer to read into.
- * The caller should free the buffer.
- * @param size_out Output parameter of buffer size.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
-vb2_error_t flashrom_read(const char *programmer, const char *region,
- uint8_t **data_out, uint32_t *size_out);
+vb2_error_t flashrom_read(struct firmware_image *image, const char *region);
/**
* Write using flashrom from a buffer.
*
- * @param programmer The name of the programmer to use. There are
- * named constants FLASHROM_PROGRAMMER_INTERNAL_AP
- * and FLASHROM_PROGRAMMER_INTERNAL_EC available
- * for the AP and EC respectively, or a custom
- * programmer string can be provided.
+ * @param image The parameter that contains the programmer, buffer and
+ * size to use in the write operation.
* @param region The name of the fmap region to write, or NULL to
* write the entire flash chip.
- * @param data The buffer to write.
- * @param size The size of the buffer to write.
*
* @return VB2_SUCCESS on success, or a relevant error.
*/
-vb2_error_t flashrom_write(const char *programmer, const char *region,
- uint8_t *data, uint32_t size);
+vb2_error_t flashrom_write(struct firmware_image *image, const char *region);
diff --git a/tests/vb2_host_flashrom_tests.c b/tests/vb2_host_flashrom_tests.c
index 8552d0ad..815657d4 100644
--- a/tests/vb2_host_flashrom_tests.c
+++ b/tests/vb2_host_flashrom_tests.c
@@ -145,10 +145,11 @@ int subprocess_run(const char *const argv[],
static void test_read_whole_chip(void)
{
- uint8_t *buf;
- uint32_t buf_sz;
+ struct firmware_image image = {
+ .programmer = "someprog",
+ };
- TEST_SUCC(flashrom_read("someprog", NULL, &buf, &buf_sz),
+ TEST_SUCC(flashrom_read(&image, NULL),
"Flashrom read succeeds");
TEST_STR_EQ(captured_programmer, "someprog",
"Using specified programmer");
@@ -158,19 +159,20 @@ static void test_read_whole_chip(void)
TEST_STR_EQ(captured_op_filename, MOCK_TMPFILE_NAME,
"Reading to correct file");
TEST_PTR_EQ(captured_region_param, NULL, "Not operating on a region");
- TEST_EQ(buf_sz, strlen(MOCK_ROM_CONTENTS), "Contents correct size");
- TEST_SUCC(memcmp(buf, MOCK_ROM_CONTENTS, buf_sz),
+ TEST_EQ(image.size, strlen(MOCK_ROM_CONTENTS), "Contents correct size");
+ TEST_SUCC(memcmp(image.data, MOCK_ROM_CONTENTS, image.size),
"Buffer has correct contents");
- free(buf);
+ free(image.data);
}
static void test_read_region(void)
{
- uint8_t *buf;
- uint32_t buf_sz;
+ struct firmware_image image = {
+ .programmer = "someprog",
+ };
- TEST_SUCC(flashrom_read("someprog", "SOME_REGION", &buf, &buf_sz),
+ TEST_SUCC(flashrom_read(&image, "SOME_REGION"),
"Flashrom read succeeds");
TEST_STR_EQ(captured_programmer, "someprog",
"Using specified programmer");
@@ -181,20 +183,21 @@ static void test_read_region(void)
"Not doing a read of the whole ROM");
TEST_STR_EQ(captured_region_param, "SOME_REGION:" MOCK_TMPFILE_NAME,
"Reading to correct file and from correct region");
- TEST_EQ(buf_sz, strlen(MOCK_ROM_CONTENTS), "Contents correct size");
- TEST_SUCC(memcmp(buf, MOCK_ROM_CONTENTS, buf_sz),
+ TEST_EQ(image.size, strlen(MOCK_ROM_CONTENTS), "Contents correct size");
+ TEST_SUCC(memcmp(image.data, MOCK_ROM_CONTENTS, image.size),
"Buffer has correct contents");
- free(buf);
+ free(image.data);
}
static void test_read_failure(void)
{
- uint8_t *buf;
- uint32_t buf_sz;
+ struct firmware_image image = {
+ .programmer = "someprog",
+ };
flashrom_mock_success = false;
- TEST_NEQ(flashrom_read("someprog", "SOME_REGION", &buf, &buf_sz),
+ TEST_NEQ(flashrom_read(&image, "SOME_REGION"),
VB2_SUCCESS, "Flashrom read fails");
flashrom_mock_success = true;
}
@@ -202,10 +205,15 @@ static void test_read_failure(void)
static void test_write_whole_chip(void)
{
uint8_t buf[sizeof(MOCK_ROM_CONTENTS) - 1];
+ struct firmware_image image = {
+ .programmer = "someprog",
+ .data = buf,
+ .size = sizeof(buf),
+ };
memcpy(buf, MOCK_ROM_CONTENTS, sizeof(buf));
- TEST_SUCC(flashrom_write("someprog", NULL, buf, sizeof(buf)),
+ TEST_SUCC(flashrom_write(&image, NULL),
"Flashrom write succeeds");
TEST_STR_EQ(captured_programmer, "someprog",
"Using specified programmer");
@@ -224,10 +232,15 @@ static void test_write_whole_chip(void)
static void test_write_region(void)
{
uint8_t buf[sizeof(MOCK_ROM_CONTENTS) - 1];
+ struct firmware_image image = {
+ .programmer = "someprog",
+ .data = buf,
+ .size = sizeof(buf),
+ };
memcpy(buf, MOCK_ROM_CONTENTS, sizeof(buf));
- TEST_SUCC(flashrom_write("someprog", "SOME_REGION", buf, sizeof(buf)),
+ TEST_SUCC(flashrom_write(&image, "SOME_REGION"),
"Flashrom write succeeds");
TEST_STR_EQ(captured_programmer, "someprog",
"Using specified programmer");
@@ -247,9 +260,14 @@ static void test_write_region(void)
static void test_write_failure(void)
{
uint8_t buf[20] = { 0 };
+ struct firmware_image image = {
+ .programmer = "someprog",
+ .data = buf,
+ .size = sizeof(buf),
+ };
flashrom_mock_success = false;
- TEST_NEQ(flashrom_write("someprog", "SOME_REGION", buf, sizeof(buf)),
+ TEST_NEQ(flashrom_write(&image, "SOME_REGION"),
VB2_SUCCESS, "Flashrom write fails");
flashrom_mock_success = true;
}
diff --git a/tests/vb2_host_nvdata_flashrom_tests.c b/tests/vb2_host_nvdata_flashrom_tests.c
index 33b435d9..068b23a4 100644
--- a/tests/vb2_host_nvdata_flashrom_tests.c
+++ b/tests/vb2_host_nvdata_flashrom_tests.c
@@ -81,35 +81,33 @@ static void reset_test_data(struct vb2_context *ctx, int nvdata_size)
}
/* Mocked flashrom_read for tests. */
-vb2_error_t flashrom_read(const char *programmer, const char *region,
- uint8_t **data_out, uint32_t *size_out)
+vb2_error_t flashrom_read(struct firmware_image *image, const char *region)
{
if (mock_flashrom_fail) {
- *data_out = NULL;
- *size_out = 0;
+ image->data = NULL;
+ image->size = 0;
return VB2_ERROR_FLASHROM;
}
- assert_mock_params(programmer, region);
+ assert_mock_params(image->programmer, region);
- *data_out = malloc(sizeof(fake_flash_region));
- *size_out = sizeof(fake_flash_region);
- memcpy(*data_out, fake_flash_region, sizeof(fake_flash_region));
+ image->data = malloc(sizeof(fake_flash_region));
+ image->size = sizeof(fake_flash_region);
+ memcpy(image->data, fake_flash_region, sizeof(fake_flash_region));
return VB2_SUCCESS;
}
/* Mocked flashrom_write for tests. */
-vb2_error_t flashrom_write(const char *programmer, const char *region,
- uint8_t *data, uint32_t data_size)
+vb2_error_t flashrom_write(struct firmware_image *image, const char *region)
{
if (mock_flashrom_fail)
return VB2_ERROR_FLASHROM;
- assert_mock_params(programmer, region);
+ assert_mock_params(image->programmer, region);
- TEST_EQ(data_size, sizeof(fake_flash_region),
+ TEST_EQ(image->size, sizeof(fake_flash_region),
"The flash size is correct");
- memcpy(fake_flash_region, data, data_size);
+ memcpy(fake_flash_region, image->data, image->size);
return VB2_SUCCESS;
}