1 // Copyright 2021, The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 //! VM Payload Config
16 
17 use serde::{Deserialize, Serialize};
18 
19 /// VM payload config
20 #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
21 pub struct VmPayloadConfig {
22     /// OS config.
23     /// Deprecated: don't use. Error if not "" or "microdroid".
24     #[serde(default)]
25     #[deprecated]
26     pub os: OsConfig,
27 
28     /// Task to run in a VM
29     #[serde(default)]
30     pub task: Option<Task>,
31 
32     /// APEXes to activate in a VM
33     #[serde(default)]
34     pub apexes: Vec<ApexConfig>,
35 
36     /// Extra APKs to be passed to a VM
37     #[serde(default)]
38     pub extra_apks: Vec<ApkConfig>,
39 
40     /// Tells VirtualizationService to use staged APEXes if possible
41     #[serde(default)]
42     pub prefer_staged: bool,
43 
44     /// Whether to export the tomsbtones (VM crashes) out of VM to host
45     /// Default: true for debuggable VMs, false for non-debuggable VMs
46     pub export_tombstones: Option<bool>,
47 
48     /// Whether the authfs service should be started in the VM. This enables read or write of host
49     /// files with integrity checking, but not confidentiality.
50     #[serde(default)]
51     pub enable_authfs: bool,
52 
53     /// Ask the kernel for transparent huge-pages (THP). This is only a hint and
54     /// the kernel will allocate THP-backed memory only if globally enabled by
55     /// the system and if any can be found. See
56     /// https://docs.kernel.org/admin-guide/mm/transhuge.html
57     #[serde(default)]
58     pub hugepages: bool,
59 }
60 
61 /// OS config
62 #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
63 pub struct OsConfig {
64     /// The name of OS to use
65     pub name: String,
66 }
67 
68 impl Default for OsConfig {
default() -> Self69     fn default() -> Self {
70         Self { name: "".to_owned() }
71     }
72 }
73 
74 /// Payload's task can be one of plain executable
75 /// or an .so library which can be started via /system/bin/microdroid_launcher
76 #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, Default)]
77 pub enum TaskType {
78     /// Task's command indicates the path to the executable binary.
79     #[serde(rename = "executable")]
80     #[default]
81     Executable,
82     /// Task's command indicates the .so library in /mnt/apk/lib/{arch}
83     #[serde(rename = "microdroid_launcher")]
84     MicrodroidLauncher,
85 }
86 
87 /// Task to run in a VM
88 #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
89 pub struct Task {
90     /// Decides how to execute the command: executable(default) | microdroid_launcher
91     #[serde(default, rename = "type")]
92     pub type_: TaskType,
93 
94     /// Command to run
95     /// - For executable task, this is the path to the executable.
96     /// - For microdroid_launcher task, this is the name of .so
97     pub command: String,
98 }
99 
100 /// APEX config
101 /// For now, we only pass the name of APEX.
102 #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
103 pub struct ApexConfig {
104     /// The name of APEX
105     pub name: String,
106 }
107 
108 /// APK config
109 #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
110 pub struct ApkConfig {
111     /// The path of APK
112     pub path: String,
113 }
114