copy_flash: update window size
When a pnor partition is copied to a window, update the window size with
the actual number of blocks copied. This is required in the response of
the V2 Read Window Command.
Change-Id: I2c158df1bd261a4e62b9cbb2765e7623a7fb3dc9
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
diff --git a/mboxd_flash.h b/mboxd_flash.h
index d8b0d0d..7c02445 100644
--- a/mboxd_flash.h
+++ b/mboxd_flash.h
@@ -29,8 +29,8 @@
int init_flash_dev(struct mbox_context *context);
void free_flash_dev(struct mbox_context *context);
-int copy_flash(struct mbox_context *context, uint32_t offset, void *mem,
- uint32_t size);
+int64_t copy_flash(struct mbox_context *context, uint32_t offset, void *mem,
+ uint32_t size);
int set_flash_bytemap(struct mbox_context *context, uint32_t offset,
uint32_t count, uint8_t val);
int erase_flash(struct mbox_context *context, uint32_t offset, uint32_t count);
diff --git a/mboxd_flash_physical.c b/mboxd_flash_physical.c
index 55624d9..69d2f3c 100644
--- a/mboxd_flash_physical.c
+++ b/mboxd_flash_physical.c
@@ -240,13 +240,15 @@
* @offset: The flash offset to copy from (bytes)
* @mem: The buffer to copy into (must be of atleast 'size' bytes)
* @size: The number of bytes to copy
- *
- * Return: 0 on success otherwise negative error code
+ * Return: Number of bytes copied on success, otherwise negative error
+ * code. copy_flash will copy at most 'size' bytes, but it may
+ * copy less.
*/
-int copy_flash(struct mbox_context *context, uint32_t offset, void *mem,
- uint32_t size)
+int64_t copy_flash(struct mbox_context *context, uint32_t offset, void *mem,
+ uint32_t size)
{
int32_t size_read;
+ void *start = mem;
MSG_DBG("Copy flash to %p for size 0x%.8x from offset 0x%.8x\n",
mem, size, offset);
@@ -269,7 +271,7 @@
mem += size_read;
} while (size && size_read);
- return size ? -MBOX_R_SYSTEM_ERROR : 0;
+ return size_read ? mem - start : -MBOX_R_SYSTEM_ERROR;
}
/*
diff --git a/mboxd_flash_virtual.cpp b/mboxd_flash_virtual.cpp
index 6e3af71..182278b 100644
--- a/mboxd_flash_virtual.cpp
+++ b/mboxd_flash_virtual.cpp
@@ -24,6 +24,7 @@
#include <sys/mman.h>
#include <unistd.h>
#include <sys/ioctl.h>
+#include <algorithm>
extern "C" {
#include "common.h"
@@ -124,17 +125,18 @@
* @offset: The pnor offset to copy from (bytes)
* @mem: The buffer to copy into (must be of atleast 'size' bytes)
* @size: The number of bytes to copy
- *
- * Return: 0 on success otherwise negative error code
+ * Return: Number of bytes copied on success, otherwise negative error
+ * code. copy_flash will copy at most 'size' bytes, but it may
+ * copy less.
*/
-int copy_flash(struct mbox_context* context, uint32_t offset, void* mem,
- uint32_t size)
+int64_t copy_flash(struct mbox_context* context, uint32_t offset, void* mem,
+ uint32_t size)
{
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;
using namespace std::string_literals;
- int rc = 0;
+ int rc = size;
MSG_DBG("Copy virtual pnor to %p for size 0x%.8x from offset 0x%.8x\n",
mem, size, offset);
@@ -151,9 +153,8 @@
{
const struct pnor_partition_table* table =
vpnor_get_partition_table(context);
- memcpy(mem,
- ((uint8_t*)table) + offset,
- min_u32(sz - offset, size));
+ rc = std::min(sz - offset, static_cast<size_t>(size));
+ memcpy(mem, ((uint8_t*)table) + offset, rc);
}
else
{
diff --git a/mboxd_pnor_partition_table.cpp b/mboxd_pnor_partition_table.cpp
index d2fdba3..60066f5 100644
--- a/mboxd_pnor_partition_table.cpp
+++ b/mboxd_pnor_partition_table.cpp
@@ -85,13 +85,14 @@
memcpy(&local.paths, &context->paths, sizeof(local.paths));
size_t tocOffset = 0;
+ uint32_t tocSize = blTable.size() * eraseSize;
// Copy TOC
copy_flash(&local, tocOffset,
static_cast<uint8_t*>(context->mem) + tocStart,
- blTable.size() * eraseSize);
+ tocSize);
const pnor_partition& partition = blTable.partition(blPartitionName);
size_t hbbOffset = partition.data.base * eraseSize;
- size_t hbbSize = partition.data.actual;
+ uint32_t hbbSize = partition.data.actual;
// Copy HBB
copy_flash(&local, hbbOffset,
static_cast<uint8_t*>(context->mem) + hbbOffset, hbbSize);
diff --git a/mboxd_windows.c b/mboxd_windows.c
index 451ecd1..1755c4a 100644
--- a/mboxd_windows.c
+++ b/mboxd_windows.c
@@ -417,7 +417,6 @@
context->current->age = 0;
}
- context->current->size = context->windows.default_size;
context->current = NULL;
context->current_is_write = false;
}
@@ -627,6 +626,7 @@
reset_window(context, cur);
return rc;
}
+ cur->size = rc;
/*
* Since for V1 windows aren't constrained to start at multiples of