@@ -1723,6 +1723,7 @@ ISA POST card
M: Lev Kujawski <lkujaw@member.fsf.org>
S: Supported
F: hw/i386/postcard.c
+F: tests/qtest/postcard-test.c
Xtensa Machines
---------------
@@ -47,6 +47,7 @@ qtests_i386 = \
(config_all_devices.has_key('CONFIG_ISA_IPMI_KCS') ? ['ipmi-kcs-test'] : []) + \
(config_host.has_key('CONFIG_LINUX') and \
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) + \
+ (config_all_devices.has_key('CONFIG_POST_CARD') ? ['postcard-test'] : []) + \
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) + \
(config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : []) + \
(config_all_devices.has_key('CONFIG_PVPANIC_PCI') ? ['pvpanic-pci-test'] : []) + \
new file mode 100644
@@ -0,0 +1,122 @@
+/*
+ * Test Suite for the ISA POST Card
+ *
+ * Copyright (c) 2022 Lev Kujawski
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "qemu/osdep.h"
+#include "libqtest-single.h"
+#include "hw/i386/postcard.h"
+
+
+/* I/O helper functions */
+static void
+post_card_write(uint8_t val)
+{
+ outb(POST_CARD_PORT_DEFAULT, val);
+}
+
+static uint8_t
+post_card_readb(void)
+{
+ return inb(POST_CARD_PORT_DEFAULT);
+}
+
+static uint16_t
+post_card_readw(void)
+{
+ return inw(POST_CARD_PORT_DEFAULT);
+}
+
+static uint32_t
+post_card_readl(void)
+{
+ return inl(POST_CARD_PORT_DEFAULT);
+}
+
+
+/* Testing framework */
+static QTestState *qts;
+
+static void
+test_setup(void)
+{
+ assert(qts == NULL);
+ qts = qtest_start("-machine pc");
+ assert(qts != NULL);
+}
+
+static void
+test_teardown(void)
+{
+ assert(qts != NULL);
+ qtest_quit(qts);
+ qts = NULL;
+}
+
+
+/* Test cases */
+static void
+test_initial_state(void)
+{
+ test_setup();
+ g_assert_cmphex(post_card_readb(), ==, 0x00);
+ test_teardown();
+}
+
+static void
+test_retain_write(void)
+{
+ test_setup();
+ g_assert_cmphex(post_card_readb(), ==, 0x00);
+ post_card_write(0xaa);
+ g_assert_cmphex(post_card_readb(), ==, 0xaa);
+ test_teardown();
+}
+
+static void
+test_read_word(void)
+{
+ test_setup();
+ g_assert_cmphex(post_card_readb(), ==, 0x00);
+ post_card_write(0xa5);
+ g_assert_cmphex(post_card_readw(), ==, 0xa5a5);
+ test_teardown();
+}
+
+static void
+test_read_double_word(void)
+{
+ test_setup();
+ g_assert_cmphex(post_card_readb(), ==, 0x00);
+ post_card_write(0xa5);
+ g_assert_cmphex(post_card_readl(), ==, 0xa5a5a5a5);
+ test_teardown();
+}
+
+
+int
+main(int argc, char **argv)
+{
+ g_test_init(&argc, &argv, NULL);
+
+ qtest_add_func("/postcard/initial_state", test_initial_state);
+ qtest_add_func("/postcard/retain_write", test_retain_write);
+ qtest_add_func("/postcard/read_word", test_read_word);
+ qtest_add_func("/postcard/read_double_word", test_read_double_word);
+
+ return g_test_run();
+}
Verify that port 0x80 behavior corresponds with i440FX hardware. Despite the name of the device, said behavior is implemented by the system board and does not depend upon the actual presence of a POST card. In particular: a) Writes to port 0x80 are retained and may be read afterwards. b) Word and double word reads return a repeated sequence of the written octet. Reference platform: TYAN S1686D (i440FX system board) Signed-off-by: Lev Kujawski <lkujaw@member.fsf.org> --- (v2) First revision of test suite. MAINTAINERS | 1 + tests/qtest/meson.build | 1 + tests/qtest/postcard-test.c | 122 ++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 tests/qtest/postcard-test.c