From 4564c9d305169d2c4e0c02217454ed2b62222c0c Mon Sep 17 00:00:00 2001 From: Song Guo Date: Wed, 8 Jul 2026 13:28:20 +0000 Subject: [PATCH 1/3] Proxy --acpi-table, --device-tree-overlay, and --file-backed-mapping to crosvm run Introduce new gflags and cuttlefish config properties to allow proxying user provided ACPI tables, device tree overlays, and file-backed mappings to crosvm run command. These options are passed when starting the main crosvm runner command. Assisted-by: Antigravity:Gemini-Next TAG=agy CONV=2a93473d-f5c9-4f0d-89a1-b07cb069a790 --- .../assemble_cvd/assemble_cvd_flags.cpp | 14 +++++++++ .../assemble_cvd/assemble_cvd_flags.h | 4 +++ .../host/commands/assemble_cvd/flags.cc | 11 +++++++ .../host/libs/config/cuttlefish_config.h | 6 ++++ .../config/cuttlefish_config_instance.cpp | 29 +++++++++++++++++++ .../host/libs/vm_manager/crosvm_manager.cpp | 13 +++++++++ 6 files changed, 77 insertions(+) diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp index f496241808f..42863f020f8 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp @@ -386,6 +386,20 @@ DEFINE_vec( DEFINE_vec(use_pmem, "true", "Make this flag false to disable pmem with crosvm"); +DEFINE_vec(crosvm_acpi_table, "", + "Passed directly to crosvm as --acpi-table. " + "Path to user provided ACPI table"); + +DEFINE_vec(crosvm_device_tree_overlay, "", + "Passed directly to crosvm as --device-tree-overlay. " + "Path to user provided device tree overlay"); + +DEFINE_vec(crosvm_file_backed_mapping, "", + "Passed directly to crosvm as --file-backed-mapping. " + "Map the given file into guest memory at the specified address. " + "Parameters (addr, size, path are required): " + "addr=NUM,size=NUM,path=PATH,offset=NUM,rw,sync,align,ram"); + DEFINE_vec(enable_wifi, fmt::format("{}", CF_DEFAULTS_ENABLE_WIFI), "Enables the guest WIFI. Mainly for Minidroid"); diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h index d0501b7fde3..73486d0f065 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h @@ -186,6 +186,10 @@ DECLARE_vec(crosvm_v4l2_proxy); DECLARE_vec(use_pmem); +DECLARE_vec(crosvm_acpi_table); +DECLARE_vec(crosvm_device_tree_overlay); +DECLARE_vec(crosvm_file_backed_mapping); + DECLARE_vec(enable_wifi); DECLARE_vec(device_external_network); diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index 9c8419e064e..d18381cb38b 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -618,6 +618,12 @@ Result InitializeCuttlefishConfiguration( std::vector smt_vec = CF_EXPECT(GET_FLAG_BOOL_VALUE(smt)); std::vector crosvm_binary_vec = CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_binary)); + std::vector crosvm_acpi_table_vec = + CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_acpi_table)); + std::vector crosvm_device_tree_overlay_vec = + CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_device_tree_overlay)); + std::vector crosvm_file_backed_mapping_vec = + CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_file_backed_mapping)); std::vector seccomp_policy_dir_vec = CF_EXPECT(GET_FLAG_STR_VALUE(seccomp_policy_dir)); std::vector qemu_binary_dir_vec = @@ -843,6 +849,11 @@ Result InitializeCuttlefishConfiguration( } instance.set_crosvm_binary(crosvm_binary_vec[instance_index]); + instance.set_crosvm_acpi_table(crosvm_acpi_table_vec[instance_index]); + instance.set_crosvm_device_tree_overlay( + crosvm_device_tree_overlay_vec[instance_index]); + instance.set_crosvm_file_backed_mapping( + crosvm_file_backed_mapping_vec[instance_index]); instance.set_seccomp_policy_dir(seccomp_policy_dir_vec[instance_index]); instance.set_qemu_binary_dir(qemu_binary_dir_vec[instance_index]); diff --git a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h index 7fda4b33569..e9e845b07fd 100644 --- a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h +++ b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config.h @@ -392,6 +392,9 @@ class CuttlefishConfig { bool crosvm_simple_media_device() const; std::string crosvm_v4l2_proxy() const; bool use_pmem() const; + std::string crosvm_acpi_table() const; + std::string crosvm_device_tree_overlay() const; + std::string crosvm_file_backed_mapping() const; // Wifi MAC address inside the guest int wifi_mac_prefix() const; @@ -644,6 +647,9 @@ class CuttlefishConfig { void set_crosvm_simple_media_device(const bool simple_media_device); void set_crosvm_v4l2_proxy(const std::string v4l2_proxy); void set_use_pmem(const bool use_pmem); + void set_crosvm_acpi_table(const std::string acpi_table); + void set_crosvm_device_tree_overlay(const std::string device_tree_overlay); + void set_crosvm_file_backed_mapping(const std::string file_backed_mapping); // Wifi MAC address inside the guest void set_wifi_mac_prefix(const int wifi_mac_prefix); // Gnss grpc proxy server port inside the host diff --git a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp index 6dc22a1b4d6..1f74072af74 100644 --- a/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp +++ b/base/cvd/cuttlefish/host/libs/config/cuttlefish_config_instance.cpp @@ -1901,6 +1901,35 @@ bool CuttlefishConfig::InstanceSpecific::use_pmem() const { return (*Dictionary())[kCrosvmUsePmem].asBool(); } +static constexpr char kCrosvmAcpiTable[] = "crosvm_acpi_table"; +void CuttlefishConfig::MutableInstanceSpecific::set_crosvm_acpi_table( + const std::string acpi_table) { + (*Dictionary())[kCrosvmAcpiTable] = acpi_table; +} +std::string CuttlefishConfig::InstanceSpecific::crosvm_acpi_table() const { + return (*Dictionary())[kCrosvmAcpiTable].asString(); +} + +static constexpr char kCrosvmDeviceTreeOverlay[] = "crosvm_device_tree_overlay"; +void CuttlefishConfig::MutableInstanceSpecific::set_crosvm_device_tree_overlay( + const std::string device_tree_overlay) { + (*Dictionary())[kCrosvmDeviceTreeOverlay] = device_tree_overlay; +} +std::string CuttlefishConfig::InstanceSpecific::crosvm_device_tree_overlay() + const { + return (*Dictionary())[kCrosvmDeviceTreeOverlay].asString(); +} + +static constexpr char kCrosvmFileBackedMapping[] = "crosvm_file_backed_mapping"; +void CuttlefishConfig::MutableInstanceSpecific::set_crosvm_file_backed_mapping( + const std::string file_backed_mapping) { + (*Dictionary())[kCrosvmFileBackedMapping] = file_backed_mapping; +} +std::string CuttlefishConfig::InstanceSpecific::crosvm_file_backed_mapping() + const { + return (*Dictionary())[kCrosvmFileBackedMapping].asString(); +} + static constexpr char kEnableTapDevices[] = "enable_tap_devices"; void CuttlefishConfig::MutableInstanceSpecific::set_enable_tap_devices( const bool enable_tap_devices) { diff --git a/base/cvd/cuttlefish/host/libs/vm_manager/crosvm_manager.cpp b/base/cvd/cuttlefish/host/libs/vm_manager/crosvm_manager.cpp index f969fd380dc..f6fd1a39377 100644 --- a/base/cvd/cuttlefish/host/libs/vm_manager/crosvm_manager.cpp +++ b/base/cvd/cuttlefish/host/libs/vm_manager/crosvm_manager.cpp @@ -574,6 +574,19 @@ Result> CrosvmManager::StartCommands( crosvm_cmd.AddControlSocket(instance.CrosvmSocketPath(), instance.crosvm_binary()); + if (!instance.crosvm_acpi_table().empty()) { + crosvm_cmd.Cmd().AddParameter("--acpi-table=", + instance.crosvm_acpi_table()); + } + if (!instance.crosvm_device_tree_overlay().empty()) { + crosvm_cmd.Cmd().AddParameter("--device-tree-overlay=", + instance.crosvm_device_tree_overlay()); + } + if (!instance.crosvm_file_backed_mapping().empty()) { + crosvm_cmd.Cmd().AddParameter("--file-backed-mapping=", + instance.crosvm_file_backed_mapping()); + } + if (!config.kvm_path().empty()) { crosvm_cmd.AddKvmPath(config.kvm_path()); } From 5d0931145484650ebc061f9765b343010d872e24 Mon Sep 17 00:00:00 2001 From: Song Guo Date: Fri, 7 Aug 2026 14:44:14 +0200 Subject: [PATCH 2/3] cuttlefish: support base64 encoded crosvm_file_backed_mapping GET_FLAG_STR_VALUE splits on commas to separate arguments for different instances. This interacts badly with crosvm_file_backed_mapping's comma-separated arguments (addr=NUM,size=NUM...). Support base64-encoded crosvm_file_backed_mapping to allow correct argument division between instances in multi-device clusters. TAG=agy CONV=d50a8a3c-a4cd-4ba2-97cc-cfaf7a4ec28c --- .../host/commands/assemble_cvd/assemble_cvd_flags.cpp | 4 ++++ .../host/commands/assemble_cvd/assemble_cvd_flags.h | 1 + base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc | 9 +++++++++ 3 files changed, 14 insertions(+) diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp index 42863f020f8..662c7ca5cc0 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.cpp @@ -400,6 +400,10 @@ DEFINE_vec(crosvm_file_backed_mapping, "", "Parameters (addr, size, path are required): " "addr=NUM,size=NUM,path=PATH,offset=NUM,rw,sync,align,ram"); +DEFINE_vec(crosvm_file_backed_mapping_base64, "", + "This is base64 encoded version of crosvm_file_backed_mapping. " + "Used for multi device clusters."); + DEFINE_vec(enable_wifi, fmt::format("{}", CF_DEFAULTS_ENABLE_WIFI), "Enables the guest WIFI. Mainly for Minidroid"); diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h index 73486d0f065..eaca436c4f9 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/assemble_cvd_flags.h @@ -189,6 +189,7 @@ DECLARE_vec(use_pmem); DECLARE_vec(crosvm_acpi_table); DECLARE_vec(crosvm_device_tree_overlay); DECLARE_vec(crosvm_file_backed_mapping); +DECLARE_vec(crosvm_file_backed_mapping_base64); DECLARE_vec(enable_wifi); diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index d18381cb38b..16815cfa89e 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -624,6 +624,8 @@ Result InitializeCuttlefishConfiguration( CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_device_tree_overlay)); std::vector crosvm_file_backed_mapping_vec = CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_file_backed_mapping)); + std::vector crosvm_file_backed_mapping_base64_vec = + CF_EXPECT(GET_FLAG_STR_VALUE(crosvm_file_backed_mapping_base64)); std::vector seccomp_policy_dir_vec = CF_EXPECT(GET_FLAG_STR_VALUE(seccomp_policy_dir)); std::vector qemu_binary_dir_vec = @@ -854,6 +856,13 @@ Result InitializeCuttlefishConfiguration( crosvm_device_tree_overlay_vec[instance_index]); instance.set_crosvm_file_backed_mapping( crosvm_file_backed_mapping_vec[instance_index]); + if (!crosvm_file_backed_mapping_base64_vec[instance_index].empty()) { + std::vector decoded_mapping = CF_EXPECT(DecodeBase64( + crosvm_file_backed_mapping_base64_vec[instance_index])); + std::string decoded_mapping_str(decoded_mapping.begin(), + decoded_mapping.end()); + instance.set_crosvm_file_backed_mapping(decoded_mapping_str); + } instance.set_seccomp_policy_dir(seccomp_policy_dir_vec[instance_index]); instance.set_qemu_binary_dir(qemu_binary_dir_vec[instance_index]); From fd777ddb77f01cd8b56d4aad05d85982fa1133dc Mon Sep 17 00:00:00 2001 From: Song Guo Date: Fri, 14 Aug 2026 07:34:37 +0000 Subject: [PATCH 3/3] Fix clang-format --- base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index 63c1e5eae8e..588939b3427 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -860,8 +860,8 @@ Result InitializeCuttlefishConfiguration( instance.set_crosvm_file_backed_mapping( crosvm_file_backed_mapping_vec[instance_index]); if (!crosvm_file_backed_mapping_base64_vec[instance_index].empty()) { - std::vector decoded_mapping = CF_EXPECT(DecodeBase64( - crosvm_file_backed_mapping_base64_vec[instance_index])); + std::vector decoded_mapping = CF_EXPECT( + DecodeBase64(crosvm_file_backed_mapping_base64_vec[instance_index])); std::string decoded_mapping_str(decoded_mapping.begin(), decoded_mapping.end()); instance.set_crosvm_file_backed_mapping(decoded_mapping_str);