]>
Commit | Line | Data |
---|---|---|
dcafd1ef EH |
1 | #!/usr/bin/env python |
2 | # | |
3 | # Basic validation of x86 versioned CPU models and CPU model aliases | |
4 | # | |
5 | # Copyright (c) 2019 Red Hat Inc | |
6 | # | |
7 | # Author: | |
8 | # Eduardo Habkost <ehabkost@redhat.com> | |
9 | # | |
10 | # This library is free software; you can redistribute it and/or | |
11 | # modify it under the terms of the GNU Lesser General Public | |
12 | # License as published by the Free Software Foundation; either | |
13 | # version 2 of the License, or (at your option) any later version. | |
14 | # | |
15 | # This library is distributed in the hope that it will be useful, | |
16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
18 | # Lesser General Public License for more details. | |
19 | # | |
20 | # You should have received a copy of the GNU Lesser General Public | |
21 | # License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
22 | # | |
23 | ||
24 | ||
25 | import avocado_qemu | |
26 | import re | |
27 | ||
28 | class X86CPUModelAliases(avocado_qemu.Test): | |
29 | """ | |
30 | Validation of PC CPU model versions and CPU model aliases | |
31 | ||
32 | :avocado: tags=arch:x86_64 | |
33 | """ | |
34 | def validate_aliases(self, cpus): | |
35 | for c in cpus.values(): | |
36 | if 'alias-of' in c: | |
37 | # all aliases must point to a valid CPU model name: | |
38 | self.assertIn(c['alias-of'], cpus, | |
39 | '%s.alias-of (%s) is not a valid CPU model name' % (c['name'], c['alias-of'])) | |
40 | # aliases must not point to aliases | |
41 | self.assertNotIn('alias-of', cpus[c['alias-of']], | |
42 | '%s.alias-of (%s) points to another alias' % (c['name'], c['alias-of'])) | |
43 | ||
44 | # aliases must not be static | |
45 | self.assertFalse(c['static']) | |
46 | ||
47 | def validate_variant_aliases(self, cpus): | |
48 | # -noTSX, -IBRS and -IBPB variants of CPU models are special: | |
49 | # they shouldn't have their own versions: | |
50 | self.assertNotIn("Haswell-noTSX-v1", cpus, | |
51 | "Haswell-noTSX shouldn't be versioned") | |
52 | self.assertNotIn("Broadwell-noTSX-v1", cpus, | |
53 | "Broadwell-noTSX shouldn't be versioned") | |
54 | self.assertNotIn("Nehalem-IBRS-v1", cpus, | |
55 | "Nehalem-IBRS shouldn't be versioned") | |
56 | self.assertNotIn("Westmere-IBRS-v1", cpus, | |
57 | "Westmere-IBRS shouldn't be versioned") | |
58 | self.assertNotIn("SandyBridge-IBRS-v1", cpus, | |
59 | "SandyBridge-IBRS shouldn't be versioned") | |
60 | self.assertNotIn("IvyBridge-IBRS-v1", cpus, | |
61 | "IvyBridge-IBRS shouldn't be versioned") | |
62 | self.assertNotIn("Haswell-noTSX-IBRS-v1", cpus, | |
63 | "Haswell-noTSX-IBRS shouldn't be versioned") | |
64 | self.assertNotIn("Haswell-IBRS-v1", cpus, | |
65 | "Haswell-IBRS shouldn't be versioned") | |
66 | self.assertNotIn("Broadwell-noTSX-IBRS-v1", cpus, | |
67 | "Broadwell-noTSX-IBRS shouldn't be versioned") | |
68 | self.assertNotIn("Broadwell-IBRS-v1", cpus, | |
69 | "Broadwell-IBRS shouldn't be versioned") | |
70 | self.assertNotIn("Skylake-Client-IBRS-v1", cpus, | |
71 | "Skylake-Client-IBRS shouldn't be versioned") | |
72 | self.assertNotIn("Skylake-Server-IBRS-v1", cpus, | |
73 | "Skylake-Server-IBRS shouldn't be versioned") | |
74 | self.assertNotIn("EPYC-IBPB-v1", cpus, | |
75 | "EPYC-IBPB shouldn't be versioned") | |
76 | ||
77 | def test_4_0_alias_compatibility(self): | |
78 | """Check if pc-*-4.0 unversioned CPU model won't be reported as aliases""" | |
79 | # pc-*-4.0 won't expose non-versioned CPU models as aliases | |
80 | # We do this to help management software to keep compatibility | |
81 | # with older QEMU versions that didn't have the versioned CPU model | |
82 | self.vm.add_args('-S') | |
83 | self.vm.set_machine('pc-i440fx-4.0') | |
84 | self.vm.launch() | |
85 | cpus = dict((m['name'], m) for m in self.vm.command('query-cpu-definitions')) | |
86 | ||
87 | self.assertFalse(cpus['Cascadelake-Server']['static'], | |
88 | 'unversioned Cascadelake-Server CPU model must not be static') | |
89 | self.assertNotIn('alias-of', cpus['Cascadelake-Server'], | |
90 | 'Cascadelake-Server must not be an alias') | |
91 | self.assertNotIn('alias-of', cpus['Cascadelake-Server-v1'], | |
92 | 'Cascadelake-Server-v1 must not be an alias') | |
93 | ||
94 | self.assertFalse(cpus['qemu64']['static'], | |
95 | 'unversioned qemu64 CPU model must not be static') | |
96 | self.assertNotIn('alias-of', cpus['qemu64'], | |
97 | 'qemu64 must not be an alias') | |
98 | self.assertNotIn('alias-of', cpus['qemu64-v1'], | |
99 | 'qemu64-v1 must not be an alias') | |
100 | ||
101 | self.validate_variant_aliases(cpus) | |
102 | ||
103 | # On pc-*-4.0, no CPU model should be reported as an alias: | |
104 | for name,c in cpus.items(): | |
105 | self.assertNotIn('alias-of', c, "%s shouldn't be an alias" % (name)) | |
0788a56b EH |
106 | |
107 | def test_4_1_alias(self): | |
108 | """Check if unversioned CPU model is an alias pointing to right version""" | |
109 | self.vm.add_args('-S') | |
110 | self.vm.set_machine('pc-i440fx-4.1') | |
111 | self.vm.launch() | |
112 | ||
113 | cpus = dict((m['name'], m) for m in self.vm.command('query-cpu-definitions')) | |
114 | ||
115 | self.assertFalse(cpus['Cascadelake-Server']['static'], | |
116 | 'unversioned Cascadelake-Server CPU model must not be static') | |
117 | self.assertEquals(cpus['Cascadelake-Server'].get('alias-of'), 'Cascadelake-Server-v1', | |
118 | 'Cascadelake-Server must be an alias of Cascadelake-Server-v1') | |
119 | self.assertNotIn('alias-of', cpus['Cascadelake-Server-v1'], | |
120 | 'Cascadelake-Server-v1 must not be an alias') | |
121 | ||
122 | self.assertFalse(cpus['qemu64']['static'], | |
123 | 'unversioned qemu64 CPU model must not be static') | |
124 | self.assertEquals(cpus['qemu64'].get('alias-of'), 'qemu64-v1', | |
125 | 'qemu64 must be an alias of qemu64-v1') | |
126 | self.assertNotIn('alias-of', cpus['qemu64-v1'], | |
127 | 'qemu64-v1 must not be an alias') | |
128 | ||
129 | self.validate_variant_aliases(cpus) | |
130 | ||
131 | # On pc-*-4.1, -noTSX and -IBRS models should be aliases: | |
132 | self.assertEquals(cpus["Haswell"].get('alias-of'), | |
133 | "Haswell-v1", | |
134 | "Haswell must be an alias") | |
135 | self.assertEquals(cpus["Haswell-noTSX"].get('alias-of'), | |
136 | "Haswell-v2", | |
137 | "Haswell-noTSX must be an alias") | |
138 | self.assertEquals(cpus["Haswell-IBRS"].get('alias-of'), | |
139 | "Haswell-v3", | |
140 | "Haswell-IBRS must be an alias") | |
141 | self.assertEquals(cpus["Haswell-noTSX-IBRS"].get('alias-of'), | |
142 | "Haswell-v4", | |
143 | "Haswell-noTSX-IBRS must be an alias") | |
144 | ||
145 | self.assertEquals(cpus["Broadwell"].get('alias-of'), | |
146 | "Broadwell-v1", | |
147 | "Broadwell must be an alias") | |
148 | self.assertEquals(cpus["Broadwell-noTSX"].get('alias-of'), | |
149 | "Broadwell-v2", | |
150 | "Broadwell-noTSX must be an alias") | |
151 | self.assertEquals(cpus["Broadwell-IBRS"].get('alias-of'), | |
152 | "Broadwell-v3", | |
153 | "Broadwell-IBRS must be an alias") | |
154 | self.assertEquals(cpus["Broadwell-noTSX-IBRS"].get('alias-of'), | |
155 | "Broadwell-v4", | |
156 | "Broadwell-noTSX-IBRS must be an alias") | |
157 | ||
158 | self.assertEquals(cpus["Nehalem"].get('alias-of'), | |
159 | "Nehalem-v1", | |
160 | "Nehalem must be an alias") | |
161 | self.assertEquals(cpus["Nehalem-IBRS"].get('alias-of'), | |
162 | "Nehalem-v2", | |
163 | "Nehalem-IBRS must be an alias") | |
164 | ||
165 | self.assertEquals(cpus["Westmere"].get('alias-of'), | |
166 | "Westmere-v1", | |
167 | "Westmere must be an alias") | |
168 | self.assertEquals(cpus["Westmere-IBRS"].get('alias-of'), | |
169 | "Westmere-v2", | |
170 | "Westmere-IBRS must be an alias") | |
171 | ||
172 | self.assertEquals(cpus["SandyBridge"].get('alias-of'), | |
173 | "SandyBridge-v1", | |
174 | "SandyBridge must be an alias") | |
175 | self.assertEquals(cpus["SandyBridge-IBRS"].get('alias-of'), | |
176 | "SandyBridge-v2", | |
177 | "SandyBridge-IBRS must be an alias") | |
178 | ||
179 | self.assertEquals(cpus["IvyBridge"].get('alias-of'), | |
180 | "IvyBridge-v1", | |
181 | "IvyBridge must be an alias") | |
182 | self.assertEquals(cpus["IvyBridge-IBRS"].get('alias-of'), | |
183 | "IvyBridge-v2", | |
184 | "IvyBridge-IBRS must be an alias") | |
185 | ||
186 | self.assertEquals(cpus["Skylake-Client"].get('alias-of'), | |
187 | "Skylake-Client-v1", | |
188 | "Skylake-Client must be an alias") | |
189 | self.assertEquals(cpus["Skylake-Client-IBRS"].get('alias-of'), | |
190 | "Skylake-Client-v2", | |
191 | "Skylake-Client-IBRS must be an alias") | |
192 | ||
193 | self.assertEquals(cpus["Skylake-Server"].get('alias-of'), | |
194 | "Skylake-Server-v1", | |
195 | "Skylake-Server must be an alias") | |
196 | self.assertEquals(cpus["Skylake-Server-IBRS"].get('alias-of'), | |
197 | "Skylake-Server-v2", | |
198 | "Skylake-Server-IBRS must be an alias") | |
199 | ||
200 | self.assertEquals(cpus["EPYC"].get('alias-of'), | |
201 | "EPYC-v1", | |
202 | "EPYC must be an alias") | |
203 | self.assertEquals(cpus["EPYC-IBPB"].get('alias-of'), | |
204 | "EPYC-v2", | |
205 | "EPYC-IBPB must be an alias") | |
206 | ||
207 | self.validate_aliases(cpus) | |
208 | ||
209 | def test_none_alias(self): | |
210 | """Check if unversioned CPU model is an alias pointing to some version""" | |
211 | self.vm.add_args('-S') | |
212 | self.vm.set_machine('none') | |
213 | self.vm.launch() | |
214 | ||
215 | cpus = dict((m['name'], m) for m in self.vm.command('query-cpu-definitions')) | |
216 | ||
217 | self.assertFalse(cpus['Cascadelake-Server']['static'], | |
218 | 'unversioned Cascadelake-Server CPU model must not be static') | |
219 | self.assertTrue(re.match('Cascadelake-Server-v[0-9]+', cpus['Cascadelake-Server']['alias-of']), | |
220 | 'Cascadelake-Server must be an alias of versioned CPU model') | |
221 | self.assertNotIn('alias-of', cpus['Cascadelake-Server-v1'], | |
222 | 'Cascadelake-Server-v1 must not be an alias') | |
223 | ||
224 | self.assertFalse(cpus['qemu64']['static'], | |
225 | 'unversioned qemu64 CPU model must not be static') | |
226 | self.assertTrue(re.match('qemu64-v[0-9]+', cpus['qemu64']['alias-of']), | |
227 | 'qemu64 must be an alias of versioned CPU model') | |
228 | self.assertNotIn('alias-of', cpus['qemu64-v1'], | |
229 | 'qemu64-v1 must not be an alias') | |
230 | ||
231 | self.validate_aliases(cpus) |