4
4
use vmm:: arch:: aarch64:: regs:: RegSize ;
5
5
use vmm:: cpu_config:: aarch64:: custom_cpu_template:: RegisterModifier ;
6
6
use vmm:: cpu_config:: templates:: { CpuConfiguration , CustomCpuTemplate , RegisterValueFilter } ;
7
+ use vmm:: logger:: warn;
7
8
8
9
use crate :: utils:: aarch64:: reg_modifier;
9
10
10
11
pub fn config_to_template ( cpu_config : & CpuConfiguration ) -> CustomCpuTemplate {
11
12
let mut reg_modifiers: Vec < RegisterModifier > = cpu_config
12
13
. regs
13
14
. iter ( )
14
- . map ( |reg| match reg. size ( ) {
15
- RegSize :: U32 => {
16
- reg_modifier ! ( reg. id, u128 :: from( reg. value:: <u32 , 4 >( ) ) )
15
+ . filter_map ( |reg| match reg. size ( ) {
16
+ RegSize :: U32 => Some ( reg_modifier ! ( reg. id, u128 :: from( reg. value:: <u32 , 4 >( ) ) ) ) ,
17
+ RegSize :: U64 => Some ( reg_modifier ! ( reg. id, u128 :: from( reg. value:: <u64 , 8 >( ) ) ) ) ,
18
+ RegSize :: U128 => Some ( reg_modifier ! ( reg. id, reg. value:: <u128 , 16 >( ) ) ) ,
19
+ _ => {
20
+ warn ! (
21
+ "Only 32, 64 and 128 bit wide registers are supported in cpu templates. \
22
+ Skipping: {:#x}",
23
+ reg. id
24
+ ) ;
25
+ None
17
26
}
18
- RegSize :: U64 => {
19
- reg_modifier ! ( reg. id, u128 :: from( reg. value:: <u64 , 8 >( ) ) )
20
- }
21
- RegSize :: U128 => {
22
- reg_modifier ! ( reg. id, reg. value:: <u128 , 16 >( ) )
23
- }
24
- _ => unreachable ! ( "Only 32, 64 and 128 bit wide registers are supported" ) ,
25
27
} )
26
28
. collect ( ) ;
27
29
reg_modifiers. sort_by_key ( |modifier| modifier. addr ) ;
@@ -43,6 +45,10 @@ mod tests {
43
45
const KVM_REG_SIZE_U32 : u64 = 0x0020000000000000 ;
44
46
const KVM_REG_SIZE_U64 : u64 = 0x0030000000000000 ;
45
47
const KVM_REG_SIZE_U128 : u64 = 0x0040000000000000 ;
48
+ const KVM_REG_SIZE_U256 : u64 = 0x0050000000000000 ;
49
+ const KVM_REG_SIZE_U512 : u64 = 0x0060000000000000 ;
50
+ const KVM_REG_SIZE_U1024 : u64 = 0x0070000000000000 ;
51
+ const KVM_REG_SIZE_U2048 : u64 = 0x0080000000000000 ;
46
52
47
53
fn build_sample_regs ( ) -> Aarch64RegisterVec {
48
54
let mut v = Aarch64RegisterVec :: default ( ) ;
@@ -58,6 +64,10 @@ mod tests {
58
64
KVM_REG_SIZE_U64 ,
59
65
& 0x0000_ffff_0000_ffff_u64 . to_le_bytes ( ) ,
60
66
) ) ;
67
+ v. push ( Aarch64RegisterRef :: new ( KVM_REG_SIZE_U256 , & [ 0x69 ; 32 ] ) ) ;
68
+ v. push ( Aarch64RegisterRef :: new ( KVM_REG_SIZE_U512 , & [ 0x69 ; 64 ] ) ) ;
69
+ v. push ( Aarch64RegisterRef :: new ( KVM_REG_SIZE_U1024 , & [ 0x69 ; 128 ] ) ) ;
70
+ v. push ( Aarch64RegisterRef :: new ( KVM_REG_SIZE_U2048 , & [ 0x69 ; 256 ] ) ) ;
61
71
v
62
72
}
63
73
0 commit comments