vmm/cpu_config/x86_64/
test_utils.rs

1// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use super::custom_cpu_template::{
5    CpuidLeafModifier, CpuidRegister, CpuidRegisterModifier, RegisterModifier,
6};
7use crate::cpu_config::templates::{CustomCpuTemplate, RegisterValueFilter};
8use crate::cpu_config::x86_64::cpuid::KvmCpuidFlags;
9
10/// Test CPU template in JSON format
11pub const TEST_TEMPLATE_JSON: &str = r#"{
12    "cpuid_modifiers": [
13        {
14            "leaf": "0x80000001",
15            "subleaf": "0x0007",
16            "flags": 0,
17            "modifiers": [
18                {
19                    "register": "eax",
20                    "bitmap": "0bx00100xxx1xxxxxxxxxxxxxxxxxxxxx1"
21                }
22            ]
23        },
24        {
25            "leaf": "0x80000002",
26            "subleaf": "0x0004",
27            "flags": 0,
28            "modifiers": [
29                {
30                    "register": "ebx",
31                    "bitmap": "0bxxx1xxxxxxxxxxxxxxxxxxxxx1"
32                },
33                {
34                    "register": "ecx",
35                    "bitmap": "0bx00100xxx1xxxxxxxxxxx0xxxxx0xxx1"
36                }
37            ]
38        },
39        {
40            "leaf": "0x80000003",
41            "subleaf": "0x0004",
42            "flags": 0,
43            "modifiers": [
44                {
45                    "register": "edx",
46                    "bitmap": "0bx00100xxx1xxxxxxxxxxx0xxxxx0xxx1"
47                }
48            ]
49        },
50        {
51            "leaf": "0x80000004",
52            "subleaf": "0x0004",
53            "flags": 0,
54            "modifiers": [
55                {
56                    "register": "edx",
57                    "bitmap": "0b00100xxx1xxxxxx1xxxxxxxxxxxxxx1"
58                },
59                {
60                    "register": "ecx",
61                    "bitmap": "0bx00100xxx1xxxxxxxxxxxxx111xxxxx1"
62                }
63            ]
64        },
65        {
66            "leaf": "0x80000005",
67            "subleaf": "0x0004",
68            "flags": 0,
69            "modifiers": [
70                {
71                    "register": "eax",
72                    "bitmap": "0bx00100xxx1xxxxx00xxxxxx000xxxxx1"
73                },
74                {
75                    "register": "edx",
76                    "bitmap": "0bx10100xxx1xxxxxxxxxxxxx000xxxxx1"
77                }
78            ]
79        }
80    ],
81    "msr_modifiers":  [
82        {
83            "addr": "0x0",
84            "bitmap": "0bx00100xxx1xxxx00xxx1xxxxxxxxxxx1"
85        },
86        {
87            "addr": "0x1",
88            "bitmap": "0bx00111xxx1xxxx111xxxxx101xxxxxx1"
89        },
90        {
91            "addr": "0b11",
92            "bitmap": "0bx00100xxx1xxxxxx0000000xxxxxxxx1"
93        },
94        {
95            "addr": "0xbbca",
96            "bitmap": "0bx00100xxx1xxxxxxxxx1"
97        }
98    ]
99}"#;
100
101/// Test CPU template in JSON format but has an invalid field for the architecture.
102/// "reg_modifiers" is the field name for the registers for aarch64"
103pub const TEST_INVALID_TEMPLATE_JSON: &str = r#"{
104    "reg_modifiers":  [
105        {
106            "addr": "0x0AAC",
107            "bitmap": "0b1xx1"
108        }
109    ]
110}"#;
111
112/// Builds a sample custom CPU template
113pub fn build_test_template() -> CustomCpuTemplate {
114    CustomCpuTemplate {
115        cpuid_modifiers: vec![CpuidLeafModifier {
116            leaf: 0x3,
117            subleaf: 0x0,
118            flags: KvmCpuidFlags(kvm_bindings::KVM_CPUID_FLAG_STATEFUL_FUNC),
119            modifiers: vec![
120                CpuidRegisterModifier {
121                    register: CpuidRegister::Eax,
122                    bitmap: RegisterValueFilter {
123                        filter: 0b0111,
124                        value: 0b0101,
125                    },
126                },
127                CpuidRegisterModifier {
128                    register: CpuidRegister::Ebx,
129                    bitmap: RegisterValueFilter {
130                        filter: 0b0111,
131                        value: 0b0100,
132                    },
133                },
134                CpuidRegisterModifier {
135                    register: CpuidRegister::Ecx,
136                    bitmap: RegisterValueFilter {
137                        filter: 0b0111,
138                        value: 0b0111,
139                    },
140                },
141                CpuidRegisterModifier {
142                    register: CpuidRegister::Edx,
143                    bitmap: RegisterValueFilter {
144                        filter: 0b0111,
145                        value: 0b0001,
146                    },
147                },
148            ],
149        }],
150        msr_modifiers: vec![
151            RegisterModifier {
152                addr: 0x9999,
153                bitmap: RegisterValueFilter {
154                    filter: 0,
155                    value: 0,
156                },
157            },
158            RegisterModifier {
159                addr: 0x8000,
160                bitmap: RegisterValueFilter {
161                    filter: 0,
162                    value: 0,
163                },
164            },
165        ],
166        ..Default::default()
167    }
168}