qemu/tests/qtest/am53c974-test.c
<<
>>
Prefs
   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
  15static 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 */
  32static 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
  80static 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 */
  97static 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 */
 113static 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
 135static 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
 153static 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
 170static 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
 192int 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