1 /* 2 * QTest testcase for am53c974 3 * 4 * Copyright (c) 2021 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> 5 * 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. 8 */ 9 10 #include "qemu/osdep.h" 11 12 #include "libqos/libqtest.h" 13 14 15 static void test_cmdfifo_underflow_ok(void) 16 { 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); 28 qtest_quit(s); 29 } 30 31 /* Reported as crash_1548bd10e7 */ 32 static void test_cmdfifo_underflow2_ok(void) 33 { 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); 77 qtest_quit(s); 78 } 79 80 static void test_cmdfifo_overflow_ok(void) 81 { 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); 93 qtest_quit(s); 94 } 95 96 /* Reported as crash_530ff2e211 */ 97 static void test_cmdfifo_overflow2_ok(void) 98 { 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); 109 qtest_quit(s); 110 } 111 112 /* Reported as crash_0900379669 */ 113 static void test_fifo_pop_buf(void) 114 { 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); 132 qtest_quit(s); 133 } 134 135 static void test_target_selected_ok(void) 136 { 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); 150 qtest_quit(s); 151 } 152 153 static void test_fifo_underflow_on_write_ok(void) 154 { 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); 167 qtest_quit(s); 168 } 169 170 static void test_cancelled_request_ok(void) 171 { 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); 189 qtest_quit(s); 190 } 191 192 int main(int argc, char **argv) 193 { 194 const char *arch = qtest_get_arch(); 195 196 g_test_init(&argc, &argv, NULL); 197 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", 208 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); 215 } 216 217 return g_test_run(); 218 } 219