Merge "Wait for crosvm in a separate thread, and keep track of when it dies."
diff --git a/microdroid/Android.bp b/microdroid/Android.bp
index 150f119..2ce435b 100644
--- a/microdroid/Android.bp
+++ b/microdroid/Android.bp
@@ -132,6 +132,14 @@
     ],
 }
 
+// TODO(jiyong): change the name to init, cause it's confusing
+microdroid_boot_cmdline = "rdinit=/bin/init_vendor " +
+    "panic=-1 " +
+    // TODO(b/181936135) make the ratelimiting conditional; ratelimiting on prod build
+    "printk.devkmsg=on " +
+    "androidboot.first_stage_console=1 " +
+    "androidboot.hardware=microdroid "
+
 bootimg {
     name: "microdroid_boot-5.10",
     ramdisk_module: "microdroid_ramdisk-5.10",
@@ -141,19 +149,16 @@
     arch: {
         arm64: {
             kernel_prebuilt: ":kernel_prebuilts-5.10-arm64",
+            cmdline: microdroid_boot_cmdline +
+                "androidboot.boot_devices=10000.pci",
         },
         x86_64: {
             kernel_prebuilt: ":kernel_prebuilts-5.10-x86_64",
+            cmdline: microdroid_boot_cmdline +
+                "pci=noacpi " +
+                "androidboot.boot_devices=pci0000:00/0000:00:01.0",
         },
     },
-    // TODO(jiyong): change the name to init, cause it's confusing
-    cmdline: "rdinit=/bin/init_vendor " +
-        "panic=-1 " +
-        // TODO(b/181936135) make the ratelimiting conditional; ratelimiting on prod build
-        "printk.devkmsg=on " +
-        "androidboot.first_stage_console=1 " +
-        "androidboot.hardware=microdroid " +
-        "androidboot.boot_devices=10000.pci ",
     dtb_prebuilt: "dummy_dtb.img",
     header_version: "4",
     partition_name: "boot",
@@ -227,6 +232,14 @@
 prebuilt_etc {
     name: "microdroid_bootloader",
     src: ":microdroid_bootloader_gen",
+    arch: {
+        x86_64: {
+            // For unknown reason, the signed bootloader doesn't work on x86_64. Until the problem
+            // is fixed, let's use the unsigned bootloader for the architecture.
+            // TODO(b/185115783): remove this
+            src: ":cuttlefish_crosvm_bootloader",
+        },
+    },
     filename: "microdroid_bootloader",
 }
 
@@ -262,6 +275,11 @@
 prebuilt_etc {
     name: "microdroid_uboot_env",
     src: ":microdroid_uboot_env_gen",
+    arch: {
+        x86_64: {
+            src: ":microdroid_uboot_env_gen_x86_64",
+        },
+    },
     filename: "uboot_env.img",
 }
 
@@ -273,6 +291,14 @@
     cmd: "$(location mkenvimage_host) -s 4096 -o $(out) $(in)",
 }
 
+genrule {
+    name: "microdroid_uboot_env_gen_x86_64",
+    tools: ["mkenvimage_host"],
+    srcs: ["uboot-env-x86_64.txt"],
+    out: ["output.img"],
+    cmd: "$(location mkenvimage_host) -s 4096 -o $(out) $(in)",
+}
+
 // sepolicy sha256 for vendor
 prebuilt_etc {
     name: "microdroid_precompiled_sepolicy.plat_sepolicy_and_mapping.sha256",
diff --git a/microdroid/microdroid_cdisk.json b/microdroid/microdroid_cdisk.json
index 591e83b..5721775 100644
--- a/microdroid/microdroid_cdisk.json
+++ b/microdroid/microdroid_cdisk.json
@@ -2,53 +2,43 @@
   "partitions": [
     {
       "label": "misc",
-      "path": "misc.img",
-      "read_only": true
+      "path": "misc.img"
     },
     {
       "label": "boot_a",
-      "path": "microdroid_boot-5.10.img",
-      "read_only": true
+      "path": "microdroid_boot-5.10.img"
     },
     {
       "label": "boot_b",
-      "path": "microdroid_boot-5.10.img",
-      "read_only": true
+      "path": "microdroid_boot-5.10.img"
     },
     {
       "label": "vendor_boot_a",
-      "path": "microdroid_vendor_boot-5.10.img",
-      "read_only": true
+      "path": "microdroid_vendor_boot-5.10.img"
     },
     {
       "label": "vendor_boot_b",
-      "path": "microdroid_vendor_boot-5.10.img",
-      "read_only": true
+      "path": "microdroid_vendor_boot-5.10.img"
     },
     {
       "label": "vbmeta_a",
-      "path": "microdroid_vbmeta.img",
-      "read_only": true
+      "path": "microdroid_vbmeta.img"
     },
     {
       "label": "vbmeta_b",
-      "path": "microdroid_vbmeta.img",
-      "read_only": true
+      "path": "microdroid_vbmeta.img"
     },
     {
       "label": "vbmeta_system_a",
-      "path": "microdroid_vbmeta_system.img",
-      "read_only": true
+      "path": "microdroid_vbmeta_system.img"
     },
     {
       "label": "vbmeta_system_b",
-      "path": "microdroid_vbmeta_system.img",
-      "read_only": true
+      "path": "microdroid_vbmeta_system.img"
     },
     {
       "label": "super",
-      "path": "microdroid_super.img",
-      "read_only": true
+      "path": "microdroid_super.img"
     }
   ]
 }
diff --git a/microdroid/microdroid_cdisk_env.json b/microdroid/microdroid_cdisk_env.json
index f43c4b1..b0fbe44 100644
--- a/microdroid/microdroid_cdisk_env.json
+++ b/microdroid/microdroid_cdisk_env.json
@@ -2,8 +2,7 @@
   "partitions": [
     {
       "label": "uboot_env",
-      "path": "uboot_env.img",
-      "read_only": true
+      "path": "uboot_env.img"
     }
   ]
 }
diff --git a/microdroid/uboot-env-x86_64.txt b/microdroid/uboot-env-x86_64.txt
new file mode 100644
index 0000000..ab0fc26
--- /dev/null
+++ b/microdroid/uboot-env-x86_64.txt
@@ -0,0 +1,13 @@
+# Static u-boot environment variables for microdroid. See b/180481192
+
+# Boot the device following the Android boot procedure
+bootcmd=boot_android virtio 0#misc
+
+bootdelay=0
+
+# U-Boot in x86_64 by defaults loads kernel at 0x20000000 (512MB), which is
+# out of the physical memory when the VM is launched with the default memory
+# size of 256MB. To avoid that, explicitly set the kernel load addresss using
+# loadaddr variable.
+loadaddr=0x02000000
+fdtaddr=0x40000000
diff --git a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
index 44a2952..57c7b17 100644
--- a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
+++ b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
@@ -106,7 +106,14 @@
         Thread.sleep(MICRODROID_BOOT_TIMEOUT_MILLIS);
 
         // Connect to microdroid and read a system property from there
-        executeCommand("adb forward tcp:" + TEST_VM_ADB_PORT + " vsock:" + TEST_VM_CID + ":5555");
+        executeCommand(
+                "adb -s "
+                        + getDevice().getSerialNumber()
+                        + " forward tcp:"
+                        + TEST_VM_ADB_PORT
+                        + " vsock:"
+                        + TEST_VM_CID
+                        + ":5555");
         executeCommand("adb connect " + MICRODROID_SERIAL);
         String prop = executeCommand("adb -s " + MICRODROID_SERIAL + " shell getprop ro.hardware");
         assertThat(prop, is("microdroid"));