xref: /openbmc/qemu/tests/unit/test-smp-parse.c (revision 046a64b9801343e2e89eef10c7a48eec8d8c0d4f)
19e8e393bSYanan Wang /*
29e8e393bSYanan Wang  * SMP parsing unit-tests
39e8e393bSYanan Wang  *
49e8e393bSYanan Wang  * Copyright (c) 2021 Huawei Technologies Co., Ltd
59e8e393bSYanan Wang  *
69e8e393bSYanan Wang  * Authors:
79e8e393bSYanan Wang  *  Yanan Wang <wangyanan55@huawei.com>
89e8e393bSYanan Wang  *
99e8e393bSYanan Wang  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
109e8e393bSYanan Wang  * See the COPYING.LIB file in the top-level directory.
119e8e393bSYanan Wang  */
129e8e393bSYanan Wang 
139e8e393bSYanan Wang #include "qemu/osdep.h"
149e8e393bSYanan Wang #include "qom/object.h"
159e8e393bSYanan Wang #include "qemu/module.h"
169e8e393bSYanan Wang #include "qapi/error.h"
179e8e393bSYanan Wang 
189e8e393bSYanan Wang #include "hw/boards.h"
199e8e393bSYanan Wang 
209e8e393bSYanan Wang #define T true
219e8e393bSYanan Wang #define F false
229e8e393bSYanan Wang 
239e8e393bSYanan Wang #define MIN_CPUS 1    /* set the min CPUs supported by the machine as 1 */
24f4e65d64SZhao Liu #define MAX_CPUS 4096 /* set the max CPUs supported by the machine as 4096 */
259e8e393bSYanan Wang 
267b6d1bc9SPhilippe Mathieu-Daudé #define SMP_MACHINE_NAME "TEST-SMP"
277b6d1bc9SPhilippe Mathieu-Daudé 
289e8e393bSYanan Wang /*
299e8e393bSYanan Wang  * Used to define the generic 3-level CPU topology hierarchy
309e8e393bSYanan Wang  *  -sockets/cores/threads
319e8e393bSYanan Wang  */
329e8e393bSYanan Wang #define SMP_CONFIG_GENERIC(ha, a, hb, b, hc, c, hd, d, he, e) \
339e8e393bSYanan Wang         {                                                     \
349e8e393bSYanan Wang             .has_cpus    = ha, .cpus    = a,                  \
359e8e393bSYanan Wang             .has_sockets = hb, .sockets = b,                  \
369e8e393bSYanan Wang             .has_cores   = hc, .cores   = c,                  \
379e8e393bSYanan Wang             .has_threads = hd, .threads = d,                  \
389e8e393bSYanan Wang             .has_maxcpus = he, .maxcpus = e,                  \
399e8e393bSYanan Wang         }
409e8e393bSYanan Wang 
419e8e393bSYanan Wang #define CPU_TOPOLOGY_GENERIC(a, b, c, d, e)                   \
429e8e393bSYanan Wang         {                                                     \
439e8e393bSYanan Wang             .cpus     = a,                                    \
449e8e393bSYanan Wang             .sockets  = b,                                    \
459e8e393bSYanan Wang             .cores    = c,                                    \
469e8e393bSYanan Wang             .threads  = d,                                    \
479e8e393bSYanan Wang             .max_cpus = e,                                    \
489e8e393bSYanan Wang         }
499e8e393bSYanan Wang 
509e8e393bSYanan Wang /*
51a05ed358SZhao Liu  * Currently a 5-level topology hierarchy is supported on PC machines
52a05ed358SZhao Liu  *  -sockets/dies/modules/cores/threads
539e8e393bSYanan Wang  */
54a05ed358SZhao Liu #define SMP_CONFIG_WITH_MODS_DIES(ha, a, hb, b, hc, c, hd, d, \
55a05ed358SZhao Liu                                   he, e, hf, f, hg, g)        \
569e8e393bSYanan Wang         {                                                     \
579e8e393bSYanan Wang             .has_cpus    = ha, .cpus    = a,                  \
589e8e393bSYanan Wang             .has_sockets = hb, .sockets = b,                  \
599e8e393bSYanan Wang             .has_dies    = hc, .dies    = c,                  \
60a05ed358SZhao Liu             .has_modules = hd, .modules = d,                  \
61a05ed358SZhao Liu             .has_cores   = he, .cores   = e,                  \
62a05ed358SZhao Liu             .has_threads = hf, .threads = f,                  \
63a05ed358SZhao Liu             .has_maxcpus = hg, .maxcpus = g,                  \
649e8e393bSYanan Wang         }
659e8e393bSYanan Wang 
66e5ef89aeSYanan Wang /*
67e5ef89aeSYanan Wang  * Currently a 4-level topology hierarchy is supported on ARM virt machines
68e5ef89aeSYanan Wang  *  -sockets/clusters/cores/threads
69e5ef89aeSYanan Wang  */
70e5ef89aeSYanan Wang #define SMP_CONFIG_WITH_CLUSTERS(ha, a, hb, b, hc, c, hd, d, he, e, hf, f) \
71e5ef89aeSYanan Wang         {                                                     \
72e5ef89aeSYanan Wang             .has_cpus     = ha, .cpus     = a,                \
73e5ef89aeSYanan Wang             .has_sockets  = hb, .sockets  = b,                \
74e5ef89aeSYanan Wang             .has_clusters = hc, .clusters = c,                \
75e5ef89aeSYanan Wang             .has_cores    = hd, .cores    = d,                \
76e5ef89aeSYanan Wang             .has_threads  = he, .threads  = e,                \
77e5ef89aeSYanan Wang             .has_maxcpus  = hf, .maxcpus  = f,                \
78e5ef89aeSYanan Wang         }
79e5ef89aeSYanan Wang 
80f0fe1cd8SZhao Liu /*
81f0fe1cd8SZhao Liu  * Currently a 5-level topology hierarchy is supported on s390 ccw machines
82f0fe1cd8SZhao Liu  *  -drawers/books/sockets/cores/threads
83f0fe1cd8SZhao Liu  */
84f0fe1cd8SZhao Liu #define SMP_CONFIG_WITH_BOOKS_DRAWERS(ha, a, hb, b, hc, c, hd, \
85f0fe1cd8SZhao Liu                                       d, he, e, hf, f, hg, g)  \
86f0fe1cd8SZhao Liu         {                                                      \
87f0fe1cd8SZhao Liu             .has_cpus     = ha, .cpus     = a,                 \
88f0fe1cd8SZhao Liu             .has_drawers  = hb, .drawers  = b,                 \
89f0fe1cd8SZhao Liu             .has_books    = hc, .books    = c,                 \
90f0fe1cd8SZhao Liu             .has_sockets  = hd, .sockets  = d,                 \
91f0fe1cd8SZhao Liu             .has_cores    = he, .cores    = e,                 \
92f0fe1cd8SZhao Liu             .has_threads  = hf, .threads  = f,                 \
93f0fe1cd8SZhao Liu             .has_maxcpus  = hg, .maxcpus  = g,                 \
94f0fe1cd8SZhao Liu         }
95f0fe1cd8SZhao Liu 
96ef88e1e8SZhao Liu /*
97*6a235525SZhao Liu  * Currently QEMU supports up to a 8-level topology hierarchy, which is the
98ef88e1e8SZhao Liu  * QEMU's unified abstract representation of CPU topology.
99*6a235525SZhao Liu  *  -drawers/books/sockets/dies/clusters/modules/cores/threads
100ef88e1e8SZhao Liu  */
101*6a235525SZhao Liu #define SMP_CONFIG_WITH_FULL_TOPO(a, b, c, d, e, f, g, h, i, j) \
102ef88e1e8SZhao Liu         {                                                       \
103ef88e1e8SZhao Liu             .has_cpus     = true, .cpus     = a,                \
104ef88e1e8SZhao Liu             .has_drawers  = true, .drawers  = b,                \
105ef88e1e8SZhao Liu             .has_books    = true, .books    = c,                \
106ef88e1e8SZhao Liu             .has_sockets  = true, .sockets  = d,                \
107ef88e1e8SZhao Liu             .has_dies     = true, .dies     = e,                \
108ef88e1e8SZhao Liu             .has_clusters = true, .clusters = f,                \
109*6a235525SZhao Liu             .has_modules  = true, .modules  = g,                \
110*6a235525SZhao Liu             .has_cores    = true, .cores    = h,                \
111*6a235525SZhao Liu             .has_threads  = true, .threads  = i,                \
112*6a235525SZhao Liu             .has_maxcpus  = true, .maxcpus  = j,                \
113ef88e1e8SZhao Liu         }
114ef88e1e8SZhao Liu 
1159e8e393bSYanan Wang /**
1169e8e393bSYanan Wang  * @config - the given SMP configuration
1179e8e393bSYanan Wang  * @expect_prefer_sockets - the expected parsing result for the
1189e8e393bSYanan Wang  * valid configuration, when sockets are preferred over cores
1199e8e393bSYanan Wang  * @expect_prefer_cores - the expected parsing result for the
1209e8e393bSYanan Wang  * valid configuration, when cores are preferred over sockets
1219e8e393bSYanan Wang  * @expect_error - the expected error report when the given
1229e8e393bSYanan Wang  * configuration is invalid
1239e8e393bSYanan Wang  */
1249e8e393bSYanan Wang typedef struct SMPTestData {
1259e8e393bSYanan Wang     SMPConfiguration config;
1269e8e393bSYanan Wang     CpuTopology expect_prefer_sockets;
1279e8e393bSYanan Wang     CpuTopology expect_prefer_cores;
1289e8e393bSYanan Wang     const char *expect_error;
1299e8e393bSYanan Wang } SMPTestData;
1309e8e393bSYanan Wang 
1319e8e393bSYanan Wang /*
1329e8e393bSYanan Wang  * List all the possible valid sub-collections of the generic 5
1339e8e393bSYanan Wang  * topology parameters (i.e. cpus/maxcpus/sockets/cores/threads),
1349e8e393bSYanan Wang  * then test the automatic calculation algorithm of the missing
1359e8e393bSYanan Wang  * values in the parser.
1369e8e393bSYanan Wang  */
137cf65000aSPhilippe Mathieu-Daudé static const struct SMPTestData data_generic_valid[] = {
1389e8e393bSYanan Wang     {
1399e8e393bSYanan Wang         /* config: no configuration provided
1409e8e393bSYanan Wang          * expect: cpus=1,sockets=1,cores=1,threads=1,maxcpus=1 */
1419e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, F, 0, F, 0),
1429e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(1, 1, 1, 1, 1),
1439e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(1, 1, 1, 1, 1),
1449e8e393bSYanan Wang     }, {
1459e8e393bSYanan Wang         /* config: -smp 8
1469e8e393bSYanan Wang          * prefer_sockets: cpus=8,sockets=8,cores=1,threads=1,maxcpus=8
1479e8e393bSYanan Wang          * prefer_cores: cpus=8,sockets=1,cores=8,threads=1,maxcpus=8 */
1489e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, F, 0, F, 0),
1499e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 8, 1, 1, 8),
1509e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 8, 1, 8),
1519e8e393bSYanan Wang     }, {
1529e8e393bSYanan Wang         /* config: -smp sockets=2
1539e8e393bSYanan Wang          * expect: cpus=2,sockets=2,cores=1,threads=1,maxcpus=2 */
1549e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, F, 0, F, 0),
1559e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(2, 2, 1, 1, 2),
1569e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(2, 2, 1, 1, 2),
1579e8e393bSYanan Wang     }, {
1589e8e393bSYanan Wang         /* config: -smp cores=4
1599e8e393bSYanan Wang          * expect: cpus=4,sockets=1,cores=4,threads=1,maxcpus=4 */
1609e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, F, 0, F, 0),
1619e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(4, 1, 4, 1, 4),
1629e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(4, 1, 4, 1, 4),
1639e8e393bSYanan Wang     }, {
1649e8e393bSYanan Wang         /* config: -smp threads=2
1659e8e393bSYanan Wang          * expect: cpus=2,sockets=1,cores=1,threads=2,maxcpus=2 */
1669e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, T, 2, F, 0),
1679e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(2, 1, 1, 2, 2),
1689e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(2, 1, 1, 2, 2),
1699e8e393bSYanan Wang     }, {
1709e8e393bSYanan Wang         /* config: -smp maxcpus=16
1719e8e393bSYanan Wang          * prefer_sockets: cpus=16,sockets=16,cores=1,threads=1,maxcpus=16
1729e8e393bSYanan Wang          * prefer_cores: cpus=16,sockets=1,cores=16,threads=1,maxcpus=16 */
1739e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, F, 0, T, 16),
1749e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 16, 1, 1, 16),
1759e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 1, 16, 1, 16),
1769e8e393bSYanan Wang     }, {
1779e8e393bSYanan Wang         /* config: -smp 8,sockets=2
1789e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
1799e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, F, 0, F, 0),
1809e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
1819e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
1829e8e393bSYanan Wang     }, {
1839e8e393bSYanan Wang         /* config: -smp 8,cores=4
1849e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
1859e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, F, 0, F, 0),
1869e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
1879e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
1889e8e393bSYanan Wang     }, {
1899e8e393bSYanan Wang         /* config: -smp 8,threads=2
1909e8e393bSYanan Wang          * prefer_sockets: cpus=8,sockets=4,cores=1,threads=2,maxcpus=8
1919e8e393bSYanan Wang          * prefer_cores: cpus=8,sockets=1,cores=4,threads=2,maxcpus=8 */
1929e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, T, 2, F, 0),
1939e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 4, 1, 2, 8),
1949e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
1959e8e393bSYanan Wang     }, {
1969e8e393bSYanan Wang         /* config: -smp 8,maxcpus=16
1979e8e393bSYanan Wang          * prefer_sockets: cpus=8,sockets=16,cores=1,threads=1,maxcpus=16
1989e8e393bSYanan Wang          * prefer_cores: cpus=8,sockets=1,cores=16,threads=1,maxcpus=16 */
1999e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, F, 0, T, 16),
2009e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 16, 1, 1, 16),
2019e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 16, 1, 16),
2029e8e393bSYanan Wang     }, {
2039e8e393bSYanan Wang         /* config: -smp sockets=2,cores=4
2049e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
2059e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, F, 0, F, 0),
2069e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
2079e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
2089e8e393bSYanan Wang     }, {
2099e8e393bSYanan Wang         /* config: -smp sockets=2,threads=2
2109e8e393bSYanan Wang          * expect: cpus=4,sockets=2,cores=1,threads=2,maxcpus=4 */
2119e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, T, 2, F, 0),
2129e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(4, 2, 1, 2, 4),
2139e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(4, 2, 1, 2, 4),
2149e8e393bSYanan Wang     }, {
2159e8e393bSYanan Wang         /* config: -smp sockets=2,maxcpus=16
2169e8e393bSYanan Wang          * expect: cpus=16,sockets=2,cores=8,threads=1,maxcpus=16 */
2179e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, F, 0, T, 16),
2189e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 8, 1, 16),
2199e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 8, 1, 16),
2209e8e393bSYanan Wang     }, {
2219e8e393bSYanan Wang         /* config: -smp cores=4,threads=2
2229e8e393bSYanan Wang          * expect: cpus=8,sockets=1,cores=4,threads=2,maxcpus=8 */
2239e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, T, 2, F, 0),
2249e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
2259e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
2269e8e393bSYanan Wang     }, {
2279e8e393bSYanan Wang         /* config: -smp cores=4,maxcpus=16
2289e8e393bSYanan Wang          * expect: cpus=16,sockets=4,cores=4,threads=1,maxcpus=16 */
2299e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, F, 0, T, 16),
2309e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 4, 4, 1, 16),
2319e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 4, 4, 1, 16),
2329e8e393bSYanan Wang     }, {
2339e8e393bSYanan Wang         /* config: -smp threads=2,maxcpus=16
2349e8e393bSYanan Wang          * prefer_sockets: cpus=16,sockets=8,cores=1,threads=2,maxcpus=16
2359e8e393bSYanan Wang          * prefer_cores: cpus=16,sockets=1,cores=8,threads=2,maxcpus=16 */
2369e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, F, 0, T, 2, T, 16),
2379e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 8, 1, 2, 16),
2389e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 1, 8, 2, 16),
2399e8e393bSYanan Wang     }, {
2409e8e393bSYanan Wang         /* config: -smp 8,sockets=2,cores=4
2419e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
2429e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, F, 0, F, 0),
2439e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
2449e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
2459e8e393bSYanan Wang     }, {
2469e8e393bSYanan Wang         /* config: -smp 8,sockets=2,threads=2
2479e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=2,threads=2,maxcpus=8 */
2489e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, T, 2, F, 0),
2499e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
2509e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
2519e8e393bSYanan Wang     }, {
2529e8e393bSYanan Wang         /* config: -smp 8,sockets=2,maxcpus=16
2539e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=8,threads=1,maxcpus=16 */
2549e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, F, 0, T, 16),
2559e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 8, 1, 16),
2569e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 8, 1, 16),
2579e8e393bSYanan Wang     }, {
2589e8e393bSYanan Wang         /* config: -smp 8,cores=4,threads=2
2599e8e393bSYanan Wang          * expect: cpus=8,sockets=1,cores=4,threads=2,maxcpus=8 */
2609e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, T, 2, F, 0),
2619e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
2629e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 4, 2, 8),
2639e8e393bSYanan Wang     }, {
2649e8e393bSYanan Wang         /* config: -smp 8,cores=4,maxcpus=16
2659e8e393bSYanan Wang          * expect: cpus=8,sockets=4,cores=4,threads=1,maxcpus=16 */
2669e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, F, 0, T, 16),
2679e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 4, 4, 1, 16),
2689e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 4, 4, 1, 16),
2699e8e393bSYanan Wang     }, {
2709e8e393bSYanan Wang         /* config: -smp 8,threads=2,maxcpus=16
2719e8e393bSYanan Wang          * prefer_sockets: cpus=8,sockets=8,cores=1,threads=2,maxcpus=16
2729e8e393bSYanan Wang          * prefer_cores: cpus=8,sockets=1,cores=8,threads=2,maxcpus=16 */
2739e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, F, 0, T, 2, T, 16),
2749e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 8, 1, 2, 16),
2759e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 1, 8, 2, 16),
2769e8e393bSYanan Wang     }, {
2779e8e393bSYanan Wang         /* config: -smp sockets=2,cores=4,threads=2
2789e8e393bSYanan Wang          * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
2799e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, T, 2, F, 0),
2809e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2819e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2829e8e393bSYanan Wang     }, {
2839e8e393bSYanan Wang         /* config: -smp sockets=2,cores=4,maxcpus=16
2849e8e393bSYanan Wang          * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
2859e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, F, 0, T, 16),
2869e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2879e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2889e8e393bSYanan Wang     }, {
2899e8e393bSYanan Wang         /* config: -smp sockets=2,threads=2,maxcpus=16
2909e8e393bSYanan Wang          * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
2919e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, F, 0, T, 2, T, 16),
2929e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2939e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2949e8e393bSYanan Wang     }, {
2959e8e393bSYanan Wang         /* config: -smp cores=4,threads=2,maxcpus=16
2969e8e393bSYanan Wang          * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
2979e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, F, 0, T, 4, T, 2, T, 16),
2989e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
2999e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
3009e8e393bSYanan Wang     }, {
3019e8e393bSYanan Wang         /* config: -smp 8,sockets=2,cores=4,threads=1
3029e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=1,maxcpus=8 */
3039e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 1, F, 0),
3049e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
3059e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 1, 8),
3069e8e393bSYanan Wang     }, {
3079e8e393bSYanan Wang         /* config: -smp 8,sockets=2,cores=4,maxcpus=16
3089e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
3099e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, F, 0, T, 16),
3109e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3119e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3129e8e393bSYanan Wang     }, {
3139e8e393bSYanan Wang         /* config: -smp 8,sockets=2,threads=2,maxcpus=16
3149e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
3159e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, F, 0, T, 2, T, 16),
3169e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3179e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3189e8e393bSYanan Wang     }, {
3199e8e393bSYanan Wang         /* config: -smp 8,cores=4,threads=2,maxcpus=16
3209e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
3219e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, F, 0, T, 4, T, 2, T, 16),
3229e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3239e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3249e8e393bSYanan Wang     }, {
3259e8e393bSYanan Wang         /* config: -smp sockets=2,cores=4,threads=2,maxcpus=16
3269e8e393bSYanan Wang          * expect: cpus=16,sockets=2,cores=4,threads=2,maxcpus=16 */
3279e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(F, 0, T, 2, T, 4, T, 2, T, 16),
3289e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
3299e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(16, 2, 4, 2, 16),
3309e8e393bSYanan Wang     }, {
3319e8e393bSYanan Wang         /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=16
3329e8e393bSYanan Wang          * expect: cpus=8,sockets=2,cores=4,threads=2,maxcpus=16 */
3339e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 2, T, 16),
3349e8e393bSYanan Wang         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
3359e8e393bSYanan Wang         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 4, 2, 16),
336e68dcbb0SDaniel P. Berrangé     }, {
337e68dcbb0SDaniel P. Berrangé         /*
338e68dcbb0SDaniel P. Berrangé          * Unsupported parameters are always allowed to be set to '1'
3397c56fb74SZhao Liu          * config:
340*6a235525SZhao Liu          *   -smp 8,drawers=1,books=1,sockets=2,dies=1,clusters=1,modules=1,\
341*6a235525SZhao Liu          *        cores=2,threads=2,maxcpus=8
342e68dcbb0SDaniel P. Berrangé          * expect: cpus=8,sockets=2,cores=2,threads=2,maxcpus=8 */
343*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(8, 1, 1, 2, 1, 1, 1, 2, 2, 8),
344e68dcbb0SDaniel P. Berrangé         .expect_prefer_sockets = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
345e68dcbb0SDaniel P. Berrangé         .expect_prefer_cores   = CPU_TOPOLOGY_GENERIC(8, 2, 2, 2, 8),
3469e8e393bSYanan Wang     },
3479e8e393bSYanan Wang };
3489e8e393bSYanan Wang 
349cf65000aSPhilippe Mathieu-Daudé static const struct SMPTestData data_generic_invalid[] = {
3509e8e393bSYanan Wang     {
351a05ed358SZhao Liu         /* config: -smp 2,modules=2 */
352a05ed358SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 2, F, 0, F, 0, T, 2,
353a05ed358SZhao Liu                                             F, 0, F, 0, F, 0),
354a05ed358SZhao Liu         .expect_error = "modules > 1 not supported by this machine's CPU topology",
355a05ed358SZhao Liu     }, {
3569e8e393bSYanan Wang         /* config: -smp 2,dies=2 */
357a05ed358SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 2, F, 0, T, 2, F, 0,
358a05ed358SZhao Liu                                             F, 0, F, 0, F, 0),
3599d7950edSDaniel P. Berrangé         .expect_error = "dies > 1 not supported by this machine's CPU topology",
3609e8e393bSYanan Wang     }, {
361e5ef89aeSYanan Wang         /* config: -smp 2,clusters=2 */
362e5ef89aeSYanan Wang         .config = SMP_CONFIG_WITH_CLUSTERS(T, 2, F, 0, T, 2, F, 0, F, 0, F, 0),
3639d7950edSDaniel P. Berrangé         .expect_error = "clusters > 1 not supported by this machine's CPU topology",
364e5ef89aeSYanan Wang     }, {
365f0fe1cd8SZhao Liu         /* config: -smp 2,books=2 */
366f0fe1cd8SZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, F, 0, T, 2, F,
367f0fe1cd8SZhao Liu                                                 0, F, 0, F, 0, F, 0),
3689d7950edSDaniel P. Berrangé         .expect_error = "books > 1 not supported by this machine's CPU topology",
369f0fe1cd8SZhao Liu     }, {
3705a4c4148SZhao Liu         /* config: -smp 2,drawers=2 */
3715a4c4148SZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 2, T, 2, F, 0, F,
3725a4c4148SZhao Liu                                                 0, F, 0, F, 0, F, 0),
3739d7950edSDaniel P. Berrangé         .expect_error = "drawers > 1 not supported by this machine's CPU topology",
3745a4c4148SZhao Liu     }, {
3759e8e393bSYanan Wang         /* config: -smp 8,sockets=2,cores=4,threads=2,maxcpus=8 */
3769e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 8, T, 2, T, 4, T, 2, T, 8),
3779e8e393bSYanan Wang         .expect_error = "Invalid CPU topology: "
3789e8e393bSYanan Wang                         "product of the hierarchy must match maxcpus: "
3799e8e393bSYanan Wang                         "sockets (2) * cores (4) * threads (2) "
3809e8e393bSYanan Wang                         "!= maxcpus (8)",
3819e8e393bSYanan Wang     }, {
3829e8e393bSYanan Wang         /* config: -smp 18,sockets=2,cores=4,threads=2,maxcpus=16 */
3839e8e393bSYanan Wang         .config = SMP_CONFIG_GENERIC(T, 18, T, 2, T, 4, T, 2, T, 16),
3849e8e393bSYanan Wang         .expect_error = "Invalid CPU topology: "
3859e8e393bSYanan Wang                         "maxcpus must be equal to or greater than smp: "
3869e8e393bSYanan Wang                         "sockets (2) * cores (4) * threads (2) "
3879e8e393bSYanan Wang                         "== maxcpus (16) < smp_cpus (18)",
3889e8e393bSYanan Wang     }, {
389803f9714SZhao Liu         /*
390803f9714SZhao Liu          * config: -smp 1
391803f9714SZhao Liu          * The test machine should tweak the supported min CPUs to
392803f9714SZhao Liu          * 2 (MIN_CPUS + 1) for testing.
393803f9714SZhao Liu          */
394803f9714SZhao Liu         .config = SMP_CONFIG_GENERIC(T, MIN_CPUS, F, 0, F, 0, F, 0, F, 0),
3959e8e393bSYanan Wang         .expect_error = "Invalid SMP CPUs 1. The min CPUs supported "
3967b6d1bc9SPhilippe Mathieu-Daudé                         "by machine '" SMP_MACHINE_NAME "' is 2",
3979e8e393bSYanan Wang     }, {
398803f9714SZhao Liu         /*
399f4e65d64SZhao Liu          * config: -smp 4096
400803f9714SZhao Liu          * The test machine should tweak the supported max CPUs to
401f4e65d64SZhao Liu          * 4095 (MAX_CPUS - 1) for testing.
402803f9714SZhao Liu          */
403f4e65d64SZhao Liu         .config = SMP_CONFIG_GENERIC(T, 4096, F, 0, F, 0, F, 0, F, 0),
404f4e65d64SZhao Liu         .expect_error = "Invalid SMP CPUs 4096. The max CPUs supported "
405f4e65d64SZhao Liu                         "by machine '" SMP_MACHINE_NAME "' is 4095",
4069e8e393bSYanan Wang     },
4079e8e393bSYanan Wang };
4089e8e393bSYanan Wang 
409a05ed358SZhao Liu static const struct SMPTestData data_with_modules_invalid[] = {
410a05ed358SZhao Liu     {
411a05ed358SZhao Liu         /* config: -smp 16,sockets=2,modules=2,cores=4,threads=2,maxcpus=16 */
412a05ed358SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 16, T, 2, F, 0, T, 2,
413a05ed358SZhao Liu                                             T, 4, T, 2, T, 16),
414a05ed358SZhao Liu         .expect_error = "Invalid CPU topology: "
415a05ed358SZhao Liu                         "product of the hierarchy must match maxcpus: "
416a05ed358SZhao Liu                         "sockets (2) * modules (2) * cores (4) * threads (2) "
417a05ed358SZhao Liu                         "!= maxcpus (16)",
418a05ed358SZhao Liu     }, {
419a05ed358SZhao Liu         /* config: -smp 34,sockets=2,modules=2,cores=4,threads=2,maxcpus=32 */
420a05ed358SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 34, T, 2, F, 0, T, 2,
421a05ed358SZhao Liu                                             T, 4, T, 2, T, 32),
422a05ed358SZhao Liu         .expect_error = "Invalid CPU topology: "
423a05ed358SZhao Liu                         "maxcpus must be equal to or greater than smp: "
424a05ed358SZhao Liu                         "sockets (2) * modules (2) * cores (4) * threads (2) "
425a05ed358SZhao Liu                         "== maxcpus (32) < smp_cpus (34)",
426a05ed358SZhao Liu     },
427a05ed358SZhao Liu };
428a05ed358SZhao Liu 
429cf65000aSPhilippe Mathieu-Daudé static const struct SMPTestData data_with_dies_invalid[] = {
4309e8e393bSYanan Wang     {
4319e8e393bSYanan Wang         /* config: -smp 16,sockets=2,dies=2,cores=4,threads=2,maxcpus=16 */
432a05ed358SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 16, T, 2, T, 2, F, 0,
433a05ed358SZhao Liu                                             T, 4, T, 2, T, 16),
4349e8e393bSYanan Wang         .expect_error = "Invalid CPU topology: "
4359e8e393bSYanan Wang                         "product of the hierarchy must match maxcpus: "
4369e8e393bSYanan Wang                         "sockets (2) * dies (2) * cores (4) * threads (2) "
4379e8e393bSYanan Wang                         "!= maxcpus (16)",
4389e8e393bSYanan Wang     }, {
4399e8e393bSYanan Wang         /* config: -smp 34,sockets=2,dies=2,cores=4,threads=2,maxcpus=32 */
440a05ed358SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 34, T, 2, T, 2, F, 0,
441a05ed358SZhao Liu                                             T, 4, T, 2, T, 32),
4429e8e393bSYanan Wang         .expect_error = "Invalid CPU topology: "
4439e8e393bSYanan Wang                         "maxcpus must be equal to or greater than smp: "
4449e8e393bSYanan Wang                         "sockets (2) * dies (2) * cores (4) * threads (2) "
4459e8e393bSYanan Wang                         "== maxcpus (32) < smp_cpus (34)",
4469e8e393bSYanan Wang     },
4479e8e393bSYanan Wang };
4489e8e393bSYanan Wang 
449fe4b9952SZhao Liu static const struct SMPTestData data_with_modules_dies_invalid[] = {
450fe4b9952SZhao Liu     {
451fe4b9952SZhao Liu         /*
452fe4b9952SZhao Liu          * config: -smp 200,sockets=3,dies=5,modules=2,cores=4,\
453fe4b9952SZhao Liu          * threads=2,maxcpus=200
454fe4b9952SZhao Liu          */
455fe4b9952SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 200, T, 3, T, 5, T,
456fe4b9952SZhao Liu                                             2, T, 4, T, 2, T, 200),
457fe4b9952SZhao Liu         .expect_error = "Invalid CPU topology: "
458fe4b9952SZhao Liu                         "product of the hierarchy must match maxcpus: "
459fe4b9952SZhao Liu                         "sockets (3) * dies (5) * modules (2) * "
460fe4b9952SZhao Liu                         "cores (4) * threads (2) != maxcpus (200)",
461fe4b9952SZhao Liu     }, {
462fe4b9952SZhao Liu         /*
463fe4b9952SZhao Liu          * config: -smp 242,sockets=3,dies=5,modules=2,cores=4,\
464fe4b9952SZhao Liu          * threads=2,maxcpus=240
465fe4b9952SZhao Liu          */
466fe4b9952SZhao Liu         .config = SMP_CONFIG_WITH_MODS_DIES(T, 242, T, 3, T, 5, T,
467fe4b9952SZhao Liu                                             2, T, 4, T, 2, T, 240),
468fe4b9952SZhao Liu         .expect_error = "Invalid CPU topology: "
469fe4b9952SZhao Liu                         "maxcpus must be equal to or greater than smp: "
470fe4b9952SZhao Liu                         "sockets (3) * dies (5) * modules (2) * "
471fe4b9952SZhao Liu                         "cores (4) * threads (2) "
472fe4b9952SZhao Liu                         "== maxcpus (240) < smp_cpus (242)",
473fe4b9952SZhao Liu     },
474fe4b9952SZhao Liu };
475fe4b9952SZhao Liu 
476e5ef89aeSYanan Wang static const struct SMPTestData data_with_clusters_invalid[] = {
477e5ef89aeSYanan Wang     {
478e5ef89aeSYanan Wang         /* config: -smp 16,sockets=2,clusters=2,cores=4,threads=2,maxcpus=16 */
479e5ef89aeSYanan Wang         .config = SMP_CONFIG_WITH_CLUSTERS(T, 16, T, 2, T, 2, T, 4, T, 2, T, 16),
480e5ef89aeSYanan Wang         .expect_error = "Invalid CPU topology: "
481e5ef89aeSYanan Wang                         "product of the hierarchy must match maxcpus: "
482e5ef89aeSYanan Wang                         "sockets (2) * clusters (2) * cores (4) * threads (2) "
483e5ef89aeSYanan Wang                         "!= maxcpus (16)",
484e5ef89aeSYanan Wang     }, {
485e5ef89aeSYanan Wang         /* config: -smp 34,sockets=2,clusters=2,cores=4,threads=2,maxcpus=32 */
486e5ef89aeSYanan Wang         .config = SMP_CONFIG_WITH_CLUSTERS(T, 34, T, 2, T, 2, T, 4, T, 2, T, 32),
487e5ef89aeSYanan Wang         .expect_error = "Invalid CPU topology: "
488e5ef89aeSYanan Wang                         "maxcpus must be equal to or greater than smp: "
489e5ef89aeSYanan Wang                         "sockets (2) * clusters (2) * cores (4) * threads (2) "
490e5ef89aeSYanan Wang                         "== maxcpus (32) < smp_cpus (34)",
491e5ef89aeSYanan Wang     },
492e5ef89aeSYanan Wang };
493e5ef89aeSYanan Wang 
494f0fe1cd8SZhao Liu static const struct SMPTestData data_with_books_invalid[] = {
495f0fe1cd8SZhao Liu     {
496f0fe1cd8SZhao Liu         /* config: -smp 16,books=2,sockets=2,cores=4,threads=2,maxcpus=16 */
497aedfeffeSZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 16, F, 0, T, 2, T,
498f0fe1cd8SZhao Liu                                                 2, T, 4, T, 2, T, 16),
499f0fe1cd8SZhao Liu         .expect_error = "Invalid CPU topology: "
500f0fe1cd8SZhao Liu                         "product of the hierarchy must match maxcpus: "
501f0fe1cd8SZhao Liu                         "books (2) * sockets (2) * cores (4) * threads (2) "
502f0fe1cd8SZhao Liu                         "!= maxcpus (16)",
503f0fe1cd8SZhao Liu     }, {
504f0fe1cd8SZhao Liu         /* config: -smp 34,books=2,sockets=2,cores=4,threads=2,maxcpus=32 */
505aedfeffeSZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 34, F, 0, T, 2, T,
506f0fe1cd8SZhao Liu                                                 2, T, 4, T, 2, T, 32),
507f0fe1cd8SZhao Liu         .expect_error = "Invalid CPU topology: "
508f0fe1cd8SZhao Liu                         "maxcpus must be equal to or greater than smp: "
509f0fe1cd8SZhao Liu                         "books (2) * sockets (2) * cores (4) * threads (2) "
510f0fe1cd8SZhao Liu                         "== maxcpus (32) < smp_cpus (34)",
511f0fe1cd8SZhao Liu     },
512f0fe1cd8SZhao Liu };
513f0fe1cd8SZhao Liu 
5145a4c4148SZhao Liu static const struct SMPTestData data_with_drawers_invalid[] = {
5155a4c4148SZhao Liu     {
5165a4c4148SZhao Liu         /* config: -smp 16,drawers=2,sockets=2,cores=4,threads=2,maxcpus=16 */
517aedfeffeSZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 16, T, 2, F, 0, T,
5185a4c4148SZhao Liu                                                 2, T, 4, T, 2, T, 16),
5195a4c4148SZhao Liu         .expect_error = "Invalid CPU topology: "
5205a4c4148SZhao Liu                         "product of the hierarchy must match maxcpus: "
5215a4c4148SZhao Liu                         "drawers (2) * sockets (2) * cores (4) * threads (2) "
5225a4c4148SZhao Liu                         "!= maxcpus (16)",
5235a4c4148SZhao Liu     }, {
5245a4c4148SZhao Liu         /* config: -smp 34,drawers=2,sockets=2,cores=4,threads=2,maxcpus=32 */
525aedfeffeSZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 34, T, 2, F, 0, T,
5265a4c4148SZhao Liu                                                 2, T, 4, T, 2, T, 32),
5275a4c4148SZhao Liu         .expect_error = "Invalid CPU topology: "
5285a4c4148SZhao Liu                         "maxcpus must be equal to or greater than smp: "
5295a4c4148SZhao Liu                         "drawers (2) * sockets (2) * cores (4) * threads (2) "
5305a4c4148SZhao Liu                         "== maxcpus (32) < smp_cpus (34)",
5315a4c4148SZhao Liu     },
5325a4c4148SZhao Liu };
5335a4c4148SZhao Liu 
5343f90fb08SZhao Liu static const struct SMPTestData data_with_drawers_books_invalid[] = {
5353f90fb08SZhao Liu     {
5363f90fb08SZhao Liu         /*
53794aae6edSZhao Liu          * config: -smp 200,drawers=3,books=5,sockets=2,cores=4,\
5383f90fb08SZhao Liu          *              threads=2,maxcpus=200
5393f90fb08SZhao Liu          */
5403f90fb08SZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 200, T, 3, T, 5, T,
5413f90fb08SZhao Liu                                                 2, T, 4, T, 2, T, 200),
5423f90fb08SZhao Liu         .expect_error = "Invalid CPU topology: "
5433f90fb08SZhao Liu                         "product of the hierarchy must match maxcpus: "
5443f90fb08SZhao Liu                         "drawers (3) * books (5) * sockets (2) * "
5453f90fb08SZhao Liu                         "cores (4) * threads (2) != maxcpus (200)",
5463f90fb08SZhao Liu     }, {
5473f90fb08SZhao Liu         /*
54894aae6edSZhao Liu          * config: -smp 242,drawers=3,books=5,sockets=2,cores=4,\
5493f90fb08SZhao Liu          *              threads=2,maxcpus=240
5503f90fb08SZhao Liu          */
5513f90fb08SZhao Liu         .config = SMP_CONFIG_WITH_BOOKS_DRAWERS(T, 242, T, 3, T, 5, T,
5523f90fb08SZhao Liu                                                 2, T, 4, T, 2, T, 240),
5533f90fb08SZhao Liu         .expect_error = "Invalid CPU topology: "
5543f90fb08SZhao Liu                         "maxcpus must be equal to or greater than smp: "
5553f90fb08SZhao Liu                         "drawers (3) * books (5) * sockets (2) * "
5563f90fb08SZhao Liu                         "cores (4) * threads (2) "
5573f90fb08SZhao Liu                         "== maxcpus (240) < smp_cpus (242)",
5583f90fb08SZhao Liu     },
5593f90fb08SZhao Liu };
5603f90fb08SZhao Liu 
561ef88e1e8SZhao Liu static const struct SMPTestData data_full_topo_invalid[] = {
562ef88e1e8SZhao Liu     {
563ef88e1e8SZhao Liu         /*
564ef88e1e8SZhao Liu          * config: -smp 200,drawers=3,books=5,sockets=2,dies=4,\
565*6a235525SZhao Liu          *              clusters=2,modules=3,cores=7,threads=2,\
566*6a235525SZhao Liu          *              maxcpus=200
567ef88e1e8SZhao Liu          */
568*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(200, 3, 5, 2, 4, 2, 3, 7, 2, 200),
569ef88e1e8SZhao Liu         .expect_error = "Invalid CPU topology: "
570ef88e1e8SZhao Liu                         "product of the hierarchy must match maxcpus: "
571ef88e1e8SZhao Liu                         "drawers (3) * books (5) * sockets (2) * dies (4) * "
572*6a235525SZhao Liu                         "clusters (2) * modules (3) * cores (7) * threads (2) "
573ef88e1e8SZhao Liu                         "!= maxcpus (200)",
574ef88e1e8SZhao Liu     }, {
575ef88e1e8SZhao Liu         /*
576*6a235525SZhao Liu          * config: -smp 2881,drawers=3,books=5,sockets=2,dies=4,\
577*6a235525SZhao Liu          *              clusters=2,modules=3,cores=2,threads=2,
578*6a235525SZhao Liu          *              maxcpus=2880
579ef88e1e8SZhao Liu          */
580*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(2881, 3, 5, 2, 4,
581*6a235525SZhao Liu                                             2, 3, 2, 2, 2880),
582ef88e1e8SZhao Liu         .expect_error = "Invalid CPU topology: "
583ef88e1e8SZhao Liu                         "maxcpus must be equal to or greater than smp: "
584*6a235525SZhao Liu                         "drawers (3) * books (5) * sockets (2) * "
585*6a235525SZhao Liu                         "dies (4) * clusters (2) * modules (3) * "
586*6a235525SZhao Liu                         "cores (2) * threads (2) == maxcpus (2880) "
587*6a235525SZhao Liu                         "< smp_cpus (2881)",
588ef88e1e8SZhao Liu     }, {
589ef88e1e8SZhao Liu         /*
590ef88e1e8SZhao Liu          * config: -smp 1,drawers=3,books=5,sockets=2,dies=4,\
591*6a235525SZhao Liu          *              clusters=2,modules=3,cores=3,threads=3,\
592*6a235525SZhao Liu          *              maxcpus=6480
593ef88e1e8SZhao Liu          */
594*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 3, 5, 2, 4, 2, 3, 3, 3, 6480),
595*6a235525SZhao Liu         .expect_error = "Invalid SMP CPUs 6480. The max CPUs supported "
596ef88e1e8SZhao Liu                         "by machine '" SMP_MACHINE_NAME "' is 4096",
597ef88e1e8SZhao Liu     },
598ef88e1e8SZhao Liu };
599ef88e1e8SZhao Liu 
600bb829cdeSZhao Liu static const struct SMPTestData data_zero_topo_invalid[] = {
601bb829cdeSZhao Liu     {
602bb829cdeSZhao Liu         /*
603bb829cdeSZhao Liu          * Test "cpus=0".
604bb829cdeSZhao Liu          * config: -smp 0,drawers=1,books=1,sockets=1,dies=1,\
605*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=1,\
606*6a235525SZhao Liu          *              maxcpus=1
607bb829cdeSZhao Liu          */
608*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(0, 1, 1, 1, 1, 1, 1, 1, 1, 1),
609bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
610bb829cdeSZhao Liu                         "be greater than zero",
611bb829cdeSZhao Liu     }, {
612bb829cdeSZhao Liu         /*
613bb829cdeSZhao Liu          * Test "drawers=0".
614bb829cdeSZhao Liu          * config: -smp 1,drawers=0,books=1,sockets=1,dies=1,\
615*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=1,\
616*6a235525SZhao Liu          *              maxcpus=1
617bb829cdeSZhao Liu          */
618*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 0, 1, 1, 1, 1, 1, 1, 1, 1),
619bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
620bb829cdeSZhao Liu                         "be greater than zero",
621bb829cdeSZhao Liu     }, {
622bb829cdeSZhao Liu         /*
623bb829cdeSZhao Liu          * Test "books=0".
624bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=0,sockets=1,dies=1,\
625*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=1,\
626*6a235525SZhao Liu          *              maxcpus=1
627bb829cdeSZhao Liu          */
628*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 0, 1, 1, 1, 1, 1, 1, 1),
629bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
630bb829cdeSZhao Liu                         "be greater than zero",
631bb829cdeSZhao Liu     }, {
632bb829cdeSZhao Liu         /*
633bb829cdeSZhao Liu          * Test "sockets=0".
634bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=0,dies=1,\
635*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=1,
636*6a235525SZhao Liu          *              maxcpus=1
637bb829cdeSZhao Liu          */
638*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 0, 1, 1, 1, 1, 1, 1),
639bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
640bb829cdeSZhao Liu                         "be greater than zero",
641bb829cdeSZhao Liu     }, {
642bb829cdeSZhao Liu         /*
643bb829cdeSZhao Liu          * Test "dies=0".
644bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=1,dies=0,\
645*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=1,\
646*6a235525SZhao Liu          *              maxcpus=1
647bb829cdeSZhao Liu          */
648*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 0, 1, 1, 1, 1, 1),
649bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
650bb829cdeSZhao Liu                         "be greater than zero",
651bb829cdeSZhao Liu     }, {
652bb829cdeSZhao Liu         /*
653bb829cdeSZhao Liu          * Test "clusters=0".
654bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
655*6a235525SZhao Liu          *              clusters=0,modules=1,cores=1,threads=1,\
656*6a235525SZhao Liu          *              maxcpus=1
657bb829cdeSZhao Liu          */
658*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 0, 1, 1, 1, 1),
659*6a235525SZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
660*6a235525SZhao Liu                         "be greater than zero",
661*6a235525SZhao Liu     }, {
662*6a235525SZhao Liu         /*
663*6a235525SZhao Liu          * Test "modules=0".
664*6a235525SZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
665*6a235525SZhao Liu          *              clusters=1,modules=0,cores=1,threads=1,\
666*6a235525SZhao Liu          *              maxcpus=1
667*6a235525SZhao Liu          */
668*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 0, 1, 1, 1),
669bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
670bb829cdeSZhao Liu                         "be greater than zero",
671bb829cdeSZhao Liu     }, {
672bb829cdeSZhao Liu         /*
673bb829cdeSZhao Liu          * Test "cores=0".
674bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
675*6a235525SZhao Liu          *              clusters=1,modules=1,cores=0,threads=1,
676*6a235525SZhao Liu          *              maxcpus=1
677bb829cdeSZhao Liu          */
678*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 1, 0, 1, 1),
679bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
680bb829cdeSZhao Liu                         "be greater than zero",
681bb829cdeSZhao Liu     }, {
682bb829cdeSZhao Liu         /*
683bb829cdeSZhao Liu          * Test "threads=0".
684bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
685*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=0,\
686*6a235525SZhao Liu          *              maxcpus=1
687bb829cdeSZhao Liu          */
688*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 1, 1, 0, 1),
689bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
690bb829cdeSZhao Liu                         "be greater than zero",
691bb829cdeSZhao Liu     }, {
692bb829cdeSZhao Liu         /*
693bb829cdeSZhao Liu          * Test "maxcpus=0".
694bb829cdeSZhao Liu          * config: -smp 1,drawers=1,books=1,sockets=1,dies=1,\
695*6a235525SZhao Liu          *              clusters=1,modules=1,cores=1,threads=1,\
696*6a235525SZhao Liu          *              maxcpus=0
697bb829cdeSZhao Liu          */
698*6a235525SZhao Liu         .config = SMP_CONFIG_WITH_FULL_TOPO(1, 1, 1, 1, 1, 1, 1, 1, 1, 0),
699bb829cdeSZhao Liu         .expect_error = "Invalid CPU topology: CPU topology parameters must "
700bb829cdeSZhao Liu                         "be greater than zero",
701bb829cdeSZhao Liu     },
702bb829cdeSZhao Liu };
703bb829cdeSZhao Liu 
smp_config_to_string(const SMPConfiguration * config)7043e2f1498SPhilippe Mathieu-Daudé static char *smp_config_to_string(const SMPConfiguration *config)
7059e8e393bSYanan Wang {
7069e8e393bSYanan Wang     return g_strdup_printf(
7079e8e393bSYanan Wang         "(SMPConfiguration) {\n"
7089e8e393bSYanan Wang         "    .has_cpus     = %5s, cpus     = %" PRId64 ",\n"
709dc583442SZhao Liu         "    .has_drawers  = %5s, drawers  = %" PRId64 ",\n"
710dc583442SZhao Liu         "    .has_books    = %5s, books    = %" PRId64 ",\n"
7119e8e393bSYanan Wang         "    .has_sockets  = %5s, sockets  = %" PRId64 ",\n"
7129e8e393bSYanan Wang         "    .has_dies     = %5s, dies     = %" PRId64 ",\n"
713e5ef89aeSYanan Wang         "    .has_clusters = %5s, clusters = %" PRId64 ",\n"
714b985f4beSZhao Liu         "    .has_modules  = %5s, modules  = %" PRId64 ",\n"
7159e8e393bSYanan Wang         "    .has_cores    = %5s, cores    = %" PRId64 ",\n"
7169e8e393bSYanan Wang         "    .has_threads  = %5s, threads  = %" PRId64 ",\n"
7179e8e393bSYanan Wang         "    .has_maxcpus  = %5s, maxcpus  = %" PRId64 ",\n"
7189e8e393bSYanan Wang         "}",
7199e8e393bSYanan Wang         config->has_cpus ? "true" : "false", config->cpus,
720dc583442SZhao Liu         config->has_drawers ? "true" : "false", config->drawers,
721dc583442SZhao Liu         config->has_books ? "true" : "false", config->books,
7229e8e393bSYanan Wang         config->has_sockets ? "true" : "false", config->sockets,
7239e8e393bSYanan Wang         config->has_dies ? "true" : "false", config->dies,
724e5ef89aeSYanan Wang         config->has_clusters ? "true" : "false", config->clusters,
725b985f4beSZhao Liu         config->has_modules ? "true" : "false", config->modules,
7269e8e393bSYanan Wang         config->has_cores ? "true" : "false", config->cores,
7279e8e393bSYanan Wang         config->has_threads ? "true" : "false", config->threads,
7289e8e393bSYanan Wang         config->has_maxcpus ? "true" : "false", config->maxcpus);
7299e8e393bSYanan Wang }
7309e8e393bSYanan Wang 
7317d593679SZhao Liu /* Use the different calculation than machine_topo_get_threads_per_socket(). */
cpu_topology_get_threads_per_socket(const CpuTopology * topo)7327d593679SZhao Liu static unsigned int cpu_topology_get_threads_per_socket(const CpuTopology *topo)
7337d593679SZhao Liu {
7347d593679SZhao Liu     /* Check the divisor to avoid invalid topology examples causing SIGFPE. */
735dc583442SZhao Liu     if (!topo->drawers || !topo->books || !topo->sockets) {
7367d593679SZhao Liu         return 0;
7377d593679SZhao Liu     } else {
738dc583442SZhao Liu         return topo->max_cpus / topo->drawers / topo->books / topo->sockets;
7397d593679SZhao Liu     }
7407d593679SZhao Liu }
7417d593679SZhao Liu 
7427d593679SZhao Liu /* Use the different calculation than machine_topo_get_cores_per_socket(). */
cpu_topology_get_cores_per_socket(const CpuTopology * topo)7437d593679SZhao Liu static unsigned int cpu_topology_get_cores_per_socket(const CpuTopology *topo)
7447d593679SZhao Liu {
7457d593679SZhao Liu     /* Check the divisor to avoid invalid topology examples causing SIGFPE. */
7467d593679SZhao Liu     if (!topo->threads) {
7477d593679SZhao Liu         return 0;
7487d593679SZhao Liu     } else {
7497d593679SZhao Liu         return cpu_topology_get_threads_per_socket(topo) / topo->threads;
7507d593679SZhao Liu     }
7517d593679SZhao Liu }
7527d593679SZhao Liu 
cpu_topology_to_string(const CpuTopology * topo,unsigned int threads_per_socket,unsigned int cores_per_socket,bool has_clusters)7537d593679SZhao Liu static char *cpu_topology_to_string(const CpuTopology *topo,
7547d593679SZhao Liu                                     unsigned int threads_per_socket,
75571e44ee0SZhao Liu                                     unsigned int cores_per_socket,
75671e44ee0SZhao Liu                                     bool has_clusters)
7579e8e393bSYanan Wang {
7589e8e393bSYanan Wang     return g_strdup_printf(
7599e8e393bSYanan Wang         "(CpuTopology) {\n"
7609e8e393bSYanan Wang         "    .cpus               = %u,\n"
761dc583442SZhao Liu         "    .drawers            = %u,\n"
762dc583442SZhao Liu         "    .books              = %u,\n"
7639e8e393bSYanan Wang         "    .sockets            = %u,\n"
7649e8e393bSYanan Wang         "    .dies               = %u,\n"
765e5ef89aeSYanan Wang         "    .clusters           = %u,\n"
766b985f4beSZhao Liu         "    .modules            = %u,\n"
7679e8e393bSYanan Wang         "    .cores              = %u,\n"
7689e8e393bSYanan Wang         "    .threads            = %u,\n"
7699e8e393bSYanan Wang         "    .max_cpus           = %u,\n"
7707d593679SZhao Liu         "    .threads_per_socket = %u,\n"
7717d593679SZhao Liu         "    .cores_per_socket   = %u,\n"
77271e44ee0SZhao Liu         "    .has_clusters       = %s,\n"
7739e8e393bSYanan Wang         "}",
774dc583442SZhao Liu         topo->cpus, topo->drawers, topo->books,
775dc583442SZhao Liu         topo->sockets, topo->dies, topo->clusters,
776b985f4beSZhao Liu         topo->modules, topo->cores, topo->threads,
777b985f4beSZhao Liu         topo->max_cpus, threads_per_socket, cores_per_socket,
77871e44ee0SZhao Liu         has_clusters ? "true" : "false");
7799e8e393bSYanan Wang }
7809e8e393bSYanan Wang 
check_parse(MachineState * ms,const SMPConfiguration * config,const CpuTopology * expect_topo,const char * expect_err,bool is_valid)7813e2f1498SPhilippe Mathieu-Daudé static void check_parse(MachineState *ms, const SMPConfiguration *config,
782cf65000aSPhilippe Mathieu-Daudé                         const CpuTopology *expect_topo, const char *expect_err,
7839e8e393bSYanan Wang                         bool is_valid)
7849e8e393bSYanan Wang {
78571e44ee0SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(ms);
7869e8e393bSYanan Wang     g_autofree char *config_str = smp_config_to_string(config);
7877d593679SZhao Liu     g_autofree char *expect_topo_str = NULL, *output_topo_str = NULL;
7887d593679SZhao Liu     unsigned int expect_threads_per_socket, expect_cores_per_socket;
7897d593679SZhao Liu     unsigned int ms_threads_per_socket, ms_cores_per_socket;
7909e8e393bSYanan Wang     Error *err = NULL;
7919e8e393bSYanan Wang 
7927d593679SZhao Liu     expect_threads_per_socket =
7937d593679SZhao Liu                         cpu_topology_get_threads_per_socket(expect_topo);
7947d593679SZhao Liu     expect_cores_per_socket =
7957d593679SZhao Liu                         cpu_topology_get_cores_per_socket(expect_topo);
7967d593679SZhao Liu     expect_topo_str = cpu_topology_to_string(expect_topo,
7977d593679SZhao Liu                                              expect_threads_per_socket,
79871e44ee0SZhao Liu                                              expect_cores_per_socket,
79971e44ee0SZhao Liu                                              config->has_clusters);
8007d593679SZhao Liu 
8013e2f1498SPhilippe Mathieu-Daudé     /* call the generic parser */
8023e2f1498SPhilippe Mathieu-Daudé     machine_parse_smp_config(ms, config, &err);
8039e8e393bSYanan Wang 
8047d593679SZhao Liu     ms_threads_per_socket = machine_topo_get_threads_per_socket(ms);
8057d593679SZhao Liu     ms_cores_per_socket = machine_topo_get_cores_per_socket(ms);
80671e44ee0SZhao Liu     output_topo_str = cpu_topology_to_string(&ms->smp,
80771e44ee0SZhao Liu                                              ms_threads_per_socket,
80871e44ee0SZhao Liu                                              ms_cores_per_socket,
80971e44ee0SZhao Liu                                              mc->smp_props.has_clusters);
8109e8e393bSYanan Wang 
8119e8e393bSYanan Wang     /* when the configuration is supposed to be valid */
8129e8e393bSYanan Wang     if (is_valid) {
8139e8e393bSYanan Wang         if ((err == NULL) &&
8149e8e393bSYanan Wang             (ms->smp.cpus == expect_topo->cpus) &&
815dc583442SZhao Liu             (ms->smp.drawers == expect_topo->drawers) &&
816dc583442SZhao Liu             (ms->smp.books == expect_topo->books) &&
8179e8e393bSYanan Wang             (ms->smp.sockets == expect_topo->sockets) &&
8189e8e393bSYanan Wang             (ms->smp.dies == expect_topo->dies) &&
819e5ef89aeSYanan Wang             (ms->smp.clusters == expect_topo->clusters) &&
820b985f4beSZhao Liu             (ms->smp.modules == expect_topo->modules) &&
8219e8e393bSYanan Wang             (ms->smp.cores == expect_topo->cores) &&
8229e8e393bSYanan Wang             (ms->smp.threads == expect_topo->threads) &&
8237d593679SZhao Liu             (ms->smp.max_cpus == expect_topo->max_cpus) &&
8247d593679SZhao Liu             (ms_threads_per_socket == expect_threads_per_socket) &&
82571e44ee0SZhao Liu             (ms_cores_per_socket == expect_cores_per_socket) &&
82671e44ee0SZhao Liu             (mc->smp_props.has_clusters == config->has_clusters)) {
8279e8e393bSYanan Wang             return;
8289e8e393bSYanan Wang         }
8299e8e393bSYanan Wang 
8309e8e393bSYanan Wang         if (err != NULL) {
8319e8e393bSYanan Wang             g_printerr("Test smp_parse failed!\n"
8329e8e393bSYanan Wang                        "Input configuration: %s\n"
8339e8e393bSYanan Wang                        "Should be valid: yes\n"
8349e8e393bSYanan Wang                        "Expected topology: %s\n\n"
8359e8e393bSYanan Wang                        "Result is valid: no\n"
8369e8e393bSYanan Wang                        "Output error report: %s\n",
8379e8e393bSYanan Wang                        config_str, expect_topo_str, error_get_pretty(err));
8389e8e393bSYanan Wang             goto end;
8399e8e393bSYanan Wang         }
8409e8e393bSYanan Wang 
8419e8e393bSYanan Wang         g_printerr("Test smp_parse failed!\n"
8429e8e393bSYanan Wang                    "Input configuration: %s\n"
8439e8e393bSYanan Wang                    "Should be valid: yes\n"
8449e8e393bSYanan Wang                    "Expected topology: %s\n\n"
8459e8e393bSYanan Wang                    "Result is valid: yes\n"
8469e8e393bSYanan Wang                    "Output topology: %s\n",
8479e8e393bSYanan Wang                    config_str, expect_topo_str, output_topo_str);
8489e8e393bSYanan Wang         goto end;
8499e8e393bSYanan Wang     }
8509e8e393bSYanan Wang 
8519e8e393bSYanan Wang     /* when the configuration is supposed to be invalid */
8529e8e393bSYanan Wang     if (err != NULL) {
8539e8e393bSYanan Wang         if (expect_err == NULL ||
8549e8e393bSYanan Wang             g_str_equal(expect_err, error_get_pretty(err))) {
8559e8e393bSYanan Wang             error_free(err);
8569e8e393bSYanan Wang             return;
8579e8e393bSYanan Wang         }
8589e8e393bSYanan Wang 
8599e8e393bSYanan Wang         g_printerr("Test smp_parse failed!\n"
8609e8e393bSYanan Wang                    "Input configuration: %s\n"
8619e8e393bSYanan Wang                    "Should be valid: no\n"
8629e8e393bSYanan Wang                    "Expected error report: %s\n\n"
8639e8e393bSYanan Wang                    "Result is valid: no\n"
8649e8e393bSYanan Wang                    "Output error report: %s\n",
8659e8e393bSYanan Wang                    config_str, expect_err, error_get_pretty(err));
8669e8e393bSYanan Wang         goto end;
8679e8e393bSYanan Wang     }
8689e8e393bSYanan Wang 
8699e8e393bSYanan Wang     g_printerr("Test smp_parse failed!\n"
8709e8e393bSYanan Wang                "Input configuration: %s\n"
8719e8e393bSYanan Wang                "Should be valid: no\n"
8729e8e393bSYanan Wang                "Expected error report: %s\n\n"
8739e8e393bSYanan Wang                "Result is valid: yes\n"
8749e8e393bSYanan Wang                "Output topology: %s\n",
8759e8e393bSYanan Wang                config_str, expect_err, output_topo_str);
8769e8e393bSYanan Wang 
8779e8e393bSYanan Wang end:
8789e8e393bSYanan Wang     if (err != NULL) {
8799e8e393bSYanan Wang         error_free(err);
8809e8e393bSYanan Wang     }
8819e8e393bSYanan Wang 
8829e8e393bSYanan Wang     abort();
8839e8e393bSYanan Wang }
8849e8e393bSYanan Wang 
smp_parse_test(MachineState * ms,SMPTestData * data,bool is_valid)8859e8e393bSYanan Wang static void smp_parse_test(MachineState *ms, SMPTestData *data, bool is_valid)
8869e8e393bSYanan Wang {
8879e8e393bSYanan Wang     MachineClass *mc = MACHINE_GET_CLASS(ms);
8889e8e393bSYanan Wang 
8899e8e393bSYanan Wang     mc->smp_props.prefer_sockets = true;
8909e8e393bSYanan Wang     check_parse(ms, &data->config, &data->expect_prefer_sockets,
8919e8e393bSYanan Wang                 data->expect_error, is_valid);
8929e8e393bSYanan Wang 
8939e8e393bSYanan Wang     mc->smp_props.prefer_sockets = false;
8949e8e393bSYanan Wang     check_parse(ms, &data->config, &data->expect_prefer_cores,
8959e8e393bSYanan Wang                 data->expect_error, is_valid);
8969e8e393bSYanan Wang }
8979e8e393bSYanan Wang 
8989e8e393bSYanan Wang /* The parsed results of the unsupported parameters should be 1 */
unsupported_params_init(const MachineClass * mc,SMPTestData * data)899cf65000aSPhilippe Mathieu-Daudé static void unsupported_params_init(const MachineClass *mc, SMPTestData *data)
9009e8e393bSYanan Wang {
901b985f4beSZhao Liu     if (!mc->smp_props.modules_supported) {
902b985f4beSZhao Liu         data->expect_prefer_sockets.modules = 1;
903b985f4beSZhao Liu         data->expect_prefer_cores.modules = 1;
904b985f4beSZhao Liu     }
905b985f4beSZhao Liu 
9069e8e393bSYanan Wang     if (!mc->smp_props.dies_supported) {
9079e8e393bSYanan Wang         data->expect_prefer_sockets.dies = 1;
9089e8e393bSYanan Wang         data->expect_prefer_cores.dies = 1;
9099e8e393bSYanan Wang     }
910e5ef89aeSYanan Wang 
911e5ef89aeSYanan Wang     if (!mc->smp_props.clusters_supported) {
912e5ef89aeSYanan Wang         data->expect_prefer_sockets.clusters = 1;
913e5ef89aeSYanan Wang         data->expect_prefer_cores.clusters = 1;
914e5ef89aeSYanan Wang     }
915dc583442SZhao Liu 
916dc583442SZhao Liu     if (!mc->smp_props.books_supported) {
917dc583442SZhao Liu         data->expect_prefer_sockets.books = 1;
918dc583442SZhao Liu         data->expect_prefer_cores.books = 1;
919dc583442SZhao Liu     }
920dc583442SZhao Liu 
921dc583442SZhao Liu     if (!mc->smp_props.drawers_supported) {
922dc583442SZhao Liu         data->expect_prefer_sockets.drawers = 1;
923dc583442SZhao Liu         data->expect_prefer_cores.drawers = 1;
924dc583442SZhao Liu     }
9259e8e393bSYanan Wang }
9269e8e393bSYanan Wang 
machine_base_class_init(ObjectClass * oc,void * data)927c3440effSPhilippe Mathieu-Daudé static void machine_base_class_init(ObjectClass *oc, void *data)
9289e8e393bSYanan Wang {
929c3440effSPhilippe Mathieu-Daudé     MachineClass *mc = MACHINE_CLASS(oc);
930c3440effSPhilippe Mathieu-Daudé 
9319e8e393bSYanan Wang     mc->min_cpus = MIN_CPUS;
9329e8e393bSYanan Wang     mc->max_cpus = MAX_CPUS;
933a2348fa2SYanan Wang 
934a2348fa2SYanan Wang     mc->name = g_strdup(SMP_MACHINE_NAME);
9359e8e393bSYanan Wang }
9369e8e393bSYanan Wang 
machine_generic_invalid_class_init(ObjectClass * oc,void * data)9377ca0705eSPhilippe Mathieu-Daudé static void machine_generic_invalid_class_init(ObjectClass *oc, void *data)
9387ca0705eSPhilippe Mathieu-Daudé {
9397ca0705eSPhilippe Mathieu-Daudé     MachineClass *mc = MACHINE_CLASS(oc);
9407ca0705eSPhilippe Mathieu-Daudé 
9417ca0705eSPhilippe Mathieu-Daudé     /* Force invalid min CPUs and max CPUs */
942803f9714SZhao Liu     mc->min_cpus = MIN_CPUS + 1;
943803f9714SZhao Liu     mc->max_cpus = MAX_CPUS - 1;
9447ca0705eSPhilippe Mathieu-Daudé }
9457ca0705eSPhilippe Mathieu-Daudé 
machine_with_modules_class_init(ObjectClass * oc,void * data)946a05ed358SZhao Liu static void machine_with_modules_class_init(ObjectClass *oc, void *data)
947a05ed358SZhao Liu {
948a05ed358SZhao Liu     MachineClass *mc = MACHINE_CLASS(oc);
949a05ed358SZhao Liu 
950a05ed358SZhao Liu     mc->smp_props.modules_supported = true;
951a05ed358SZhao Liu }
952a05ed358SZhao Liu 
machine_with_dies_class_init(ObjectClass * oc,void * data)95376b6d4ccSPhilippe Mathieu-Daudé static void machine_with_dies_class_init(ObjectClass *oc, void *data)
95476b6d4ccSPhilippe Mathieu-Daudé {
95576b6d4ccSPhilippe Mathieu-Daudé     MachineClass *mc = MACHINE_CLASS(oc);
95676b6d4ccSPhilippe Mathieu-Daudé 
95776b6d4ccSPhilippe Mathieu-Daudé     mc->smp_props.dies_supported = true;
958e5ef89aeSYanan Wang }
959e5ef89aeSYanan Wang 
machine_with_modules_dies_class_init(ObjectClass * oc,void * data)960fe4b9952SZhao Liu static void machine_with_modules_dies_class_init(ObjectClass *oc, void *data)
961fe4b9952SZhao Liu {
962fe4b9952SZhao Liu     MachineClass *mc = MACHINE_CLASS(oc);
963fe4b9952SZhao Liu 
964fe4b9952SZhao Liu     mc->smp_props.modules_supported = true;
965fe4b9952SZhao Liu     mc->smp_props.dies_supported = true;
966fe4b9952SZhao Liu }
967fe4b9952SZhao Liu 
machine_with_clusters_class_init(ObjectClass * oc,void * data)968e5ef89aeSYanan Wang static void machine_with_clusters_class_init(ObjectClass *oc, void *data)
969e5ef89aeSYanan Wang {
970e5ef89aeSYanan Wang     MachineClass *mc = MACHINE_CLASS(oc);
971e5ef89aeSYanan Wang 
972e5ef89aeSYanan Wang     mc->smp_props.clusters_supported = true;
97376b6d4ccSPhilippe Mathieu-Daudé }
97476b6d4ccSPhilippe Mathieu-Daudé 
machine_with_books_class_init(ObjectClass * oc,void * data)975f0fe1cd8SZhao Liu static void machine_with_books_class_init(ObjectClass *oc, void *data)
976f0fe1cd8SZhao Liu {
977f0fe1cd8SZhao Liu     MachineClass *mc = MACHINE_CLASS(oc);
978f0fe1cd8SZhao Liu 
979f0fe1cd8SZhao Liu     mc->smp_props.books_supported = true;
980f0fe1cd8SZhao Liu }
981f0fe1cd8SZhao Liu 
machine_with_drawers_class_init(ObjectClass * oc,void * data)9825a4c4148SZhao Liu static void machine_with_drawers_class_init(ObjectClass *oc, void *data)
9835a4c4148SZhao Liu {
9845a4c4148SZhao Liu     MachineClass *mc = MACHINE_CLASS(oc);
9855a4c4148SZhao Liu 
9865a4c4148SZhao Liu     mc->smp_props.drawers_supported = true;
9875a4c4148SZhao Liu }
9885a4c4148SZhao Liu 
machine_with_drawers_books_class_init(ObjectClass * oc,void * data)9893f90fb08SZhao Liu static void machine_with_drawers_books_class_init(ObjectClass *oc, void *data)
9903f90fb08SZhao Liu {
9913f90fb08SZhao Liu     MachineClass *mc = MACHINE_CLASS(oc);
9923f90fb08SZhao Liu 
9933f90fb08SZhao Liu     mc->smp_props.drawers_supported = true;
9943f90fb08SZhao Liu     mc->smp_props.books_supported = true;
9953f90fb08SZhao Liu }
9963f90fb08SZhao Liu 
machine_full_topo_class_init(ObjectClass * oc,void * data)997ef88e1e8SZhao Liu static void machine_full_topo_class_init(ObjectClass *oc, void *data)
998ef88e1e8SZhao Liu {
999ef88e1e8SZhao Liu     MachineClass *mc = MACHINE_CLASS(oc);
1000ef88e1e8SZhao Liu 
1001ef88e1e8SZhao Liu     mc->smp_props.drawers_supported = true;
1002ef88e1e8SZhao Liu     mc->smp_props.books_supported = true;
1003ef88e1e8SZhao Liu     mc->smp_props.dies_supported = true;
1004ef88e1e8SZhao Liu     mc->smp_props.clusters_supported = true;
1005*6a235525SZhao Liu     mc->smp_props.modules_supported = true;
1006ef88e1e8SZhao Liu }
1007ef88e1e8SZhao Liu 
test_generic_valid(const void * opaque)1008c30bdb02SPhilippe Mathieu-Daudé static void test_generic_valid(const void *opaque)
10099e8e393bSYanan Wang {
10101ab192f3SPhilippe Mathieu-Daudé     const char *machine_type = opaque;
10111ab192f3SPhilippe Mathieu-Daudé     Object *obj = object_new(machine_type);
10129e8e393bSYanan Wang     MachineState *ms = MACHINE(obj);
10139e8e393bSYanan Wang     MachineClass *mc = MACHINE_GET_CLASS(obj);
101447ab8a49SPhilippe Mathieu-Daudé     SMPTestData data = {};
10159e8e393bSYanan Wang     int i;
10169e8e393bSYanan Wang 
10179e8e393bSYanan Wang     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
101847ab8a49SPhilippe Mathieu-Daudé         data = data_generic_valid[i];
101947ab8a49SPhilippe Mathieu-Daudé         unsupported_params_init(mc, &data);
10209e8e393bSYanan Wang 
102147ab8a49SPhilippe Mathieu-Daudé         smp_parse_test(ms, &data, true);
10229e8e393bSYanan Wang     }
10239e8e393bSYanan Wang 
1024c30bdb02SPhilippe Mathieu-Daudé     object_unref(obj);
1025c30bdb02SPhilippe Mathieu-Daudé }
1026c30bdb02SPhilippe Mathieu-Daudé 
test_generic_invalid(const void * opaque)1027c30bdb02SPhilippe Mathieu-Daudé static void test_generic_invalid(const void *opaque)
1028c30bdb02SPhilippe Mathieu-Daudé {
1029c30bdb02SPhilippe Mathieu-Daudé     const char *machine_type = opaque;
1030c30bdb02SPhilippe Mathieu-Daudé     Object *obj = object_new(machine_type);
1031c30bdb02SPhilippe Mathieu-Daudé     MachineState *ms = MACHINE(obj);
1032c30bdb02SPhilippe Mathieu-Daudé     MachineClass *mc = MACHINE_GET_CLASS(obj);
103347ab8a49SPhilippe Mathieu-Daudé     SMPTestData data = {};
1034c30bdb02SPhilippe Mathieu-Daudé     int i;
1035c30bdb02SPhilippe Mathieu-Daudé 
10369e8e393bSYanan Wang     for (i = 0; i < ARRAY_SIZE(data_generic_invalid); i++) {
103747ab8a49SPhilippe Mathieu-Daudé         data = data_generic_invalid[i];
103847ab8a49SPhilippe Mathieu-Daudé         unsupported_params_init(mc, &data);
10399e8e393bSYanan Wang 
104047ab8a49SPhilippe Mathieu-Daudé         smp_parse_test(ms, &data, false);
10419e8e393bSYanan Wang     }
10429e8e393bSYanan Wang 
10439e8e393bSYanan Wang     object_unref(obj);
10449e8e393bSYanan Wang }
10459e8e393bSYanan Wang 
test_with_modules(const void * opaque)1046a05ed358SZhao Liu static void test_with_modules(const void *opaque)
1047a05ed358SZhao Liu {
1048a05ed358SZhao Liu     const char *machine_type = opaque;
1049a05ed358SZhao Liu     Object *obj = object_new(machine_type);
1050a05ed358SZhao Liu     MachineState *ms = MACHINE(obj);
1051a05ed358SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(obj);
1052a05ed358SZhao Liu     SMPTestData data = {};
1053a05ed358SZhao Liu     unsigned int num_modules = 2;
1054a05ed358SZhao Liu     int i;
1055a05ed358SZhao Liu 
1056a05ed358SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
1057a05ed358SZhao Liu         data = data_generic_valid[i];
1058a05ed358SZhao Liu         unsupported_params_init(mc, &data);
1059a05ed358SZhao Liu 
1060a05ed358SZhao Liu         /* when modules parameter is omitted, it will be set as 1 */
1061a05ed358SZhao Liu         data.expect_prefer_sockets.modules = 1;
1062a05ed358SZhao Liu         data.expect_prefer_cores.modules = 1;
1063a05ed358SZhao Liu 
1064a05ed358SZhao Liu         smp_parse_test(ms, &data, true);
1065a05ed358SZhao Liu 
1066a05ed358SZhao Liu         /* when modules parameter is specified */
1067a05ed358SZhao Liu         data.config.has_modules = true;
1068a05ed358SZhao Liu         data.config.modules = num_modules;
1069a05ed358SZhao Liu         if (data.config.has_cpus) {
1070a05ed358SZhao Liu             data.config.cpus *= num_modules;
1071a05ed358SZhao Liu         }
1072a05ed358SZhao Liu         if (data.config.has_maxcpus) {
1073a05ed358SZhao Liu             data.config.maxcpus *= num_modules;
1074a05ed358SZhao Liu         }
1075a05ed358SZhao Liu 
1076a05ed358SZhao Liu         data.expect_prefer_sockets.modules = num_modules;
1077a05ed358SZhao Liu         data.expect_prefer_sockets.cpus *= num_modules;
1078a05ed358SZhao Liu         data.expect_prefer_sockets.max_cpus *= num_modules;
1079a05ed358SZhao Liu         data.expect_prefer_cores.modules = num_modules;
1080a05ed358SZhao Liu         data.expect_prefer_cores.cpus *= num_modules;
1081a05ed358SZhao Liu         data.expect_prefer_cores.max_cpus *= num_modules;
1082a05ed358SZhao Liu 
1083a05ed358SZhao Liu         smp_parse_test(ms, &data, true);
1084a05ed358SZhao Liu     }
1085a05ed358SZhao Liu 
1086a05ed358SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_with_modules_invalid); i++) {
1087a05ed358SZhao Liu         data = data_with_modules_invalid[i];
1088a05ed358SZhao Liu         unsupported_params_init(mc, &data);
1089a05ed358SZhao Liu 
1090a05ed358SZhao Liu         smp_parse_test(ms, &data, false);
1091a05ed358SZhao Liu     }
1092a05ed358SZhao Liu 
1093a05ed358SZhao Liu     object_unref(obj);
1094a05ed358SZhao Liu }
1095a05ed358SZhao Liu 
test_with_dies(const void * opaque)10961ab192f3SPhilippe Mathieu-Daudé static void test_with_dies(const void *opaque)
10979e8e393bSYanan Wang {
10981ab192f3SPhilippe Mathieu-Daudé     const char *machine_type = opaque;
10991ab192f3SPhilippe Mathieu-Daudé     Object *obj = object_new(machine_type);
11009e8e393bSYanan Wang     MachineState *ms = MACHINE(obj);
11019e8e393bSYanan Wang     MachineClass *mc = MACHINE_GET_CLASS(obj);
110247ab8a49SPhilippe Mathieu-Daudé     SMPTestData data = {};
11039e8e393bSYanan Wang     unsigned int num_dies = 2;
11049e8e393bSYanan Wang     int i;
11059e8e393bSYanan Wang 
11069e8e393bSYanan Wang     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
110747ab8a49SPhilippe Mathieu-Daudé         data = data_generic_valid[i];
110847ab8a49SPhilippe Mathieu-Daudé         unsupported_params_init(mc, &data);
11099e8e393bSYanan Wang 
11109e8e393bSYanan Wang         /* when dies parameter is omitted, it will be set as 1 */
111147ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_sockets.dies = 1;
111247ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_cores.dies = 1;
11139e8e393bSYanan Wang 
111447ab8a49SPhilippe Mathieu-Daudé         smp_parse_test(ms, &data, true);
11159e8e393bSYanan Wang 
11169e8e393bSYanan Wang         /* when dies parameter is specified */
111747ab8a49SPhilippe Mathieu-Daudé         data.config.has_dies = true;
111847ab8a49SPhilippe Mathieu-Daudé         data.config.dies = num_dies;
111947ab8a49SPhilippe Mathieu-Daudé         if (data.config.has_cpus) {
112047ab8a49SPhilippe Mathieu-Daudé             data.config.cpus *= num_dies;
11219e8e393bSYanan Wang         }
112247ab8a49SPhilippe Mathieu-Daudé         if (data.config.has_maxcpus) {
112347ab8a49SPhilippe Mathieu-Daudé             data.config.maxcpus *= num_dies;
11249e8e393bSYanan Wang         }
11259e8e393bSYanan Wang 
112647ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_sockets.dies = num_dies;
112747ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_sockets.cpus *= num_dies;
112847ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_sockets.max_cpus *= num_dies;
112947ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_cores.dies = num_dies;
113047ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_cores.cpus *= num_dies;
113147ab8a49SPhilippe Mathieu-Daudé         data.expect_prefer_cores.max_cpus *= num_dies;
11329e8e393bSYanan Wang 
113347ab8a49SPhilippe Mathieu-Daudé         smp_parse_test(ms, &data, true);
11349e8e393bSYanan Wang     }
11359e8e393bSYanan Wang 
11369e8e393bSYanan Wang     for (i = 0; i < ARRAY_SIZE(data_with_dies_invalid); i++) {
113747ab8a49SPhilippe Mathieu-Daudé         data = data_with_dies_invalid[i];
113847ab8a49SPhilippe Mathieu-Daudé         unsupported_params_init(mc, &data);
11399e8e393bSYanan Wang 
114047ab8a49SPhilippe Mathieu-Daudé         smp_parse_test(ms, &data, false);
11419e8e393bSYanan Wang     }
11429e8e393bSYanan Wang 
11439e8e393bSYanan Wang     object_unref(obj);
11449e8e393bSYanan Wang }
11459e8e393bSYanan Wang 
test_with_modules_dies(const void * opaque)1146fe4b9952SZhao Liu static void test_with_modules_dies(const void *opaque)
1147fe4b9952SZhao Liu {
1148fe4b9952SZhao Liu     const char *machine_type = opaque;
1149fe4b9952SZhao Liu     Object *obj = object_new(machine_type);
1150fe4b9952SZhao Liu     MachineState *ms = MACHINE(obj);
1151fe4b9952SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(obj);
1152fe4b9952SZhao Liu     SMPTestData data = {};
1153fe4b9952SZhao Liu     unsigned int num_modules = 5, num_dies = 3;
1154fe4b9952SZhao Liu     int i;
1155fe4b9952SZhao Liu 
1156fe4b9952SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
1157fe4b9952SZhao Liu         data = data_generic_valid[i];
1158fe4b9952SZhao Liu         unsupported_params_init(mc, &data);
1159fe4b9952SZhao Liu 
1160fe4b9952SZhao Liu         /*
1161fe4b9952SZhao Liu          * when modules and dies parameters are omitted, they will
1162fe4b9952SZhao Liu          * be both set as 1.
1163fe4b9952SZhao Liu          */
1164fe4b9952SZhao Liu         data.expect_prefer_sockets.modules = 1;
1165fe4b9952SZhao Liu         data.expect_prefer_sockets.dies = 1;
1166fe4b9952SZhao Liu         data.expect_prefer_cores.modules = 1;
1167fe4b9952SZhao Liu         data.expect_prefer_cores.dies = 1;
1168fe4b9952SZhao Liu 
1169fe4b9952SZhao Liu         smp_parse_test(ms, &data, true);
1170fe4b9952SZhao Liu 
1171fe4b9952SZhao Liu         /* when modules and dies parameters are both specified */
1172fe4b9952SZhao Liu         data.config.has_modules = true;
1173fe4b9952SZhao Liu         data.config.modules = num_modules;
1174fe4b9952SZhao Liu         data.config.has_dies = true;
1175fe4b9952SZhao Liu         data.config.dies = num_dies;
1176fe4b9952SZhao Liu 
1177fe4b9952SZhao Liu         if (data.config.has_cpus) {
1178fe4b9952SZhao Liu             data.config.cpus *= num_modules * num_dies;
1179fe4b9952SZhao Liu         }
1180fe4b9952SZhao Liu         if (data.config.has_maxcpus) {
1181fe4b9952SZhao Liu             data.config.maxcpus *= num_modules * num_dies;
1182fe4b9952SZhao Liu         }
1183fe4b9952SZhao Liu 
1184fe4b9952SZhao Liu         data.expect_prefer_sockets.modules = num_modules;
1185fe4b9952SZhao Liu         data.expect_prefer_sockets.dies = num_dies;
1186fe4b9952SZhao Liu         data.expect_prefer_sockets.cpus *= num_modules * num_dies;
1187fe4b9952SZhao Liu         data.expect_prefer_sockets.max_cpus *= num_modules * num_dies;
1188fe4b9952SZhao Liu 
1189fe4b9952SZhao Liu         data.expect_prefer_cores.modules = num_modules;
1190fe4b9952SZhao Liu         data.expect_prefer_cores.dies = num_dies;
1191fe4b9952SZhao Liu         data.expect_prefer_cores.cpus *= num_modules * num_dies;
1192fe4b9952SZhao Liu         data.expect_prefer_cores.max_cpus *= num_modules * num_dies;
1193fe4b9952SZhao Liu 
1194fe4b9952SZhao Liu         smp_parse_test(ms, &data, true);
1195fe4b9952SZhao Liu     }
1196fe4b9952SZhao Liu 
1197fe4b9952SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_with_modules_dies_invalid); i++) {
1198fe4b9952SZhao Liu         data = data_with_modules_dies_invalid[i];
1199fe4b9952SZhao Liu         unsupported_params_init(mc, &data);
1200fe4b9952SZhao Liu 
1201fe4b9952SZhao Liu         smp_parse_test(ms, &data, false);
1202fe4b9952SZhao Liu     }
1203fe4b9952SZhao Liu 
1204fe4b9952SZhao Liu     object_unref(obj);
1205fe4b9952SZhao Liu }
1206fe4b9952SZhao Liu 
test_with_clusters(const void * opaque)1207e5ef89aeSYanan Wang static void test_with_clusters(const void *opaque)
1208e5ef89aeSYanan Wang {
1209e5ef89aeSYanan Wang     const char *machine_type = opaque;
1210e5ef89aeSYanan Wang     Object *obj = object_new(machine_type);
1211e5ef89aeSYanan Wang     MachineState *ms = MACHINE(obj);
1212e5ef89aeSYanan Wang     MachineClass *mc = MACHINE_GET_CLASS(obj);
1213e5ef89aeSYanan Wang     SMPTestData data = {};
1214e5ef89aeSYanan Wang     unsigned int num_clusters = 2;
1215e5ef89aeSYanan Wang     int i;
1216e5ef89aeSYanan Wang 
1217e5ef89aeSYanan Wang     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
1218e5ef89aeSYanan Wang         data = data_generic_valid[i];
1219e5ef89aeSYanan Wang         unsupported_params_init(mc, &data);
1220e5ef89aeSYanan Wang 
1221e5ef89aeSYanan Wang         /* when clusters parameter is omitted, it will be set as 1 */
1222e5ef89aeSYanan Wang         data.expect_prefer_sockets.clusters = 1;
1223e5ef89aeSYanan Wang         data.expect_prefer_cores.clusters = 1;
1224e5ef89aeSYanan Wang 
1225e5ef89aeSYanan Wang         smp_parse_test(ms, &data, true);
1226e5ef89aeSYanan Wang 
1227e5ef89aeSYanan Wang         /* when clusters parameter is specified */
1228e5ef89aeSYanan Wang         data.config.has_clusters = true;
1229e5ef89aeSYanan Wang         data.config.clusters = num_clusters;
1230e5ef89aeSYanan Wang         if (data.config.has_cpus) {
1231e5ef89aeSYanan Wang             data.config.cpus *= num_clusters;
1232e5ef89aeSYanan Wang         }
1233e5ef89aeSYanan Wang         if (data.config.has_maxcpus) {
1234e5ef89aeSYanan Wang             data.config.maxcpus *= num_clusters;
1235e5ef89aeSYanan Wang         }
1236e5ef89aeSYanan Wang 
1237e5ef89aeSYanan Wang         data.expect_prefer_sockets.clusters = num_clusters;
1238e5ef89aeSYanan Wang         data.expect_prefer_sockets.cpus *= num_clusters;
1239e5ef89aeSYanan Wang         data.expect_prefer_sockets.max_cpus *= num_clusters;
1240e5ef89aeSYanan Wang         data.expect_prefer_cores.clusters = num_clusters;
1241e5ef89aeSYanan Wang         data.expect_prefer_cores.cpus *= num_clusters;
1242e5ef89aeSYanan Wang         data.expect_prefer_cores.max_cpus *= num_clusters;
1243e5ef89aeSYanan Wang 
1244e5ef89aeSYanan Wang         smp_parse_test(ms, &data, true);
1245e5ef89aeSYanan Wang     }
1246e5ef89aeSYanan Wang 
1247e5ef89aeSYanan Wang     for (i = 0; i < ARRAY_SIZE(data_with_clusters_invalid); i++) {
1248e5ef89aeSYanan Wang         data = data_with_clusters_invalid[i];
1249e5ef89aeSYanan Wang         unsupported_params_init(mc, &data);
1250e5ef89aeSYanan Wang 
1251e5ef89aeSYanan Wang         smp_parse_test(ms, &data, false);
1252e5ef89aeSYanan Wang     }
1253e5ef89aeSYanan Wang 
1254e5ef89aeSYanan Wang     object_unref(obj);
1255e5ef89aeSYanan Wang }
1256e5ef89aeSYanan Wang 
test_with_books(const void * opaque)1257f0fe1cd8SZhao Liu static void test_with_books(const void *opaque)
1258f0fe1cd8SZhao Liu {
1259f0fe1cd8SZhao Liu     const char *machine_type = opaque;
1260f0fe1cd8SZhao Liu     Object *obj = object_new(machine_type);
1261f0fe1cd8SZhao Liu     MachineState *ms = MACHINE(obj);
1262f0fe1cd8SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(obj);
1263f0fe1cd8SZhao Liu     SMPTestData data = {};
1264f0fe1cd8SZhao Liu     unsigned int num_books = 2;
1265f0fe1cd8SZhao Liu     int i;
1266f0fe1cd8SZhao Liu 
1267f0fe1cd8SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
1268f0fe1cd8SZhao Liu         data = data_generic_valid[i];
1269f0fe1cd8SZhao Liu         unsupported_params_init(mc, &data);
1270f0fe1cd8SZhao Liu 
1271f0fe1cd8SZhao Liu         /* when books parameter is omitted, it will be set as 1 */
1272f0fe1cd8SZhao Liu         data.expect_prefer_sockets.books = 1;
1273f0fe1cd8SZhao Liu         data.expect_prefer_cores.books = 1;
1274f0fe1cd8SZhao Liu 
1275f0fe1cd8SZhao Liu         smp_parse_test(ms, &data, true);
1276f0fe1cd8SZhao Liu 
1277f0fe1cd8SZhao Liu         /* when books parameter is specified */
1278f0fe1cd8SZhao Liu         data.config.has_books = true;
1279f0fe1cd8SZhao Liu         data.config.books = num_books;
1280f0fe1cd8SZhao Liu         if (data.config.has_cpus) {
1281f0fe1cd8SZhao Liu             data.config.cpus *= num_books;
1282f0fe1cd8SZhao Liu         }
1283f0fe1cd8SZhao Liu         if (data.config.has_maxcpus) {
1284f0fe1cd8SZhao Liu             data.config.maxcpus *= num_books;
1285f0fe1cd8SZhao Liu         }
1286f0fe1cd8SZhao Liu 
1287f0fe1cd8SZhao Liu         data.expect_prefer_sockets.books = num_books;
1288f0fe1cd8SZhao Liu         data.expect_prefer_sockets.cpus *= num_books;
1289f0fe1cd8SZhao Liu         data.expect_prefer_sockets.max_cpus *= num_books;
1290f0fe1cd8SZhao Liu         data.expect_prefer_cores.books = num_books;
1291f0fe1cd8SZhao Liu         data.expect_prefer_cores.cpus *= num_books;
1292f0fe1cd8SZhao Liu         data.expect_prefer_cores.max_cpus *= num_books;
1293f0fe1cd8SZhao Liu 
1294f0fe1cd8SZhao Liu         smp_parse_test(ms, &data, true);
1295f0fe1cd8SZhao Liu     }
1296f0fe1cd8SZhao Liu 
1297f0fe1cd8SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_with_books_invalid); i++) {
1298f0fe1cd8SZhao Liu         data = data_with_books_invalid[i];
1299f0fe1cd8SZhao Liu         unsupported_params_init(mc, &data);
1300f0fe1cd8SZhao Liu 
1301f0fe1cd8SZhao Liu         smp_parse_test(ms, &data, false);
1302f0fe1cd8SZhao Liu     }
1303f0fe1cd8SZhao Liu 
1304f0fe1cd8SZhao Liu     object_unref(obj);
1305f0fe1cd8SZhao Liu }
1306f0fe1cd8SZhao Liu 
test_with_drawers(const void * opaque)13075a4c4148SZhao Liu static void test_with_drawers(const void *opaque)
13085a4c4148SZhao Liu {
13095a4c4148SZhao Liu     const char *machine_type = opaque;
13105a4c4148SZhao Liu     Object *obj = object_new(machine_type);
13115a4c4148SZhao Liu     MachineState *ms = MACHINE(obj);
13125a4c4148SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(obj);
13135a4c4148SZhao Liu     SMPTestData data = {};
13145a4c4148SZhao Liu     unsigned int num_drawers = 2;
13155a4c4148SZhao Liu     int i;
13165a4c4148SZhao Liu 
13175a4c4148SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
13185a4c4148SZhao Liu         data = data_generic_valid[i];
13195a4c4148SZhao Liu         unsupported_params_init(mc, &data);
13205a4c4148SZhao Liu 
13215a4c4148SZhao Liu         /* when drawers parameter is omitted, it will be set as 1 */
13225a4c4148SZhao Liu         data.expect_prefer_sockets.drawers = 1;
13235a4c4148SZhao Liu         data.expect_prefer_cores.drawers = 1;
13245a4c4148SZhao Liu 
13255a4c4148SZhao Liu         smp_parse_test(ms, &data, true);
13265a4c4148SZhao Liu 
13275a4c4148SZhao Liu         /* when drawers parameter is specified */
13285a4c4148SZhao Liu         data.config.has_drawers = true;
13295a4c4148SZhao Liu         data.config.drawers = num_drawers;
13305a4c4148SZhao Liu         if (data.config.has_cpus) {
13315a4c4148SZhao Liu             data.config.cpus *= num_drawers;
13325a4c4148SZhao Liu         }
13335a4c4148SZhao Liu         if (data.config.has_maxcpus) {
13345a4c4148SZhao Liu             data.config.maxcpus *= num_drawers;
13355a4c4148SZhao Liu         }
13365a4c4148SZhao Liu 
13375a4c4148SZhao Liu         data.expect_prefer_sockets.drawers = num_drawers;
13385a4c4148SZhao Liu         data.expect_prefer_sockets.cpus *= num_drawers;
13395a4c4148SZhao Liu         data.expect_prefer_sockets.max_cpus *= num_drawers;
13405a4c4148SZhao Liu         data.expect_prefer_cores.drawers = num_drawers;
13415a4c4148SZhao Liu         data.expect_prefer_cores.cpus *= num_drawers;
13425a4c4148SZhao Liu         data.expect_prefer_cores.max_cpus *= num_drawers;
13435a4c4148SZhao Liu 
13445a4c4148SZhao Liu         smp_parse_test(ms, &data, true);
13455a4c4148SZhao Liu     }
13465a4c4148SZhao Liu 
13475a4c4148SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_with_drawers_invalid); i++) {
13485a4c4148SZhao Liu         data = data_with_drawers_invalid[i];
13495a4c4148SZhao Liu         unsupported_params_init(mc, &data);
13505a4c4148SZhao Liu 
13515a4c4148SZhao Liu         smp_parse_test(ms, &data, false);
13525a4c4148SZhao Liu     }
13535a4c4148SZhao Liu 
13545a4c4148SZhao Liu     object_unref(obj);
13555a4c4148SZhao Liu }
13565a4c4148SZhao Liu 
test_with_drawers_books(const void * opaque)13573f90fb08SZhao Liu static void test_with_drawers_books(const void *opaque)
13583f90fb08SZhao Liu {
13593f90fb08SZhao Liu     const char *machine_type = opaque;
13603f90fb08SZhao Liu     Object *obj = object_new(machine_type);
13613f90fb08SZhao Liu     MachineState *ms = MACHINE(obj);
13623f90fb08SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(obj);
13633f90fb08SZhao Liu     SMPTestData data = {};
13643f90fb08SZhao Liu     unsigned int num_drawers = 5, num_books = 3;
13653f90fb08SZhao Liu     int i;
13663f90fb08SZhao Liu 
13673f90fb08SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
13683f90fb08SZhao Liu         data = data_generic_valid[i];
13693f90fb08SZhao Liu         unsupported_params_init(mc, &data);
13703f90fb08SZhao Liu 
13713f90fb08SZhao Liu         /*
13723f90fb08SZhao Liu          * when drawers and books parameters are omitted, they will
13733f90fb08SZhao Liu          * be both set as 1.
13743f90fb08SZhao Liu          */
13753f90fb08SZhao Liu         data.expect_prefer_sockets.drawers = 1;
13763f90fb08SZhao Liu         data.expect_prefer_sockets.books = 1;
13773f90fb08SZhao Liu         data.expect_prefer_cores.drawers = 1;
13783f90fb08SZhao Liu         data.expect_prefer_cores.books = 1;
13793f90fb08SZhao Liu 
13803f90fb08SZhao Liu         smp_parse_test(ms, &data, true);
13813f90fb08SZhao Liu 
13823f90fb08SZhao Liu         /* when drawers and books parameters are both specified */
13833f90fb08SZhao Liu         data.config.has_drawers = true;
13843f90fb08SZhao Liu         data.config.drawers = num_drawers;
13853f90fb08SZhao Liu         data.config.has_books = true;
13863f90fb08SZhao Liu         data.config.books = num_books;
13873f90fb08SZhao Liu 
13883f90fb08SZhao Liu         if (data.config.has_cpus) {
13893f90fb08SZhao Liu             data.config.cpus *= num_drawers * num_books;
13903f90fb08SZhao Liu         }
13913f90fb08SZhao Liu         if (data.config.has_maxcpus) {
13923f90fb08SZhao Liu             data.config.maxcpus *= num_drawers * num_books;
13933f90fb08SZhao Liu         }
13943f90fb08SZhao Liu 
13953f90fb08SZhao Liu         data.expect_prefer_sockets.drawers = num_drawers;
13963f90fb08SZhao Liu         data.expect_prefer_sockets.books = num_books;
13973f90fb08SZhao Liu         data.expect_prefer_sockets.cpus *= num_drawers * num_books;
13983f90fb08SZhao Liu         data.expect_prefer_sockets.max_cpus *= num_drawers * num_books;
13993f90fb08SZhao Liu 
14003f90fb08SZhao Liu         data.expect_prefer_cores.drawers = num_drawers;
14013f90fb08SZhao Liu         data.expect_prefer_cores.books = num_books;
14023f90fb08SZhao Liu         data.expect_prefer_cores.cpus *= num_drawers * num_books;
14033f90fb08SZhao Liu         data.expect_prefer_cores.max_cpus *= num_drawers * num_books;
14043f90fb08SZhao Liu 
14053f90fb08SZhao Liu         smp_parse_test(ms, &data, true);
14063f90fb08SZhao Liu     }
14073f90fb08SZhao Liu 
14083f90fb08SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_with_drawers_books_invalid); i++) {
14093f90fb08SZhao Liu         data = data_with_drawers_books_invalid[i];
14103f90fb08SZhao Liu         unsupported_params_init(mc, &data);
14113f90fb08SZhao Liu 
14123f90fb08SZhao Liu         smp_parse_test(ms, &data, false);
14133f90fb08SZhao Liu     }
14143f90fb08SZhao Liu 
14153f90fb08SZhao Liu     object_unref(obj);
14163f90fb08SZhao Liu }
14173f90fb08SZhao Liu 
test_full_topo(const void * opaque)1418ef88e1e8SZhao Liu static void test_full_topo(const void *opaque)
1419ef88e1e8SZhao Liu {
1420ef88e1e8SZhao Liu     const char *machine_type = opaque;
1421ef88e1e8SZhao Liu     Object *obj = object_new(machine_type);
1422ef88e1e8SZhao Liu     MachineState *ms = MACHINE(obj);
1423ef88e1e8SZhao Liu     MachineClass *mc = MACHINE_GET_CLASS(obj);
1424ef88e1e8SZhao Liu     SMPTestData data = {};
1425*6a235525SZhao Liu     unsigned int drawers, books, dies, clusters, modules, multiplier;
1426ef88e1e8SZhao Liu     int i;
1427ef88e1e8SZhao Liu 
1428*6a235525SZhao Liu     drawers = 5;
1429*6a235525SZhao Liu     books = 3;
1430*6a235525SZhao Liu     dies = 2;
1431*6a235525SZhao Liu     clusters = 3;
1432*6a235525SZhao Liu     modules = 2;
1433*6a235525SZhao Liu 
1434*6a235525SZhao Liu     multiplier = drawers * books * dies * clusters * modules;
1435ef88e1e8SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_generic_valid); i++) {
1436ef88e1e8SZhao Liu         data = data_generic_valid[i];
1437ef88e1e8SZhao Liu         unsupported_params_init(mc, &data);
1438ef88e1e8SZhao Liu 
1439ef88e1e8SZhao Liu         /*
1440*6a235525SZhao Liu          * when drawers, books, dies, clusters and modules parameters are
1441*6a235525SZhao Liu          * omitted, they will be set as 1.
1442ef88e1e8SZhao Liu          */
1443ef88e1e8SZhao Liu         data.expect_prefer_sockets.drawers = 1;
1444ef88e1e8SZhao Liu         data.expect_prefer_sockets.books = 1;
1445ef88e1e8SZhao Liu         data.expect_prefer_sockets.dies = 1;
1446ef88e1e8SZhao Liu         data.expect_prefer_sockets.clusters = 1;
1447*6a235525SZhao Liu         data.expect_prefer_sockets.modules = 1;
1448ef88e1e8SZhao Liu         data.expect_prefer_cores.drawers = 1;
1449ef88e1e8SZhao Liu         data.expect_prefer_cores.books = 1;
1450ef88e1e8SZhao Liu         data.expect_prefer_cores.dies = 1;
1451ef88e1e8SZhao Liu         data.expect_prefer_cores.clusters = 1;
1452*6a235525SZhao Liu         data.expect_prefer_cores.modules = 1;
1453ef88e1e8SZhao Liu 
1454ef88e1e8SZhao Liu         smp_parse_test(ms, &data, true);
1455ef88e1e8SZhao Liu 
1456*6a235525SZhao Liu         /*
1457*6a235525SZhao Liu          * when drawers, books, dies, clusters and modules parameters
1458*6a235525SZhao Liu          * are specified.
1459*6a235525SZhao Liu          */
1460ef88e1e8SZhao Liu         data.config.has_drawers = true;
1461ef88e1e8SZhao Liu         data.config.drawers = drawers;
1462ef88e1e8SZhao Liu         data.config.has_books = true;
1463ef88e1e8SZhao Liu         data.config.books = books;
1464ef88e1e8SZhao Liu         data.config.has_dies = true;
1465ef88e1e8SZhao Liu         data.config.dies = dies;
1466ef88e1e8SZhao Liu         data.config.has_clusters = true;
1467ef88e1e8SZhao Liu         data.config.clusters = clusters;
1468*6a235525SZhao Liu         data.config.has_modules = true;
1469*6a235525SZhao Liu         data.config.modules = modules;
1470ef88e1e8SZhao Liu 
1471ef88e1e8SZhao Liu         if (data.config.has_cpus) {
1472ef88e1e8SZhao Liu             data.config.cpus *= multiplier;
1473ef88e1e8SZhao Liu         }
1474ef88e1e8SZhao Liu         if (data.config.has_maxcpus) {
1475ef88e1e8SZhao Liu             data.config.maxcpus *= multiplier;
1476ef88e1e8SZhao Liu         }
1477ef88e1e8SZhao Liu 
1478ef88e1e8SZhao Liu         data.expect_prefer_sockets.drawers = drawers;
1479ef88e1e8SZhao Liu         data.expect_prefer_sockets.books = books;
1480ef88e1e8SZhao Liu         data.expect_prefer_sockets.dies = dies;
1481ef88e1e8SZhao Liu         data.expect_prefer_sockets.clusters = clusters;
1482*6a235525SZhao Liu         data.expect_prefer_sockets.modules = modules;
1483ef88e1e8SZhao Liu         data.expect_prefer_sockets.cpus *= multiplier;
1484ef88e1e8SZhao Liu         data.expect_prefer_sockets.max_cpus *= multiplier;
1485ef88e1e8SZhao Liu 
1486ef88e1e8SZhao Liu         data.expect_prefer_cores.drawers = drawers;
1487ef88e1e8SZhao Liu         data.expect_prefer_cores.books = books;
1488ef88e1e8SZhao Liu         data.expect_prefer_cores.dies = dies;
1489ef88e1e8SZhao Liu         data.expect_prefer_cores.clusters = clusters;
1490*6a235525SZhao Liu         data.expect_prefer_cores.modules = modules;
1491ef88e1e8SZhao Liu         data.expect_prefer_cores.cpus *= multiplier;
1492ef88e1e8SZhao Liu         data.expect_prefer_cores.max_cpus *= multiplier;
1493ef88e1e8SZhao Liu 
1494ef88e1e8SZhao Liu         smp_parse_test(ms, &data, true);
1495ef88e1e8SZhao Liu     }
1496ef88e1e8SZhao Liu 
1497ef88e1e8SZhao Liu     for (i = 0; i < ARRAY_SIZE(data_full_topo_invalid); i++) {
1498ef88e1e8SZhao Liu         data = data_full_topo_invalid[i];
1499ef88e1e8SZhao Liu         unsupported_params_init(mc, &data);
1500ef88e1e8SZhao Liu 
1501ef88e1e8SZhao Liu         smp_parse_test(ms, &data, false);
1502ef88e1e8SZhao Liu     }
1503ef88e1e8SZhao Liu 
1504bb829cdeSZhao Liu     for (i = 0; i < ARRAY_SIZE(data_zero_topo_invalid); i++) {
1505bb829cdeSZhao Liu         data = data_zero_topo_invalid[i];
1506bb829cdeSZhao Liu         unsupported_params_init(mc, &data);
1507bb829cdeSZhao Liu 
1508bb829cdeSZhao Liu         smp_parse_test(ms, &data, false);
1509bb829cdeSZhao Liu     }
1510bb829cdeSZhao Liu 
1511ef88e1e8SZhao Liu     object_unref(obj);
1512ef88e1e8SZhao Liu }
1513ef88e1e8SZhao Liu 
1514c3440effSPhilippe Mathieu-Daudé /* Type info of the tested machine */
1515c3440effSPhilippe Mathieu-Daudé static const TypeInfo smp_machine_types[] = {
1516c3440effSPhilippe Mathieu-Daudé     {
1517c3440effSPhilippe Mathieu-Daudé         .name           = TYPE_MACHINE,
1518c3440effSPhilippe Mathieu-Daudé         .parent         = TYPE_OBJECT,
15192dc426c4SPhilippe Mathieu-Daudé         .abstract       = true,
1520c3440effSPhilippe Mathieu-Daudé         .class_init     = machine_base_class_init,
1521c3440effSPhilippe Mathieu-Daudé         .class_size     = sizeof(MachineClass),
1522c3440effSPhilippe Mathieu-Daudé         .instance_size  = sizeof(MachineState),
152376b6d4ccSPhilippe Mathieu-Daudé     }, {
15242dc426c4SPhilippe Mathieu-Daudé         .name           = MACHINE_TYPE_NAME("smp-generic-valid"),
15252dc426c4SPhilippe Mathieu-Daudé         .parent         = TYPE_MACHINE,
15262dc426c4SPhilippe Mathieu-Daudé     }, {
15277ca0705eSPhilippe Mathieu-Daudé         .name           = MACHINE_TYPE_NAME("smp-generic-invalid"),
15287ca0705eSPhilippe Mathieu-Daudé         .parent         = TYPE_MACHINE,
15297ca0705eSPhilippe Mathieu-Daudé         .class_init     = machine_generic_invalid_class_init,
15307ca0705eSPhilippe Mathieu-Daudé     }, {
1531a05ed358SZhao Liu         .name           = MACHINE_TYPE_NAME("smp-with-modules"),
1532a05ed358SZhao Liu         .parent         = TYPE_MACHINE,
1533a05ed358SZhao Liu         .class_init     = machine_with_modules_class_init,
1534a05ed358SZhao Liu     }, {
153576b6d4ccSPhilippe Mathieu-Daudé         .name           = MACHINE_TYPE_NAME("smp-with-dies"),
153676b6d4ccSPhilippe Mathieu-Daudé         .parent         = TYPE_MACHINE,
153776b6d4ccSPhilippe Mathieu-Daudé         .class_init     = machine_with_dies_class_init,
1538e5ef89aeSYanan Wang     }, {
1539fe4b9952SZhao Liu         .name           = MACHINE_TYPE_NAME("smp-with-modules-dies"),
1540fe4b9952SZhao Liu         .parent         = TYPE_MACHINE,
1541fe4b9952SZhao Liu         .class_init     = machine_with_modules_dies_class_init,
1542fe4b9952SZhao Liu     }, {
1543e5ef89aeSYanan Wang         .name           = MACHINE_TYPE_NAME("smp-with-clusters"),
1544e5ef89aeSYanan Wang         .parent         = TYPE_MACHINE,
1545e5ef89aeSYanan Wang         .class_init     = machine_with_clusters_class_init,
1546f0fe1cd8SZhao Liu     }, {
1547f0fe1cd8SZhao Liu         .name           = MACHINE_TYPE_NAME("smp-with-books"),
1548f0fe1cd8SZhao Liu         .parent         = TYPE_MACHINE,
1549f0fe1cd8SZhao Liu         .class_init     = machine_with_books_class_init,
15505a4c4148SZhao Liu     }, {
15515a4c4148SZhao Liu         .name           = MACHINE_TYPE_NAME("smp-with-drawers"),
15525a4c4148SZhao Liu         .parent         = TYPE_MACHINE,
15535a4c4148SZhao Liu         .class_init     = machine_with_drawers_class_init,
15543f90fb08SZhao Liu     }, {
15553f90fb08SZhao Liu         .name           = MACHINE_TYPE_NAME("smp-with-drawers-books"),
15563f90fb08SZhao Liu         .parent         = TYPE_MACHINE,
15573f90fb08SZhao Liu         .class_init     = machine_with_drawers_books_class_init,
1558ef88e1e8SZhao Liu     }, {
1559ef88e1e8SZhao Liu         .name           = MACHINE_TYPE_NAME("smp-full-topo"),
1560ef88e1e8SZhao Liu         .parent         = TYPE_MACHINE,
1561ef88e1e8SZhao Liu         .class_init     = machine_full_topo_class_init,
1562c3440effSPhilippe Mathieu-Daudé     }
1563c3440effSPhilippe Mathieu-Daudé };
1564c3440effSPhilippe Mathieu-Daudé 
DEFINE_TYPES(smp_machine_types)1565c3440effSPhilippe Mathieu-Daudé DEFINE_TYPES(smp_machine_types)
1566c3440effSPhilippe Mathieu-Daudé 
15679e8e393bSYanan Wang int main(int argc, char *argv[])
15689e8e393bSYanan Wang {
15699e8e393bSYanan Wang     module_call_init(MODULE_INIT_QOM);
1570c3440effSPhilippe Mathieu-Daudé 
1571c3440effSPhilippe Mathieu-Daudé     g_test_init(&argc, &argv, NULL);
15729e8e393bSYanan Wang 
1573c30bdb02SPhilippe Mathieu-Daudé     g_test_add_data_func("/test-smp-parse/generic/valid",
15742dc426c4SPhilippe Mathieu-Daudé                          MACHINE_TYPE_NAME("smp-generic-valid"),
1575c30bdb02SPhilippe Mathieu-Daudé                          test_generic_valid);
1576c30bdb02SPhilippe Mathieu-Daudé     g_test_add_data_func("/test-smp-parse/generic/invalid",
15777ca0705eSPhilippe Mathieu-Daudé                          MACHINE_TYPE_NAME("smp-generic-invalid"),
1578c30bdb02SPhilippe Mathieu-Daudé                          test_generic_invalid);
1579a05ed358SZhao Liu     g_test_add_data_func("/test-smp-parse/with_modules",
1580a05ed358SZhao Liu                          MACHINE_TYPE_NAME("smp-with-modules"),
1581a05ed358SZhao Liu                          test_with_modules);
15821ab192f3SPhilippe Mathieu-Daudé     g_test_add_data_func("/test-smp-parse/with_dies",
158376b6d4ccSPhilippe Mathieu-Daudé                          MACHINE_TYPE_NAME("smp-with-dies"),
15841ab192f3SPhilippe Mathieu-Daudé                          test_with_dies);
1585fe4b9952SZhao Liu     g_test_add_data_func("/test-smp-parse/with_modules_dies",
1586fe4b9952SZhao Liu                          MACHINE_TYPE_NAME("smp-with-modules-dies"),
1587fe4b9952SZhao Liu                          test_with_modules_dies);
1588e5ef89aeSYanan Wang     g_test_add_data_func("/test-smp-parse/with_clusters",
1589e5ef89aeSYanan Wang                          MACHINE_TYPE_NAME("smp-with-clusters"),
1590e5ef89aeSYanan Wang                          test_with_clusters);
1591f0fe1cd8SZhao Liu     g_test_add_data_func("/test-smp-parse/with_books",
1592f0fe1cd8SZhao Liu                          MACHINE_TYPE_NAME("smp-with-books"),
1593f0fe1cd8SZhao Liu                          test_with_books);
15945a4c4148SZhao Liu     g_test_add_data_func("/test-smp-parse/with_drawers",
15955a4c4148SZhao Liu                          MACHINE_TYPE_NAME("smp-with-drawers"),
15965a4c4148SZhao Liu                          test_with_drawers);
15973f90fb08SZhao Liu     g_test_add_data_func("/test-smp-parse/with_drawers_books",
15983f90fb08SZhao Liu                          MACHINE_TYPE_NAME("smp-with-drawers-books"),
15993f90fb08SZhao Liu                          test_with_drawers_books);
1600ef88e1e8SZhao Liu     g_test_add_data_func("/test-smp-parse/full",
1601ef88e1e8SZhao Liu                          MACHINE_TYPE_NAME("smp-full-topo"),
1602ef88e1e8SZhao Liu                          test_full_topo);
16039e8e393bSYanan Wang 
16049e8e393bSYanan Wang     g_test_run();
16059e8e393bSYanan Wang 
16069e8e393bSYanan Wang     return 0;
16079e8e393bSYanan Wang }
1608