1bf2a38d4SAnthony Liguori /*
2bf2a38d4SAnthony Liguori * qtest fw_cfg test case
3bf2a38d4SAnthony Liguori *
4bf2a38d4SAnthony Liguori * Copyright IBM, Corp. 2012-2013
5bf2a38d4SAnthony Liguori *
6bf2a38d4SAnthony Liguori * Authors:
7bf2a38d4SAnthony Liguori * Anthony Liguori <aliguori@us.ibm.com>
8bf2a38d4SAnthony Liguori *
9bf2a38d4SAnthony Liguori * This work is licensed under the terms of the GNU GPL, version 2 or later.
10bf2a38d4SAnthony Liguori * See the COPYING file in the top-level directory.
11bf2a38d4SAnthony Liguori */
12bf2a38d4SAnthony Liguori
13681c28a3SPeter Maydell #include "qemu/osdep.h"
14bf2a38d4SAnthony Liguori
15*907b5105SMarc-André Lureau #include "libqtest.h"
165be5df72SMarc-André Lureau #include "standard-headers/linux/qemu_fw_cfg.h"
1791f32b0cSStefan Hajnoczi #include "libqos/fw_cfg.h"
18b41e912fSLi Qiang #include "qemu/bswap.h"
1991f32b0cSStefan Hajnoczi
20bf2a38d4SAnthony Liguori static uint64_t ram_size = 128 << 20;
21bf2a38d4SAnthony Liguori static uint16_t nb_cpus = 1;
22bf2a38d4SAnthony Liguori static uint16_t max_cpus = 1;
23bf2a38d4SAnthony Liguori static uint64_t nb_nodes = 0;
24bf2a38d4SAnthony Liguori static uint16_t boot_menu = 0;
25bf2a38d4SAnthony Liguori
test_fw_cfg_signature(void)26bf2a38d4SAnthony Liguori static void test_fw_cfg_signature(void)
27bf2a38d4SAnthony Liguori {
287a44091dSLi Qiang QFWCFG *fw_cfg;
297a44091dSLi Qiang QTestState *s;
30bf2a38d4SAnthony Liguori char buf[5];
31bf2a38d4SAnthony Liguori
327a44091dSLi Qiang s = qtest_init("");
337a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
347a44091dSLi Qiang
35bf2a38d4SAnthony Liguori qfw_cfg_get(fw_cfg, FW_CFG_SIGNATURE, buf, 4);
36bf2a38d4SAnthony Liguori buf[4] = 0;
37bf2a38d4SAnthony Liguori
38bf2a38d4SAnthony Liguori g_assert_cmpstr(buf, ==, "QEMU");
397a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
407a44091dSLi Qiang qtest_quit(s);
41bf2a38d4SAnthony Liguori }
42bf2a38d4SAnthony Liguori
test_fw_cfg_id(void)43bf2a38d4SAnthony Liguori static void test_fw_cfg_id(void)
44bf2a38d4SAnthony Liguori {
457a44091dSLi Qiang QFWCFG *fw_cfg;
467a44091dSLi Qiang QTestState *s;
477a44091dSLi Qiang uint32_t id;
487a44091dSLi Qiang
497a44091dSLi Qiang s = qtest_init("");
507a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
517a44091dSLi Qiang
527a44091dSLi Qiang id = qfw_cfg_get_u32(fw_cfg, FW_CFG_ID);
53a4c0d1deSMarc Marí g_assert((id == 1) ||
54a4c0d1deSMarc Marí (id == 3));
557a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
567a44091dSLi Qiang qtest_quit(s);
57bf2a38d4SAnthony Liguori }
58bf2a38d4SAnthony Liguori
test_fw_cfg_uuid(void)59bf2a38d4SAnthony Liguori static void test_fw_cfg_uuid(void)
60bf2a38d4SAnthony Liguori {
617a44091dSLi Qiang QFWCFG *fw_cfg;
627a44091dSLi Qiang QTestState *s;
637a44091dSLi Qiang
64bf2a38d4SAnthony Liguori uint8_t buf[16];
65bf2a38d4SAnthony Liguori static const uint8_t uuid[16] = {
66bf2a38d4SAnthony Liguori 0x46, 0x00, 0xcb, 0x32, 0x38, 0xec, 0x4b, 0x2f,
67bf2a38d4SAnthony Liguori 0x8a, 0xcb, 0x81, 0xc6, 0xea, 0x54, 0xf2, 0xd8,
68bf2a38d4SAnthony Liguori };
69bf2a38d4SAnthony Liguori
707a44091dSLi Qiang s = qtest_init("-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8");
717a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
727a44091dSLi Qiang
73bf2a38d4SAnthony Liguori qfw_cfg_get(fw_cfg, FW_CFG_UUID, buf, 16);
74bf2a38d4SAnthony Liguori g_assert(memcmp(buf, uuid, sizeof(buf)) == 0);
757a44091dSLi Qiang
767a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
777a44091dSLi Qiang qtest_quit(s);
787a44091dSLi Qiang
79bf2a38d4SAnthony Liguori }
80bf2a38d4SAnthony Liguori
test_fw_cfg_ram_size(void)81bf2a38d4SAnthony Liguori static void test_fw_cfg_ram_size(void)
82bf2a38d4SAnthony Liguori {
837a44091dSLi Qiang QFWCFG *fw_cfg;
847a44091dSLi Qiang QTestState *s;
857a44091dSLi Qiang
867a44091dSLi Qiang s = qtest_init("");
877a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
887a44091dSLi Qiang
89bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u64(fw_cfg, FW_CFG_RAM_SIZE), ==, ram_size);
907a44091dSLi Qiang
917a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
927a44091dSLi Qiang qtest_quit(s);
93bf2a38d4SAnthony Liguori }
94bf2a38d4SAnthony Liguori
test_fw_cfg_nographic(void)95bf2a38d4SAnthony Liguori static void test_fw_cfg_nographic(void)
96bf2a38d4SAnthony Liguori {
977a44091dSLi Qiang QFWCFG *fw_cfg;
987a44091dSLi Qiang QTestState *s;
997a44091dSLi Qiang
1007a44091dSLi Qiang s = qtest_init("");
1017a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
1027a44091dSLi Qiang
103bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_NOGRAPHIC), ==, 0);
1047a44091dSLi Qiang
1057a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
1067a44091dSLi Qiang qtest_quit(s);
107bf2a38d4SAnthony Liguori }
108bf2a38d4SAnthony Liguori
test_fw_cfg_nb_cpus(void)109bf2a38d4SAnthony Liguori static void test_fw_cfg_nb_cpus(void)
110bf2a38d4SAnthony Liguori {
1117a44091dSLi Qiang QFWCFG *fw_cfg;
1127a44091dSLi Qiang QTestState *s;
1137a44091dSLi Qiang
1147a44091dSLi Qiang s = qtest_init("");
1157a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
1167a44091dSLi Qiang
117bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_NB_CPUS), ==, nb_cpus);
1187a44091dSLi Qiang
1197a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
1207a44091dSLi Qiang qtest_quit(s);
121bf2a38d4SAnthony Liguori }
122bf2a38d4SAnthony Liguori
test_fw_cfg_max_cpus(void)123bf2a38d4SAnthony Liguori static void test_fw_cfg_max_cpus(void)
124bf2a38d4SAnthony Liguori {
1257a44091dSLi Qiang QFWCFG *fw_cfg;
1267a44091dSLi Qiang QTestState *s;
1277a44091dSLi Qiang
1287a44091dSLi Qiang s = qtest_init("");
1297a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
1307a44091dSLi Qiang
131bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_MAX_CPUS), ==, max_cpus);
1327a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
1337a44091dSLi Qiang qtest_quit(s);
134bf2a38d4SAnthony Liguori }
135bf2a38d4SAnthony Liguori
test_fw_cfg_numa(void)136bf2a38d4SAnthony Liguori static void test_fw_cfg_numa(void)
137bf2a38d4SAnthony Liguori {
1387a44091dSLi Qiang QFWCFG *fw_cfg;
1397a44091dSLi Qiang QTestState *s;
140bf2a38d4SAnthony Liguori uint64_t *cpu_mask;
141bf2a38d4SAnthony Liguori uint64_t *node_mask;
142bf2a38d4SAnthony Liguori
1437a44091dSLi Qiang s = qtest_init("");
1447a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
1457a44091dSLi Qiang
146bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u64(fw_cfg, FW_CFG_NUMA), ==, nb_nodes);
147bf2a38d4SAnthony Liguori
148790bbb97SMarc-André Lureau cpu_mask = g_new0(uint64_t, max_cpus);
149790bbb97SMarc-André Lureau node_mask = g_new0(uint64_t, nb_nodes);
150bf2a38d4SAnthony Liguori
151bf2a38d4SAnthony Liguori qfw_cfg_read_data(fw_cfg, cpu_mask, sizeof(uint64_t) * max_cpus);
152bf2a38d4SAnthony Liguori qfw_cfg_read_data(fw_cfg, node_mask, sizeof(uint64_t) * nb_nodes);
153bf2a38d4SAnthony Liguori
154bf2a38d4SAnthony Liguori if (nb_nodes) {
155bf2a38d4SAnthony Liguori g_assert(cpu_mask[0] & 0x01);
156bf2a38d4SAnthony Liguori g_assert_cmpint(node_mask[0], ==, ram_size);
157bf2a38d4SAnthony Liguori }
158bf2a38d4SAnthony Liguori
159bf2a38d4SAnthony Liguori g_free(node_mask);
160bf2a38d4SAnthony Liguori g_free(cpu_mask);
1617a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
1627a44091dSLi Qiang qtest_quit(s);
163bf2a38d4SAnthony Liguori }
164bf2a38d4SAnthony Liguori
test_fw_cfg_boot_menu(void)165bf2a38d4SAnthony Liguori static void test_fw_cfg_boot_menu(void)
166bf2a38d4SAnthony Liguori {
1677a44091dSLi Qiang QFWCFG *fw_cfg;
1687a44091dSLi Qiang QTestState *s;
1697a44091dSLi Qiang
1707a44091dSLi Qiang s = qtest_init("");
1717a44091dSLi Qiang fw_cfg = pc_fw_cfg_init(s);
1727a44091dSLi Qiang
173bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_BOOT_MENU), ==, boot_menu);
1747a44091dSLi Qiang pc_fw_cfg_uninit(fw_cfg);
1757a44091dSLi Qiang qtest_quit(s);
176bf2a38d4SAnthony Liguori }
177bf2a38d4SAnthony Liguori
test_fw_cfg_reboot_timeout(void)178b41e912fSLi Qiang static void test_fw_cfg_reboot_timeout(void)
179b41e912fSLi Qiang {
180b41e912fSLi Qiang QFWCFG *fw_cfg;
181b41e912fSLi Qiang QTestState *s;
182b41e912fSLi Qiang uint32_t reboot_timeout = 0;
183b41e912fSLi Qiang size_t filesize;
184b41e912fSLi Qiang
185b41e912fSLi Qiang s = qtest_init("-boot reboot-timeout=15");
186b41e912fSLi Qiang fw_cfg = pc_fw_cfg_init(s);
187b41e912fSLi Qiang
188b41e912fSLi Qiang filesize = qfw_cfg_get_file(fw_cfg, "etc/boot-fail-wait",
189b41e912fSLi Qiang &reboot_timeout, sizeof(reboot_timeout));
190b41e912fSLi Qiang g_assert_cmpint(filesize, ==, sizeof(reboot_timeout));
191b41e912fSLi Qiang reboot_timeout = le32_to_cpu(reboot_timeout);
192b41e912fSLi Qiang g_assert_cmpint(reboot_timeout, ==, 15);
193b41e912fSLi Qiang pc_fw_cfg_uninit(fw_cfg);
194b41e912fSLi Qiang qtest_quit(s);
195b41e912fSLi Qiang }
196b41e912fSLi Qiang
test_fw_cfg_no_reboot_timeout(void)197eda4e62cSPhilippe Mathieu-Daudé static void test_fw_cfg_no_reboot_timeout(void)
198eda4e62cSPhilippe Mathieu-Daudé {
199eda4e62cSPhilippe Mathieu-Daudé QFWCFG *fw_cfg;
200eda4e62cSPhilippe Mathieu-Daudé QTestState *s;
201eda4e62cSPhilippe Mathieu-Daudé uint32_t reboot_timeout = 0;
202eda4e62cSPhilippe Mathieu-Daudé size_t filesize;
203eda4e62cSPhilippe Mathieu-Daudé
204eda4e62cSPhilippe Mathieu-Daudé /* Special value -1 means "don't reboot" */
205eda4e62cSPhilippe Mathieu-Daudé s = qtest_init("-boot reboot-timeout=-1");
206eda4e62cSPhilippe Mathieu-Daudé fw_cfg = pc_fw_cfg_init(s);
207eda4e62cSPhilippe Mathieu-Daudé
208eda4e62cSPhilippe Mathieu-Daudé filesize = qfw_cfg_get_file(fw_cfg, "etc/boot-fail-wait",
209eda4e62cSPhilippe Mathieu-Daudé &reboot_timeout, sizeof(reboot_timeout));
210eda4e62cSPhilippe Mathieu-Daudé g_assert_cmpint(filesize, ==, sizeof(reboot_timeout));
211eda4e62cSPhilippe Mathieu-Daudé reboot_timeout = le32_to_cpu(reboot_timeout);
212eda4e62cSPhilippe Mathieu-Daudé g_assert_cmpint(reboot_timeout, ==, UINT32_MAX);
213eda4e62cSPhilippe Mathieu-Daudé pc_fw_cfg_uninit(fw_cfg);
214eda4e62cSPhilippe Mathieu-Daudé qtest_quit(s);
215eda4e62cSPhilippe Mathieu-Daudé }
216eda4e62cSPhilippe Mathieu-Daudé
test_fw_cfg_splash_time(void)2173ae9dd1aSLi Qiang static void test_fw_cfg_splash_time(void)
2183ae9dd1aSLi Qiang {
2193ae9dd1aSLi Qiang QFWCFG *fw_cfg;
2203ae9dd1aSLi Qiang QTestState *s;
2213ae9dd1aSLi Qiang uint16_t splash_time = 0;
2223ae9dd1aSLi Qiang size_t filesize;
2233ae9dd1aSLi Qiang
2243ae9dd1aSLi Qiang s = qtest_init("-boot splash-time=12");
2253ae9dd1aSLi Qiang fw_cfg = pc_fw_cfg_init(s);
2263ae9dd1aSLi Qiang
2273ae9dd1aSLi Qiang filesize = qfw_cfg_get_file(fw_cfg, "etc/boot-menu-wait",
2283ae9dd1aSLi Qiang &splash_time, sizeof(splash_time));
2293ae9dd1aSLi Qiang g_assert_cmpint(filesize, ==, sizeof(splash_time));
2303ae9dd1aSLi Qiang splash_time = le16_to_cpu(splash_time);
2313ae9dd1aSLi Qiang g_assert_cmpint(splash_time, ==, 12);
2323ae9dd1aSLi Qiang pc_fw_cfg_uninit(fw_cfg);
2333ae9dd1aSLi Qiang qtest_quit(s);
2343ae9dd1aSLi Qiang }
2353ae9dd1aSLi Qiang
main(int argc,char ** argv)236bf2a38d4SAnthony Liguori int main(int argc, char **argv)
237bf2a38d4SAnthony Liguori {
238bf2a38d4SAnthony Liguori g_test_init(&argc, &argv, NULL);
239bf2a38d4SAnthony Liguori
24053850b88SAndreas Färber qtest_add_func("fw_cfg/signature", test_fw_cfg_signature);
24153850b88SAndreas Färber qtest_add_func("fw_cfg/id", test_fw_cfg_id);
24253850b88SAndreas Färber qtest_add_func("fw_cfg/uuid", test_fw_cfg_uuid);
24353850b88SAndreas Färber qtest_add_func("fw_cfg/ram_size", test_fw_cfg_ram_size);
24453850b88SAndreas Färber qtest_add_func("fw_cfg/nographic", test_fw_cfg_nographic);
24553850b88SAndreas Färber qtest_add_func("fw_cfg/nb_cpus", test_fw_cfg_nb_cpus);
24653850b88SAndreas Färber qtest_add_func("fw_cfg/max_cpus", test_fw_cfg_max_cpus);
24753850b88SAndreas Färber qtest_add_func("fw_cfg/numa", test_fw_cfg_numa);
24853850b88SAndreas Färber qtest_add_func("fw_cfg/boot_menu", test_fw_cfg_boot_menu);
249b41e912fSLi Qiang qtest_add_func("fw_cfg/reboot_timeout", test_fw_cfg_reboot_timeout);
250eda4e62cSPhilippe Mathieu-Daudé qtest_add_func("fw_cfg/no_reboot_timeout", test_fw_cfg_no_reboot_timeout);
2513ae9dd1aSLi Qiang qtest_add_func("fw_cfg/splash_time", test_fw_cfg_splash_time);
252bf2a38d4SAnthony Liguori
2537a44091dSLi Qiang return g_test_run();
254bf2a38d4SAnthony Liguori }
255