1fbaf445aSAndreas Färber /*
2fbaf445aSAndreas Färber * QTest testcase for Intel HDA
3fbaf445aSAndreas Färber *
4fbaf445aSAndreas Färber * Copyright (c) 2014 SUSE LINUX Products GmbH
5fbaf445aSAndreas Färber *
6fbaf445aSAndreas Färber * This work is licensed under the terms of the GNU GPL, version 2 or later.
7fbaf445aSAndreas Färber * See the COPYING file in the top-level directory.
8fbaf445aSAndreas Färber */
9fbaf445aSAndreas Färber
10fbaf445aSAndreas Färber #include "qemu/osdep.h"
11dd210749SThomas Huth #include "libqtest-single.h"
12fbaf445aSAndreas Färber
13fbaf445aSAndreas Färber #define HDA_ID "hda0"
14*50333482SMartin Kletzander #define AUDIODEV " -audiodev driver=none,id=audio0 "
15*50333482SMartin Kletzander #define AUDIODEV_REF "audiodev=audio0"
16*50333482SMartin Kletzander #define CODEC_DEVICES " -device hda-output,bus=" HDA_ID ".0," AUDIODEV_REF \
17*50333482SMartin Kletzander " -device hda-micro,bus=" HDA_ID ".0," AUDIODEV_REF \
18*50333482SMartin Kletzander " -device hda-duplex,bus=" HDA_ID ".0," AUDIODEV_REF
19fbaf445aSAndreas Färber
20fbaf445aSAndreas Färber /* Tests only initialization so far. TODO: Replace with functional tests */
ich6_test(void)21fbaf445aSAndreas Färber static void ich6_test(void)
22fbaf445aSAndreas Färber {
23*50333482SMartin Kletzander qtest_start(AUDIODEV "-machine pc -device intel-hda,id=" HDA_ID CODEC_DEVICES);
24fbaf445aSAndreas Färber qtest_end();
25fbaf445aSAndreas Färber }
26fbaf445aSAndreas Färber
ich9_test(void)27fbaf445aSAndreas Färber static void ich9_test(void)
28fbaf445aSAndreas Färber {
29*50333482SMartin Kletzander qtest_start("-machine q35"
30*50333482SMartin Kletzander AUDIODEV
31*50333482SMartin Kletzander "-device ich9-intel-hda,bus=pcie.0,addr=1b.0,id="
32fbaf445aSAndreas Färber HDA_ID CODEC_DEVICES);
33fbaf445aSAndreas Färber qtest_end();
34fbaf445aSAndreas Färber }
35fbaf445aSAndreas Färber
3619a54527SPhilippe Mathieu-Daudé /*
3719a54527SPhilippe Mathieu-Daudé * https://gitlab.com/qemu-project/qemu/-/issues/542
3819a54527SPhilippe Mathieu-Daudé * Used to trigger:
3919a54527SPhilippe Mathieu-Daudé * AddressSanitizer: stack-overflow
4019a54527SPhilippe Mathieu-Daudé */
test_issue542_ich6(void)4119a54527SPhilippe Mathieu-Daudé static void test_issue542_ich6(void)
4219a54527SPhilippe Mathieu-Daudé {
4319a54527SPhilippe Mathieu-Daudé QTestState *s;
4419a54527SPhilippe Mathieu-Daudé
4519a54527SPhilippe Mathieu-Daudé s = qtest_init("-nographic -nodefaults -M pc-q35-6.2 "
46*50333482SMartin Kletzander AUDIODEV
4719a54527SPhilippe Mathieu-Daudé "-device intel-hda,id=" HDA_ID CODEC_DEVICES);
4819a54527SPhilippe Mathieu-Daudé
4919a54527SPhilippe Mathieu-Daudé qtest_outl(s, 0xcf8, 0x80000804);
5019a54527SPhilippe Mathieu-Daudé qtest_outw(s, 0xcfc, 0x06);
5119a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0xff0d060f, "\x03", 1);
5219a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x0, "\x12", 1);
5319a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x2, "\x2a", 1);
5419a54527SPhilippe Mathieu-Daudé qtest_writeb(s, 0x0, 0x12);
5519a54527SPhilippe Mathieu-Daudé qtest_writeb(s, 0x2, 0x2a);
5619a54527SPhilippe Mathieu-Daudé qtest_outl(s, 0xcf8, 0x80000811);
5719a54527SPhilippe Mathieu-Daudé qtest_outl(s, 0xcfc, 0x006a4400);
5819a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44005a, "\x01", 1);
5919a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44005c, "\x02", 1);
6019a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a442050, "\x00\x00\x44\x6a", 4);
6119a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44204a, "\x01", 1);
6219a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44204c, "\x02", 1);
6319a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44005c, "\x02", 1);
6419a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a442050, "\x00\x00\x44\x6a", 4);
6519a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44204a, "\x01", 1);
6619a54527SPhilippe Mathieu-Daudé qtest_bufwrite(s, 0x6a44204c, "\x02", 1);
6719a54527SPhilippe Mathieu-Daudé qtest_quit(s);
6819a54527SPhilippe Mathieu-Daudé }
6919a54527SPhilippe Mathieu-Daudé
main(int argc,char ** argv)70fbaf445aSAndreas Färber int main(int argc, char **argv)
71fbaf445aSAndreas Färber {
72fbaf445aSAndreas Färber g_test_init(&argc, &argv, NULL);
7308ed0988SJuan Quintela if (qtest_has_machine("pc")) {
74fbaf445aSAndreas Färber qtest_add_func("/intel-hda/ich6", ich6_test);
7508ed0988SJuan Quintela }
7608ed0988SJuan Quintela if (qtest_has_machine("q35")) {
77fbaf445aSAndreas Färber qtest_add_func("/intel-hda/ich9", ich9_test);
7819a54527SPhilippe Mathieu-Daudé qtest_add_func("/intel-hda/fuzz/issue542", test_issue542_ich6);
7908ed0988SJuan Quintela }
809be38598SEduardo Habkost return g_test_run();
81fbaf445aSAndreas Färber }
82