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