Merge "Warn/Panic with x86_64 emulation without CPU acceleration."
diff --git a/android/main.c b/android/main.c
index 9cba680..8ce827b 100644
--- a/android/main.c
+++ b/android/main.c
@@ -1282,9 +1282,11 @@
     bool accel_ok = android_hasCpuAcceleration(&accel_status);
 
 #ifdef __linux__
+    static const char kAccelerator[] = "KVM";
     static const char kEnableAccelerator[] = "-enable-kvm";
     static const char kDisableAccelerator[] = "-disable-kvm";
 #else
+    static const char kAccelerator[] = "Intel HAXM";
     static const char kEnableAccelerator[] = "-enable-hax";
     static const char kDisableAccelerator[] = "-disable-hax";
 #endif
@@ -1303,6 +1305,28 @@
         dprint("CPU Acceleration status: %s", accel_status);
     }
 
+    // Special case: x86_64 emulation currently requires hardware
+    // acceleration, so refuse to start in 'auto' mode if it is not
+    // available.
+    {
+        char* abi = avdInfo_getTargetAbi(avd);
+        if (!strcmp(abi, "x86_64")) {
+            if (!accel_ok && accel_mode != ACCEL_OFF) {
+                derror("x86_64 emulation currently requires hardware acceleration!\n"
+                    "Please ensure %s is properly installed and usable.\n"
+                    "CPU acceleration status: %s",
+                    kAccelerator, accel_status);
+                exit(1);
+            }
+            else if (accel_mode == ACCEL_OFF) {
+                // '-no-accel' of '-accel off' was used explicitly. Warn about
+                // the issue but do not exit.
+                dwarning("x86_64 emulation may not work without hardware acceleration!");
+            }
+        }
+        AFREE(abi);
+    }
+
     // CPU acceleration only works for x86 and x86_64 system images.
     if (accel_mode == ACCEL_OFF && accel_ok) {
         args[n++] = ASTRDUP(kDisableAccelerator);