cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

am53c974-test.c (7087B)


      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}