summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatt Delco <delco@chromium.org>2019-10-07 22:32:47 -0700
committerCommit Bot <commit-bot@chromium.org>2019-10-23 22:20:15 +0000
commit4ad168c0d7859fd8bcefe77b60c14327f094f6e7 (patch)
treed784659e0462298ab784e4da55fd406910a8cffa
parent30de32f2af9a2a57d74a7fdaf01e6e1fdce3c9e5 (diff)
downloadcrosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.tar
crosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.tar.gz
crosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.tar.bz2
crosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.tar.lz
crosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.tar.xz
crosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.tar.zst
crosvm-4ad168c0d7859fd8bcefe77b60c14327f094f6e7.zip
crosvm: add support for immediate exit
Adds ability to set the immediate exit bit and ask kvm if it's
supported.

BUG=None
TEST=local compile and test

Change-Id: I5c58a5920ebda13267efeb079c0bb671f83464ee
Signed-off-by: Matt Delco <delco@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1847857
Reviewed-by: Zach Reizner <zachr@chromium.org>
-rw-r--r--kvm/src/cap.rs1
-rw-r--r--kvm_sys/src/aarch64/bindings.rs16
-rw-r--r--kvm_sys/src/x86/bindings.rs16
3 files changed, 29 insertions, 4 deletions
diff --git a/kvm/src/cap.rs b/kvm/src/cap.rs
index b095f82..7dfd965 100644
--- a/kvm/src/cap.rs
+++ b/kvm/src/cap.rs
@@ -118,4 +118,5 @@ pub enum Cap {
     PpcEnableHcall = KVM_CAP_PPC_ENABLE_HCALL,
     CheckExtensionVm = KVM_CAP_CHECK_EXTENSION_VM,
     S390UserSigp = KVM_CAP_S390_USER_SIGP,
+    ImmediateExit = KVM_CAP_IMMEDIATE_EXIT,
 }
diff --git a/kvm_sys/src/aarch64/bindings.rs b/kvm_sys/src/aarch64/bindings.rs
index 26b10b4..7be9e0d 100644
--- a/kvm_sys/src/aarch64/bindings.rs
+++ b/kvm_sys/src/aarch64/bindings.rs
@@ -436,6 +436,7 @@ pub const KVM_CAP_GUEST_DEBUG_HW_BPS: ::std::os::raw::c_uint = 119;
 pub const KVM_CAP_GUEST_DEBUG_HW_WPS: ::std::os::raw::c_uint = 120;
 pub const KVM_CAP_SPLIT_IRQCHIP: ::std::os::raw::c_uint = 121;
 pub const KVM_CAP_IOEVENTFD_ANY_LENGTH: ::std::os::raw::c_uint = 122;
+pub const KVM_CAP_IMMEDIATE_EXIT: ::std::os::raw::c_uint = 136;
 pub const KVM_IRQ_ROUTING_IRQCHIP: ::std::os::raw::c_uint = 1;
 pub const KVM_IRQ_ROUTING_MSI: ::std::os::raw::c_uint = 2;
 pub const KVM_IRQ_ROUTING_S390_ADAPTER: ::std::os::raw::c_uint = 3;
@@ -1652,7 +1653,8 @@ fn bindgen_test_layout_kvm_s390_skeys() {
 #[derive(Copy, Clone)]
 pub struct kvm_run {
     pub request_interrupt_window: __u8,
-    pub padding1: [__u8; 7usize],
+    pub immediate_exit: __u8,
+    pub padding1: [__u8; 6usize],
     pub exit_reason: __u32,
     pub ready_for_interrupt_injection: __u8,
     pub if_flag: __u8,
@@ -3143,12 +3145,22 @@ fn bindgen_test_layout_kvm_run() {
         )
     );
     assert_eq!(
-        unsafe { &(*(::std::ptr::null::<kvm_run>())).padding1 as *const _ as usize },
+        unsafe { &(*(::std::ptr::null::<kvm_run>())).immediate_exit as *const _ as usize },
         1usize,
         concat!(
             "Offset of field: ",
             stringify!(kvm_run),
             "::",
+            stringify!(immediate_exit)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<kvm_run>())).padding1 as *const _ as usize },
+        2usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(kvm_run),
+            "::",
             stringify!(padding1)
         )
     );
diff --git a/kvm_sys/src/x86/bindings.rs b/kvm_sys/src/x86/bindings.rs
index 06b8680..a9d792f 100644
--- a/kvm_sys/src/x86/bindings.rs
+++ b/kvm_sys/src/x86/bindings.rs
@@ -422,6 +422,7 @@ pub const KVM_CAP_GUEST_DEBUG_HW_BPS: ::std::os::raw::c_uint = 119;
 pub const KVM_CAP_GUEST_DEBUG_HW_WPS: ::std::os::raw::c_uint = 120;
 pub const KVM_CAP_SPLIT_IRQCHIP: ::std::os::raw::c_uint = 121;
 pub const KVM_CAP_IOEVENTFD_ANY_LENGTH: ::std::os::raw::c_uint = 122;
+pub const KVM_CAP_IMMEDIATE_EXIT: ::std::os::raw::c_uint = 136;
 pub const KVM_IRQ_ROUTING_IRQCHIP: ::std::os::raw::c_uint = 1;
 pub const KVM_IRQ_ROUTING_MSI: ::std::os::raw::c_uint = 2;
 pub const KVM_IRQ_ROUTING_S390_ADAPTER: ::std::os::raw::c_uint = 3;
@@ -4040,7 +4041,8 @@ fn bindgen_test_layout_kvm_s390_skeys() {
 #[derive(Copy, Clone)]
 pub struct kvm_run {
     pub request_interrupt_window: __u8,
-    pub padding1: [__u8; 7usize],
+    pub immediate_exit: __u8,
+    pub padding1: [__u8; 6usize],
     pub exit_reason: __u32,
     pub ready_for_interrupt_injection: __u8,
     pub if_flag: __u8,
@@ -5532,12 +5534,22 @@ fn bindgen_test_layout_kvm_run() {
         )
     );
     assert_eq!(
-        unsafe { &(*(::std::ptr::null::<kvm_run>())).padding1 as *const _ as usize },
+        unsafe { &(*(::std::ptr::null::<kvm_run>())).immediate_exit as *const _ as usize },
         1usize,
         concat!(
             "Offset of field: ",
             stringify!(kvm_run),
             "::",
+            stringify!(immediate_exit)
+        )
+    );
+    assert_eq!(
+        unsafe { &(*(::std::ptr::null::<kvm_run>())).padding1 as *const _ as usize },
+        2usize,
+        concat!(
+            "Offset of field: ",
+            stringify!(kvm_run),
+            "::",
             stringify!(padding1)
         )
     );