xref: /qemu/tests/functional/test_mem_addr_space.py (revision 0034d0395e4e92c722a7044d291b2bab42f705bd)
1*0034d039SAni Sinha# Check for crash when using memory beyond the available guest processor
2*0034d039SAni Sinha# address space.
3*0034d039SAni Sinha#
4*0034d039SAni Sinha# Copyright (c) 2023 Red Hat, Inc.
5*0034d039SAni Sinha#
6*0034d039SAni Sinha# Author:
7*0034d039SAni Sinha#  Ani Sinha <anisinha@redhat.com>
8*0034d039SAni Sinha#
9*0034d039SAni Sinha# SPDX-License-Identifier: GPL-2.0-or-later
10*0034d039SAni Sinha
11*0034d039SAni Sinhafrom avocado_qemu import QemuSystemTest
12*0034d039SAni Sinhaimport signal
13*0034d039SAni Sinhaimport time
14*0034d039SAni Sinha
15*0034d039SAni Sinhaclass MemAddrCheck(QemuSystemTest):
16*0034d039SAni Sinha    # after launch, in order to generate the logs from QEMU we need to
17*0034d039SAni Sinha    # wait for some time. Launching and then immediately shutting down
18*0034d039SAni Sinha    # the VM generates empty logs. A delay of 1 second is added for
19*0034d039SAni Sinha    # this reason.
20*0034d039SAni Sinha    DELAY_Q35_BOOT_SEQUENCE = 1
21*0034d039SAni Sinha
22*0034d039SAni Sinha    # first, lets test some 32-bit processors.
23*0034d039SAni Sinha    # for all 32-bit cases, pci64_hole_size is 0.
24*0034d039SAni Sinha    def test_phybits_low_pse36(self):
25*0034d039SAni Sinha        """
26*0034d039SAni Sinha        :avocado: tags=machine:q35
27*0034d039SAni Sinha        :avocado: tags=arch:x86_64
28*0034d039SAni Sinha
29*0034d039SAni Sinha        With pse36 feature ON, a processor has 36 bits of addressing. So it can
30*0034d039SAni Sinha        access up to a maximum of 64GiB of memory. Memory hotplug region begins
31*0034d039SAni Sinha        at 4 GiB boundary when "above_4g_mem_size" is 0 (this would be true when
32*0034d039SAni Sinha        we have 0.5 GiB of VM memory, see pc_q35_init()). This means total
33*0034d039SAni Sinha        hotpluggable memory size is 60 GiB. Per slot, we reserve 1 GiB of memory
34*0034d039SAni Sinha        for dimm alignment for all newer machines (see enforce_aligned_dimm
35*0034d039SAni Sinha        property for pc machines and pc_get_device_memory_range()). That leaves
36*0034d039SAni Sinha        total hotpluggable actual memory size of 59 GiB. If the VM is started
37*0034d039SAni Sinha        with 0.5 GiB of memory, maxmem should be set to a maximum value of
38*0034d039SAni Sinha        59.5 GiB to ensure that the processor can address all memory directly.
39*0034d039SAni Sinha        Note that 64-bit pci hole size is 0 in this case. If maxmem is set to
40*0034d039SAni Sinha        59.6G, QEMU should fail to start with a message "phy-bits are too low".
41*0034d039SAni Sinha        If maxmem is set to 59.5G with all other QEMU parameters identical, QEMU
42*0034d039SAni Sinha        should start fine.
43*0034d039SAni Sinha        """
44*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'q35', '-m',
45*0034d039SAni Sinha                         '512,slots=1,maxmem=59.6G',
46*0034d039SAni Sinha                         '-cpu', 'pentium,pse36=on', '-display', 'none',
47*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
48*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
49*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
50*0034d039SAni Sinha        self.vm.launch()
51*0034d039SAni Sinha        self.vm.wait()
52*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
53*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
54*0034d039SAni Sinha
55*0034d039SAni Sinha    def test_phybits_low_pae(self):
56*0034d039SAni Sinha        """
57*0034d039SAni Sinha        :avocado: tags=machine:q35
58*0034d039SAni Sinha        :avocado: tags=arch:x86_64
59*0034d039SAni Sinha
60*0034d039SAni Sinha        With pae feature ON, a processor has 36 bits of addressing. So it can
61*0034d039SAni Sinha        access up to a maximum of 64GiB of memory. Rest is the same as the case
62*0034d039SAni Sinha        with pse36 above.
63*0034d039SAni Sinha        """
64*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'q35', '-m',
65*0034d039SAni Sinha                         '512,slots=1,maxmem=59.6G',
66*0034d039SAni Sinha                         '-cpu', 'pentium,pae=on', '-display', 'none',
67*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
68*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
69*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
70*0034d039SAni Sinha        self.vm.launch()
71*0034d039SAni Sinha        self.vm.wait()
72*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
73*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
74*0034d039SAni Sinha
75*0034d039SAni Sinha    def test_phybits_ok_pentium_pse36(self):
76*0034d039SAni Sinha        """
77*0034d039SAni Sinha        :avocado: tags=machine:q35
78*0034d039SAni Sinha        :avocado: tags=arch:x86_64
79*0034d039SAni Sinha
80*0034d039SAni Sinha        Setting maxmem to 59.5G and making sure that QEMU can start with the
81*0034d039SAni Sinha        same options as the failing case above with pse36 cpu feature.
82*0034d039SAni Sinha        """
83*0034d039SAni Sinha        self.vm.add_args('-machine', 'q35', '-m',
84*0034d039SAni Sinha                         '512,slots=1,maxmem=59.5G',
85*0034d039SAni Sinha                         '-cpu', 'pentium,pse36=on', '-display', 'none',
86*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
87*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
88*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
89*0034d039SAni Sinha        self.vm.launch()
90*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
91*0034d039SAni Sinha        self.vm.shutdown()
92*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
93*0034d039SAni Sinha
94*0034d039SAni Sinha    def test_phybits_ok_pentium_pae(self):
95*0034d039SAni Sinha        """
96*0034d039SAni Sinha        :avocado: tags=machine:q35
97*0034d039SAni Sinha        :avocado: tags=arch:x86_64
98*0034d039SAni Sinha
99*0034d039SAni Sinha        Test is same as above but now with pae cpu feature turned on.
100*0034d039SAni Sinha        Setting maxmem to 59.5G and making sure that QEMU can start fine
101*0034d039SAni Sinha        with the same options as the case above.
102*0034d039SAni Sinha        """
103*0034d039SAni Sinha        self.vm.add_args('-machine', 'q35', '-m',
104*0034d039SAni Sinha                         '512,slots=1,maxmem=59.5G',
105*0034d039SAni Sinha                         '-cpu', 'pentium,pae=on', '-display', 'none',
106*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
107*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
108*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
109*0034d039SAni Sinha        self.vm.launch()
110*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
111*0034d039SAni Sinha        self.vm.shutdown()
112*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
113*0034d039SAni Sinha
114*0034d039SAni Sinha    def test_phybits_ok_pentium2(self):
115*0034d039SAni Sinha        """
116*0034d039SAni Sinha        :avocado: tags=machine:q35
117*0034d039SAni Sinha        :avocado: tags=arch:x86_64
118*0034d039SAni Sinha
119*0034d039SAni Sinha        Pentium2 has 36 bits of addressing, so its same as pentium
120*0034d039SAni Sinha        with pse36 ON.
121*0034d039SAni Sinha        """
122*0034d039SAni Sinha        self.vm.add_args('-machine', 'q35', '-m',
123*0034d039SAni Sinha                         '512,slots=1,maxmem=59.5G',
124*0034d039SAni Sinha                         '-cpu', 'pentium2', '-display', 'none',
125*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
126*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
127*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
128*0034d039SAni Sinha        self.vm.launch()
129*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
130*0034d039SAni Sinha        self.vm.shutdown()
131*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
132*0034d039SAni Sinha
133*0034d039SAni Sinha    def test_phybits_low_nonpse36(self):
134*0034d039SAni Sinha        """
135*0034d039SAni Sinha        :avocado: tags=machine:q35
136*0034d039SAni Sinha        :avocado: tags=arch:x86_64
137*0034d039SAni Sinha
138*0034d039SAni Sinha        Pentium processor has 32 bits of addressing without pse36 or pae
139*0034d039SAni Sinha        so it can access physical address up to 4 GiB. Setting maxmem to
140*0034d039SAni Sinha        4 GiB should make QEMU fail to start with "phys-bits too low"
141*0034d039SAni Sinha        message because the region for memory hotplug is always placed
142*0034d039SAni Sinha        above 4 GiB due to the PCI hole and simplicity.
143*0034d039SAni Sinha        """
144*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'q35', '-m',
145*0034d039SAni Sinha                         '512,slots=1,maxmem=4G',
146*0034d039SAni Sinha                         '-cpu', 'pentium', '-display', 'none',
147*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
148*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
149*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
150*0034d039SAni Sinha        self.vm.launch()
151*0034d039SAni Sinha        self.vm.wait()
152*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
153*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
154*0034d039SAni Sinha
155*0034d039SAni Sinha    # now lets test some 64-bit CPU cases.
156*0034d039SAni Sinha    def test_phybits_low_tcg_q35_70_amd(self):
157*0034d039SAni Sinha        """
158*0034d039SAni Sinha        :avocado: tags=machine:q35
159*0034d039SAni Sinha        :avocado: tags=arch:x86_64
160*0034d039SAni Sinha
161*0034d039SAni Sinha        For q35 7.1 machines and above, there is a HT window that starts at
162*0034d039SAni Sinha        1024 GiB and ends at 1 TiB - 1. If the max GPA falls in this range,
163*0034d039SAni Sinha        "above_4G" memory is adjusted to start at 1 TiB boundary for AMD cpus
164*0034d039SAni Sinha        in the default case. Lets test without that case for machines 7.0.
165*0034d039SAni Sinha        For q35-7.0 machines, "above 4G" memory starts are 4G.
166*0034d039SAni Sinha        pci64_hole size is 32 GiB. Since TCG_PHYS_ADDR_BITS is defined to
167*0034d039SAni Sinha        be 40, TCG emulated CPUs have maximum of 1 TiB (1024 GiB) of
168*0034d039SAni Sinha        directly addressible memory.
169*0034d039SAni Sinha        Hence, maxmem value at most can be
170*0034d039SAni Sinha        1024 GiB - 4 GiB - 1 GiB per slot for alignment - 32 GiB + 0.5 GiB
171*0034d039SAni Sinha        which is equal to 987.5 GiB. Setting the value to 988 GiB should
172*0034d039SAni Sinha        make QEMU fail with the error message.
173*0034d039SAni Sinha        """
174*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'pc-q35-7.0', '-m',
175*0034d039SAni Sinha                         '512,slots=1,maxmem=988G',
176*0034d039SAni Sinha                         '-display', 'none',
177*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
178*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
179*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
180*0034d039SAni Sinha        self.vm.launch()
181*0034d039SAni Sinha        self.vm.wait()
182*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
183*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
184*0034d039SAni Sinha
185*0034d039SAni Sinha    def test_phybits_low_tcg_q35_71_amd(self):
186*0034d039SAni Sinha        """
187*0034d039SAni Sinha        :avocado: tags=machine:q35
188*0034d039SAni Sinha        :avocado: tags=arch:x86_64
189*0034d039SAni Sinha
190*0034d039SAni Sinha        AMD_HT_START is defined to be at 1012 GiB. So for q35 machines
191*0034d039SAni Sinha        version > 7.0 and AMD cpus, instead of 1024 GiB limit for 40 bit
192*0034d039SAni Sinha        processor address space, it has to be 1012 GiB , that is 12 GiB
193*0034d039SAni Sinha        less than the case above in order to accomodate HT hole.
194*0034d039SAni Sinha        Make sure QEMU fails when maxmem size is 976 GiB (12 GiB less
195*0034d039SAni Sinha        than 988 GiB).
196*0034d039SAni Sinha        """
197*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'pc-q35-7.1', '-m',
198*0034d039SAni Sinha                         '512,slots=1,maxmem=976G',
199*0034d039SAni Sinha                         '-display', 'none',
200*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
201*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
202*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
203*0034d039SAni Sinha        self.vm.launch()
204*0034d039SAni Sinha        self.vm.wait()
205*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
206*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
207*0034d039SAni Sinha
208*0034d039SAni Sinha    def test_phybits_ok_tcg_q35_70_amd(self):
209*0034d039SAni Sinha        """
210*0034d039SAni Sinha        :avocado: tags=machine:q35
211*0034d039SAni Sinha        :avocado: tags=arch:x86_64
212*0034d039SAni Sinha
213*0034d039SAni Sinha        Same as q35-7.0 AMD case except that here we check that QEMU can
214*0034d039SAni Sinha        successfully start when maxmem is < 988G.
215*0034d039SAni Sinha        """
216*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'pc-q35-7.0', '-m',
217*0034d039SAni Sinha                         '512,slots=1,maxmem=987.5G',
218*0034d039SAni Sinha                         '-display', 'none',
219*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
220*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
221*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
222*0034d039SAni Sinha        self.vm.launch()
223*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
224*0034d039SAni Sinha        self.vm.shutdown()
225*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
226*0034d039SAni Sinha
227*0034d039SAni Sinha    def test_phybits_ok_tcg_q35_71_amd(self):
228*0034d039SAni Sinha        """
229*0034d039SAni Sinha        :avocado: tags=machine:q35
230*0034d039SAni Sinha        :avocado: tags=arch:x86_64
231*0034d039SAni Sinha
232*0034d039SAni Sinha        Same as q35-7.1 AMD case except that here we check that QEMU can
233*0034d039SAni Sinha        successfully start when maxmem is < 976G.
234*0034d039SAni Sinha        """
235*0034d039SAni Sinha        self.vm.add_args('-S', '-machine', 'pc-q35-7.1', '-m',
236*0034d039SAni Sinha                         '512,slots=1,maxmem=975.5G',
237*0034d039SAni Sinha                         '-display', 'none',
238*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
239*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
240*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
241*0034d039SAni Sinha        self.vm.launch()
242*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
243*0034d039SAni Sinha        self.vm.shutdown()
244*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
245*0034d039SAni Sinha
246*0034d039SAni Sinha    def test_phybits_ok_tcg_q35_71_intel(self):
247*0034d039SAni Sinha        """
248*0034d039SAni Sinha        :avocado: tags=machine:q35
249*0034d039SAni Sinha        :avocado: tags=arch:x86_64
250*0034d039SAni Sinha
251*0034d039SAni Sinha        Same parameters as test_phybits_low_tcg_q35_71_amd() but use
252*0034d039SAni Sinha        Intel cpu instead. QEMU should start fine in this case as
253*0034d039SAni Sinha        "above_4G" memory starts at 4G.
254*0034d039SAni Sinha        """
255*0034d039SAni Sinha        self.vm.add_args('-S', '-cpu', 'Skylake-Server',
256*0034d039SAni Sinha                         '-machine', 'pc-q35-7.1', '-m',
257*0034d039SAni Sinha                         '512,slots=1,maxmem=976G',
258*0034d039SAni Sinha                         '-display', 'none',
259*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
260*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
261*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
262*0034d039SAni Sinha        self.vm.launch()
263*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
264*0034d039SAni Sinha        self.vm.shutdown()
265*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
266*0034d039SAni Sinha
267*0034d039SAni Sinha    def test_phybits_low_tcg_q35_71_amd_41bits(self):
268*0034d039SAni Sinha        """
269*0034d039SAni Sinha        :avocado: tags=machine:q35
270*0034d039SAni Sinha        :avocado: tags=arch:x86_64
271*0034d039SAni Sinha
272*0034d039SAni Sinha        AMD processor with 41 bits. Max cpu hw address = 2 TiB.
273*0034d039SAni Sinha        By setting maxram above 1012 GiB  - 32 GiB - 4 GiB = 976 GiB, we can
274*0034d039SAni Sinha        force "above_4G" memory to start at 1 TiB for q35-7.1 machines
275*0034d039SAni Sinha        (max GPA will be above AMD_HT_START which is defined as 1012 GiB).
276*0034d039SAni Sinha
277*0034d039SAni Sinha        With pci_64_hole size at 32 GiB, in this case, maxmem should be 991.5
278*0034d039SAni Sinha        GiB with 1 GiB per slot for alignment and 0.5 GiB as non-hotplug
279*0034d039SAni Sinha        memory for the VM (1024 - 32 - 1 + 0.5). With 992 GiB, QEMU should
280*0034d039SAni Sinha        fail to start.
281*0034d039SAni Sinha        """
282*0034d039SAni Sinha        self.vm.add_args('-S', '-cpu', 'EPYC-v4,phys-bits=41',
283*0034d039SAni Sinha                         '-machine', 'pc-q35-7.1', '-m',
284*0034d039SAni Sinha                         '512,slots=1,maxmem=992G',
285*0034d039SAni Sinha                         '-display', 'none',
286*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
287*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
288*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
289*0034d039SAni Sinha        self.vm.launch()
290*0034d039SAni Sinha        self.vm.wait()
291*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
292*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
293*0034d039SAni Sinha
294*0034d039SAni Sinha    def test_phybits_ok_tcg_q35_71_amd_41bits(self):
295*0034d039SAni Sinha        """
296*0034d039SAni Sinha        :avocado: tags=machine:q35
297*0034d039SAni Sinha        :avocado: tags=arch:x86_64
298*0034d039SAni Sinha
299*0034d039SAni Sinha        AMD processor with 41 bits. Max cpu hw address = 2 TiB.
300*0034d039SAni Sinha        Same as above but by setting maxram beween 976 GiB and 992 Gib,
301*0034d039SAni Sinha        QEMU should start fine.
302*0034d039SAni Sinha        """
303*0034d039SAni Sinha        self.vm.add_args('-S', '-cpu', 'EPYC-v4,phys-bits=41',
304*0034d039SAni Sinha                         '-machine', 'pc-q35-7.1', '-m',
305*0034d039SAni Sinha                         '512,slots=1,maxmem=990G',
306*0034d039SAni Sinha                         '-display', 'none',
307*0034d039SAni Sinha                         '-object', 'memory-backend-ram,id=mem1,size=1G',
308*0034d039SAni Sinha                         '-device', 'pc-dimm,id=vm0,memdev=mem1')
309*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
310*0034d039SAni Sinha        self.vm.launch()
311*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
312*0034d039SAni Sinha        self.vm.shutdown()
313*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
314*0034d039SAni Sinha
315*0034d039SAni Sinha    def test_phybits_low_tcg_q35_intel_cxl(self):
316*0034d039SAni Sinha        """
317*0034d039SAni Sinha        :avocado: tags=machine:q35
318*0034d039SAni Sinha        :avocado: tags=arch:x86_64
319*0034d039SAni Sinha
320*0034d039SAni Sinha        cxl memory window starts after memory device range. Here, we use 1 GiB
321*0034d039SAni Sinha        of cxl window memory. 4G_mem end aligns at 4G. pci64_hole is 32 GiB and
322*0034d039SAni Sinha        starts after the cxl memory window.
323*0034d039SAni Sinha        So maxmem here should be at most 986 GiB considering all memory boundary
324*0034d039SAni Sinha        alignment constraints with 40 bits (1 TiB) of processor physical bits.
325*0034d039SAni Sinha        """
326*0034d039SAni Sinha        self.vm.add_args('-S', '-cpu', 'Skylake-Server,phys-bits=40',
327*0034d039SAni Sinha                         '-machine', 'q35,cxl=on', '-m',
328*0034d039SAni Sinha                         '512,slots=1,maxmem=987G',
329*0034d039SAni Sinha                         '-display', 'none',
330*0034d039SAni Sinha                         '-device', 'pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1',
331*0034d039SAni Sinha                         '-M', 'cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=1G')
332*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
333*0034d039SAni Sinha        self.vm.launch()
334*0034d039SAni Sinha        self.vm.wait()
335*0034d039SAni Sinha        self.assertEquals(self.vm.exitcode(), 1, "QEMU exit code should be 1")
336*0034d039SAni Sinha        self.assertRegex(self.vm.get_log(), r'phys-bits too low')
337*0034d039SAni Sinha
338*0034d039SAni Sinha    def test_phybits_ok_tcg_q35_intel_cxl(self):
339*0034d039SAni Sinha        """
340*0034d039SAni Sinha        :avocado: tags=machine:q35
341*0034d039SAni Sinha        :avocado: tags=arch:x86_64
342*0034d039SAni Sinha
343*0034d039SAni Sinha        Same as above but here we do not reserve any cxl memory window. Hence,
344*0034d039SAni Sinha        with the exact same parameters as above, QEMU should start fine even
345*0034d039SAni Sinha        with cxl enabled.
346*0034d039SAni Sinha        """
347*0034d039SAni Sinha        self.vm.add_args('-S', '-cpu', 'Skylake-Server,phys-bits=40',
348*0034d039SAni Sinha                         '-machine', 'q35,cxl=on', '-m',
349*0034d039SAni Sinha                         '512,slots=1,maxmem=987G',
350*0034d039SAni Sinha                         '-display', 'none',
351*0034d039SAni Sinha                         '-device', 'pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1')
352*0034d039SAni Sinha        self.vm.set_qmp_monitor(enabled=False)
353*0034d039SAni Sinha        self.vm.launch()
354*0034d039SAni Sinha        time.sleep(self.DELAY_Q35_BOOT_SEQUENCE)
355*0034d039SAni Sinha        self.vm.shutdown()
356*0034d039SAni Sinha        self.assertNotRegex(self.vm.get_log(), r'phys-bits too low')
357