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: [],
+    }),
+}