2 * QTest testcase for LSI MegaRAID
4 * Copyright (c) 2017 Red Hat Inc.
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
10 #include "qemu/osdep.h"
12 #include "qemu/bswap.h"
13 #include "libqos/qgraph.h"
14 #include "libqos/pci.h"
16 typedef struct QMegasas QMegasas
;
23 static void *megasas_get_driver(void *obj
, const char *interface
)
25 QMegasas
*megasas
= obj
;
27 if (!g_strcmp0(interface
, "pci-device")) {
31 fprintf(stderr
, "%s not present in megasas\n", interface
);
32 g_assert_not_reached();
35 static void *megasas_create(void *pci_bus
, QGuestAllocator
*alloc
, void *addr
)
37 QMegasas
*megasas
= g_new0(QMegasas
, 1);
38 QPCIBus
*bus
= pci_bus
;
40 qpci_device_init(&megasas
->dev
, bus
, addr
);
41 megasas
->obj
.get_driver
= megasas_get_driver
;
46 /* This used to cause a NULL pointer dereference. */
47 static void megasas_pd_get_info_fuzz(void *obj
, void *data
, QGuestAllocator
*alloc
)
49 QMegasas
*megasas
= obj
;
50 QPCIDevice
*dev
= &megasas
->dev
;
52 uint32_t context
[256];
56 qpci_device_enable(dev
);
57 bar
= qpci_iomap(dev
, 0, NULL
);
59 memset(context
, 0, sizeof(context
));
60 context
[0] = cpu_to_le32(0x05050505);
61 context
[1] = cpu_to_le32(0x01010101);
62 for (i
= 2; i
< ARRAY_SIZE(context
); i
++) {
63 context
[i
] = cpu_to_le32(0x41414141);
65 context
[6] = cpu_to_le32(0x02020000);
66 context
[7] = cpu_to_le32(0);
68 context_pa
= guest_alloc(alloc
, sizeof(context
));
69 qtest_memwrite(dev
->bus
->qts
, context_pa
, context
, sizeof(context
));
70 qpci_io_writel(dev
, bar
, 0x40, context_pa
);
73 static void megasas_register_nodes(void)
75 QOSGraphEdgeOptions opts
= {
76 .extra_device_opts
= "addr=04.0,id=scsi0",
77 .before_cmd_line
= "-drive id=drv0,if=none,file=null-co://,format=raw",
78 .after_cmd_line
= "-device scsi-hd,bus=scsi0.0,drive=drv0",
81 add_qpci_address(&opts
, &(QPCIAddress
) { .devfn
= QPCI_DEVFN(4, 0) });
83 qos_node_create_driver("megasas", megasas_create
);
84 qos_node_consumes("megasas", "pci-bus", &opts
);
85 qos_node_produces("megasas", "pci-device");
87 qos_add_test("dcmd/pd-get-info/fuzz", "megasas", megasas_pd_get_info_fuzz
, NULL
);
89 libqos_init(megasas_register_nodes
);