qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

am53c974-test.c (9282B)


      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 "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 static void test_inflight_cancel_ok(void)
    193 {
    194     QTestState *s = qtest_init(
    195         "-device am53c974,id=scsi "
    196         "-device scsi-hd,drive=disk0 -drive "
    197         "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
    198     qtest_outl(s, 0xcf8, 0x80001000);
    199     qtest_inw(s, 0xcfc);
    200     qtest_outl(s, 0xcf8, 0x80001010);
    201     qtest_outl(s, 0xcfc, 0xffffffff);
    202     qtest_outl(s, 0xcf8, 0x80001010);
    203     qtest_inl(s, 0xcfc);
    204     qtest_outl(s, 0xcf8, 0x80001010);
    205     qtest_outl(s, 0xcfc, 0xc001);
    206     qtest_outl(s, 0xcf8, 0x80001004);
    207     qtest_inw(s, 0xcfc);
    208     qtest_outl(s, 0xcf8, 0x80001004);
    209     qtest_outw(s, 0xcfc, 0x7);
    210     qtest_outl(s, 0xcf8, 0x80001004);
    211     qtest_inw(s, 0xcfc);
    212     qtest_inb(s, 0xc000);
    213     qtest_outb(s, 0xc008, 0x8);
    214     qtest_outw(s, 0xc00b, 0x4100);
    215     qtest_outb(s, 0xc009, 0x0);
    216     qtest_outb(s, 0xc009, 0x0);
    217     qtest_outw(s, 0xc00b, 0xc212);
    218     qtest_outl(s, 0xc042, 0x2c2c5a88);
    219     qtest_outw(s, 0xc00b, 0xc212);
    220     qtest_outw(s, 0xc00b, 0x415a);
    221     qtest_outl(s, 0xc03f, 0x3060303);
    222     qtest_outl(s, 0xc00b, 0x5afa9054);
    223     qtest_quit(s);
    224 }
    225 
    226 static void test_reset_before_transfer_ok(void)
    227 {
    228     QTestState *s = qtest_init(
    229         "-device am53c974,id=scsi "
    230         "-device scsi-hd,drive=disk0 -drive "
    231         "id=disk0,if=none,file=null-co://,format=raw -nodefaults");
    232 
    233     qtest_outl(s, 0xcf8, 0x80001010);
    234     qtest_outl(s, 0xcfc, 0xc000);
    235     qtest_outl(s, 0xcf8, 0x80001004);
    236     qtest_outw(s, 0xcfc, 0x01);
    237     qtest_outl(s, 0xc007, 0x2500);
    238     qtest_outl(s, 0xc00a, 0x410000);
    239     qtest_outl(s, 0xc00a, 0x410000);
    240     qtest_outw(s, 0xc00b, 0x0200);
    241     qtest_outw(s, 0xc040, 0x03);
    242     qtest_outw(s, 0xc009, 0x00);
    243     qtest_outw(s, 0xc00b, 0x00);
    244     qtest_outw(s, 0xc009, 0x00);
    245     qtest_outw(s, 0xc00b, 0x00);
    246     qtest_outw(s, 0xc009, 0x00);
    247     qtest_outw(s, 0xc003, 0x1000);
    248     qtest_outw(s, 0xc00b, 0x1000);
    249     qtest_outl(s, 0xc00b, 0x9000);
    250     qtest_outw(s, 0xc00b, 0x1000);
    251     qtest_quit(s);
    252 }
    253 
    254 int main(int argc, char **argv)
    255 {
    256     const char *arch = qtest_get_arch();
    257 
    258     g_test_init(&argc, &argv, NULL);
    259 
    260     if (strcmp(arch, "i386") == 0) {
    261         qtest_add_func("am53c974/test_cmdfifo_underflow_ok",
    262                        test_cmdfifo_underflow_ok);
    263         qtest_add_func("am53c974/test_cmdfifo_underflow2_ok",
    264                        test_cmdfifo_underflow2_ok);
    265         qtest_add_func("am53c974/test_cmdfifo_overflow_ok",
    266                        test_cmdfifo_overflow_ok);
    267         qtest_add_func("am53c974/test_cmdfifo_overflow2_ok",
    268                        test_cmdfifo_overflow2_ok);
    269         qtest_add_func("am53c974/test_fifo_pop_buf",
    270                        test_fifo_pop_buf);
    271         qtest_add_func("am53c974/test_target_selected_ok",
    272                        test_target_selected_ok);
    273         qtest_add_func("am53c974/test_fifo_underflow_on_write_ok",
    274                        test_fifo_underflow_on_write_ok);
    275         qtest_add_func("am53c974/test_cancelled_request_ok",
    276                        test_cancelled_request_ok);
    277         qtest_add_func("am53c974/test_inflight_cancel_ok",
    278                        test_inflight_cancel_ok);
    279         qtest_add_func("am53c974/test_reset_before_transfer_ok",
    280                        test_reset_before_transfer_ok);
    281     }
    282 
    283     return g_test_run();
    284 }