xref: /openbmc/qemu/tests/qtest/fuzz/qtest_wrappers.c (revision d92e1b6d5439e04d2b863113ce714709f40fb84e)
1*d92e1b6dSAlexander Bulekov /*
2*d92e1b6dSAlexander Bulekov  * qtest function wrappers
3*d92e1b6dSAlexander Bulekov  *
4*d92e1b6dSAlexander Bulekov  * Copyright Red Hat Inc., 2019
5*d92e1b6dSAlexander Bulekov  *
6*d92e1b6dSAlexander Bulekov  * Authors:
7*d92e1b6dSAlexander Bulekov  *  Alexander Bulekov   <alxndr@bu.edu>
8*d92e1b6dSAlexander Bulekov  *
9*d92e1b6dSAlexander Bulekov  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10*d92e1b6dSAlexander Bulekov  * See the COPYING file in the top-level directory.
11*d92e1b6dSAlexander Bulekov  *
12*d92e1b6dSAlexander Bulekov  */
13*d92e1b6dSAlexander Bulekov 
14*d92e1b6dSAlexander Bulekov #include "qemu/osdep.h"
15*d92e1b6dSAlexander Bulekov #include "cpu.h"
16*d92e1b6dSAlexander Bulekov #include "exec/ioport.h"
17*d92e1b6dSAlexander Bulekov 
18*d92e1b6dSAlexander Bulekov #include "fuzz.h"
19*d92e1b6dSAlexander Bulekov 
20*d92e1b6dSAlexander Bulekov static bool serialize = true;
21*d92e1b6dSAlexander Bulekov 
22*d92e1b6dSAlexander Bulekov #define WRAP(RET_TYPE, NAME_AND_ARGS)\
23*d92e1b6dSAlexander Bulekov     RET_TYPE __wrap_##NAME_AND_ARGS;\
24*d92e1b6dSAlexander Bulekov     RET_TYPE __real_##NAME_AND_ARGS;
25*d92e1b6dSAlexander Bulekov 
26*d92e1b6dSAlexander Bulekov WRAP(uint8_t  , qtest_inb(QTestState *s, uint16_t addr))
27*d92e1b6dSAlexander Bulekov WRAP(uint16_t , qtest_inw(QTestState *s, uint16_t addr))
28*d92e1b6dSAlexander Bulekov WRAP(uint32_t , qtest_inl(QTestState *s, uint16_t addr))
29*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_outb(QTestState *s, uint16_t addr, uint8_t value))
30*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_outw(QTestState *s, uint16_t addr, uint16_t value))
31*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_outl(QTestState *s, uint16_t addr, uint32_t value))
32*d92e1b6dSAlexander Bulekov WRAP(uint8_t  , qtest_readb(QTestState *s, uint64_t addr))
33*d92e1b6dSAlexander Bulekov WRAP(uint16_t , qtest_readw(QTestState *s, uint64_t addr))
34*d92e1b6dSAlexander Bulekov WRAP(uint32_t , qtest_readl(QTestState *s, uint64_t addr))
35*d92e1b6dSAlexander Bulekov WRAP(uint64_t , qtest_readq(QTestState *s, uint64_t addr))
36*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_writeb(QTestState *s, uint64_t addr, uint8_t value))
37*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_writew(QTestState *s, uint64_t addr, uint16_t value))
38*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_writel(QTestState *s, uint64_t addr, uint32_t value))
39*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_writeq(QTestState *s, uint64_t addr, uint64_t value))
40*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_memread(QTestState *s, uint64_t addr,
41*d92e1b6dSAlexander Bulekov                               void *data, size_t size))
42*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_bufread(QTestState *s, uint64_t addr, void *data,
43*d92e1b6dSAlexander Bulekov                               size_t size))
44*d92e1b6dSAlexander Bulekov WRAP(void     , qtest_memwrite(QTestState *s, uint64_t addr, const void *data,
45*d92e1b6dSAlexander Bulekov                                size_t size))
46*d92e1b6dSAlexander Bulekov WRAP(void,      qtest_bufwrite(QTestState *s, uint64_t addr,
47*d92e1b6dSAlexander Bulekov                                const void *data, size_t size))
48*d92e1b6dSAlexander Bulekov WRAP(void,      qtest_memset(QTestState *s, uint64_t addr,
49*d92e1b6dSAlexander Bulekov                              uint8_t patt, size_t size))
50*d92e1b6dSAlexander Bulekov 
51*d92e1b6dSAlexander Bulekov 
52*d92e1b6dSAlexander Bulekov uint8_t __wrap_qtest_inb(QTestState *s, uint16_t addr)
53*d92e1b6dSAlexander Bulekov {
54*d92e1b6dSAlexander Bulekov     if (!serialize) {
55*d92e1b6dSAlexander Bulekov         return cpu_inb(addr);
56*d92e1b6dSAlexander Bulekov     } else {
57*d92e1b6dSAlexander Bulekov         return __real_qtest_inb(s, addr);
58*d92e1b6dSAlexander Bulekov     }
59*d92e1b6dSAlexander Bulekov }
60*d92e1b6dSAlexander Bulekov 
61*d92e1b6dSAlexander Bulekov uint16_t __wrap_qtest_inw(QTestState *s, uint16_t addr)
62*d92e1b6dSAlexander Bulekov {
63*d92e1b6dSAlexander Bulekov     if (!serialize) {
64*d92e1b6dSAlexander Bulekov         return cpu_inw(addr);
65*d92e1b6dSAlexander Bulekov     } else {
66*d92e1b6dSAlexander Bulekov         return __real_qtest_inw(s, addr);
67*d92e1b6dSAlexander Bulekov     }
68*d92e1b6dSAlexander Bulekov }
69*d92e1b6dSAlexander Bulekov 
70*d92e1b6dSAlexander Bulekov uint32_t __wrap_qtest_inl(QTestState *s, uint16_t addr)
71*d92e1b6dSAlexander Bulekov {
72*d92e1b6dSAlexander Bulekov     if (!serialize) {
73*d92e1b6dSAlexander Bulekov         return cpu_inl(addr);
74*d92e1b6dSAlexander Bulekov     } else {
75*d92e1b6dSAlexander Bulekov         return __real_qtest_inl(s, addr);
76*d92e1b6dSAlexander Bulekov     }
77*d92e1b6dSAlexander Bulekov }
78*d92e1b6dSAlexander Bulekov 
79*d92e1b6dSAlexander Bulekov void __wrap_qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
80*d92e1b6dSAlexander Bulekov {
81*d92e1b6dSAlexander Bulekov     if (!serialize) {
82*d92e1b6dSAlexander Bulekov         cpu_outb(addr, value);
83*d92e1b6dSAlexander Bulekov     } else {
84*d92e1b6dSAlexander Bulekov         __real_qtest_outb(s, addr, value);
85*d92e1b6dSAlexander Bulekov     }
86*d92e1b6dSAlexander Bulekov }
87*d92e1b6dSAlexander Bulekov 
88*d92e1b6dSAlexander Bulekov void __wrap_qtest_outw(QTestState *s, uint16_t addr, uint16_t value)
89*d92e1b6dSAlexander Bulekov {
90*d92e1b6dSAlexander Bulekov     if (!serialize) {
91*d92e1b6dSAlexander Bulekov         cpu_outw(addr, value);
92*d92e1b6dSAlexander Bulekov     } else {
93*d92e1b6dSAlexander Bulekov         __real_qtest_outw(s, addr, value);
94*d92e1b6dSAlexander Bulekov     }
95*d92e1b6dSAlexander Bulekov }
96*d92e1b6dSAlexander Bulekov 
97*d92e1b6dSAlexander Bulekov void __wrap_qtest_outl(QTestState *s, uint16_t addr, uint32_t value)
98*d92e1b6dSAlexander Bulekov {
99*d92e1b6dSAlexander Bulekov     if (!serialize) {
100*d92e1b6dSAlexander Bulekov         cpu_outl(addr, value);
101*d92e1b6dSAlexander Bulekov     } else {
102*d92e1b6dSAlexander Bulekov         __real_qtest_outl(s, addr, value);
103*d92e1b6dSAlexander Bulekov     }
104*d92e1b6dSAlexander Bulekov }
105*d92e1b6dSAlexander Bulekov 
106*d92e1b6dSAlexander Bulekov uint8_t __wrap_qtest_readb(QTestState *s, uint64_t addr)
107*d92e1b6dSAlexander Bulekov {
108*d92e1b6dSAlexander Bulekov     uint8_t value;
109*d92e1b6dSAlexander Bulekov     if (!serialize) {
110*d92e1b6dSAlexander Bulekov         address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
111*d92e1b6dSAlexander Bulekov                             &value, 1);
112*d92e1b6dSAlexander Bulekov         return value;
113*d92e1b6dSAlexander Bulekov     } else {
114*d92e1b6dSAlexander Bulekov         return __real_qtest_readb(s, addr);
115*d92e1b6dSAlexander Bulekov     }
116*d92e1b6dSAlexander Bulekov }
117*d92e1b6dSAlexander Bulekov 
118*d92e1b6dSAlexander Bulekov uint16_t __wrap_qtest_readw(QTestState *s, uint64_t addr)
119*d92e1b6dSAlexander Bulekov {
120*d92e1b6dSAlexander Bulekov     uint16_t value;
121*d92e1b6dSAlexander Bulekov     if (!serialize) {
122*d92e1b6dSAlexander Bulekov         address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
123*d92e1b6dSAlexander Bulekov                             &value, 2);
124*d92e1b6dSAlexander Bulekov         return value;
125*d92e1b6dSAlexander Bulekov     } else {
126*d92e1b6dSAlexander Bulekov         return __real_qtest_readw(s, addr);
127*d92e1b6dSAlexander Bulekov     }
128*d92e1b6dSAlexander Bulekov }
129*d92e1b6dSAlexander Bulekov 
130*d92e1b6dSAlexander Bulekov uint32_t __wrap_qtest_readl(QTestState *s, uint64_t addr)
131*d92e1b6dSAlexander Bulekov {
132*d92e1b6dSAlexander Bulekov     uint32_t value;
133*d92e1b6dSAlexander Bulekov     if (!serialize) {
134*d92e1b6dSAlexander Bulekov         address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
135*d92e1b6dSAlexander Bulekov                             &value, 4);
136*d92e1b6dSAlexander Bulekov         return value;
137*d92e1b6dSAlexander Bulekov     } else {
138*d92e1b6dSAlexander Bulekov         return __real_qtest_readl(s, addr);
139*d92e1b6dSAlexander Bulekov     }
140*d92e1b6dSAlexander Bulekov }
141*d92e1b6dSAlexander Bulekov 
142*d92e1b6dSAlexander Bulekov uint64_t __wrap_qtest_readq(QTestState *s, uint64_t addr)
143*d92e1b6dSAlexander Bulekov {
144*d92e1b6dSAlexander Bulekov     uint64_t value;
145*d92e1b6dSAlexander Bulekov     if (!serialize) {
146*d92e1b6dSAlexander Bulekov         address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
147*d92e1b6dSAlexander Bulekov                             &value, 8);
148*d92e1b6dSAlexander Bulekov         return value;
149*d92e1b6dSAlexander Bulekov     } else {
150*d92e1b6dSAlexander Bulekov         return __real_qtest_readq(s, addr);
151*d92e1b6dSAlexander Bulekov     }
152*d92e1b6dSAlexander Bulekov }
153*d92e1b6dSAlexander Bulekov 
154*d92e1b6dSAlexander Bulekov void __wrap_qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
155*d92e1b6dSAlexander Bulekov {
156*d92e1b6dSAlexander Bulekov     if (!serialize) {
157*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
158*d92e1b6dSAlexander Bulekov                             &value, 1);
159*d92e1b6dSAlexander Bulekov     } else {
160*d92e1b6dSAlexander Bulekov         __real_qtest_writeb(s, addr, value);
161*d92e1b6dSAlexander Bulekov     }
162*d92e1b6dSAlexander Bulekov }
163*d92e1b6dSAlexander Bulekov 
164*d92e1b6dSAlexander Bulekov void __wrap_qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
165*d92e1b6dSAlexander Bulekov {
166*d92e1b6dSAlexander Bulekov     if (!serialize) {
167*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
168*d92e1b6dSAlexander Bulekov                             &value, 2);
169*d92e1b6dSAlexander Bulekov     } else {
170*d92e1b6dSAlexander Bulekov         __real_qtest_writew(s, addr, value);
171*d92e1b6dSAlexander Bulekov     }
172*d92e1b6dSAlexander Bulekov }
173*d92e1b6dSAlexander Bulekov 
174*d92e1b6dSAlexander Bulekov void __wrap_qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
175*d92e1b6dSAlexander Bulekov {
176*d92e1b6dSAlexander Bulekov     if (!serialize) {
177*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
178*d92e1b6dSAlexander Bulekov                             &value, 4);
179*d92e1b6dSAlexander Bulekov     } else {
180*d92e1b6dSAlexander Bulekov         __real_qtest_writel(s, addr, value);
181*d92e1b6dSAlexander Bulekov     }
182*d92e1b6dSAlexander Bulekov }
183*d92e1b6dSAlexander Bulekov 
184*d92e1b6dSAlexander Bulekov void __wrap_qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
185*d92e1b6dSAlexander Bulekov {
186*d92e1b6dSAlexander Bulekov     if (!serialize) {
187*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
188*d92e1b6dSAlexander Bulekov                             &value, 8);
189*d92e1b6dSAlexander Bulekov     } else {
190*d92e1b6dSAlexander Bulekov         __real_qtest_writeq(s, addr, value);
191*d92e1b6dSAlexander Bulekov     }
192*d92e1b6dSAlexander Bulekov }
193*d92e1b6dSAlexander Bulekov 
194*d92e1b6dSAlexander Bulekov void __wrap_qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
195*d92e1b6dSAlexander Bulekov {
196*d92e1b6dSAlexander Bulekov     if (!serialize) {
197*d92e1b6dSAlexander Bulekov         address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED, data,
198*d92e1b6dSAlexander Bulekov                            size);
199*d92e1b6dSAlexander Bulekov     } else {
200*d92e1b6dSAlexander Bulekov         __real_qtest_memread(s, addr, data, size);
201*d92e1b6dSAlexander Bulekov     }
202*d92e1b6dSAlexander Bulekov }
203*d92e1b6dSAlexander Bulekov 
204*d92e1b6dSAlexander Bulekov void __wrap_qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
205*d92e1b6dSAlexander Bulekov {
206*d92e1b6dSAlexander Bulekov     if (!serialize) {
207*d92e1b6dSAlexander Bulekov         address_space_read(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED, data,
208*d92e1b6dSAlexander Bulekov                            size);
209*d92e1b6dSAlexander Bulekov     } else {
210*d92e1b6dSAlexander Bulekov         __real_qtest_bufread(s, addr, data, size);
211*d92e1b6dSAlexander Bulekov     }
212*d92e1b6dSAlexander Bulekov }
213*d92e1b6dSAlexander Bulekov 
214*d92e1b6dSAlexander Bulekov void __wrap_qtest_memwrite(QTestState *s, uint64_t addr, const void *data,
215*d92e1b6dSAlexander Bulekov                            size_t size)
216*d92e1b6dSAlexander Bulekov {
217*d92e1b6dSAlexander Bulekov     if (!serialize) {
218*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
219*d92e1b6dSAlexander Bulekov                             data, size);
220*d92e1b6dSAlexander Bulekov     } else {
221*d92e1b6dSAlexander Bulekov         __real_qtest_memwrite(s, addr, data, size);
222*d92e1b6dSAlexander Bulekov     }
223*d92e1b6dSAlexander Bulekov }
224*d92e1b6dSAlexander Bulekov 
225*d92e1b6dSAlexander Bulekov void __wrap_qtest_bufwrite(QTestState *s, uint64_t addr,
226*d92e1b6dSAlexander Bulekov                     const void *data, size_t size)
227*d92e1b6dSAlexander Bulekov {
228*d92e1b6dSAlexander Bulekov     if (!serialize) {
229*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
230*d92e1b6dSAlexander Bulekov                             data, size);
231*d92e1b6dSAlexander Bulekov     } else {
232*d92e1b6dSAlexander Bulekov         __real_qtest_bufwrite(s, addr, data, size);
233*d92e1b6dSAlexander Bulekov     }
234*d92e1b6dSAlexander Bulekov }
235*d92e1b6dSAlexander Bulekov void __wrap_qtest_memset(QTestState *s, uint64_t addr,
236*d92e1b6dSAlexander Bulekov                          uint8_t patt, size_t size)
237*d92e1b6dSAlexander Bulekov {
238*d92e1b6dSAlexander Bulekov     void *data;
239*d92e1b6dSAlexander Bulekov     if (!serialize) {
240*d92e1b6dSAlexander Bulekov         data = malloc(size);
241*d92e1b6dSAlexander Bulekov         memset(data, patt, size);
242*d92e1b6dSAlexander Bulekov         address_space_write(first_cpu->as, addr, MEMTXATTRS_UNSPECIFIED,
243*d92e1b6dSAlexander Bulekov                             data, size);
244*d92e1b6dSAlexander Bulekov     } else {
245*d92e1b6dSAlexander Bulekov         __real_qtest_memset(s, addr, patt, size);
246*d92e1b6dSAlexander Bulekov     }
247*d92e1b6dSAlexander Bulekov }
248*d92e1b6dSAlexander Bulekov 
249*d92e1b6dSAlexander Bulekov void fuzz_qtest_set_serialize(bool option)
250*d92e1b6dSAlexander Bulekov {
251*d92e1b6dSAlexander Bulekov     serialize = option;
252*d92e1b6dSAlexander Bulekov }
253