Support boot image v4

Test: th
Change-Id: Ied870199f92dc2e2015f3ef59e5ab52eddc987fd
diff --git a/payload_generator/boot_img_filesystem.cc b/payload_generator/boot_img_filesystem.cc
index 89b175e..cad267e 100644
--- a/payload_generator/boot_img_filesystem.cc
+++ b/payload_generator/boot_img_filesystem.cc
@@ -57,7 +57,7 @@
   }
   uint32_t header_version =
       *reinterpret_cast<uint32_t*>(header_version_blob.data());
-  if (header_version > 3) {
+  if (header_version > 4) {
     LOG(WARNING) << "Boot image header version " << header_version
                  << " isn't supported for parsing";
     return nullptr;
@@ -80,13 +80,22 @@
     result->kernel_size_ = hdr_v0->kernel_size;
     result->ramdisk_size_ = hdr_v0->ramdisk_size;
     result->page_size_ = hdr_v0->page_size;
-  } else {
+  } else if (header_version == 3) {
     auto hdr_v3 = reinterpret_cast<boot_img_hdr_v3*>(header_blob.data());
     CHECK_EQ(0, memcmp(hdr_v3->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE));
     CHECK_EQ(3u, hdr_v3->header_version);
     result->kernel_size_ = hdr_v3->kernel_size;
     result->ramdisk_size_ = hdr_v3->ramdisk_size;
     result->page_size_ = 4096;
+  } else {
+    auto hdr_v4 = reinterpret_cast<boot_img_hdr_v4*>(header_blob.data());
+    CHECK_EQ(0, memcmp(hdr_v4->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE));
+    CHECK_EQ(hdr_v4->header_version, 4u);
+    result->kernel_size_ = hdr_v4->kernel_size;
+    result->ramdisk_size_ = hdr_v4->ramdisk_size;
+    // In boot image v3 and v4, page size is hard coded as 4096
+    result->page_size_ = 4096;
+    result->signature_size_ = hdr_v4->signature_size;
   }
 
   CHECK_GT(result->page_size_, 0u);
@@ -141,6 +150,10 @@
   if (ramdisk_size_ > 0 && offset + ramdisk_size_ <= file_size) {
     files->emplace_back(GetFile("<ramdisk>", offset, ramdisk_size_));
   }
+  offset += utils::RoundUp(ramdisk_size_, page_size_);
+  if (signature_size_ > 0) {
+    files->emplace_back(GetFile("<boot signature>", offset, signature_size_));
+  }
   return true;
 }
 
diff --git a/payload_generator/boot_img_filesystem.h b/payload_generator/boot_img_filesystem.h
index 61f755c..7773461 100644
--- a/payload_generator/boot_img_filesystem.h
+++ b/payload_generator/boot_img_filesystem.h
@@ -52,9 +52,10 @@
   // The boot.img file path.
   std::string filename_;
 
-  uint32_t kernel_size_;  /* size in bytes */
-  uint32_t ramdisk_size_; /* size in bytes */
-  uint32_t page_size_;    /* flash page size we assume */
+  uint32_t kernel_size_ = 0;    /* size in bytes */
+  uint32_t ramdisk_size_ = 0;   /* size in bytes */
+  uint32_t signature_size_ = 0; /* size in bytes */
+  uint32_t page_size_ = 4096;   /* flash page size we assume */
 
   DISALLOW_COPY_AND_ASSIGN(BootImgFilesystem);
 };