From patchwork Fri Jun 14 11:15:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Markus Armbruster X-Patchwork-Id: 251375 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 470422C008F for ; Fri, 14 Jun 2013 21:23:46 +1000 (EST) Received: from localhost ([::1]:50840 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnS6a-0007md-4N for incoming@patchwork.ozlabs.org; Fri, 14 Jun 2013 07:23:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34136) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnRyZ-0000pj-4H for qemu-devel@nongnu.org; Fri, 14 Jun 2013 07:15:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UnRyU-0004pQ-Sj for qemu-devel@nongnu.org; Fri, 14 Jun 2013 07:15:27 -0400 Received: from oxygen.pond.sub.org ([2a01:4f8:121:10e4::3]:44245) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UnRyU-0004oP-Ik for qemu-devel@nongnu.org; Fri, 14 Jun 2013 07:15:22 -0400 Received: from blackfin.pond.sub.org (p5B32AD34.dip0.t-ipconnect.de [91.50.173.52]) by oxygen.pond.sub.org (Postfix) with ESMTPA id ED808A43D7; Fri, 14 Jun 2013 13:15:20 +0200 (CEST) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id BF3D2200BE; Fri, 14 Jun 2013 13:15:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Fri, 14 Jun 2013 13:15:11 +0200 Message-Id: <1371208516-7857-12-git-send-email-armbru@redhat.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1371208516-7857-1-git-send-email-armbru@redhat.com> References: <1371208516-7857-1-git-send-email-armbru@redhat.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a01:4f8:121:10e4::3 Cc: aliguori@us.ibm.com, jan.kiszka@siemens.com, Alexander Graf , alex.williamson@redhat.com, qemu-ppc@nongnu.org, aviksil@linux.vnet.ibm.com, afaerber@suse.de Subject: [Qemu-devel] [PATCH v3 11/16] boot-order-test: Better separate target-specific and generic parts X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The initial version did just PC. I didn't bother to separate out generic parts, because I don't like to abstract from a single case. Now we have two cases, PC and PowerMac, and I'm about to add two more. Time to do it right. To ease review, this commit changes the code without in-place, and only the next commit reorders it for better readability. Cc: Andreas Färber Cc: Alexander Graf Cc: qemu-ppc@nongnu.org Signed-off-by: Markus Armbruster --- tests/boot-order-test.c | 160 ++++++++++++++++++++++++++++++------------------ 1 file changed, 99 insertions(+), 61 deletions(-) diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c index f6dece6..23edacf 100644 --- a/tests/boot-order-test.c +++ b/tests/boot-order-test.c @@ -15,106 +15,141 @@ #include "libqtest.h" #include "qemu/bswap.h" -static void test_pc_cmos_byte(int reg, int expected) +static uint8_t read_mc146818(uint16_t port, uint8_t reg) { - int actual; - - outb(0x70, reg); - actual = inb(0x71); - g_assert_cmphex(actual, ==, expected); + outb(port, reg); + return inb(port + 1); } -static void test_pc_cmos(uint8_t boot1, uint8_t boot2) +static uint64_t read_boot_order_pc(void) { - test_pc_cmos_byte(0x38, boot1); - test_pc_cmos_byte(0x3d, boot2); + uint8_t b1 = read_mc146818(0x70, 0x38); + uint8_t b2 = read_mc146818(0x70, 0x3d); + + return b1 | (b2 << 8); } -static void test_pc_with_args(const char *test_args, - uint8_t boot1, uint8_t boot2, - uint8_t reboot1, uint8_t reboot2) +static void test_a_boot_order(const char *machine, + const char *test_args, + uint64_t (*read_boot_order)(void), + uint64_t expected_boot, + uint64_t expected_reboot) { - char *args = g_strdup_printf("-nodefaults -display none %s", test_args); + char *args; + uint64_t actual; + args = g_strdup_printf("-nodefaults -display none%s%s %s", + machine ? " -M " : "", + machine ?: "", + test_args); qtest_start(args); - test_pc_cmos(boot1, boot2); + actual = read_boot_order(); + g_assert_cmphex(actual, ==, expected_boot); qmp("{ 'execute': 'system_reset' }"); - test_pc_cmos(reboot1, reboot2); + actual = read_boot_order(); + g_assert_cmphex(actual, ==, expected_reboot); qtest_quit(global_qtest); g_free(args); } +typedef struct { + const char *args; + uint64_t expected_boot; + uint64_t expected_reboot; +} boot_order_test; + +static void test_boot_orders(const char *machine, + uint64_t (*read_boot_order)(void), + const boot_order_test *tests) +{ + int i; + + for (i = 0; tests[i].args; i++) { + test_a_boot_order(machine, tests[i].args, + read_boot_order, + tests[i].expected_boot, + tests[i].expected_reboot); + } +} + +static const boot_order_test test_cases_pc[] = { + { "", + 0x1230, 0x1230 }, + { "-no-fd-bootchk", + 0x1231, 0x1231 }, + { "-boot c", + 0x0200, 0x0200 }, + { "-boot nda", + 0x3410, 0x3410 }, + { "-boot order=", + 0, 0 }, + { "-boot order= -boot order=c", + 0x0200, 0x0200 }, + { "-boot once=a", + 0x0100, 0x1230 }, + { "-boot once=a -no-fd-bootchk", + 0x0101, 0x1231 }, + { "-boot once=a,order=c", + 0x0100, 0x0200 }, + { "-boot once=d -boot order=nda", + 0x0300, 0x3410 }, + { "-boot once=a -boot once=b -boot once=c", + 0x0200, 0x1230 }, + {} +}; + static void test_pc_boot_order(void) { - test_pc_with_args("", 0x30, 0x12, 0x30, 0x12); - test_pc_with_args("-no-fd-bootchk", 0x31, 0x12, 0x31, 0x12); - test_pc_with_args("-boot c", 0, 0x02, 0, 0x02); - test_pc_with_args("-boot nda", 0x10, 0x34, 0x10, 0x34); - test_pc_with_args("-boot order=", 0, 0, 0, 0); - test_pc_with_args("-boot order= -boot order=c", 0, 0x02, 0, 0x02); - test_pc_with_args("-boot once=a", 0, 0x01, 0x30, 0x12); - test_pc_with_args("-boot once=a -no-fd-bootchk", 0x01, 0x01, 0x31, 0x12); - test_pc_with_args("-boot once=a,order=c", 0, 0x01, 0, 0x02); - test_pc_with_args("-boot once=d -boot order=nda", 0, 0x03, 0x10, 0x34); - test_pc_with_args("-boot once=a -boot once=b -boot once=c", - 0, 0x02, 0x30, 0x12); + test_boot_orders(NULL, read_boot_order_pc, test_cases_pc); } -#define G3BEIGE_CFG_ADDR 0xf0000510 -#define MAC99_CFG_ADDR 0xf0000510 +#define PMAC_CFG_ADDR 0xf0000510 #define NO_QEMU_PROTOS #include "hw/nvram/fw_cfg.h" #undef NO_QEMU_PROTOS -static void powermac_fw_cfg_read(bool newworld, uint16_t cmd, - uint8_t *buf, unsigned int len) +static void read_fw_cfg(uint64_t cfg_addr, uint16_t cmd, + void *buf, size_t len) { - unsigned int i; + uint8_t *p = buf; + size_t i; - writew(newworld ? MAC99_CFG_ADDR : G3BEIGE_CFG_ADDR, cmd); + writew(cfg_addr, cmd); for (i = 0; i < len; i++) { - buf[i] = readb((newworld ? MAC99_CFG_ADDR : G3BEIGE_CFG_ADDR) + 2); + p[i] = readb(cfg_addr + 2); } } -static uint16_t powermac_fw_cfg_read16(bool newworld, uint16_t cmd) +static uint16_t read_fw_cfg_i16(uint64_t cfg_addr, uint16_t cmd) { uint16_t value; - powermac_fw_cfg_read(newworld, cmd, (uint8_t *)&value, sizeof(value)); + read_fw_cfg(cfg_addr, cmd, &value, sizeof(value)); return le16_to_cpu(value); } -static void test_powermac_with_args(bool newworld, const char *extra_args, - uint16_t expected_boot, - uint16_t expected_reboot) +static uint64_t read_boot_order_pmac(void) { - char *args = g_strdup_printf("-nodefaults -display none -machine %s %s", - newworld ? "mac99" : "g3beige", extra_args); - uint16_t actual; - qtest_start(args); - actual = powermac_fw_cfg_read16(newworld, FW_CFG_BOOT_DEVICE); - g_assert_cmphex(actual, ==, expected_boot); - qmp("{ 'execute': 'system_reset' }"); - actual = powermac_fw_cfg_read16(newworld, FW_CFG_BOOT_DEVICE); - g_assert_cmphex(actual, ==, expected_reboot); - qtest_quit(global_qtest); - g_free(args); + return read_fw_cfg_i16(PMAC_CFG_ADDR, FW_CFG_BOOT_DEVICE); } -static void test_powermac_boot_order(void) -{ - int i; +static const boot_order_test test_cases_fw_cfg[] = { + { "", 'c', 'c' }, + { "-boot c", 'c', 'c' }, + { "-boot d", 'd', 'd' }, + { "-boot once=d,order=c", 'd', 'c' }, + {} +}; - for (i = 0; i < 2; i++) { - bool newworld = (i == 1); +static void test_pmac_oldworld_boot_order(void) +{ + test_boot_orders("g3beige", read_boot_order_pmac, test_cases_fw_cfg); +} - test_powermac_with_args(newworld, "", 'c', 'c'); - test_powermac_with_args(newworld, "-boot c", 'c', 'c'); - test_powermac_with_args(newworld, "-boot d", 'd', 'd'); - test_powermac_with_args(newworld, "-boot once=d,order=c", 'd', 'c'); - } +static void test_pmac_newworld_boot_order(void) +{ + test_boot_orders("mac99", read_boot_order_pmac, test_cases_fw_cfg); } int main(int argc, char *argv[]) @@ -126,7 +161,10 @@ int main(int argc, char *argv[]) if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { qtest_add_func("boot-order/pc", test_pc_boot_order); } else if (strcmp(arch, "ppc") == 0 || strcmp(arch, "ppc64") == 0) { - qtest_add_func("boot-order/powermac", test_powermac_boot_order); + qtest_add_func("boot-order/pmac_oldworld", + test_pmac_oldworld_boot_order); + qtest_add_func("boot-order/pmac_newworld", + test_pmac_newworld_boot_order); } return g_test_run();