Merge "More API changes"
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 321dbf4..c37fd19 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -46,9 +46,18 @@
"path": "packages/modules/Virtualization/virtualizationservice"
},
{
+ "path": "packages/modules/Virtualization/libs/apexutil"
+ },
+ {
"path": "packages/modules/Virtualization/libs/apkverify"
},
{
+ "path": "packages/modules/Virtualization/libs/avb"
+ },
+ {
+ "path": "packages/modules/Virtualization/libs/capabilities"
+ },
+ {
"path": "packages/modules/Virtualization/libs/devicemapper"
},
{
@@ -58,12 +67,18 @@
"path": "packages/modules/Virtualization/authfs"
},
{
+ "path": "packages/modules/Virtualization/microdroid_manager"
+ },
+ {
"path": "packages/modules/Virtualization/pvmfw"
},
{
"path": "packages/modules/Virtualization/rialto"
},
{
+ "path": "packages/modules/Virtualization/vm"
+ },
+ {
"path": "packages/modules/Virtualization/vmbase"
},
{
diff --git a/libs/apexutil/TEST_MAPPING b/libs/apexutil/TEST_MAPPING
new file mode 100644
index 0000000..f66a400
--- /dev/null
+++ b/libs/apexutil/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "avf-presubmit" : [
+ {
+ "name" : "libapexutil_rust.test"
+ }
+ ]
+}
diff --git a/libs/avb/TEST_MAPPING b/libs/avb/TEST_MAPPING
new file mode 100644
index 0000000..2f4bccc
--- /dev/null
+++ b/libs/avb/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "avf-presubmit" : [
+ {
+ "name" : "libavb_bindgen_test"
+ }
+ ]
+}
diff --git a/libs/capabilities/TEST_MAPPING b/libs/capabilities/TEST_MAPPING
new file mode 100644
index 0000000..568a771
--- /dev/null
+++ b/libs/capabilities/TEST_MAPPING
@@ -0,0 +1,10 @@
+{
+ "avf-presubmit" : [
+ {
+ "name" : "libcap_rust.test"
+ },
+ {
+ "name" : "libcap_bindgen_test"
+ }
+ ]
+}
diff --git a/microdroid_manager/TEST_MAPPING b/microdroid_manager/TEST_MAPPING
new file mode 100644
index 0000000..af0abe7
--- /dev/null
+++ b/microdroid_manager/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "avf-presubmit" : [
+ {
+ "name" : "microdroid_manager_test"
+ }
+ ]
+}
diff --git a/pvmfw/avb/src/verify.rs b/pvmfw/avb/src/verify.rs
index d5f7283..b6db601 100644
--- a/pvmfw/avb/src/verify.rs
+++ b/pvmfw/avb/src/verify.rs
@@ -393,10 +393,12 @@
mod tests {
use super::*;
use anyhow::Result;
- use std::fs;
+ use avb_bindgen::AvbFooter;
+ use std::{fs, mem::size_of};
const PUBLIC_KEY_RSA2048_PATH: &str = "data/testkey_rsa2048_pub.bin";
const PUBLIC_KEY_RSA4096_PATH: &str = "data/testkey_rsa4096_pub.bin";
+ const RANDOM_FOOTER_POS: usize = 30;
/// This test uses the Microdroid payload compiled on the fly to check that
/// the latest payload can be verified successfully.
@@ -457,6 +459,19 @@
)
}
+ #[test]
+ fn tampered_kernel_footer_fails_verification() -> Result<()> {
+ let mut kernel = load_latest_signed_kernel()?;
+ let avb_footer_index = kernel.len() - size_of::<AvbFooter>() + RANDOM_FOOTER_POS;
+ kernel[avb_footer_index] = !kernel[avb_footer_index];
+
+ assert_payload_verification_fails(
+ &kernel,
+ &fs::read(PUBLIC_KEY_RSA4096_PATH)?,
+ AvbImageVerifyError::InvalidMetadata,
+ )
+ }
+
fn assert_payload_verification_fails(
kernel: &[u8],
trusted_public_key: &[u8],
diff --git a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
index cbe7072..9cfac4e 100644
--- a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
+++ b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
@@ -65,6 +65,7 @@
private static final String APEX_ETC_FS = "/apex/com.android.virt/etc/fs/";
private static final double SIZE_MB = 1024.0 * 1024.0;
+ private static final double NANO_TO_MILLI = 1000000.0;
private static final String MICRODROID_IMG_PREFIX = "microdroid_";
private static final String MICRODROID_IMG_SUFFIX = ".img";
@@ -141,19 +142,12 @@
final int trialCount = 10;
- List<Double> vmStartingTimeMetrics = new ArrayList<>();
List<Double> bootTimeMetrics = new ArrayList<>();
- List<Double> bootloaderTimeMetrics = new ArrayList<>();
- List<Double> kernelBootTimeMetrics = new ArrayList<>();
- List<Double> userspaceBootTimeMetrics = new ArrayList<>();
-
for (int i = 0; i < trialCount; i++) {
-
- // To grab boot events from log, set debug mode to FULL
VirtualMachineConfig normalConfig =
newVmConfigBuilder()
.setPayloadBinaryPath("MicrodroidIdleNativeLib.so")
- .setDebugLevel(DEBUG_LEVEL_FULL)
+ .setDebugLevel(DEBUG_LEVEL_NONE)
.setMemoryMib(256)
.build();
forceCreateNewVirtualMachine("test_vm_boot_time", normalConfig);
@@ -161,12 +155,74 @@
BootResult result = tryBootVm(TAG, "test_vm_boot_time");
assertThat(result.payloadStarted).isTrue();
- final double nanoToMilli = 1000000.0;
- vmStartingTimeMetrics.add(result.getVMStartingElapsedNanoTime() / nanoToMilli);
- bootTimeMetrics.add(result.endToEndNanoTime / nanoToMilli);
- bootloaderTimeMetrics.add(result.getBootloaderElapsedNanoTime() / nanoToMilli);
- kernelBootTimeMetrics.add(result.getKernelElapsedNanoTime() / nanoToMilli);
- userspaceBootTimeMetrics.add(result.getUserspaceElapsedNanoTime() / nanoToMilli);
+ bootTimeMetrics.add(result.endToEndNanoTime / NANO_TO_MILLI);
+ }
+
+ reportMetrics(bootTimeMetrics, "boot_time", "ms");
+ }
+
+ @Test
+ public void testMicrodroidMulticoreBootTime()
+ throws VirtualMachineException, InterruptedException, IOException {
+ assume().withMessage("Skip on CF; too slow").that(isCuttlefish()).isFalse();
+
+ final int trialCount = 10;
+ final int[] trialNumCpus = {2, 4, 8};
+
+ for (int numCpus : trialNumCpus) {
+ List<Double> bootTimeMetrics = new ArrayList<>();
+ for (int i = 0; i < trialCount; i++) {
+ VirtualMachineConfig normalConfig =
+ newVmConfigBuilder()
+ .setPayloadBinaryPath("MicrodroidIdleNativeLib.so")
+ .setDebugLevel(DEBUG_LEVEL_NONE)
+ .setMemoryMib(256)
+ .setNumCpus(numCpus)
+ .build();
+ forceCreateNewVirtualMachine("test_vm_boot_time_multicore", normalConfig);
+
+ BootResult result = tryBootVm(TAG, "test_vm_boot_time_multicore");
+ assertThat(result.payloadStarted).isTrue();
+
+ bootTimeMetrics.add(result.endToEndNanoTime / NANO_TO_MILLI);
+ }
+
+ String metricName = "boot_time_" + numCpus + "cpus";
+ reportMetrics(bootTimeMetrics, metricName, "ms");
+ }
+ }
+
+ @Test
+ public void testMicrodroidDebugBootTime()
+ throws VirtualMachineException, InterruptedException, IOException {
+ assume().withMessage("Skip on CF; too slow").that(isCuttlefish()).isFalse();
+
+ final int trialCount = 10;
+
+ List<Double> vmStartingTimeMetrics = new ArrayList<>();
+ List<Double> bootTimeMetrics = new ArrayList<>();
+ List<Double> bootloaderTimeMetrics = new ArrayList<>();
+ List<Double> kernelBootTimeMetrics = new ArrayList<>();
+ List<Double> userspaceBootTimeMetrics = new ArrayList<>();
+
+ for (int i = 0; i < trialCount; i++) {
+ // To grab boot events from log, set debug mode to FULL
+ VirtualMachineConfig normalConfig =
+ newVmConfigBuilder()
+ .setPayloadBinaryPath("MicrodroidIdleNativeLib.so")
+ .setDebugLevel(DEBUG_LEVEL_FULL)
+ .setMemoryMib(256)
+ .build();
+ forceCreateNewVirtualMachine("test_vm_boot_time_debug", normalConfig);
+
+ BootResult result = tryBootVm(TAG, "test_vm_boot_time_debug");
+ assertThat(result.payloadStarted).isTrue();
+
+ vmStartingTimeMetrics.add(result.getVMStartingElapsedNanoTime() / NANO_TO_MILLI);
+ bootTimeMetrics.add(result.endToEndNanoTime / NANO_TO_MILLI);
+ bootloaderTimeMetrics.add(result.getBootloaderElapsedNanoTime() / NANO_TO_MILLI);
+ kernelBootTimeMetrics.add(result.getKernelElapsedNanoTime() / NANO_TO_MILLI);
+ userspaceBootTimeMetrics.add(result.getUserspaceElapsedNanoTime() / NANO_TO_MILLI);
}
reportMetrics(vmStartingTimeMetrics, "vm_starting_time", "ms");
diff --git a/virtualizationservice/src/virtmgr.rs b/virtualizationservice/src/virtmgr.rs
index 90b4789..5616097 100644
--- a/virtualizationservice/src/virtmgr.rs
+++ b/virtualizationservice/src/virtmgr.rs
@@ -30,6 +30,7 @@
use rpcbinder::{FileDescriptorTransportMode, RpcServer};
use std::os::unix::io::{FromRawFd, OwnedFd, RawFd};
use clap::Parser;
+use nix::fcntl::{fcntl, F_GETFD, F_SETFD, FdFlag};
use nix::unistd::{Pid, Uid};
use std::os::unix::raw::{pid_t, uid_t};
@@ -66,8 +67,12 @@
fn take_fd_ownership(raw_fd: RawFd, owned_fds: &mut Vec<RawFd>) -> Result<OwnedFd, anyhow::Error> {
// Basic check that the integer value does correspond to a file descriptor.
- nix::fcntl::fcntl(raw_fd, nix::fcntl::F_GETFD)
- .with_context(|| format!("Invalid file descriptor {raw_fd}"))?;
+ fcntl(raw_fd, F_GETFD).with_context(|| format!("Invalid file descriptor {raw_fd}"))?;
+
+ // The file descriptor had CLOEXEC disabled to be inherited from the parent.
+ // Re-enable it to make sure it is not accidentally inherited further.
+ fcntl(raw_fd, F_SETFD(FdFlag::FD_CLOEXEC))
+ .with_context(|| format!("Could not set CLOEXEC on file descriptor {raw_fd}"))?;
// Creating OwnedFd for stdio FDs is not safe.
if [libc::STDIN_FILENO, libc::STDOUT_FILENO, libc::STDERR_FILENO].contains(&raw_fd) {
diff --git a/vm/TEST_MAPPING b/vm/TEST_MAPPING
new file mode 100644
index 0000000..a8d1fa6
--- /dev/null
+++ b/vm/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "avf-presubmit" : [
+ {
+ "name" : "vm.test"
+ }
+ ]
+}