Skip to content

Commit de0acbf

Browse files
committed
Windows done
Signed-off-by: Ludvig Liljenberg <[email protected]>
1 parent de1cb48 commit de0acbf

File tree

7 files changed

+599
-167
lines changed

7 files changed

+599
-167
lines changed

src/hyperlight_host/src/hypervisor/hyperlight_vm.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,10 @@ impl HyperlightSandbox {
351351
sregs.cr4 = CR4_PAE | CR4_OSFXSR | CR4_OSXMMEXCPT;
352352
sregs.cr0 = CR0_PE | CR0_MP | CR0_ET | CR0_NE | CR0_AM | CR0_PG | CR0_WP;
353353
sregs.efer = EFER_LME | EFER_LMA | EFER_SCE | EFER_NX;
354-
sregs.cs.l = 1; // required for 64-bit mode
355-
sregs.cs.present = 1;
356-
sregs.cs.s = 1;
354+
sregs.cs.type_ = 11; // 0b1011: Execute/Read, Accessed
355+
sregs.cs.s = 1; // Code/data segment
356+
sregs.cs.present = 1; // Segment is present
357+
sregs.cs.l = 1; // 64-bit segment
357358
vm.set_sregs(&sregs)?;
358359

359360
#[cfg(gdb)]

src/hyperlight_host/src/hypervisor/hyperv_windows.rs

Lines changed: 68 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ use windows_result::HRESULT;
2525

2626
#[cfg(gdb)]
2727
use 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;
3334
use crate::hypervisor::regs::{CommonFpu, CommonRegisters, CommonSpecialRegisters};
3435
use crate::hypervisor::surrogate_process::SurrogateProcess;
3536
use 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

137138
impl 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
}

src/hyperlight_host/src/hypervisor/regs.rs

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)