2 * QTest testcase for am53c974
4 * Copyright (c) 2021 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6 * This work is licensed under the terms of the GNU GPL, version 2 or
7 * later. See the COPYING file in the top-level directory.
10 #include "qemu/osdep.h"
12 #include "libqos/libqtest.h"
15 static void test_cmdfifo_underflow_ok(void)
17 QTestState
*s
= qtest_init(
18 "-device am53c974,id=scsi "
19 "-device scsi-hd,drive=disk0 -drive "
20 "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
21 qtest_outl(s
, 0xcf8, 0x80001004);
22 qtest_outw(s
, 0xcfc, 0x01);
23 qtest_outl(s
, 0xcf8, 0x8000100e);
24 qtest_outl(s
, 0xcfc, 0x8a000000);
25 qtest_outl(s
, 0x8a09, 0x42000000);
26 qtest_outl(s
, 0x8a0d, 0x00);
27 qtest_outl(s
, 0x8a0b, 0x1000);
31 /* Reported as crash_1548bd10e7 */
32 static void test_cmdfifo_underflow2_ok(void)
34 QTestState
*s
= qtest_init(
35 "-device am53c974,id=scsi -device scsi-hd,drive=disk0 "
36 "-drive id=disk0,if=none,file=null-co://,format=raw -nodefaults");
37 qtest_outl(s
, 0xcf8, 0x80001010);
38 qtest_outl(s
, 0xcfc, 0xc000);
39 qtest_outl(s
, 0xcf8, 0x80001004);
40 qtest_outw(s
, 0xcfc, 0x01);
41 qtest_outw(s
, 0xc00c, 0x41);
42 qtest_outw(s
, 0xc00a, 0x00);
43 qtest_outl(s
, 0xc00a, 0x00);
44 qtest_outw(s
, 0xc00c, 0x43);
45 qtest_outw(s
, 0xc00b, 0x00);
46 qtest_outw(s
, 0xc00b, 0x00);
47 qtest_outw(s
, 0xc00c, 0x00);
48 qtest_outl(s
, 0xc00a, 0x00);
49 qtest_outw(s
, 0xc00a, 0x00);
50 qtest_outl(s
, 0xc00a, 0x00);
51 qtest_outw(s
, 0xc00c, 0x00);
52 qtest_outl(s
, 0xc00a, 0x00);
53 qtest_outw(s
, 0xc00a, 0x00);
54 qtest_outl(s
, 0xc00a, 0x00);
55 qtest_outw(s
, 0xc00c, 0x00);
56 qtest_outl(s
, 0xc00a, 0x00);
57 qtest_outw(s
, 0xc00a, 0x00);
58 qtest_outl(s
, 0xc00a, 0x00);
59 qtest_outw(s
, 0xc00c, 0x00);
60 qtest_outl(s
, 0xc00a, 0x00);
61 qtest_outl(s
, 0xc006, 0x00);
62 qtest_outl(s
, 0xc00b, 0x00);
63 qtest_outw(s
, 0xc00b, 0x0800);
64 qtest_outw(s
, 0xc00b, 0x00);
65 qtest_outw(s
, 0xc00b, 0x00);
66 qtest_outl(s
, 0xc006, 0x00);
67 qtest_outl(s
, 0xc00b, 0x00);
68 qtest_outw(s
, 0xc00b, 0x0800);
69 qtest_outw(s
, 0xc00b, 0x00);
70 qtest_outw(s
, 0xc00b, 0x4100);
71 qtest_outw(s
, 0xc00a, 0x00);
72 qtest_outl(s
, 0xc00a, 0x100000);
73 qtest_outl(s
, 0xc00a, 0x00);
74 qtest_outw(s
, 0xc00c, 0x43);
75 qtest_outl(s
, 0xc00a, 0x100000);
76 qtest_outl(s
, 0xc00a, 0x100000);
80 static void test_cmdfifo_overflow_ok(void)
82 QTestState
*s
= qtest_init(
83 "-device am53c974,id=scsi "
84 "-device scsi-hd,drive=disk0 -drive "
85 "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
86 qtest_outl(s
, 0xcf8, 0x80001004);
87 qtest_outw(s
, 0xcfc, 0x01);
88 qtest_outl(s
, 0xcf8, 0x8000100e);
89 qtest_outl(s
, 0xcfc, 0x0e000000);
90 qtest_outl(s
, 0xe40, 0x03);
91 qtest_outl(s
, 0xe0b, 0x4100);
92 qtest_outl(s
, 0xe0b, 0x9000);
96 /* Reported as crash_530ff2e211 */
97 static void test_cmdfifo_overflow2_ok(void)
99 QTestState
*s
= qtest_init(
100 "-device am53c974,id=scsi -device scsi-hd,drive=disk0 "
101 "-drive id=disk0,if=none,file=null-co://,format=raw -nodefaults");
102 qtest_outl(s
, 0xcf8, 0x80001010);
103 qtest_outl(s
, 0xcfc, 0xc000);
104 qtest_outl(s
, 0xcf8, 0x80001004);
105 qtest_outw(s
, 0xcfc, 0x01);
106 qtest_outl(s
, 0xc00b, 0x4100);
107 qtest_outw(s
, 0xc00b, 0xc200);
108 qtest_outl(s
, 0xc03f, 0x0300);
112 /* Reported as crash_0900379669 */
113 static void test_fifo_pop_buf(void)
115 QTestState
*s
= qtest_init(
116 "-device am53c974,id=scsi -device scsi-hd,drive=disk0 "
117 "-drive id=disk0,if=none,file=null-co://,format=raw -nodefaults");
118 qtest_outl(s
, 0xcf8, 0x80001010);
119 qtest_outl(s
, 0xcfc, 0xc000);
120 qtest_outl(s
, 0xcf8, 0x80001004);
121 qtest_outw(s
, 0xcfc, 0x01);
122 qtest_outb(s
, 0xc000, 0x4);
123 qtest_outb(s
, 0xc008, 0xa0);
124 qtest_outl(s
, 0xc03f, 0x0300);
125 qtest_outl(s
, 0xc00b, 0xc300);
126 qtest_outw(s
, 0xc00b, 0x9000);
127 qtest_outl(s
, 0xc00b, 0xc300);
128 qtest_outl(s
, 0xc00b, 0xc300);
129 qtest_outl(s
, 0xc00b, 0xc300);
130 qtest_outw(s
, 0xc00b, 0x9000);
131 qtest_outw(s
, 0xc00b, 0x1000);
135 static void test_target_selected_ok(void)
137 QTestState
*s
= qtest_init(
138 "-device am53c974,id=scsi "
139 "-device scsi-hd,drive=disk0 -drive "
140 "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
141 qtest_outl(s
, 0xcf8, 0x80001001);
142 qtest_outl(s
, 0xcfc, 0x01000000);
143 qtest_outl(s
, 0xcf8, 0x8000100e);
144 qtest_outl(s
, 0xcfc, 0xef800000);
145 qtest_outl(s
, 0xef8b, 0x4100);
146 qtest_outw(s
, 0xef80, 0x01);
147 qtest_outl(s
, 0xefc0, 0x03);
148 qtest_outl(s
, 0xef8b, 0xc100);
149 qtest_outl(s
, 0xef8b, 0x9000);
153 static void test_fifo_underflow_on_write_ok(void)
155 QTestState
*s
= qtest_init(
156 "-device am53c974,id=scsi "
157 "-device scsi-hd,drive=disk0 -drive "
158 "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
159 qtest_outl(s
, 0xcf8, 0x80001010);
160 qtest_outl(s
, 0xcfc, 0xc000);
161 qtest_outl(s
, 0xcf8, 0x80001004);
162 qtest_outw(s
, 0xcfc, 0x01);
163 qtest_outl(s
, 0xc008, 0x0a);
164 qtest_outl(s
, 0xc009, 0x41000000);
165 qtest_outl(s
, 0xc009, 0x41000000);
166 qtest_outl(s
, 0xc00b, 0x1000);
170 static void test_cancelled_request_ok(void)
172 QTestState
*s
= qtest_init(
173 "-device am53c974,id=scsi "
174 "-device scsi-hd,drive=disk0 -drive "
175 "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
176 qtest_outl(s
, 0xcf8, 0x80001010);
177 qtest_outl(s
, 0xcfc, 0xc000);
178 qtest_outl(s
, 0xcf8, 0x80001004);
179 qtest_outw(s
, 0xcfc, 0x05);
180 qtest_outb(s
, 0xc046, 0x02);
181 qtest_outl(s
, 0xc00b, 0xc100);
182 qtest_outl(s
, 0xc040, 0x03);
183 qtest_outl(s
, 0xc040, 0x03);
184 qtest_bufwrite(s
, 0x0, "\x41", 0x1);
185 qtest_outl(s
, 0xc00b, 0xc100);
186 qtest_outw(s
, 0xc040, 0x02);
187 qtest_outw(s
, 0xc040, 0x81);
188 qtest_outl(s
, 0xc00b, 0x9000);
192 int main(int argc
, char **argv
)
194 const char *arch
= qtest_get_arch();
196 g_test_init(&argc
, &argv
, NULL
);
198 if (strcmp(arch
, "i386") == 0) {
199 qtest_add_func("am53c974/test_cmdfifo_underflow_ok",
200 test_cmdfifo_underflow_ok
);
201 qtest_add_func("am53c974/test_cmdfifo_underflow2_ok",
202 test_cmdfifo_underflow2_ok
);
203 qtest_add_func("am53c974/test_cmdfifo_overflow_ok",
204 test_cmdfifo_overflow_ok
);
205 qtest_add_func("am53c974/test_cmdfifo_overflow2_ok",
206 test_cmdfifo_overflow2_ok
);
207 qtest_add_func("am53c974/test_fifo_pop_buf",
209 qtest_add_func("am53c974/test_target_selected_ok",
210 test_target_selected_ok
);
211 qtest_add_func("am53c974/test_fifo_underflow_on_write_ok",
212 test_fifo_underflow_on_write_ok
);
213 qtest_add_func("am53c974/test_cancelled_request_ok",
214 test_cancelled_request_ok
);