1*bf2a38d4SAnthony Liguori /* 2*bf2a38d4SAnthony Liguori * qtest fw_cfg test case 3*bf2a38d4SAnthony Liguori * 4*bf2a38d4SAnthony Liguori * Copyright IBM, Corp. 2012-2013 5*bf2a38d4SAnthony Liguori * 6*bf2a38d4SAnthony Liguori * Authors: 7*bf2a38d4SAnthony Liguori * Anthony Liguori <aliguori@us.ibm.com> 8*bf2a38d4SAnthony Liguori * 9*bf2a38d4SAnthony Liguori * This work is licensed under the terms of the GNU GPL, version 2 or later. 10*bf2a38d4SAnthony Liguori * See the COPYING file in the top-level directory. 11*bf2a38d4SAnthony Liguori */ 12*bf2a38d4SAnthony Liguori 13*bf2a38d4SAnthony Liguori #define NO_QEMU_PROTOS 14*bf2a38d4SAnthony Liguori 15*bf2a38d4SAnthony Liguori #include "libqtest.h" 16*bf2a38d4SAnthony Liguori #include "hw/nvram/fw_cfg.h" 17*bf2a38d4SAnthony Liguori #include "libqos/fw_cfg-pc.h" 18*bf2a38d4SAnthony Liguori 19*bf2a38d4SAnthony Liguori #include <string.h> 20*bf2a38d4SAnthony Liguori #include <glib.h> 21*bf2a38d4SAnthony Liguori 22*bf2a38d4SAnthony Liguori static uint64_t ram_size = 128 << 20; 23*bf2a38d4SAnthony Liguori static uint16_t nb_cpus = 1; 24*bf2a38d4SAnthony Liguori static uint16_t max_cpus = 1; 25*bf2a38d4SAnthony Liguori static uint64_t nb_nodes = 0; 26*bf2a38d4SAnthony Liguori static uint16_t boot_menu = 0; 27*bf2a38d4SAnthony Liguori static QFWCFG *fw_cfg = NULL; 28*bf2a38d4SAnthony Liguori 29*bf2a38d4SAnthony Liguori static void test_fw_cfg_signature(void) 30*bf2a38d4SAnthony Liguori { 31*bf2a38d4SAnthony Liguori char buf[5]; 32*bf2a38d4SAnthony Liguori 33*bf2a38d4SAnthony Liguori qfw_cfg_get(fw_cfg, FW_CFG_SIGNATURE, buf, 4); 34*bf2a38d4SAnthony Liguori buf[4] = 0; 35*bf2a38d4SAnthony Liguori 36*bf2a38d4SAnthony Liguori g_assert_cmpstr(buf, ==, "QEMU"); 37*bf2a38d4SAnthony Liguori } 38*bf2a38d4SAnthony Liguori 39*bf2a38d4SAnthony Liguori static void test_fw_cfg_id(void) 40*bf2a38d4SAnthony Liguori { 41*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u32(fw_cfg, FW_CFG_ID), ==, 1); 42*bf2a38d4SAnthony Liguori } 43*bf2a38d4SAnthony Liguori 44*bf2a38d4SAnthony Liguori static void test_fw_cfg_uuid(void) 45*bf2a38d4SAnthony Liguori { 46*bf2a38d4SAnthony Liguori uint8_t buf[16]; 47*bf2a38d4SAnthony Liguori static const uint8_t uuid[16] = { 48*bf2a38d4SAnthony Liguori 0x46, 0x00, 0xcb, 0x32, 0x38, 0xec, 0x4b, 0x2f, 49*bf2a38d4SAnthony Liguori 0x8a, 0xcb, 0x81, 0xc6, 0xea, 0x54, 0xf2, 0xd8, 50*bf2a38d4SAnthony Liguori }; 51*bf2a38d4SAnthony Liguori 52*bf2a38d4SAnthony Liguori qfw_cfg_get(fw_cfg, FW_CFG_UUID, buf, 16); 53*bf2a38d4SAnthony Liguori g_assert(memcmp(buf, uuid, sizeof(buf)) == 0); 54*bf2a38d4SAnthony Liguori } 55*bf2a38d4SAnthony Liguori 56*bf2a38d4SAnthony Liguori static void test_fw_cfg_ram_size(void) 57*bf2a38d4SAnthony Liguori { 58*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u64(fw_cfg, FW_CFG_RAM_SIZE), ==, ram_size); 59*bf2a38d4SAnthony Liguori } 60*bf2a38d4SAnthony Liguori 61*bf2a38d4SAnthony Liguori static void test_fw_cfg_nographic(void) 62*bf2a38d4SAnthony Liguori { 63*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_NOGRAPHIC), ==, 0); 64*bf2a38d4SAnthony Liguori } 65*bf2a38d4SAnthony Liguori 66*bf2a38d4SAnthony Liguori static void test_fw_cfg_nb_cpus(void) 67*bf2a38d4SAnthony Liguori { 68*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_NB_CPUS), ==, nb_cpus); 69*bf2a38d4SAnthony Liguori } 70*bf2a38d4SAnthony Liguori 71*bf2a38d4SAnthony Liguori static void test_fw_cfg_max_cpus(void) 72*bf2a38d4SAnthony Liguori { 73*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_MAX_CPUS), ==, max_cpus); 74*bf2a38d4SAnthony Liguori } 75*bf2a38d4SAnthony Liguori 76*bf2a38d4SAnthony Liguori static void test_fw_cfg_numa(void) 77*bf2a38d4SAnthony Liguori { 78*bf2a38d4SAnthony Liguori uint64_t *cpu_mask; 79*bf2a38d4SAnthony Liguori uint64_t *node_mask; 80*bf2a38d4SAnthony Liguori 81*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u64(fw_cfg, FW_CFG_NUMA), ==, nb_nodes); 82*bf2a38d4SAnthony Liguori 83*bf2a38d4SAnthony Liguori cpu_mask = g_malloc0(sizeof(uint64_t) * max_cpus); 84*bf2a38d4SAnthony Liguori node_mask = g_malloc0(sizeof(uint64_t) * nb_nodes); 85*bf2a38d4SAnthony Liguori 86*bf2a38d4SAnthony Liguori qfw_cfg_read_data(fw_cfg, cpu_mask, sizeof(uint64_t) * max_cpus); 87*bf2a38d4SAnthony Liguori qfw_cfg_read_data(fw_cfg, node_mask, sizeof(uint64_t) * nb_nodes); 88*bf2a38d4SAnthony Liguori 89*bf2a38d4SAnthony Liguori if (nb_nodes) { 90*bf2a38d4SAnthony Liguori g_assert(cpu_mask[0] & 0x01); 91*bf2a38d4SAnthony Liguori g_assert_cmpint(node_mask[0], ==, ram_size); 92*bf2a38d4SAnthony Liguori } 93*bf2a38d4SAnthony Liguori 94*bf2a38d4SAnthony Liguori g_free(node_mask); 95*bf2a38d4SAnthony Liguori g_free(cpu_mask); 96*bf2a38d4SAnthony Liguori } 97*bf2a38d4SAnthony Liguori 98*bf2a38d4SAnthony Liguori static void test_fw_cfg_boot_menu(void) 99*bf2a38d4SAnthony Liguori { 100*bf2a38d4SAnthony Liguori g_assert_cmpint(qfw_cfg_get_u16(fw_cfg, FW_CFG_BOOT_MENU), ==, boot_menu); 101*bf2a38d4SAnthony Liguori } 102*bf2a38d4SAnthony Liguori 103*bf2a38d4SAnthony Liguori int main(int argc, char **argv) 104*bf2a38d4SAnthony Liguori { 105*bf2a38d4SAnthony Liguori QTestState *s; 106*bf2a38d4SAnthony Liguori char *cmdline; 107*bf2a38d4SAnthony Liguori int ret; 108*bf2a38d4SAnthony Liguori 109*bf2a38d4SAnthony Liguori g_test_init(&argc, &argv, NULL); 110*bf2a38d4SAnthony Liguori 111*bf2a38d4SAnthony Liguori fw_cfg = pc_fw_cfg_init(); 112*bf2a38d4SAnthony Liguori 113*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/signature", test_fw_cfg_signature); 114*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/id", test_fw_cfg_id); 115*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/uuid", test_fw_cfg_uuid); 116*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/ram_size", test_fw_cfg_ram_size); 117*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/nographic", test_fw_cfg_nographic); 118*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/nb_cpus", test_fw_cfg_nb_cpus); 119*bf2a38d4SAnthony Liguori #if 0 120*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/machine_id", test_fw_cfg_machine_id); 121*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/kernel", test_fw_cfg_kernel); 122*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/initrd", test_fw_cfg_initrd); 123*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/boot_device", test_fw_cfg_boot_device); 124*bf2a38d4SAnthony Liguori #endif 125*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/max_cpus", test_fw_cfg_max_cpus); 126*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/numa", test_fw_cfg_numa); 127*bf2a38d4SAnthony Liguori g_test_add_func("/fw_cfg/boot_menu", test_fw_cfg_boot_menu); 128*bf2a38d4SAnthony Liguori 129*bf2a38d4SAnthony Liguori cmdline = g_strdup_printf("-display none " 130*bf2a38d4SAnthony Liguori "-uuid 4600cb32-38ec-4b2f-8acb-81c6ea54f2d8 "); 131*bf2a38d4SAnthony Liguori s = qtest_start(cmdline); 132*bf2a38d4SAnthony Liguori g_free(cmdline); 133*bf2a38d4SAnthony Liguori 134*bf2a38d4SAnthony Liguori ret = g_test_run(); 135*bf2a38d4SAnthony Liguori 136*bf2a38d4SAnthony Liguori if (s) { 137*bf2a38d4SAnthony Liguori qtest_quit(s); 138*bf2a38d4SAnthony Liguori } 139*bf2a38d4SAnthony Liguori 140*bf2a38d4SAnthony Liguori return ret; 141*bf2a38d4SAnthony Liguori } 142