]>
Commit | Line | Data |
---|---|---|
edbd790d MA |
1 | /* |
2 | * Boot order test cases. | |
3 | * | |
4 | * Copyright (c) 2013 Red Hat Inc. | |
5 | * | |
6 | * Authors: | |
7 | * Markus Armbruster <armbru@redhat.com>, | |
8 | * | |
9 | * This work is licensed under the terms of the GNU GPL, version 2 or later. | |
10 | * See the COPYING file in the top-level directory. | |
11 | */ | |
12 | ||
13 | #include <glib.h> | |
14 | #include "libqtest.h" | |
15 | ||
16 | static void test_pc_cmos_byte(int reg, int expected) | |
17 | { | |
18 | int actual; | |
19 | ||
20 | outb(0x70, reg); | |
21 | actual = inb(0x71); | |
22 | g_assert_cmphex(actual, ==, expected); | |
23 | } | |
24 | ||
25 | static void test_pc_cmos(uint8_t boot1, uint8_t boot2) | |
26 | { | |
27 | test_pc_cmos_byte(0x38, boot1); | |
28 | test_pc_cmos_byte(0x3d, boot2); | |
29 | } | |
30 | ||
31 | static void test_pc_with_args(const char *test_args, | |
32 | uint8_t boot1, uint8_t boot2, | |
33 | uint8_t reboot1, uint8_t reboot2) | |
34 | { | |
35 | char *args = g_strdup_printf("-nodefaults -display none %s", test_args); | |
36 | ||
37 | qtest_start(args); | |
38 | test_pc_cmos(boot1, boot2); | |
39 | qmp("{ 'execute': 'system_reset' }"); | |
40 | /* | |
41 | * system_reset only requests reset. We get a RESET event after | |
42 | * the actual reset completes. Need to wait for that. | |
43 | */ | |
44 | qmp(""); /* HACK: wait for event */ | |
45 | test_pc_cmos(reboot1, reboot2); | |
46 | qtest_quit(global_qtest); | |
47 | g_free(args); | |
48 | } | |
49 | ||
50 | static void test_pc_boot_order(void) | |
51 | { | |
52 | test_pc_with_args("", 0x30, 0x12, 0x30, 0x12); | |
53 | test_pc_with_args("-no-fd-bootchk", 0x31, 0x12, 0x31, 0x12); | |
54 | test_pc_with_args("-boot c", 0, 0x02, 0, 0x02); | |
55 | test_pc_with_args("-boot nda", 0x10, 0x34, 0x10, 0x34); | |
56 | test_pc_with_args("-boot order=", 0, 0, 0, 0); | |
57 | test_pc_with_args("-boot order= -boot order=c", 0, 0x02, 0, 0x02); | |
58 | test_pc_with_args("-boot once=a", 0, 0x01, 0x30, 0x12); | |
59 | test_pc_with_args("-boot once=a -no-fd-bootchk", 0x01, 0x01, 0x31, 0x12); | |
60 | test_pc_with_args("-boot once=a,order=c", 0, 0x01, 0, 0x02); | |
61 | test_pc_with_args("-boot once=d -boot order=nda", 0, 0x03, 0x10, 0x34); | |
62 | test_pc_with_args("-boot once=a -boot once=b -boot once=c", | |
63 | 0, 0x02, 0x30, 0x12); | |
64 | } | |
65 | ||
66 | int main(int argc, char *argv[]) | |
67 | { | |
68 | g_test_init(&argc, &argv, NULL); | |
69 | ||
70 | qtest_add_func("boot-order/pc", test_pc_boot_order); | |
71 | ||
72 | return g_test_run(); | |
73 | } |