blob: 5ae401e0bb53ce1442403dcc6b86d51719c54aa0 [file] [log] [blame]
Jorge E. Moreiraba626622019-01-28 17:47:50 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "host/libs/vm_manager/crosvm_manager.h"
18
19#include <string>
20#include <vector>
21
22#include <glog/logging.h>
23
Jorge E. Moreira46429a92019-02-12 17:21:32 -080024#include "common/libs/utils/network.h"
Jorge E. Moreiraba626622019-01-28 17:47:50 -080025#include "common/libs/utils/subprocess.h"
26#include "host/libs/config/cuttlefish_config.h"
27#include "host/libs/vm_manager/qemu_manager.h"
28
29namespace vm_manager {
30
31namespace {
32
33std::string GetControlSocketPath(const vsoc::CuttlefishConfig* config) {
34 return config->PerInstancePath("crosvm_control.sock");
35}
36
37cvd::SharedFD ConnectToLogMonitor(const std::string& log_monitor_name) {
38 return cvd::SharedFD::SocketLocalClient(log_monitor_name.c_str(), false,
39 SOCK_STREAM);
40}
41
Jorge E. Moreira46429a92019-02-12 17:21:32 -080042void AddTapFdParameter(cvd::Command* crosvm_cmd, const std::string& tap_name) {
43 auto tap_fd = cvd::OpenTapInterface(tap_name);
44 if (tap_fd->IsOpen()) {
45 crosvm_cmd->AddParameter("--tap-fd=", tap_fd);
46 } else {
47 LOG(ERROR) << "Unable to connect to " << tap_name << ": "
48 << tap_fd->StrError();
49 }
50}
51
Jorge E. Moreiraba626622019-01-28 17:47:50 -080052} // namespace
53
54const std::string CrosvmManager::name() { return "crosvm"; }
55
Greg Hartmana3c552d2019-03-28 18:20:48 -070056bool CrosvmManager::ConfigureGpu(vsoc::CuttlefishConfig* config) {
57 // Override the default HAL search paths in all cases. We do this because
58 // the HAL search path allows for fallbacks, and fallbacks in conjunction
59 // with properities lead to non-deterministic behavior while loading the
60 // HALs.
61 if (config->gpu_mode() == vsoc::kGpuModeGuestDrm) {
62 config->add_kernel_cmdline("androidboot.hardware.gralloc=minigbm");
Greg Hartmanc7fbbea2019-04-04 22:09:07 -070063 config->add_kernel_cmdline("androidboot.hardware.hwcomposer=drm_minigbm");
Greg Hartmana3c552d2019-03-28 18:20:48 -070064 return true;
65 }
66 if (config->gpu_mode() == vsoc::kGpuModeGuestAshmem) {
67 config->add_kernel_cmdline(
68 "androidboot.hardware.gralloc=cutf_ashmem");
69 config->add_kernel_cmdline(
70 "androidboot.hardware.hwcomposer=cutf_cvm_ashmem");
71 return true;
72 }
73 return false;
74}
75
Jorge E. Moreiraba626622019-01-28 17:47:50 -080076CrosvmManager::CrosvmManager(const vsoc::CuttlefishConfig* config)
77 : VmManager(config) {}
78
79cvd::Command CrosvmManager::StartCommand() {
Jorge E. Moreiraba626622019-01-28 17:47:50 -080080 // TODO Add aarch64 support
81 // TODO Add the tap interfaces (--tap-fd)
82 // TODO Redirect logcat output
83
84 // Run crosvm directly instead of through a cf_crosvm.sh script. The kernel
85 // logs are on crosvm's standard output, so we need to redirect it to the log
86 // monitor socket, a helper script will print more than just the logs to
87 // standard output.
88 cvd::Command command(config_->crosvm_binary());
89 command.AddParameter("run");
90
Greg Hartmana3c552d2019-03-28 18:20:48 -070091 if (config_->gpu_mode() != vsoc::kGpuModeGuestAshmem) {
92 command.AddParameter("--gpu");
93 command.AddParameter("--wayland-sock=", config_->wayland_socket());
94 }
Alistair Strachane1c6b902019-04-17 09:49:01 -070095 if (!config_->ramdisk_image_path().empty()) {
96 command.AddParameter("--initrd=", config_->ramdisk_image_path());
97 }
Alistair Strachan252d98b2019-03-04 17:58:06 -080098 command.AddParameter("--null-audio");
Jorge E. Moreiraba626622019-01-28 17:47:50 -080099 command.AddParameter("--mem=", config_->memory_mb());
100 command.AddParameter("--cpus=", config_->cpus());
101 command.AddParameter("--params=", config_->kernel_cmdline_as_string());
Jorge E. Moreira3fad4502019-02-28 14:16:38 -0800102 command.AddParameter("--rwdisk=", config_->system_image_path());
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800103 command.AddParameter("--rwdisk=", config_->data_image_path());
104 command.AddParameter("--rwdisk=", config_->cache_image_path());
Paul Trautrimba8f8e92019-03-12 17:55:48 +0900105 command.AddParameter("--rwdisk=", config_->metadata_image_path());
Alistair Strachan14c3eb22019-04-17 09:37:09 -0700106 command.AddParameter("--rwdisk=", config_->vendor_image_path());
Alistair Strachan5782ce42019-03-28 22:05:13 -0700107 command.AddParameter("--rwdisk=", config_->product_image_path());
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800108 command.AddParameter("--socket=", GetControlSocketPath(config_));
109 command.AddParameter("--android-fstab=", config_->gsi_fstab_path());
Jorge E. Moreirac87c2c72019-03-06 16:12:23 -0800110 command.AddParameter("--single-touch=", config_->touch_socket_path(), ":",
111 config_->x_res(), ":", config_->y_res());
112 command.AddParameter("--keyboard=", config_->keyboard_socket_path());
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800113
Jorge E. Moreira46429a92019-02-12 17:21:32 -0800114 AddTapFdParameter(&command, config_->wifi_tap_name());
115 AddTapFdParameter(&command, config_->mobile_tap_name());
116
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800117 // TODO remove this (use crosvm's seccomp files)
118 command.AddParameter("--disable-sandbox");
119
120 if (config_->vsock_guest_cid() >= 2) {
121 command.AddParameter("--cid=", config_->vsock_guest_cid());
122 }
123
124 auto kernel_log_connection =
125 ConnectToLogMonitor(config_->kernel_log_socket_name());
126 if (!kernel_log_connection->IsOpen()) {
127 LOG(WARNING) << "Unable to connect to log monitor: "
128 << kernel_log_connection->StrError();
129 } else {
130 command.RedirectStdIO(cvd::Subprocess::StdIOChannel::kStdOut,
131 kernel_log_connection);
132 }
133
Jorge E. Moreira664325e2019-03-12 16:52:26 -0700134 auto dev_null = cvd::SharedFD::Open("/dev/null", O_RDONLY);
135 if (dev_null->IsOpen()) {
136 command.RedirectStdIO(cvd::Subprocess::StdIOChannel::kStdIn, dev_null);
137 } else {
138 LOG(ERROR) << "Unable to open /dev/null for stdin redirection";
139 }
140
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800141 // This needs to be the last parameter
Jorge E. Moreira80ddd7f2019-02-04 16:30:13 -0800142 command.AddParameter(config_->GetKernelImageToUse());
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800143
144 return command;
145}
146
147bool CrosvmManager::Stop() {
148 cvd::Command command(config_->crosvm_binary());
149 command.AddParameter("stop");
150 command.AddParameter(GetControlSocketPath(config_));
151
152 auto process = command.Start();
153
154 return process.Wait() == 0;
155}
156
157} // namespace vm_manager