Reland Add microdroid_16k
So far only non-protected VMs can boot with 16k kernel.
Support for microdroid_16k pvms is tracked in b/376870129.
Bug: 317201718
Bug: 376517173
Bug: 333730505
Bug: 376870129
Test: adb shell /apex/com.android.virt/bin/vm run-microdroid \
--os microdroid_16k \
--debug full
Test: atest MicrodropidTests
Test: atest MicrodroidHostTestCases
Test: atest virtualizationmanager_device_test
Test: presubmit
Change-Id: I0fe5cd431b16f57e5bcc51146691fd0368d30818
diff --git a/build/microdroid/Android.bp b/build/microdroid/Android.bp
index abb97da..d5d8108 100644
--- a/build/microdroid/Android.bp
+++ b/build/microdroid/Android.bp
@@ -344,6 +344,11 @@
cmd: "cat $(in) > $(out)",
}
+filegroup {
+ name: "microdroid_16k_bootconfig_x86_64_gen",
+ srcs: ["bootconfig.x86_64_16k"],
+}
+
prebuilt_etc {
name: "microdroid_fstab",
src: "fstab.microdroid",
@@ -377,6 +382,11 @@
}
prebuilt_etc {
+ name: "microdroid_16k.json",
+ src: "microdroid_16k.json",
+}
+
+prebuilt_etc {
name: "microdroid_manifest",
src: "microdroid_manifest.xml",
filename: "manifest.xml",
@@ -431,6 +441,12 @@
src: ":microdroid_initrd_normal",
}
+avb_gen_vbmeta_image {
+ name: "microdroid_16k_initrd_normal_hashdesc",
+ defaults: ["microdroid_initrd_normal_defaults"],
+ src: ":microdroid_16k_initrd_normal",
+}
+
// python -c "import hashlib; print(hashlib.sha256(b'initrd_debug').hexdigest())"
initrd_debug_salt = "8ab9dc9cb7e6456700ff6ef18c6b4c3acc24c5fa5381b829563f8d7a415d869a"
@@ -447,6 +463,12 @@
src: ":microdroid_initrd_debuggable",
}
+avb_gen_vbmeta_image {
+ name: "microdroid_16k_initrd_debug_hashdesc",
+ defaults: ["microdroid_initrd_debug_defaults"],
+ src: ":microdroid_16k_initrd_debuggable",
+}
+
soong_config_module_type {
name: "flag_aware_avb_add_hash_footer_defaults",
module_type: "avb_add_hash_footer_defaults",
@@ -521,6 +543,40 @@
},
}
+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",
+ },
+ // There is no 16k x86_64 kernel. Instead the 16k emulation is triggered by adding
+ // `page_shift=14` to the kernel cmdline or bootconfig.
+ x86_64: {
+ src: ":microdroid_kernel_prebuilt-x86_64",
+ },
+ },
+ include_descriptors_from_images: [
+ ":microdroid_16k_initrd_normal_hashdesc",
+ ":microdroid_16k_initrd_debug_hashdesc",
+ ],
+}
+
+prebuilt_etc {
+ name: "microdroid_kernel_16k",
+ src: ":empty_file",
+ relative_install_path: "fs",
+ arch: {
+ arm64: {
+ src: ":microdroid_kernel_16k_signed",
+ },
+ x86_64: {
+ src: ":microdroid_kernel_16k_signed",
+ },
+ },
+}
+
///////////////////////////////////////
// GKI-android15-6.6
///////////////////////////////////////
diff --git a/build/microdroid/bootconfig.x86_64_16k b/build/microdroid/bootconfig.x86_64_16k
new file mode 100644
index 0000000..6a8423b
--- /dev/null
+++ b/build/microdroid/bootconfig.x86_64_16k
@@ -0,0 +1 @@
+page_shift=14
diff --git a/build/microdroid/initrd/Android.bp b/build/microdroid/initrd/Android.bp
index 6d45417..7331e0b 100644
--- a/build/microdroid/initrd/Android.bp
+++ b/build/microdroid/initrd/Android.bp
@@ -84,6 +84,10 @@
":microdroid_vbmeta_bootconfig_gen",
]
+bootconfigs_x86_64_16k = bootconfigs_x86_64 + [
+ ":microdroid_16k_bootconfig_x86_64_gen",
+]
+
java_genrule {
name: "microdroid_initrd_debuggable_arm64",
tools: ["initrd_bootconfig"],
@@ -118,6 +122,17 @@
}
java_genrule {
+ name: "microdroid_16k_initrd_debuggable_x86_64",
+ tools: ["initrd_bootconfig"],
+ srcs: [
+ ":microdroid_initrd_gen",
+ ":microdroid_bootconfig_debuggable_src",
+ ] + bootconfigs_x86_64_16k,
+ out: ["microdroid_16k_initrd_debuggable_x86_64"],
+ cmd: "$(location initrd_bootconfig) attach --output $(out) $(in)",
+}
+
+java_genrule {
name: "microdroid_gki-android15-6.6_initrd_debuggable_x86_64",
tools: ["initrd_bootconfig"],
srcs: [
@@ -162,6 +177,17 @@
}
java_genrule {
+ name: "microdroid_16k_initrd_normal_x86_64",
+ tools: ["initrd_bootconfig"],
+ srcs: [
+ ":microdroid_initrd_gen",
+ ":microdroid_bootconfig_normal_src",
+ ] + bootconfigs_x86_64_16k,
+ out: ["microdroid_16k_initrd_normal_x86_64"],
+ cmd: "$(location initrd_bootconfig) attach --output $(out) $(in)",
+}
+
+java_genrule {
name: "microdroid_gki-android15-6.6_initrd_normal_x86_64",
tools: ["initrd_bootconfig"],
srcs: [
@@ -188,6 +214,24 @@
}
prebuilt_etc {
+ name: "microdroid_16k_initrd_debuggable",
+ // We don't have ramdisk for architectures other than x86_64 & arm64
+ src: ":empty_file",
+ arch: {
+ // For x86_64 we emulate 16k by adding `page_shift=14` to bootconfig, that's why we need
+ // separate initrd.
+ x86_64: {
+ src: ":microdroid_16k_initrd_debuggable_x86_64",
+ },
+ // For arm64, the initrd for 16k kernel is the same.
+ arm64: {
+ src: ":microdroid_initrd_debuggable_arm64",
+ },
+ },
+ filename: "microdroid_16k_initrd_debuggable.img",
+}
+
+prebuilt_etc {
name: "microdroid_gki-android15-6.6_initrd_debuggable",
// We don't have ramdisk for architectures other than x86_64 & arm64
src: ":empty_file",
@@ -218,6 +262,24 @@
}
prebuilt_etc {
+ name: "microdroid_16k_initrd_normal",
+ // We don't have ramdisk for architectures other than x86_64 & arm64
+ src: ":empty_file",
+ arch: {
+ // For x86_64 we emulate 16k by adding `page_shift=14` to bootconfig, that's why we need
+ // separate initrd.
+ x86_64: {
+ src: ":microdroid_16k_initrd_normal_x86_64",
+ },
+ // For arm64, the initrd for 16k kernel is the same.
+ arm64: {
+ src: ":microdroid_initrd_normal_arm64",
+ },
+ },
+ filename: "microdroid_16k_initrd_normal.img",
+}
+
+prebuilt_etc {
name: "microdroid_gki-android15-6.6_initrd_normal",
// We don't have ramdisk for architectures other than x86_64 & arm64
src: ":empty_file",
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"
+}