summary refs log tree commit diff
path: root/kvm/src/lib.rs
diff options
context:
space:
mode:
authorSonny Rao <sonnyrao@chromium.org>2018-03-27 17:12:58 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-03-29 13:32:59 -0700
commit6ce158fb86b034c8a12bee4d65baba452ef42d6a (patch)
treed48c6a77d23078fd685bb42cb554a479e95a8c51 /kvm/src/lib.rs
parent62a4063aa6c28d1f73e93fd0e7da2135d4d46d02 (diff)
downloadcrosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.tar
crosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.tar.gz
crosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.tar.bz2
crosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.tar.lz
crosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.tar.xz
crosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.tar.zst
crosvm-6ce158fb86b034c8a12bee4d65baba452ef42d6a.zip
crosvm: support VM shutdown via SystemEvent
ARM systems don't have an exit event fd like x86, instead one of the Vcpus
will exit with the SystemEvent reason and put a code into the kvm run
union of either shutdown, reboot, or crash.  We currently don't handle
reboot or crash differently but can do so in the future.

BUG=chromium:797868
TEST=./build_test passes on all architectures
TEST=crosvm runs on kevin - manually test shutdown via maitred

Change-Id: I455cbe1ac653f61a1e9eae1ce22922d14cff4e3c
Reviewed-on: https://chromium-review.googlesource.com/982531
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Sonny Rao <sonnyrao@chromium.org>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'kvm/src/lib.rs')
-rw-r--r--kvm/src/lib.rs12
1 files changed, 10 insertions, 2 deletions
diff --git a/kvm/src/lib.rs b/kvm/src/lib.rs
index de938b6..04810b2 100644
--- a/kvm/src/lib.rs
+++ b/kvm/src/lib.rs
@@ -696,7 +696,9 @@ pub enum VcpuExit<'a> {
     Watchdog,
     S390Tsch,
     Epr,
-    SystemEvent,
+    /// The cpu triggered a system level event which is specified by the type field.
+    /// The possible events are shutdown, reset, or crash.
+    SystemEvent(u32 /* event_type*/, u64 /* flags */),
 }
 
 /// A wrapper around creating and using a VCPU.
@@ -803,7 +805,13 @@ impl Vcpu {
                 KVM_EXIT_WATCHDOG        => Ok(VcpuExit::Watchdog),
                 KVM_EXIT_S390_TSCH       => Ok(VcpuExit::S390Tsch),
                 KVM_EXIT_EPR             => Ok(VcpuExit::Epr),
-                KVM_EXIT_SYSTEM_EVENT    => Ok(VcpuExit::SystemEvent),
+                KVM_EXIT_SYSTEM_EVENT    => {
+                    // Safe because we know the exit reason told us this union
+                    // field is valid
+                    let event_type = unsafe { run.__bindgen_anon_1.system_event.type_ };
+                    let event_flags = unsafe { run.__bindgen_anon_1.system_event.flags };
+                    Ok(VcpuExit::SystemEvent(event_type, event_flags))
+                },
                 r => panic!("unknown kvm exit reason: {}", r),
             }
         } else {