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