qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

libqtest-single.h (6371B)


      1 /*
      2  * QTest - wrappers for test with single QEMU instances
      3  *
      4  * Copyright IBM, Corp. 2012
      5  * Copyright Red Hat, Inc. 2012
      6  * Copyright SUSE LINUX Products GmbH 2013
      7  *
      8  * This work is licensed under the terms of the GNU GPL, version 2 or later.
      9  * See the COPYING file in the top-level directory.
     10  */
     11 #ifndef LIBQTEST_SINGLE_H
     12 #define LIBQTEST_SINGLE_H
     13 
     14 #include "libqtest.h"
     15 
     16 #ifndef _WIN32
     17 QTestState *global_qtest __attribute__((common, weak));
     18 #else
     19 __declspec(selectany) QTestState *global_qtest;
     20 #endif
     21 
     22 /**
     23  * qtest_start:
     24  * @args: other arguments to pass to QEMU
     25  *
     26  * Start QEMU and assign the resulting #QTestState to a global variable.
     27  * The global variable is used by "shortcut" functions documented below.
     28  *
     29  * Returns: #QTestState instance.
     30  */
     31 static inline QTestState *qtest_start(const char *args)
     32 {
     33     global_qtest = qtest_init(args);
     34     return global_qtest;
     35 }
     36 
     37 /**
     38  * qtest_end:
     39  *
     40  * Shut down the QEMU process started by qtest_start().
     41  */
     42 static inline void qtest_end(void)
     43 {
     44     if (!global_qtest) {
     45         return;
     46     }
     47     qtest_quit(global_qtest);
     48     global_qtest = NULL;
     49 }
     50 
     51 /**
     52  * qmp:
     53  * @fmt...: QMP message to send to qemu, formatted like
     54  * qobject_from_jsonf_nofail().  See parse_interpolation() for what's
     55  * supported after '%'.
     56  *
     57  * Sends a QMP message to QEMU and returns the response.
     58  */
     59 G_GNUC_PRINTF(1, 2)
     60 static inline QDict *qmp(const char *fmt, ...)
     61 {
     62     va_list ap;
     63     QDict *response;
     64 
     65     va_start(ap, fmt);
     66     response = qtest_vqmp(global_qtest, fmt, ap);
     67     va_end(ap);
     68     return response;
     69 }
     70 
     71 /**
     72  * qmp_eventwait:
     73  * @s: #event event to wait for.
     74  *
     75  * Continuously polls for QMP responses until it receives the desired event.
     76  */
     77 static inline void qmp_eventwait(const char *event)
     78 {
     79     return qtest_qmp_eventwait(global_qtest, event);
     80 }
     81 
     82 /**
     83  * get_irq:
     84  * @num: Interrupt to observe.
     85  *
     86  * Returns: The level of the @num interrupt.
     87  */
     88 static inline bool get_irq(int num)
     89 {
     90     return qtest_get_irq(global_qtest, num);
     91 }
     92 
     93 /**
     94  * outb:
     95  * @addr: I/O port to write to.
     96  * @value: Value being written.
     97  *
     98  * Write an 8-bit value to an I/O port.
     99  */
    100 static inline void outb(uint16_t addr, uint8_t value)
    101 {
    102     qtest_outb(global_qtest, addr, value);
    103 }
    104 
    105 /**
    106  * outw:
    107  * @addr: I/O port to write to.
    108  * @value: Value being written.
    109  *
    110  * Write a 16-bit value to an I/O port.
    111  */
    112 static inline void outw(uint16_t addr, uint16_t value)
    113 {
    114     qtest_outw(global_qtest, addr, value);
    115 }
    116 
    117 /**
    118  * outl:
    119  * @addr: I/O port to write to.
    120  * @value: Value being written.
    121  *
    122  * Write a 32-bit value to an I/O port.
    123  */
    124 static inline void outl(uint16_t addr, uint32_t value)
    125 {
    126     qtest_outl(global_qtest, addr, value);
    127 }
    128 
    129 /**
    130  * inb:
    131  * @addr: I/O port to read from.
    132  *
    133  * Reads an 8-bit value from an I/O port.
    134  *
    135  * Returns: Value read.
    136  */
    137 static inline uint8_t inb(uint16_t addr)
    138 {
    139     return qtest_inb(global_qtest, addr);
    140 }
    141 
    142 /**
    143  * inw:
    144  * @addr: I/O port to read from.
    145  *
    146  * Reads a 16-bit value from an I/O port.
    147  *
    148  * Returns: Value read.
    149  */
    150 static inline uint16_t inw(uint16_t addr)
    151 {
    152     return qtest_inw(global_qtest, addr);
    153 }
    154 
    155 /**
    156  * inl:
    157  * @addr: I/O port to read from.
    158  *
    159  * Reads a 32-bit value from an I/O port.
    160  *
    161  * Returns: Value read.
    162  */
    163 static inline uint32_t inl(uint16_t addr)
    164 {
    165     return qtest_inl(global_qtest, addr);
    166 }
    167 
    168 /**
    169  * writeb:
    170  * @addr: Guest address to write to.
    171  * @value: Value being written.
    172  *
    173  * Writes an 8-bit value to guest memory.
    174  */
    175 static inline void writeb(uint64_t addr, uint8_t value)
    176 {
    177     qtest_writeb(global_qtest, addr, value);
    178 }
    179 
    180 /**
    181  * writew:
    182  * @addr: Guest address to write to.
    183  * @value: Value being written.
    184  *
    185  * Writes a 16-bit value to guest memory.
    186  */
    187 static inline void writew(uint64_t addr, uint16_t value)
    188 {
    189     qtest_writew(global_qtest, addr, value);
    190 }
    191 
    192 /**
    193  * writel:
    194  * @addr: Guest address to write to.
    195  * @value: Value being written.
    196  *
    197  * Writes a 32-bit value to guest memory.
    198  */
    199 static inline void writel(uint64_t addr, uint32_t value)
    200 {
    201     qtest_writel(global_qtest, addr, value);
    202 }
    203 
    204 /**
    205  * writeq:
    206  * @addr: Guest address to write to.
    207  * @value: Value being written.
    208  *
    209  * Writes a 64-bit value to guest memory.
    210  */
    211 static inline void writeq(uint64_t addr, uint64_t value)
    212 {
    213     qtest_writeq(global_qtest, addr, value);
    214 }
    215 
    216 /**
    217  * readb:
    218  * @addr: Guest address to read from.
    219  *
    220  * Reads an 8-bit value from guest memory.
    221  *
    222  * Returns: Value read.
    223  */
    224 static inline uint8_t readb(uint64_t addr)
    225 {
    226     return qtest_readb(global_qtest, addr);
    227 }
    228 
    229 /**
    230  * readw:
    231  * @addr: Guest address to read from.
    232  *
    233  * Reads a 16-bit value from guest memory.
    234  *
    235  * Returns: Value read.
    236  */
    237 static inline uint16_t readw(uint64_t addr)
    238 {
    239     return qtest_readw(global_qtest, addr);
    240 }
    241 
    242 /**
    243  * readl:
    244  * @addr: Guest address to read from.
    245  *
    246  * Reads a 32-bit value from guest memory.
    247  *
    248  * Returns: Value read.
    249  */
    250 static inline uint32_t readl(uint64_t addr)
    251 {
    252     return qtest_readl(global_qtest, addr);
    253 }
    254 
    255 /**
    256  * readq:
    257  * @addr: Guest address to read from.
    258  *
    259  * Reads a 64-bit value from guest memory.
    260  *
    261  * Returns: Value read.
    262  */
    263 static inline uint64_t readq(uint64_t addr)
    264 {
    265     return qtest_readq(global_qtest, addr);
    266 }
    267 
    268 /**
    269  * memread:
    270  * @addr: Guest address to read from.
    271  * @data: Pointer to where memory contents will be stored.
    272  * @size: Number of bytes to read.
    273  *
    274  * Read guest memory into a buffer.
    275  */
    276 static inline void memread(uint64_t addr, void *data, size_t size)
    277 {
    278     qtest_memread(global_qtest, addr, data, size);
    279 }
    280 
    281 /**
    282  * memwrite:
    283  * @addr: Guest address to write to.
    284  * @data: Pointer to the bytes that will be written to guest memory.
    285  * @size: Number of bytes to write.
    286  *
    287  * Write a buffer to guest memory.
    288  */
    289 static inline void memwrite(uint64_t addr, const void *data, size_t size)
    290 {
    291     qtest_memwrite(global_qtest, addr, data, size);
    292 }
    293 
    294 /**
    295  * clock_step_next:
    296  *
    297  * Advance the QEMU_CLOCK_VIRTUAL to the next deadline.
    298  *
    299  * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds.
    300  */
    301 static inline int64_t clock_step_next(void)
    302 {
    303     return qtest_clock_step_next(global_qtest);
    304 }
    305 
    306 /**
    307  * clock_step:
    308  * @step: Number of nanoseconds to advance the clock by.
    309  *
    310  * Advance the QEMU_CLOCK_VIRTUAL by @step nanoseconds.
    311  *
    312  * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds.
    313  */
    314 static inline int64_t clock_step(int64_t step)
    315 {
    316     return qtest_clock_step(global_qtest, step);
    317 }
    318 
    319 #endif