Boot one sp-mem device and assert the guest's e820 table gains exactly one E820_SOFT_RESERVED range whose length matches the device's backend size.
Signed-off-by: FangSheng Huang <[email protected]> --- tests/qtest/e820-test.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/qtest/e820-test.c b/tests/qtest/e820-test.c index 1db0744c08..aafa3c1aa2 100644 --- a/tests/qtest/e820-test.c +++ b/tests/qtest/e820-test.c @@ -16,6 +16,7 @@ #include "libqtest.h" #include "libqos/fw_cfg.h" #include "qemu/bswap.h" +#include "qemu/units.h" /* e820 entry layout and types (cf. hw/i386/e820_memory_layout.h) */ #define E820_RAM 1 @@ -85,11 +86,44 @@ static void test_e820_basic(void) qtest_quit(s); } +static void test_e820_sp_mem(void) +{ + struct e820_entry table[E820_MAX_ENTRIES]; + QFWCFG *fw_cfg; + QTestState *s; + size_t n, i; + int soft_reserved = 0; + uint64_t soft_reserved_len = 0; + + s = qtest_init("-machine q35 -m 256M,slots=2,maxmem=2G " + "-object memory-backend-ram,id=ram0,size=256M " + "-numa node,nodeid=0,memdev=ram0 " + "-object memory-backend-ram,id=spm0,size=128M " + "-device sp-mem,id=sp0,memdev=spm0,node=0"); + fw_cfg = pc_fw_cfg_init(s); + + n = get_e820_table(fw_cfg, table); + for (i = 0; i < n; i++) { + if (le32_to_cpu(table[i].type) == E820_SOFT_RESERVED) { + soft_reserved++; + soft_reserved_len = le64_to_cpu(table[i].length); + } + } + + /* exactly one SOFT_RESERVED range, sized to the backend */ + g_assert_cmpint(soft_reserved, ==, 1); + g_assert_cmpint(soft_reserved_len, ==, 128 * MiB); + + pc_fw_cfg_uninit(fw_cfg); + qtest_quit(s); +} + int main(int argc, char **argv) { g_test_init(&argc, &argv, NULL); qtest_add_func("e820/basic", test_e820_basic); + qtest_add_func("e820/sp-mem", test_e820_sp_mem); return g_test_run(); } -- 2.34.1
