Add microdroid_16k kernel
Since microdroid_16k kernel uses the same initrd as regulard microdroid
kernel, I've added a small hack in payload.rs. If we want, we can add a
more generic solution in a follow-up patch.
Additionally, since 16k kernels are only supported for 16k kernel builds
(trying to build x86_64 16k kernel on android15-6.6 branch results in
"ERROR: 16k pages not supported on x86_64."), the microdroid_16k related
soong modules are only enabled for products that set
TARGET_BOOTS_16K := true. This is needed to make checkbuild on x86_64
products happy.
Test: adb shell /apex/com.android.virt/bin info
Test: atest virtualizationmanager_device_test
Change-Id: Id74da6bb73093cc5ee60c58d99a8c218a31468c9
diff --git a/android/virtmgr/src/aidl.rs b/android/virtmgr/src/aidl.rs
index 5dac07f..c1b4d86 100644
--- a/android/virtmgr/src/aidl.rs
+++ b/android/virtmgr/src/aidl.rs
@@ -2237,6 +2237,14 @@
}
#[test]
+ fn test_extract_os_name_from_microdroid_16k_config() -> Result<()> {
+ test_extract_os_name_from_config_path(
+ Path::new("/apex/com.android.virt/etc/microdroid_16k.json"),
+ Some("microdroid_16k"),
+ )
+ }
+
+ #[test]
fn test_extract_os_name_from_microdroid_gki_config() -> Result<()> {
test_extract_os_name_from_config_path(
Path::new("/apex/com.android.virt/etc/microdroid_gki-android14-6.1.json"),
diff --git a/android/virtmgr/src/payload.rs b/android/virtmgr/src/payload.rs
index 5811314..244e112 100644
--- a/android/virtmgr/src/payload.rs
+++ b/android/virtmgr/src/payload.rs
@@ -449,6 +449,8 @@
DebugLevel::FULL => "debuggable",
_ => return Err(anyhow!("unsupported debug level: {:?}", config.debugLevel)),
};
+ // TODO(ioffe): generalise this
+ let os_name = if os_name == "microdroid_16k" { "microdroid" } else { os_name };
let initrd = format!("/apex/com.android.virt/etc/{os_name}_initrd_{debug_suffix}.img");
vm_config.initrd = Some(open_parcel_file(Path::new(&initrd), false)?);
diff --git a/build/apex/Android.bp b/build/apex/Android.bp
index b0ecdde..6090b6f 100644
--- a/build/apex/Android.bp
+++ b/build/apex/Android.bp
@@ -159,6 +159,12 @@
}) + select(release_flag("RELEASE_AVF_ENABLE_NETWORK"), {
true: ["com.android.virt.vmnic.rc"],
default: [],
+ }) + select(soong_config_variable("ANDROID", "target_boots_16k"), {
+ true: [
+ "microdroid_16k.json",
+ "microdroid_kernel_16k",
+ ],
+ default: [],
}),
host_required: [
"vm_shell",
diff --git a/build/microdroid/Android.bp b/build/microdroid/Android.bp
index abb97da..6fa15fe 100644
--- a/build/microdroid/Android.bp
+++ b/build/microdroid/Android.bp
@@ -377,6 +377,11 @@
}
prebuilt_etc {
+ name: "microdroid_16k.json",
+ src: "microdroid_16k.json",
+}
+
+prebuilt_etc {
name: "microdroid_manifest",
src: "microdroid_manifest.xml",
filename: "manifest.xml",
@@ -507,6 +512,29 @@
],
}
+avb_add_hash_footer {
+ name: "microdroid_kernel_16k_signed",
+ defaults: ["microdroid_kernel_signed_defaults"],
+ filename: "microdroid_kernel_16k",
+ arch: {
+ arm64: {
+ src: ":microdroid_kernel_16k_prebuilt-arm64",
+ },
+ },
+ include_descriptors_from_images: [
+ ":microdroid_initrd_normal_hashdesc",
+ ":microdroid_initrd_debug_hashdesc",
+ ],
+ // Currently x86_64 arch doesn't support building 16k kernels, meaning that
+ // we don't have microdroid_16k kernel prebuilts in x86_64.
+ // We need to disable this module on x86_64 products, otherwise checkbuild
+ // will complain.
+ enabled: select(soong_config_variable("ANDROID", "target_boots_16k"), {
+ true: true,
+ default: false,
+ }),
+}
+
prebuilt_etc {
name: "microdroid_kernel",
src: ":empty_file",
@@ -521,6 +549,23 @@
},
}
+prebuilt_etc {
+ name: "microdroid_kernel_16k",
+ src: ":empty_file",
+ relative_install_path: "fs",
+ arch: {
+ arm64: {
+ src: ":microdroid_kernel_16k_signed",
+ },
+ },
+ // The microdroid_kernel_16k_signed is only enabled for products that set
+ // TARGET_BOOTS_16K, so we also need to conditionally enable this module.
+ enabled: select(soong_config_variable("ANDROID", "target_boots_16k"), {
+ true: true,
+ default: false,
+ }),
+}
+
///////////////////////////////////////
// GKI-android15-6.6
///////////////////////////////////////
diff --git a/build/microdroid/microdroid_16k.json b/build/microdroid/microdroid_16k.json
new file mode 100644
index 0000000..ba6a949
--- /dev/null
+++ b/build/microdroid/microdroid_16k.json
@@ -0,0 +1,21 @@
+{
+ "kernel": "/apex/com.android.virt/etc/fs/microdroid_kernel_16k",
+ "disks": [
+ {
+ "partitions": [
+ {
+ "label": "vbmeta_a",
+ "path": "/apex/com.android.virt/etc/fs/microdroid_vbmeta.img"
+ },
+ {
+ "label": "super",
+ "path": "/apex/com.android.virt/etc/fs/microdroid_super.img"
+ }
+ ],
+ "writable": false
+ }
+ ],
+ "memory_mib": 256,
+ "console_input_device": "hvc0",
+ "platform_version": "~1.0"
+}
diff --git a/guest/kernel/Android.bp b/guest/kernel/Android.bp
index 8c6cccb..d3249f6 100644
--- a/guest/kernel/Android.bp
+++ b/guest/kernel/Android.bp
@@ -43,3 +43,12 @@
default: [],
}),
}
+
+filegroup {
+ name: "microdroid_kernel_16k_prebuilt-arm64",
+ // Below are properties that are conditionally set depending on value of build flags.
+ srcs: select(release_flag("RELEASE_AVF_MICRODROID_KERNEL_VERSION"), {
+ "android15_66": ["android15-6.6/arm64/16k/kernel-6.6"],
+ default: [],
+ }),
+}