@@ -26,8 +26,8 @@ use windows_result::HRESULT;
26
26
#[ cfg( gdb) ]
27
27
use super :: handlers:: DbgMemAccessHandlerWrapper ;
28
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 ,
29
+ AlignedRegisterValues , WHP_FPU_NAMES , WHP_FPU_NAMES_LEN , WHP_REGS_NAMES , WHP_REGS_NAMES_LEN ,
30
+ WHP_SREGS_NAMES , WHP_SREGS_NAMES_LEN ,
31
31
} ;
32
32
use super :: vm:: HyperlightExit ;
33
33
use super :: wrappers:: HandleWrapper ;
@@ -86,6 +86,16 @@ pub(crate) struct WhpVm {
86
86
unsafe impl Send for WhpVm { }
87
87
unsafe impl Sync for WhpVm { }
88
88
89
+ #[ repr( C , align( 16 ) ) ]
90
+ struct Align16 < T > ( T ) ;
91
+ #[ allow( clippy:: disallowed_macros) ] // compile time
92
+ const _: ( ) = {
93
+ assert ! (
94
+ std:: mem:: size_of:: <Align16 <WHV_REGISTER_VALUE >>( )
95
+ == std:: mem:: size_of:: <WHV_REGISTER_VALUE >( )
96
+ ) ;
97
+ } ;
98
+
89
99
impl WhpVm {
90
100
pub ( crate ) fn new ( mmap_file_handle : HandleWrapper ) -> Result < Self > {
91
101
const NUM_CPU : u32 = 1 ;
@@ -112,12 +122,14 @@ impl WhpVm {
112
122
/// Helper for setting arbitrary registers.
113
123
fn set_registers ( & self , registers : & [ ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) ] ) -> Result < ( ) > {
114
124
let register_count = registers. len ( ) ;
115
- let mut register_names: Vec < WHV_REGISTER_NAME > = vec ! [ ] ;
116
- let mut register_values: Vec < WHV_REGISTER_VALUE > = vec ! [ ] ;
125
+
126
+ // Prepare register names (no special alignment needed)
127
+ let mut register_names = Vec :: with_capacity ( register_count) ;
128
+ let mut register_values = Vec :: with_capacity ( register_count) ;
117
129
118
130
for ( key, value) in registers. iter ( ) {
119
131
register_names. push ( * key) ;
120
- register_values. push ( * value) ;
132
+ register_values. push ( Align16 ( * value) ) ;
121
133
}
122
134
123
135
unsafe {
@@ -126,7 +138,7 @@ impl WhpVm {
126
138
0 ,
127
139
register_names. as_ptr ( ) ,
128
140
register_count as u32 ,
129
- register_values. as_ptr ( ) ,
141
+ register_values. as_ptr ( ) as * const WHV_REGISTER_VALUE ,
130
142
) ?;
131
143
}
132
144
@@ -136,22 +148,22 @@ impl WhpVm {
136
148
137
149
impl Vm for WhpVm {
138
150
fn get_regs ( & self ) -> Result < CommonRegisters > {
139
- let mut whv_regs_values: [ WHV_REGISTER_VALUE ; WHP_REGS_NAMES_LEN ] =
140
- unsafe { std:: mem:: zeroed ( ) } ;
151
+ let mut whv_regs_values =
152
+ AlignedRegisterValues :: < WHP_REGS_NAMES_LEN > ( unsafe { std:: mem:: zeroed ( ) } ) ;
141
153
142
154
unsafe {
143
155
WHvGetVirtualProcessorRegisters (
144
156
self . partition ,
145
157
0 ,
146
158
WHP_REGS_NAMES . as_ptr ( ) ,
147
- WHP_REGS_NAMES_LEN as u32 ,
148
- whv_regs_values. as_mut_ptr ( ) ,
159
+ whv_regs_values . 0 . len ( ) as u32 ,
160
+ whv_regs_values. 0 . as_mut_ptr ( ) ,
149
161
) ?;
150
162
}
151
163
152
164
WHP_REGS_NAMES
153
165
. into_iter ( )
154
- . zip ( whv_regs_values)
166
+ . zip ( whv_regs_values. 0 )
155
167
. collect :: < Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > > ( )
156
168
. as_slice ( )
157
169
. try_into ( )
@@ -170,22 +182,22 @@ impl Vm for WhpVm {
170
182
}
171
183
172
184
fn get_sregs ( & self ) -> Result < CommonSpecialRegisters > {
173
- let mut whp_sregs_values: [ WHV_REGISTER_VALUE ; WHP_SREGS_NAMES_LEN ] =
174
- unsafe { std:: mem:: zeroed ( ) } ;
185
+ let mut whp_sregs_values =
186
+ AlignedRegisterValues :: < WHP_SREGS_NAMES_LEN > ( unsafe { std:: mem:: zeroed ( ) } ) ;
175
187
176
188
unsafe {
177
189
WHvGetVirtualProcessorRegisters (
178
190
self . partition ,
179
191
0 ,
180
192
WHP_SREGS_NAMES . as_ptr ( ) ,
181
- whp_sregs_values. len ( ) as u32 ,
182
- whp_sregs_values. as_mut_ptr ( ) ,
193
+ whp_sregs_values. 0 . len ( ) as u32 ,
194
+ whp_sregs_values. 0 . as_mut_ptr ( ) ,
183
195
) ?;
184
196
}
185
197
186
198
WHP_SREGS_NAMES
187
199
. into_iter ( )
188
- . zip ( whp_sregs_values)
200
+ . zip ( whp_sregs_values. 0 )
189
201
. collect :: < Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > > ( )
190
202
. as_slice ( )
191
203
. try_into ( )
@@ -204,22 +216,22 @@ impl Vm for WhpVm {
204
216
}
205
217
206
218
fn get_fpu ( & self ) -> Result < CommonFpu > {
207
- let mut whp_fpu_values: [ WHV_REGISTER_VALUE ; WHP_FPU_NAMES_LEN ] =
208
- unsafe { std:: mem:: zeroed ( ) } ;
219
+ let mut whp_fpu_values =
220
+ AlignedRegisterValues :: < WHP_FPU_NAMES_LEN > ( unsafe { std:: mem:: zeroed ( ) } ) ;
209
221
210
222
unsafe {
211
223
WHvGetVirtualProcessorRegisters (
212
224
self . partition ,
213
225
0 ,
214
226
WHP_FPU_NAMES . as_ptr ( ) ,
215
- whp_fpu_values. len ( ) as u32 ,
216
- whp_fpu_values. as_mut_ptr ( ) ,
227
+ whp_fpu_values. 0 . len ( ) as u32 ,
228
+ whp_fpu_values. 0 . as_mut_ptr ( ) ,
217
229
) ?;
218
230
}
219
231
220
232
WHP_FPU_NAMES
221
233
. into_iter ( )
222
- . zip ( whp_fpu_values)
234
+ . zip ( whp_fpu_values. 0 )
223
235
. collect :: < Vec < ( WHV_REGISTER_NAME , WHV_REGISTER_VALUE ) > > ( )
224
236
. as_slice ( )
225
237
. try_into ( )
0 commit comments