1/* 2 * QTest 3 * 4 * Copyright IBM, Corp. 2012 5 * Copyright Red Hat, Inc. 2012 6 * 7 * Authors: 8 * Anthony Liguori <aliguori@us.ibm.com> 9 * Paolo Bonzini <pbonzini@redhat.com> 10 * 11 * This work is licensed under the terms of the GNU GPL, version 2 or later. 12 * See the COPYING file in the top-level directory. 13 * 14 */ 15#ifndef LIBQTEST_H 16#define LIBQTEST_H 17 18#include <stdint.h> 19#include <stdbool.h> 20#include <sys/types.h> 21 22typedef struct QTestState QTestState; 23 24extern QTestState *global_qtest; 25 26/** 27 * qtest_init: 28 * @extra_args: other arguments to pass to QEMU. 29 */ 30QTestState *qtest_init(const char *extra_args); 31 32/** 33 * qtest_quit: 34 * @s: QTestState instance to operate on. 35 * 36 * Shut down the QEMU process associated to @s. 37 */ 38void qtest_quit(QTestState *s); 39 40/** 41 * qtest_qmp: 42 * @s: QTestState instance to operate on. 43 * @fmt...: QMP message to send to qemu 44 * 45 * Sends a QMP message to QEMU 46 */ 47void qtest_qmp(QTestState *s, const char *fmt, ...); 48 49/** 50 * qtest_get_irq: 51 * @s: QTestState instance to operate on. 52 * @num: Interrupt to observe. 53 * 54 * Return the level of the @num interrupt. 55 */ 56bool qtest_get_irq(QTestState *s, int num); 57 58/** 59 * qtest_irq_intercept_in: 60 * @s: QTestState instance to operate on. 61 * @string: QOM path of a device. 62 * 63 * Associate qtest irqs with the GPIO-in pins of the device 64 * whose path is specified by @string. 65 */ 66void qtest_irq_intercept_in(QTestState *s, const char *string); 67 68/** 69 * qtest_irq_intercept_out: 70 * @s: QTestState instance to operate on. 71 * @string: QOM path of a device. 72 * 73 * Associate qtest irqs with the GPIO-out pins of the device 74 * whose path is specified by @string. 75 */ 76void qtest_irq_intercept_out(QTestState *s, const char *string); 77 78/** 79 * qtest_outb: 80 * @s: QTestState instance to operate on. 81 * @addr: I/O port to write to. 82 * @value: Value being written. 83 * 84 * Write an 8-bit value to an I/O port. 85 */ 86void qtest_outb(QTestState *s, uint16_t addr, uint8_t value); 87 88/** 89 * qtest_outw: 90 * @s: QTestState instance to operate on. 91 * @addr: I/O port to write to. 92 * @value: Value being written. 93 * 94 * Write a 16-bit value to an I/O port. 95 */ 96void qtest_outw(QTestState *s, uint16_t addr, uint16_t value); 97 98/** 99 * qtest_outl: 100 * @s: QTestState instance to operate on. 101 * @addr: I/O port to write to. 102 * @value: Value being written. 103 * 104 * Write a 32-bit value to an I/O port. 105 */ 106void qtest_outl(QTestState *s, uint16_t addr, uint32_t value); 107 108/** 109 * qtest_inb: 110 * @s: QTestState instance to operate on. 111 * @addr: I/O port to read from. 112 * @value: Value being written. 113 * 114 * Returns an 8-bit value from an I/O port. 115 */ 116uint8_t qtest_inb(QTestState *s, uint16_t addr); 117 118/** 119 * qtest_inw: 120 * @s: QTestState instance to operate on. 121 * @addr: I/O port to read from. 122 * @value: Value being written. 123 * 124 * Returns a 16-bit value from an I/O port. 125 */ 126uint16_t qtest_inw(QTestState *s, uint16_t addr); 127 128/** 129 * qtest_inl: 130 * @s: QTestState instance to operate on. 131 * @addr: I/O port to read from. 132 * @value: Value being written. 133 * 134 * Returns a 32-bit value from an I/O port. 135 */ 136uint32_t qtest_inl(QTestState *s, uint16_t addr); 137 138/** 139 * qtest_memread: 140 * @s: QTestState instance to operate on. 141 * @addr: Guest address to read from. 142 * @data: Pointer to where memory contents will be stored. 143 * @size: Number of bytes to read. 144 * 145 * Read guest memory into a buffer. 146 */ 147void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size); 148 149/** 150 * qtest_memwrite: 151 * @s: QTestState instance to operate on. 152 * @addr: Guest address to write to. 153 * @data: Pointer to the bytes that will be written to guest memory. 154 * @size: Number of bytes to write. 155 * 156 * Write a buffer to guest memory. 157 */ 158void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size); 159 160/** 161 * qtest_clock_step_next: 162 * @s: QTestState instance to operate on. 163 * 164 * Advance the vm_clock to the next deadline. Return the current 165 * value of the vm_clock in nanoseconds. 166 */ 167int64_t qtest_clock_step_next(QTestState *s); 168 169/** 170 * qtest_clock_step: 171 * @s: QTestState instance to operate on. 172 * @step: Number of nanoseconds to advance the clock by. 173 * 174 * Advance the vm_clock by @step nanoseconds. Return the current 175 * value of the vm_clock in nanoseconds. 176 */ 177int64_t qtest_clock_step(QTestState *s, int64_t step); 178 179/** 180 * qtest_clock_set: 181 * @s: QTestState instance to operate on. 182 * @val: Nanoseconds value to advance the clock to. 183 * 184 * Advance the vm_clock to @val nanoseconds since the VM was launched. 185 * Return the current value of the vm_clock in nanoseconds. 186 */ 187int64_t qtest_clock_set(QTestState *s, int64_t val); 188 189/** 190 * qtest_get_arch: 191 * 192 * Returns the architecture for the QEMU executable under test. 193 */ 194const char *qtest_get_arch(void); 195 196/** 197 * qtest_add_func: 198 * @str: Test case path. 199 * @fn: Test case function 200 * 201 * Add a GTester testcase with the given name and function. 202 * The path is prefixed with the architecture under test, as 203 * returned by qtest_get_arch. 204 */ 205void qtest_add_func(const char *str, void (*fn)); 206 207/** 208 * qtest_start: 209 * @args: other arguments to pass to QEMU 210 * 211 * Start QEMU and assign the resulting QTestState to a global variable. 212 * The global variable is used by "shortcut" macros documented below. 213 */ 214#define qtest_start(args) ( \ 215 global_qtest = qtest_init((args)) \ 216 ) 217 218/** 219 * qmp: 220 * @fmt...: QMP message to send to qemu 221 * 222 * Sends a QMP message to QEMU 223 */ 224#define qmp(fmt, ...) qtest_qmp(global_qtest, fmt, ## __VA_ARGS__) 225 226/** 227 * get_irq: 228 * @num: Interrupt to observe. 229 * 230 * Return the level of the @num interrupt. 231 */ 232#define get_irq(num) qtest_get_irq(global_qtest, num) 233 234/** 235 * irq_intercept_in: 236 * @string: QOM path of a device. 237 * 238 * Associate qtest irqs with the GPIO-in pins of the device 239 * whose path is specified by @string. 240 */ 241#define irq_intercept_in(string) qtest_irq_intercept_in(global_qtest, string) 242 243/** 244 * qtest_irq_intercept_out: 245 * @string: QOM path of a device. 246 * 247 * Associate qtest irqs with the GPIO-out pins of the device 248 * whose path is specified by @string. 249 */ 250#define irq_intercept_out(string) qtest_irq_intercept_out(global_qtest, string) 251 252/** 253 * outb: 254 * @addr: I/O port to write to. 255 * @value: Value being written. 256 * 257 * Write an 8-bit value to an I/O port. 258 */ 259#define outb(addr, val) qtest_outb(global_qtest, addr, val) 260 261/** 262 * outw: 263 * @addr: I/O port to write to. 264 * @value: Value being written. 265 * 266 * Write a 16-bit value to an I/O port. 267 */ 268#define outw(addr, val) qtest_outw(global_qtest, addr, val) 269 270/** 271 * outl: 272 * @addr: I/O port to write to. 273 * @value: Value being written. 274 * 275 * Write a 32-bit value to an I/O port. 276 */ 277#define outl(addr, val) qtest_outl(global_qtest, addr, val) 278 279/** 280 * inb: 281 * @addr: I/O port to read from. 282 * @value: Value being written. 283 * 284 * Returns an 8-bit value from an I/O port. 285 */ 286#define inb(addr) qtest_inb(global_qtest, addr) 287 288/** 289 * inw: 290 * @addr: I/O port to read from. 291 * @value: Value being written. 292 * 293 * Returns a 16-bit value from an I/O port. 294 */ 295#define inw(addr) qtest_inw(global_qtest, addr) 296 297/** 298 * inl: 299 * @addr: I/O port to read from. 300 * @value: Value being written. 301 * 302 * Returns a 32-bit value from an I/O port. 303 */ 304#define inl(addr) qtest_inl(global_qtest, addr) 305 306/** 307 * memread: 308 * @addr: Guest address to read from. 309 * @data: Pointer to where memory contents will be stored. 310 * @size: Number of bytes to read. 311 * 312 * Read guest memory into a buffer. 313 */ 314#define memread(addr, data, size) qtest_memread(global_qtest, addr, data, size) 315 316/** 317 * memwrite: 318 * @addr: Guest address to write to. 319 * @data: Pointer to the bytes that will be written to guest memory. 320 * @size: Number of bytes to write. 321 * 322 * Write a buffer to guest memory. 323 */ 324#define memwrite(addr, data, size) qtest_memwrite(global_qtest, addr, data, size) 325 326/** 327 * clock_step_next: 328 * 329 * Advance the vm_clock to the next deadline. Return the current 330 * value of the vm_clock in nanoseconds. 331 */ 332#define clock_step_next() qtest_clock_step_next(global_qtest) 333 334/** 335 * clock_step: 336 * @step: Number of nanoseconds to advance the clock by. 337 * 338 * Advance the vm_clock by @step nanoseconds. Return the current 339 * value of the vm_clock in nanoseconds. 340 */ 341#define clock_step(step) qtest_clock_step(global_qtest, step) 342 343/** 344 * clock_set: 345 * @val: Nanoseconds value to advance the clock to. 346 * 347 * Advance the vm_clock to @val nanoseconds since the VM was launched. 348 * Return the current value of the vm_clock in nanoseconds. 349 */ 350#define clock_set(val) qtest_clock_set(global_qtest, val) 351 352#endif 353