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