Add product.img support to launcher

Require that the build provides a product.img, which is basically a
split off part of the system image, and pass it down to the vm_manager
at launch time.

Bug: 129163131
Bug: 126036177
Change-Id: I213f9516c13668f442c1cccf8a31b67d113c50f1
diff --git a/host/commands/launch/flags.cc b/host/commands/launch/flags.cc
index 3f62a50..1387f30 100644
--- a/host/commands/launch/flags.cc
+++ b/host/commands/launch/flags.cc
@@ -91,6 +91,7 @@
 DEFINE_string(system_image_dir, vsoc::DefaultGuestImagePath(""),
               "Location of the system partition images.");
 DEFINE_string(vendor_image, "", "Location of the vendor partition image.");
+DEFINE_string(product_image, "", "Location of the product partition image.");
 
 DEFINE_bool(deprecated_boot_completed, false, "Log boot completed message to"
             " host kernel. This is only used during transition of our clients."
@@ -223,6 +224,9 @@
   std::string default_metadata_image = FLAGS_system_image_dir + "/metadata.img";
   SetCommandLineOptionWithMode("metadata_image", default_metadata_image.c_str(),
                                google::FlagSettingMode::SET_FLAGS_DEFAULT);
+  std::string default_product_image = FLAGS_system_image_dir + "/product.img";
+  SetCommandLineOptionWithMode("product_image", default_product_image.c_str(),
+                               google::FlagSettingMode::SET_FLAGS_DEFAULT);
 
   return true;
 }
@@ -348,6 +352,7 @@
   tmp_config_obj.set_data_image_path(FLAGS_data_image);
   tmp_config_obj.set_vendor_image_path(FLAGS_vendor_image);
   tmp_config_obj.set_metadata_image_path(FLAGS_metadata_image);
+  tmp_config_obj.set_product_image_path(FLAGS_product_image);
   tmp_config_obj.set_dtb_path(FLAGS_dtb);
   tmp_config_obj.set_gsi_fstab_path(FLAGS_gsi_fstab);
 
@@ -642,7 +647,7 @@
   for (const auto& file :
        {config->system_image_path(), config->vendor_image_path(),
         config->cache_image_path(), config->data_image_path(),
-        config->metadata_image_path()}) {
+        config->metadata_image_path(), config->product_image_path()}) {
     if (!cvd::FileHasContent(file.c_str())) {
       LOG(ERROR) << "File not found: " << file;
       exit(cvd::kCuttlefishConfigurationInitError);
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index 2c4ba95..af690ed 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -93,6 +93,7 @@
 const char* kDataImagePath = "data_image_path";
 const char* kVendorImagePath = "vendor_image_path";
 const char* kMetadataImagePath = "metadata_image_path";
+const char* kProductImagePath = "product_image_path";
 const char* kUsbV1SocketName = "usb_v1_socket_name";
 const char* kVhciPort = "vhci_port";
 const char* kUsbIpSocketName = "usb_ip_socket_name";
@@ -359,6 +360,14 @@
   SetPath(kMetadataImagePath, metadata_image_path);
 }
 
+std::string CuttlefishConfig::product_image_path() const {
+  return (*dictionary_)[kProductImagePath].asString();
+}
+void CuttlefishConfig::set_product_image_path(
+    const std::string& product_image_path) {
+  SetPath(kProductImagePath, product_image_path);
+}
+
 std::string CuttlefishConfig::dtb_path() const {
   return (*dictionary_)[kDtbPath].asString();
 }
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index 75dbddc..668badc 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -135,6 +135,9 @@
   std::string metadata_image_path() const;
   void set_metadata_image_path(const std::string& metadata_image_path);
 
+  std::string product_image_path() const;
+  void set_product_image_path(const std::string& product_image_path);
+
   std::string dtb_path() const;
   void set_dtb_path(const std::string& dtb_path);
 
diff --git a/host/libs/vm_manager/cf_qemu.sh b/host/libs/vm_manager/cf_qemu.sh
index ac63bbe..e037c3c 100755
--- a/host/libs/vm_manager/cf_qemu.sh
+++ b/host/libs/vm_manager/cf_qemu.sh
@@ -109,6 +109,8 @@
     -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk3,id=virtio-disk3"
     -drive "file=${metadata_image_path:-${HOME}/metadata.img},format=raw,if=none,id=drive-virtio-disk4,aio=threads"
     -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk4,id=virtio-disk4"
+    -drive "file=${product_image_path:-${HOME}/product.img},format=raw,if=none,id=drive-virtio-disk5,aio=threads"
+    -device "virtio-blk-pci,scsi=off,drive=drive-virtio-disk5,id=virtio-disk5"
     -netdev "tap,id=hostnet0,ifname=${wifi_tap_name:-${default_wifi_tap_name}},script=no,downscript=no"
     -device "virtio-net-pci,netdev=hostnet0,id=net0"
     -netdev "tap,id=hostnet1,ifname=${mobile_tap_name:-${default_mobile_tap_name}},script=no,downscript=no"
diff --git a/host/libs/vm_manager/crosvm_manager.cpp b/host/libs/vm_manager/crosvm_manager.cpp
index 2cee6b3..1605931 100644
--- a/host/libs/vm_manager/crosvm_manager.cpp
+++ b/host/libs/vm_manager/crosvm_manager.cpp
@@ -83,6 +83,7 @@
   command.AddParameter("--rwdisk=", config_->cache_image_path());
   command.AddParameter("--rwdisk=", config_->vendor_image_path());
   command.AddParameter("--rwdisk=", config_->metadata_image_path());
+  command.AddParameter("--rwdisk=", config_->product_image_path());
   command.AddParameter("--socket=", GetControlSocketPath(config_));
   command.AddParameter("--android-fstab=", config_->gsi_fstab_path());
   command.AddParameter("--single-touch=", config_->touch_socket_path(), ":",
diff --git a/host/libs/vm_manager/qemu_manager.cpp b/host/libs/vm_manager/qemu_manager.cpp
index d986833..bb8e0af 100644
--- a/host/libs/vm_manager/qemu_manager.cpp
+++ b/host/libs/vm_manager/qemu_manager.cpp
@@ -76,6 +76,7 @@
   LogAndSetEnv("cache_image_path", config_->cache_image_path());
   LogAndSetEnv("vendor_image_path", config_->vendor_image_path());
   LogAndSetEnv("metadata_image_path", config_->metadata_image_path());
+  LogAndSetEnv("product_image_path", config_->product_image_path());
   LogAndSetEnv("wifi_tap_name", config_->wifi_tap_name());
   LogAndSetEnv("mobile_tap_name", config_->mobile_tap_name());
   LogAndSetEnv("kernel_log_socket_name",