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

test-qgraph.c (13175B)


      1/*
      2 * libqos driver framework
      3 *
      4 * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
      5 *
      6 * This library is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License version 2.1 as published by the Free Software Foundation.
      9 *
     10 * This library is distributed in the hope that it will be useful,
     11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13 * Lesser General Public License for more details.
     14 *
     15 * You should have received a copy of the GNU Lesser General Public
     16 * License along with this library; if not, see <http://www.gnu.org/licenses/>
     17 */
     18
     19#include "qemu/osdep.h"
     20#include "../qtest/libqos/qgraph.h"
     21#include "../qtest/libqos/qgraph_internal.h"
     22
     23#define MACHINE_PC "x86_64/pc"
     24#define MACHINE_RASPI2 "arm/raspi2b"
     25#define I440FX "i440FX-pcihost"
     26#define PCIBUS_PC "pcibus-pc"
     27#define SDHCI "sdhci"
     28#define PCIBUS "pci-bus"
     29#define SDHCI_PCI "sdhci-pci"
     30#define SDHCI_MM "generic-sdhci"
     31#define REGISTER_TEST "register-test"
     32
     33int npath;
     34
     35static void *machinefunct(QTestState *qts)
     36{
     37    return NULL;
     38}
     39
     40static void *driverfunct(void *obj, QGuestAllocator *machine, void *arg)
     41{
     42    return NULL;
     43}
     44
     45static void testfunct(void *obj, void *arg, QGuestAllocator *alloc)
     46{
     47    return;
     48}
     49
     50static void check_interface(const char *interface)
     51{
     52    g_assert_cmpint(qos_graph_has_machine(interface), ==, FALSE);
     53    g_assert_nonnull(qos_graph_get_node(interface));
     54    g_assert_cmpint(qos_graph_has_node(interface), ==, TRUE);
     55    g_assert_cmpint(qos_graph_get_node_type(interface), ==, QNODE_INTERFACE);
     56    qos_graph_node_set_availability(interface, TRUE);
     57    g_assert_cmpint(qos_graph_get_node_availability(interface), ==, TRUE);
     58}
     59
     60static void check_machine(const char *machine)
     61{
     62    qos_node_create_machine(machine, machinefunct);
     63    g_assert_nonnull(qos_graph_get_machine(machine));
     64    g_assert_cmpint(qos_graph_has_machine(machine), ==, TRUE);
     65    g_assert_nonnull(qos_graph_get_node(machine));
     66    g_assert_cmpint(qos_graph_get_node_availability(machine), ==, FALSE);
     67    qos_graph_node_set_availability(machine, TRUE);
     68    g_assert_cmpint(qos_graph_get_node_availability(machine), ==, TRUE);
     69    g_assert_cmpint(qos_graph_has_node(machine), ==, TRUE);
     70    g_assert_cmpint(qos_graph_get_node_type(machine), ==, QNODE_MACHINE);
     71}
     72
     73static void check_contains(const char *machine, const char *driver)
     74{
     75    QOSGraphEdge *edge;
     76    qos_node_contains(machine, driver, NULL);
     77
     78    edge = qos_graph_get_edge(machine, driver);
     79    g_assert_nonnull(edge);
     80    g_assert_cmpint(qos_graph_edge_get_type(edge), ==, QEDGE_CONTAINS);
     81    g_assert_cmpint(qos_graph_has_edge(machine, driver), ==, TRUE);
     82}
     83
     84static void check_produces(const char *machine, const char *interface)
     85{
     86    QOSGraphEdge *edge;
     87
     88    qos_node_produces(machine, interface);
     89    check_interface(interface);
     90    edge = qos_graph_get_edge(machine, interface);
     91    g_assert_nonnull(edge);
     92    g_assert_cmpint(qos_graph_edge_get_type(edge), ==,
     93                    QEDGE_PRODUCES);
     94    g_assert_cmpint(qos_graph_has_edge(machine, interface), ==, TRUE);
     95}
     96
     97static void check_consumes(const char *driver, const char *interface)
     98{
     99    QOSGraphEdge *edge;
    100
    101    qos_node_consumes(driver, interface, NULL);
    102    check_interface(interface);
    103    edge = qos_graph_get_edge(interface, driver);
    104    g_assert_nonnull(edge);
    105    g_assert_cmpint(qos_graph_edge_get_type(edge), ==, QEDGE_CONSUMED_BY);
    106    g_assert_cmpint(qos_graph_has_edge(interface, driver), ==, TRUE);
    107}
    108
    109static void check_driver(const char *driver)
    110{
    111    qos_node_create_driver(driver, driverfunct);
    112    g_assert_cmpint(qos_graph_has_machine(driver), ==, FALSE);
    113    g_assert_nonnull(qos_graph_get_node(driver));
    114    g_assert_cmpint(qos_graph_has_node(driver), ==, TRUE);
    115    g_assert_cmpint(qos_graph_get_node_type(driver), ==, QNODE_DRIVER);
    116    g_assert_cmpint(qos_graph_get_node_availability(driver), ==, FALSE);
    117    qos_graph_node_set_availability(driver, TRUE);
    118    g_assert_cmpint(qos_graph_get_node_availability(driver), ==, TRUE);
    119}
    120
    121static void check_test(const char *test, const char *interface)
    122{
    123    QOSGraphEdge *edge;
    124    char *full_name = g_strdup_printf("%s-tests/%s", interface, test);
    125
    126    qos_add_test(test, interface, testfunct, NULL);
    127    g_assert_cmpint(qos_graph_has_machine(test), ==, FALSE);
    128    g_assert_cmpint(qos_graph_has_machine(full_name), ==, FALSE);
    129    g_assert_nonnull(qos_graph_get_node(full_name));
    130    g_assert_cmpint(qos_graph_has_node(full_name), ==, TRUE);
    131    g_assert_cmpint(qos_graph_get_node_type(full_name), ==, QNODE_TEST);
    132    edge = qos_graph_get_edge(interface, full_name);
    133    g_assert_nonnull(edge);
    134    g_assert_cmpint(qos_graph_edge_get_type(edge), ==,
    135                    QEDGE_CONSUMED_BY);
    136    g_assert_cmpint(qos_graph_has_edge(interface, full_name), ==, TRUE);
    137    g_assert_cmpint(qos_graph_get_node_availability(full_name), ==, TRUE);
    138    qos_graph_node_set_availability(full_name, FALSE);
    139    g_assert_cmpint(qos_graph_get_node_availability(full_name), ==, FALSE);
    140    g_free(full_name);
    141}
    142
    143static void count_each_test(QOSGraphNode *path, int len)
    144{
    145    npath++;
    146}
    147
    148static void check_leaf_discovered(int n)
    149{
    150    npath = 0;
    151    qos_graph_foreach_test_path(count_each_test);
    152    g_assert_cmpint(n, ==, npath);
    153}
    154
    155/* G_Test functions */
    156
    157static void init_nop(void)
    158{
    159    qos_graph_init();
    160    qos_graph_destroy();
    161}
    162
    163static void test_machine(void)
    164{
    165    qos_graph_init();
    166    check_machine(MACHINE_PC);
    167    qos_graph_destroy();
    168}
    169
    170static void test_contains(void)
    171{
    172    qos_graph_init();
    173    check_contains(MACHINE_PC, I440FX);
    174    g_assert_null(qos_graph_get_machine(MACHINE_PC));
    175    g_assert_null(qos_graph_get_machine(I440FX));
    176    g_assert_null(qos_graph_get_node(MACHINE_PC));
    177    g_assert_null(qos_graph_get_node(I440FX));
    178    qos_graph_destroy();
    179}
    180
    181static void test_multiple_contains(void)
    182{
    183    qos_graph_init();
    184    check_contains(MACHINE_PC, I440FX);
    185    check_contains(MACHINE_PC, PCIBUS_PC);
    186    qos_graph_destroy();
    187}
    188
    189static void test_produces(void)
    190{
    191    qos_graph_init();
    192    check_produces(MACHINE_PC, I440FX);
    193    g_assert_null(qos_graph_get_machine(MACHINE_PC));
    194    g_assert_null(qos_graph_get_machine(I440FX));
    195    g_assert_null(qos_graph_get_node(MACHINE_PC));
    196    g_assert_nonnull(qos_graph_get_node(I440FX));
    197    qos_graph_destroy();
    198}
    199
    200static void test_multiple_produces(void)
    201{
    202    qos_graph_init();
    203    check_produces(MACHINE_PC, I440FX);
    204    check_produces(MACHINE_PC, PCIBUS_PC);
    205    qos_graph_destroy();
    206}
    207
    208static void test_consumes(void)
    209{
    210    qos_graph_init();
    211    check_consumes(I440FX, SDHCI);
    212    g_assert_null(qos_graph_get_machine(I440FX));
    213    g_assert_null(qos_graph_get_machine(SDHCI));
    214    g_assert_null(qos_graph_get_node(I440FX));
    215    g_assert_nonnull(qos_graph_get_node(SDHCI));
    216    qos_graph_destroy();
    217}
    218
    219static void test_multiple_consumes(void)
    220{
    221    qos_graph_init();
    222    check_consumes(I440FX, SDHCI);
    223    check_consumes(PCIBUS_PC, SDHCI);
    224    qos_graph_destroy();
    225}
    226
    227static void test_driver(void)
    228{
    229    qos_graph_init();
    230    check_driver(I440FX);
    231    qos_graph_destroy();
    232}
    233
    234static void test_test(void)
    235{
    236    qos_graph_init();
    237    check_test(REGISTER_TEST, SDHCI);
    238    qos_graph_destroy();
    239}
    240
    241static void test_machine_contains_driver(void)
    242{
    243    qos_graph_init();
    244    check_machine(MACHINE_PC);
    245    check_driver(I440FX);
    246    check_contains(MACHINE_PC, I440FX);
    247    qos_graph_destroy();
    248}
    249
    250static void test_driver_contains_driver(void)
    251{
    252    qos_graph_init();
    253    check_driver(PCIBUS_PC);
    254    check_driver(I440FX);
    255    check_contains(PCIBUS_PC, I440FX);
    256    qos_graph_destroy();
    257}
    258
    259static void test_machine_produces_interface(void)
    260{
    261    qos_graph_init();
    262    check_machine(MACHINE_PC);
    263    check_produces(MACHINE_PC, SDHCI);
    264    qos_graph_destroy();
    265}
    266
    267static void test_driver_produces_interface(void)
    268{
    269    qos_graph_init();
    270    check_driver(I440FX);
    271    check_produces(I440FX, SDHCI);
    272    qos_graph_destroy();
    273}
    274
    275static void test_machine_consumes_interface(void)
    276{
    277    qos_graph_init();
    278    check_machine(MACHINE_PC);
    279    check_consumes(MACHINE_PC, SDHCI);
    280    qos_graph_destroy();
    281}
    282
    283static void test_driver_consumes_interface(void)
    284{
    285    qos_graph_init();
    286    check_driver(I440FX);
    287    check_consumes(I440FX, SDHCI);
    288    qos_graph_destroy();
    289}
    290
    291static void test_test_consumes_interface(void)
    292{
    293    qos_graph_init();
    294    check_test(REGISTER_TEST, SDHCI);
    295    qos_graph_destroy();
    296}
    297
    298static void test_full_sample(void)
    299{
    300    qos_graph_init();
    301    check_machine(MACHINE_PC);
    302    check_contains(MACHINE_PC, I440FX);
    303    check_driver(I440FX);
    304    check_driver(PCIBUS_PC);
    305    check_contains(I440FX, PCIBUS_PC);
    306    check_produces(PCIBUS_PC, PCIBUS);
    307    check_driver(SDHCI_PCI);
    308    qos_node_consumes(SDHCI_PCI, PCIBUS, NULL);
    309    check_produces(SDHCI_PCI, SDHCI);
    310    check_driver(SDHCI_MM);
    311    check_produces(SDHCI_MM, SDHCI);
    312    qos_add_test(REGISTER_TEST, SDHCI, testfunct, NULL);
    313    check_leaf_discovered(1);
    314    qos_print_graph();
    315    qos_graph_destroy();
    316}
    317
    318static void test_full_sample_raspi(void)
    319{
    320    qos_graph_init();
    321    check_machine(MACHINE_PC);
    322    check_contains(MACHINE_PC, I440FX);
    323    check_driver(I440FX);
    324    check_driver(PCIBUS_PC);
    325    check_contains(I440FX, PCIBUS_PC);
    326    check_produces(PCIBUS_PC, PCIBUS);
    327    check_driver(SDHCI_PCI);
    328    qos_node_consumes(SDHCI_PCI, PCIBUS, NULL);
    329    check_produces(SDHCI_PCI, SDHCI);
    330    check_machine(MACHINE_RASPI2);
    331    check_contains(MACHINE_RASPI2, SDHCI_MM);
    332    check_driver(SDHCI_MM);
    333    check_produces(SDHCI_MM, SDHCI);
    334    qos_add_test(REGISTER_TEST, SDHCI, testfunct, NULL);
    335    qos_print_graph();
    336    check_leaf_discovered(2);
    337    qos_graph_destroy();
    338}
    339
    340static void test_cycle(void)
    341{
    342    qos_graph_init();
    343    check_machine(MACHINE_RASPI2);
    344    check_driver("B");
    345    check_driver("C");
    346    check_driver("D");
    347    check_contains(MACHINE_RASPI2, "B");
    348    check_contains("B", "C");
    349    check_contains("C", "D");
    350    check_contains("D", MACHINE_RASPI2);
    351    check_leaf_discovered(0);
    352    qos_print_graph();
    353    qos_graph_destroy();
    354}
    355
    356static void test_two_test_same_interface(void)
    357{
    358    qos_graph_init();
    359    check_machine(MACHINE_RASPI2);
    360    check_produces(MACHINE_RASPI2, "B");
    361    qos_add_test("C", "B", testfunct, NULL);
    362    qos_add_test("D", "B", testfunct, NULL);
    363    check_contains(MACHINE_RASPI2, "B");
    364    check_leaf_discovered(4);
    365    qos_print_graph();
    366    qos_graph_destroy();
    367}
    368
    369static void test_test_in_path(void)
    370{
    371    qos_graph_init();
    372    check_machine(MACHINE_RASPI2);
    373    check_produces(MACHINE_RASPI2, "B");
    374    qos_add_test("C", "B", testfunct, NULL);
    375    check_driver("D");
    376    check_consumes("D", "B");
    377    check_produces("D", "E");
    378    qos_add_test("F", "E", testfunct, NULL);
    379    check_leaf_discovered(2);
    380    qos_print_graph();
    381    qos_graph_destroy();
    382}
    383
    384static void test_double_edge(void)
    385{
    386    qos_graph_init();
    387    check_machine(MACHINE_RASPI2);
    388    check_produces("B", "C");
    389    qos_node_consumes("C", "B", NULL);
    390    qos_add_test("D", "C", testfunct, NULL);
    391    check_contains(MACHINE_RASPI2, "B");
    392    qos_print_graph();
    393    qos_graph_destroy();
    394}
    395
    396int main(int argc, char **argv)
    397{
    398    g_test_init(&argc, &argv, NULL);
    399    g_test_add_func("/qgraph/init_nop", init_nop);
    400    g_test_add_func("/qgraph/test_machine", test_machine);
    401    g_test_add_func("/qgraph/test_contains", test_contains);
    402    g_test_add_func("/qgraph/test_multiple_contains", test_multiple_contains);
    403    g_test_add_func("/qgraph/test_produces", test_produces);
    404    g_test_add_func("/qgraph/test_multiple_produces", test_multiple_produces);
    405    g_test_add_func("/qgraph/test_consumes", test_consumes);
    406    g_test_add_func("/qgraph/test_multiple_consumes",
    407                    test_multiple_consumes);
    408    g_test_add_func("/qgraph/test_driver", test_driver);
    409    g_test_add_func("/qgraph/test_test", test_test);
    410    g_test_add_func("/qgraph/test_machine_contains_driver",
    411                    test_machine_contains_driver);
    412    g_test_add_func("/qgraph/test_driver_contains_driver",
    413                    test_driver_contains_driver);
    414    g_test_add_func("/qgraph/test_machine_produces_interface",
    415                    test_machine_produces_interface);
    416    g_test_add_func("/qgraph/test_driver_produces_interface",
    417                    test_driver_produces_interface);
    418    g_test_add_func("/qgraph/test_machine_consumes_interface",
    419                    test_machine_consumes_interface);
    420    g_test_add_func("/qgraph/test_driver_consumes_interface",
    421                    test_driver_consumes_interface);
    422    g_test_add_func("/qgraph/test_test_consumes_interface",
    423                    test_test_consumes_interface);
    424    g_test_add_func("/qgraph/test_full_sample", test_full_sample);
    425    g_test_add_func("/qgraph/test_full_sample_raspi", test_full_sample_raspi);
    426    g_test_add_func("/qgraph/test_cycle", test_cycle);
    427    g_test_add_func("/qgraph/test_two_test_same_interface",
    428                    test_two_test_same_interface);
    429    g_test_add_func("/qgraph/test_test_in_path", test_test_in_path);
    430    g_test_add_func("/qgraph/test_double_edge", test_double_edge);
    431
    432    g_test_run();
    433    return 0;
    434}