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