xref: /aosp_15_r20/external/crosvm/hypervisor/src/haxm/linux.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::cell::RefCell;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_char;
7*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_int;
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker use base::errno_result;
10*bb4ee6a4SAndroid Build Coastguard Worker use base::Error;
11*bb4ee6a4SAndroid Build Coastguard Worker use base::FromRawDescriptor;
12*bb4ee6a4SAndroid Build Coastguard Worker use base::MappedRegion;
13*bb4ee6a4SAndroid Build Coastguard Worker use base::Result;
14*bb4ee6a4SAndroid Build Coastguard Worker use base::SafeDescriptor;
15*bb4ee6a4SAndroid Build Coastguard Worker use libc::open64;
16*bb4ee6a4SAndroid Build Coastguard Worker use libc::EBUSY;
17*bb4ee6a4SAndroid Build Coastguard Worker use libc::O_CLOEXEC;
18*bb4ee6a4SAndroid Build Coastguard Worker use libc::O_RDWR;
19*bb4ee6a4SAndroid Build Coastguard Worker 
20*bb4ee6a4SAndroid Build Coastguard Worker use super::haxm_sys::hax_tunnel;
21*bb4ee6a4SAndroid Build Coastguard Worker use super::HaxmVcpu;
22*bb4ee6a4SAndroid Build Coastguard Worker use super::HAX_EXIT_PAUSED;
23*bb4ee6a4SAndroid Build Coastguard Worker 
open_haxm_device(_use_ghaxm: bool) -> Result<SafeDescriptor>24*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn open_haxm_device(_use_ghaxm: bool) -> Result<SafeDescriptor> {
25*bb4ee6a4SAndroid Build Coastguard Worker     // Open calls are safe because we give a constant nul-terminated string and verify the
26*bb4ee6a4SAndroid Build Coastguard Worker     // result.
27*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe { open64("/dev/HAX\0".as_ptr() as *const c_char, O_RDWR | O_CLOEXEC) };
28*bb4ee6a4SAndroid Build Coastguard Worker     if ret < 0 {
29*bb4ee6a4SAndroid Build Coastguard Worker         return errno_result();
30*bb4ee6a4SAndroid Build Coastguard Worker     }
31*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because we verify that ret is valid and we own the fd.
32*bb4ee6a4SAndroid Build Coastguard Worker     Ok(unsafe { SafeDescriptor::from_raw_descriptor(ret) })
33*bb4ee6a4SAndroid Build Coastguard Worker }
34*bb4ee6a4SAndroid Build Coastguard Worker 
open_haxm_vm_device(_use_ghaxm: bool, vm_id: u32) -> Result<SafeDescriptor>35*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn open_haxm_vm_device(_use_ghaxm: bool, vm_id: u32) -> Result<SafeDescriptor> {
36*bb4ee6a4SAndroid Build Coastguard Worker     // Haxm creates additional device paths when VMs are created
37*bb4ee6a4SAndroid Build Coastguard Worker     let path = format!("/dev/hax_vm/vm{:02}\0", vm_id);
38*bb4ee6a4SAndroid Build Coastguard Worker 
39*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe { open64(path.as_ptr() as *const c_char, O_RDWR | O_CLOEXEC) };
40*bb4ee6a4SAndroid Build Coastguard Worker     if ret < 0 {
41*bb4ee6a4SAndroid Build Coastguard Worker         return errno_result();
42*bb4ee6a4SAndroid Build Coastguard Worker     }
43*bb4ee6a4SAndroid Build Coastguard Worker 
44*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because we verify that ret is valid and we own the fd.
45*bb4ee6a4SAndroid Build Coastguard Worker     Ok(unsafe { SafeDescriptor::from_raw_descriptor(ret) })
46*bb4ee6a4SAndroid Build Coastguard Worker }
47*bb4ee6a4SAndroid Build Coastguard Worker 
open_haxm_vcpu_device( _use_ghaxm: bool, vm_id: u32, vcpu_id: u32, ) -> Result<SafeDescriptor>48*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn open_haxm_vcpu_device(
49*bb4ee6a4SAndroid Build Coastguard Worker     _use_ghaxm: bool,
50*bb4ee6a4SAndroid Build Coastguard Worker     vm_id: u32,
51*bb4ee6a4SAndroid Build Coastguard Worker     vcpu_id: u32,
52*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<SafeDescriptor> {
53*bb4ee6a4SAndroid Build Coastguard Worker     // Haxm creates additional device paths when VMs are created
54*bb4ee6a4SAndroid Build Coastguard Worker     let path = format!("/dev/hax_vm{:02}/vcpu{:02}\0", vm_id, vcpu_id);
55*bb4ee6a4SAndroid Build Coastguard Worker 
56*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe { open64(path.as_ptr() as *const c_char, O_RDWR | O_CLOEXEC) };
57*bb4ee6a4SAndroid Build Coastguard Worker     if ret < 0 {
58*bb4ee6a4SAndroid Build Coastguard Worker         return errno_result();
59*bb4ee6a4SAndroid Build Coastguard Worker     }
60*bb4ee6a4SAndroid Build Coastguard Worker 
61*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because we verify that ret is valid and we own the fd.
62*bb4ee6a4SAndroid Build Coastguard Worker     unsafe { SafeDescriptor::from_raw_descriptor(ret) };
63*bb4ee6a4SAndroid Build Coastguard Worker }
64