xref: /aosp_15_r20/external/crosvm/hypervisor/src/haxm/win.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::ptr::null_mut;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use base::errno_result;
8*bb4ee6a4SAndroid Build Coastguard Worker use base::FromRawDescriptor;
9*bb4ee6a4SAndroid Build Coastguard Worker use base::Result;
10*bb4ee6a4SAndroid Build Coastguard Worker use base::SafeDescriptor;
11*bb4ee6a4SAndroid Build Coastguard Worker use win_util::win32_wide_string;
12*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::fileapi::CreateFileW;
13*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::fileapi::CREATE_ALWAYS;
14*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::handleapi::INVALID_HANDLE_VALUE;
15*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::winnt::FILE_ATTRIBUTE_NORMAL;
16*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::winnt::GENERIC_READ;
17*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::winnt::GENERIC_WRITE;
18*bb4ee6a4SAndroid Build Coastguard Worker 
open_haxm_device(use_ghaxm: bool) -> Result<SafeDescriptor>19*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn open_haxm_device(use_ghaxm: bool) -> Result<SafeDescriptor> {
20*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
21*bb4ee6a4SAndroid Build Coastguard Worker     // Open calls are safe because we give a constant nul-terminated string and verify the
22*bb4ee6a4SAndroid Build Coastguard Worker     // result.
23*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe {
24*bb4ee6a4SAndroid Build Coastguard Worker         CreateFileW(
25*bb4ee6a4SAndroid Build Coastguard Worker             win32_wide_string(if use_ghaxm {
26*bb4ee6a4SAndroid Build Coastguard Worker                 "\\\\.\\GHAX"
27*bb4ee6a4SAndroid Build Coastguard Worker             } else {
28*bb4ee6a4SAndroid Build Coastguard Worker                 "\\\\.\\HAX"
29*bb4ee6a4SAndroid Build Coastguard Worker             })
30*bb4ee6a4SAndroid Build Coastguard Worker             .as_ptr(),
31*bb4ee6a4SAndroid Build Coastguard Worker             GENERIC_READ | GENERIC_WRITE,
32*bb4ee6a4SAndroid Build Coastguard Worker             0,
33*bb4ee6a4SAndroid Build Coastguard Worker             null_mut(),
34*bb4ee6a4SAndroid Build Coastguard Worker             CREATE_ALWAYS,
35*bb4ee6a4SAndroid Build Coastguard Worker             FILE_ATTRIBUTE_NORMAL,
36*bb4ee6a4SAndroid Build Coastguard Worker             null_mut(),
37*bb4ee6a4SAndroid Build Coastguard Worker         )
38*bb4ee6a4SAndroid Build Coastguard Worker     };
39*bb4ee6a4SAndroid Build Coastguard Worker 
40*bb4ee6a4SAndroid Build Coastguard Worker     if ret == INVALID_HANDLE_VALUE {
41*bb4ee6a4SAndroid Build Coastguard Worker         return errno_result();
42*bb4ee6a4SAndroid Build Coastguard Worker     }
43*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
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_vm_device(use_ghaxm: bool, vm_id: u32) -> Result<SafeDescriptor>48*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn open_haxm_vm_device(use_ghaxm: bool, vm_id: u32) -> Result<SafeDescriptor> {
49*bb4ee6a4SAndroid Build Coastguard Worker     let name = if use_ghaxm {
50*bb4ee6a4SAndroid Build Coastguard Worker         format!("\\\\.\\ghax_vm{:02}", vm_id)
51*bb4ee6a4SAndroid Build Coastguard Worker     } else {
52*bb4ee6a4SAndroid Build Coastguard Worker         format!("\\\\.\\hax_vm{:02}", vm_id)
53*bb4ee6a4SAndroid Build Coastguard Worker     };
54*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
55*bb4ee6a4SAndroid Build Coastguard Worker     // Open calls are safe because we give a constant nul-terminated string and verify the
56*bb4ee6a4SAndroid Build Coastguard Worker     // result.
57*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe {
58*bb4ee6a4SAndroid Build Coastguard Worker         CreateFileW(
59*bb4ee6a4SAndroid Build Coastguard Worker             win32_wide_string(&name).as_ptr(),
60*bb4ee6a4SAndroid Build Coastguard Worker             GENERIC_READ | GENERIC_WRITE,
61*bb4ee6a4SAndroid Build Coastguard Worker             0,
62*bb4ee6a4SAndroid Build Coastguard Worker             null_mut(),
63*bb4ee6a4SAndroid Build Coastguard Worker             CREATE_ALWAYS,
64*bb4ee6a4SAndroid Build Coastguard Worker             FILE_ATTRIBUTE_NORMAL,
65*bb4ee6a4SAndroid Build Coastguard Worker             null_mut(),
66*bb4ee6a4SAndroid Build Coastguard Worker         )
67*bb4ee6a4SAndroid Build Coastguard Worker     };
68*bb4ee6a4SAndroid Build Coastguard Worker 
69*bb4ee6a4SAndroid Build Coastguard Worker     if ret == INVALID_HANDLE_VALUE {
70*bb4ee6a4SAndroid Build Coastguard Worker         return errno_result();
71*bb4ee6a4SAndroid Build Coastguard Worker     }
72*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
73*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because we verify that ret is valid and we own the fd.
74*bb4ee6a4SAndroid Build Coastguard Worker     Ok(unsafe { SafeDescriptor::from_raw_descriptor(ret) })
75*bb4ee6a4SAndroid Build Coastguard Worker }
76*bb4ee6a4SAndroid Build Coastguard Worker 
open_haxm_vcpu_device( use_ghaxm: bool, vm_id: u32, vcpu_id: u32, ) -> Result<SafeDescriptor>77*bb4ee6a4SAndroid Build Coastguard Worker pub(super) fn open_haxm_vcpu_device(
78*bb4ee6a4SAndroid Build Coastguard Worker     use_ghaxm: bool,
79*bb4ee6a4SAndroid Build Coastguard Worker     vm_id: u32,
80*bb4ee6a4SAndroid Build Coastguard Worker     vcpu_id: u32,
81*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<SafeDescriptor> {
82*bb4ee6a4SAndroid Build Coastguard Worker     let name = if use_ghaxm {
83*bb4ee6a4SAndroid Build Coastguard Worker         format!("\\\\.\\ghax_vm{:02}_vcpu{:02}", vm_id, vcpu_id)
84*bb4ee6a4SAndroid Build Coastguard Worker     } else {
85*bb4ee6a4SAndroid Build Coastguard Worker         format!("\\\\.\\hax_vm{:02}_vcpu{:02}", vm_id, vcpu_id)
86*bb4ee6a4SAndroid Build Coastguard Worker     };
87*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
88*bb4ee6a4SAndroid Build Coastguard Worker     // Open calls are safe because we give a constant nul-terminated string and verify the
89*bb4ee6a4SAndroid Build Coastguard Worker     // result.
90*bb4ee6a4SAndroid Build Coastguard Worker     let ret = unsafe {
91*bb4ee6a4SAndroid Build Coastguard Worker         CreateFileW(
92*bb4ee6a4SAndroid Build Coastguard Worker             win32_wide_string(&name).as_ptr(),
93*bb4ee6a4SAndroid Build Coastguard Worker             GENERIC_READ | GENERIC_WRITE,
94*bb4ee6a4SAndroid Build Coastguard Worker             0,
95*bb4ee6a4SAndroid Build Coastguard Worker             null_mut(),
96*bb4ee6a4SAndroid Build Coastguard Worker             CREATE_ALWAYS,
97*bb4ee6a4SAndroid Build Coastguard Worker             FILE_ATTRIBUTE_NORMAL,
98*bb4ee6a4SAndroid Build Coastguard Worker             null_mut(),
99*bb4ee6a4SAndroid Build Coastguard Worker         )
100*bb4ee6a4SAndroid Build Coastguard Worker     };
101*bb4ee6a4SAndroid Build Coastguard Worker 
102*bb4ee6a4SAndroid Build Coastguard Worker     if ret == INVALID_HANDLE_VALUE {
103*bb4ee6a4SAndroid Build Coastguard Worker         return errno_result();
104*bb4ee6a4SAndroid Build Coastguard Worker     }
105*bb4ee6a4SAndroid Build Coastguard Worker     // SAFETY:
106*bb4ee6a4SAndroid Build Coastguard Worker     // Safe because we verify that ret is valid and we own the fd.
107*bb4ee6a4SAndroid Build Coastguard Worker     Ok(unsafe { SafeDescriptor::from_raw_descriptor(ret) })
108*bb4ee6a4SAndroid Build Coastguard Worker }
109