@@ -25,11 +25,12 @@ use windows_result::HRESULT;
2525
2626#[ cfg( gdb) ]
2727use super :: handlers:: DbgMemAccessHandlerWrapper ;
28- use super :: wrappers:: HandleWrapper ;
29- use super :: {
30- HyperlightExit , CR0_AM , CR0_ET , CR0_MP , CR0_NE , CR0_PE , CR0_PG , CR0_WP , CR4_OSFXSR ,
31- CR4_OSXMMEXCPT , CR4_PAE , EFER_LMA , EFER_LME , EFER_NX , EFER_SCE ,
28+ use super :: regs:: {
29+ WHP_FPU_NAMES , WHP_FPU_NAMES_LEN , WHP_REGS_NAMES , WHP_REGS_NAMES_LEN , WHP_SREGS_NAMES ,
30+ WHP_SREGS_NAMES_LEN ,
3231} ;
32+ use super :: wrappers:: HandleWrapper ;
33+ use super :: HyperlightExit ;
3334use crate :: hypervisor:: regs:: { CommonFpu , CommonRegisters , CommonSpecialRegisters } ;
3435use crate :: hypervisor:: surrogate_process:: SurrogateProcess ;
3536use crate :: hypervisor:: surrogate_process_manager:: get_surrogate_process_manager;
@@ -108,7 +109,7 @@ impl WhpVm {
108109 } )
109110 }
110111
111- /// Helper for setting arbitrary registers
112+ /// Helper for setting arbitrary registers.
112113 fn set_registers ( & self , registers : & [ ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) ] ) -> Result < ( ) > {
113114 let register_count = registers. len ( ) ;
114115 let mut register_names: Vec < WHV_REGISTER_NAME > = vec ! [ ] ;
@@ -136,172 +137,101 @@ impl WhpVm {
136137
137138impl Vm for WhpVm {
138139 fn get_regs ( & self ) -> Result < CommonRegisters > {
139- const LEN : usize = 18 ;
140-
141- let names: [ WHV_REGISTER_NAME ; LEN ] = [
142- WHvX64RegisterRax ,
143- WHvX64RegisterRbx ,
144- WHvX64RegisterRcx ,
145- WHvX64RegisterRdx ,
146- WHvX64RegisterRsi ,
147- WHvX64RegisterRdi ,
148- WHvX64RegisterRsp ,
149- WHvX64RegisterRbp ,
150- WHvX64RegisterR8 ,
151- WHvX64RegisterR9 ,
152- WHvX64RegisterR10 ,
153- WHvX64RegisterR11 ,
154- WHvX64RegisterR12 ,
155- WHvX64RegisterR13 ,
156- WHvX64RegisterR14 ,
157- WHvX64RegisterR15 ,
158- WHvX64RegisterRip ,
159- WHvX64RegisterRflags ,
160- ] ;
161-
162- let mut out: [ WHV_REGISTER_VALUE ; LEN ] = unsafe { std:: mem:: zeroed ( ) } ;
140+ let mut whv_regs_values: [ WHV_REGISTER_VALUE ; WHP_REGS_NAMES_LEN ] =
141+ unsafe { std:: mem:: zeroed ( ) } ;
142+
163143 unsafe {
164144 WHvGetVirtualProcessorRegisters (
165145 self . partition ,
166146 0 ,
167- names . as_ptr ( ) ,
168- LEN as u32 ,
169- out . as_mut_ptr ( ) ,
147+ WHP_REGS_NAMES . as_ptr ( ) ,
148+ WHP_REGS_NAMES_LEN as u32 ,
149+ whv_regs_values . as_mut_ptr ( ) ,
170150 )
171151 . unwrap ( ) ;
172- Ok ( CommonRegisters {
173- rax : out[ 0 ] . Reg64 ,
174- rbx : out[ 1 ] . Reg64 ,
175- rcx : out[ 2 ] . Reg64 ,
176- rdx : out[ 3 ] . Reg64 ,
177- rsi : out[ 4 ] . Reg64 ,
178- rdi : out[ 5 ] . Reg64 ,
179- rsp : out[ 6 ] . Reg64 ,
180- rbp : out[ 7 ] . Reg64 ,
181- r8 : out[ 8 ] . Reg64 ,
182- r9 : out[ 9 ] . Reg64 ,
183- r10 : out[ 10 ] . Reg64 ,
184- r11 : out[ 11 ] . Reg64 ,
185- r12 : out[ 12 ] . Reg64 ,
186- r13 : out[ 13 ] . Reg64 ,
187- r14 : out[ 14 ] . Reg64 ,
188- r15 : out[ 15 ] . Reg64 ,
189- rip : out[ 16 ] . Reg64 ,
190- rflags : out[ 17 ] . Reg64 ,
191- } )
192152 }
153+
154+ WHP_REGS_NAMES
155+ . into_iter ( )
156+ . zip ( whv_regs_values)
157+ . collect :: < Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > > ( )
158+ . as_slice ( )
159+ . try_into ( )
160+ . map_err ( |e| {
161+ new_error ! (
162+ "Failed to convert WHP registers to CommonRegisters: {:?}" ,
163+ e
164+ )
165+ } )
193166 }
194167
195168 fn set_regs ( & self , regs : & CommonRegisters ) -> Result < ( ) > {
196- let whp_regs: Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > = regs. into ( ) ;
169+ let whp_regs: [ ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) ; WHP_REGS_NAMES_LEN ] = regs. into ( ) ;
197170 self . set_registers ( & whp_regs) ?;
198171 Ok ( ( ) )
199172 }
200173
201174 fn get_sregs ( & self ) -> Result < CommonSpecialRegisters > {
202- const LEN : usize = 17 ;
203-
204- let names: [ WHV_REGISTER_NAME ; LEN ] = [
205- WHvX64RegisterCs ,
206- WHvX64RegisterDs ,
207- WHvX64RegisterEs ,
208- WHvX64RegisterFs ,
209- WHvX64RegisterGs ,
210- WHvX64RegisterSs ,
211- WHvX64RegisterTr ,
212- WHvX64RegisterLdtr ,
213- WHvX64RegisterGdtr ,
214- WHvX64RegisterIdtr ,
215- WHvX64RegisterCr0 ,
216- WHvX64RegisterCr2 ,
217- WHvX64RegisterCr3 ,
218- WHvX64RegisterCr4 ,
219- WHvX64RegisterCr8 ,
220- WHvX64RegisterEfer ,
221- WHvX64RegisterApicBase ,
222- ] ;
223-
224- let mut out: [ WHV_REGISTER_VALUE ; LEN ] = unsafe { std:: mem:: zeroed ( ) } ;
175+ let mut whp_sregs_values: [ WHV_REGISTER_VALUE ; WHP_SREGS_NAMES_LEN ] =
176+ unsafe { std:: mem:: zeroed ( ) } ;
177+
225178 unsafe {
226179 WHvGetVirtualProcessorRegisters (
227180 self . partition ,
228181 0 ,
229- names . as_ptr ( ) ,
230- out . len ( ) as u32 ,
231- out . as_mut_ptr ( ) ,
182+ WHP_SREGS_NAMES . as_ptr ( ) ,
183+ whp_sregs_values . len ( ) as u32 ,
184+ whp_sregs_values . as_mut_ptr ( ) ,
232185 )
233186 . unwrap ( ) ;
234187 }
235188
236- let result = unsafe {
237- CommonSpecialRegisters {
238- cs : out[ 0 ] . into ( ) ,
239- ds : out[ 1 ] . into ( ) ,
240- es : out[ 2 ] . into ( ) ,
241- fs : out[ 3 ] . into ( ) ,
242- gs : out[ 4 ] . into ( ) ,
243- ss : out[ 5 ] . into ( ) ,
244- tr : out[ 6 ] . into ( ) ,
245- ldt : out[ 7 ] . into ( ) ,
246- gdt : out[ 8 ] . into ( ) ,
247- idt : out[ 9 ] . into ( ) ,
248- cr0 : out[ 10 ] . Reg64 ,
249- cr2 : out[ 11 ] . Reg64 ,
250- cr3 : out[ 12 ] . Reg64 ,
251- cr4 : out[ 13 ] . Reg64 ,
252- cr8 : out[ 14 ] . Reg64 ,
253- efer : out[ 15 ] . Reg64 ,
254- apic_base : out[ 16 ] . Reg64 ,
255- interrupt_bitmap : Default :: default ( ) , // TODO: I'm not sure how to get this at the moment
256- }
257- } ;
258-
259- Ok ( result)
189+ WHP_SREGS_NAMES
190+ . into_iter ( )
191+ . zip ( whp_sregs_values)
192+ . collect :: < Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > > ( )
193+ . as_slice ( )
194+ . try_into ( )
195+ . map_err ( |e| {
196+ new_error ! (
197+ "Failed to convert WHP registers to CommonSpecialRegisters: {:?}" ,
198+ e
199+ )
200+ } )
260201 }
261202
262203 fn set_sregs ( & self , sregs : & CommonSpecialRegisters ) -> Result < ( ) > {
263- // self.processor.set_sregs(sregs).unwrap();
264- self . set_registers ( & [
265- ( WHvX64RegisterCr3 , WHV_REGISTER_VALUE { Reg64 : sregs. cr3 } ) ,
266- (
267- WHvX64RegisterCr4 ,
268- WHV_REGISTER_VALUE {
269- Reg64 : CR4_PAE | CR4_OSFXSR | CR4_OSXMMEXCPT ,
270- } ,
271- ) ,
272- (
273- WHvX64RegisterCr0 ,
274- WHV_REGISTER_VALUE {
275- Reg64 : CR0_PE | CR0_MP | CR0_ET | CR0_NE | CR0_AM | CR0_PG | CR0_WP ,
276- } ,
277- ) ,
278- (
279- WHvX64RegisterEfer ,
280- WHV_REGISTER_VALUE {
281- Reg64 : EFER_LME | EFER_LMA | EFER_SCE | EFER_NX ,
282- } ,
283- ) ,
284- (
285- WHvX64RegisterCs ,
286- WHV_REGISTER_VALUE {
287- Segment : WHV_X64_SEGMENT_REGISTER {
288- Anonymous : WHV_X64_SEGMENT_REGISTER_0 {
289- Attributes : 0b1011 | 1 << 4 | 1 << 7 | 1 << 13 , // Type (11: Execute/Read, accessed) | L (64-bit mode) | P (present) | S (code segment)
290- } ,
291- ..Default :: default ( ) // zero out the rest
292- } ,
293- } ,
294- ) ,
295- ] ) ?;
204+ let whp_regs: [ ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) ; WHP_SREGS_NAMES_LEN ] = sregs. into ( ) ;
205+ self . set_registers ( & whp_regs) ?;
296206 Ok ( ( ) )
297207 }
298208
299209 fn get_fpu ( & self ) -> Result < CommonFpu > {
300- todo ! ( )
210+ let mut whp_fpu_values: [ WHV_REGISTER_VALUE ; WHP_FPU_NAMES_LEN ] =
211+ unsafe { std:: mem:: zeroed ( ) } ;
212+
213+ unsafe {
214+ WHvGetVirtualProcessorRegisters (
215+ self . partition ,
216+ 0 ,
217+ WHP_FPU_NAMES . as_ptr ( ) ,
218+ whp_fpu_values. len ( ) as u32 ,
219+ whp_fpu_values. as_mut_ptr ( ) ,
220+ )
221+ . unwrap ( ) ;
222+ }
223+
224+ WHP_FPU_NAMES
225+ . into_iter ( )
226+ . zip ( whp_fpu_values)
227+ . collect :: < Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > > ( )
228+ . as_slice ( )
229+ . try_into ( )
230+ . map_err ( |e| new_error ! ( "Failed to convert WHP registers to CommonFpu: {:?}" , e) )
301231 }
302232
303233 fn set_fpu ( & self , fpu : & CommonFpu ) -> Result < ( ) > {
304- let whp_fpu: Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > = fpu. into ( ) ;
234+ let whp_fpu: [ ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) ; WHP_FPU_NAMES_LEN ] = fpu. into ( ) ;
305235 self . set_registers ( & whp_fpu) ?;
306236 Ok ( ( ) )
307237 }
0 commit comments