1/* 2 * QTest 3 * 4 * Copyright IBM, Corp. 2012 5 * Copyright Red Hat, Inc. 2012 6 * Copyright SUSE LINUX Products GmbH 2013 7 * 8 * Authors: 9 * Anthony Liguori <aliguori@us.ibm.com> 10 * Paolo Bonzini <pbonzini@redhat.com> 11 * Andreas Färber <afaerber@suse.de> 12 * 13 * This work is licensed under the terms of the GNU GPL, version 2 or later. 14 * See the COPYING file in the top-level directory. 15 * 16 */ 17#ifndef LIBQTEST_H 18#define LIBQTEST_H 19 20#include <stddef.h> 21#include <stdint.h> 22#include <stdbool.h> 23#include <stdarg.h> 24#include <sys/types.h> 25#include "qapi/qmp/qdict.h" 26 27typedef struct QTestState QTestState; 28 29extern QTestState *global_qtest; 30 31/** 32 * qtest_init: 33 * @extra_args: other arguments to pass to QEMU. 34 * 35 * Returns: #QTestState instance. 36 */ 37QTestState *qtest_init(const char *extra_args); 38 39/** 40 * qtest_quit: 41 * @s: #QTestState instance to operate on. 42 * 43 * Shut down the QEMU process associated to @s. 44 */ 45void qtest_quit(QTestState *s); 46 47/** 48 * qtest_qmp_discard_response: 49 * @s: #QTestState instance to operate on. 50 * @fmt...: QMP message to send to qemu 51 * 52 * Sends a QMP message to QEMU and consumes the response. 53 */ 54void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...); 55 56/** 57 * qtest_qmp: 58 * @s: #QTestState instance to operate on. 59 * @fmt...: QMP message to send to qemu 60 * 61 * Sends a QMP message to QEMU and returns the response. 62 */ 63QDict *qtest_qmp(QTestState *s, const char *fmt, ...); 64 65/** 66 * qtest_qmpv_discard_response: 67 * @s: #QTestState instance to operate on. 68 * @fmt: QMP message to send to QEMU 69 * @ap: QMP message arguments 70 * 71 * Sends a QMP message to QEMU and consumes the response. 72 */ 73void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap); 74 75/** 76 * qtest_qmpv: 77 * @s: #QTestState instance to operate on. 78 * @fmt: QMP message to send to QEMU 79 * @ap: QMP message arguments 80 * 81 * Sends a QMP message to QEMU and returns the response. 82 */ 83QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap); 84 85/** 86 * qtest_get_irq: 87 * @s: #QTestState instance to operate on. 88 * @num: Interrupt to observe. 89 * 90 * Returns: The level of the @num interrupt. 91 */ 92bool qtest_get_irq(QTestState *s, int num); 93 94/** 95 * qtest_irq_intercept_in: 96 * @s: #QTestState instance to operate on. 97 * @string: QOM path of a device. 98 * 99 * Associate qtest irqs with the GPIO-in pins of the device 100 * whose path is specified by @string. 101 */ 102void qtest_irq_intercept_in(QTestState *s, const char *string); 103 104/** 105 * qtest_irq_intercept_out: 106 * @s: #QTestState instance to operate on. 107 * @string: QOM path of a device. 108 * 109 * Associate qtest irqs with the GPIO-out pins of the device 110 * whose path is specified by @string. 111 */ 112void qtest_irq_intercept_out(QTestState *s, const char *string); 113 114/** 115 * qtest_outb: 116 * @s: #QTestState instance to operate on. 117 * @addr: I/O port to write to. 118 * @value: Value being written. 119 * 120 * Write an 8-bit value to an I/O port. 121 */ 122void qtest_outb(QTestState *s, uint16_t addr, uint8_t value); 123 124/** 125 * qtest_outw: 126 * @s: #QTestState instance to operate on. 127 * @addr: I/O port to write to. 128 * @value: Value being written. 129 * 130 * Write a 16-bit value to an I/O port. 131 */ 132void qtest_outw(QTestState *s, uint16_t addr, uint16_t value); 133 134/** 135 * qtest_outl: 136 * @s: #QTestState instance to operate on. 137 * @addr: I/O port to write to. 138 * @value: Value being written. 139 * 140 * Write a 32-bit value to an I/O port. 141 */ 142void qtest_outl(QTestState *s, uint16_t addr, uint32_t value); 143 144/** 145 * qtest_inb: 146 * @s: #QTestState instance to operate on. 147 * @addr: I/O port to read from. 148 * 149 * Returns an 8-bit value from an I/O port. 150 */ 151uint8_t qtest_inb(QTestState *s, uint16_t addr); 152 153/** 154 * qtest_inw: 155 * @s: #QTestState instance to operate on. 156 * @addr: I/O port to read from. 157 * 158 * Returns a 16-bit value from an I/O port. 159 */ 160uint16_t qtest_inw(QTestState *s, uint16_t addr); 161 162/** 163 * qtest_inl: 164 * @s: #QTestState instance to operate on. 165 * @addr: I/O port to read from. 166 * 167 * Returns a 32-bit value from an I/O port. 168 */ 169uint32_t qtest_inl(QTestState *s, uint16_t addr); 170 171/** 172 * qtest_writeb: 173 * @s: #QTestState instance to operate on. 174 * @addr: Guest address to write to. 175 * @value: Value being written. 176 * 177 * Writes an 8-bit value to memory. 178 */ 179void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value); 180 181/** 182 * qtest_writew: 183 * @s: #QTestState instance to operate on. 184 * @addr: Guest address to write to. 185 * @value: Value being written. 186 * 187 * Writes a 16-bit value to memory. 188 */ 189void qtest_writew(QTestState *s, uint64_t addr, uint16_t value); 190 191/** 192 * qtest_writel: 193 * @s: #QTestState instance to operate on. 194 * @addr: Guest address to write to. 195 * @value: Value being written. 196 * 197 * Writes a 32-bit value to memory. 198 */ 199void qtest_writel(QTestState *s, uint64_t addr, uint32_t value); 200 201/** 202 * qtest_writeq: 203 * @s: #QTestState instance to operate on. 204 * @addr: Guest address to write to. 205 * @value: Value being written. 206 * 207 * Writes a 64-bit value to memory. 208 */ 209void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value); 210 211/** 212 * qtest_readb: 213 * @s: #QTestState instance to operate on. 214 * @addr: Guest address to read from. 215 * 216 * Reads an 8-bit value from memory. 217 * 218 * Returns: Value read. 219 */ 220uint8_t qtest_readb(QTestState *s, uint64_t addr); 221 222/** 223 * qtest_readw: 224 * @s: #QTestState instance to operate on. 225 * @addr: Guest address to read from. 226 * 227 * Reads a 16-bit value from memory. 228 * 229 * Returns: Value read. 230 */ 231uint16_t qtest_readw(QTestState *s, uint64_t addr); 232 233/** 234 * qtest_readl: 235 * @s: #QTestState instance to operate on. 236 * @addr: Guest address to read from. 237 * 238 * Reads a 32-bit value from memory. 239 * 240 * Returns: Value read. 241 */ 242uint32_t qtest_readl(QTestState *s, uint64_t addr); 243 244/** 245 * qtest_readq: 246 * @s: #QTestState instance to operate on. 247 * @addr: Guest address to read from. 248 * 249 * Reads a 64-bit value from memory. 250 * 251 * Returns: Value read. 252 */ 253uint64_t qtest_readq(QTestState *s, uint64_t addr); 254 255/** 256 * qtest_memread: 257 * @s: #QTestState instance to operate on. 258 * @addr: Guest address to read from. 259 * @data: Pointer to where memory contents will be stored. 260 * @size: Number of bytes to read. 261 * 262 * Read guest memory into a buffer. 263 */ 264void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size); 265 266/** 267 * qtest_memwrite: 268 * @s: #QTestState instance to operate on. 269 * @addr: Guest address to write to. 270 * @data: Pointer to the bytes that will be written to guest memory. 271 * @size: Number of bytes to write. 272 * 273 * Write a buffer to guest memory. 274 */ 275void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size); 276 277/** 278 * qtest_clock_step_next: 279 * @s: #QTestState instance to operate on. 280 * 281 * Advance the QEMU_CLOCK_VIRTUAL to the next deadline. 282 * 283 * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds. 284 */ 285int64_t qtest_clock_step_next(QTestState *s); 286 287/** 288 * qtest_clock_step: 289 * @s: QTestState instance to operate on. 290 * @step: Number of nanoseconds to advance the clock by. 291 * 292 * Advance the QEMU_CLOCK_VIRTUAL by @step nanoseconds. 293 * 294 * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds. 295 */ 296int64_t qtest_clock_step(QTestState *s, int64_t step); 297 298/** 299 * qtest_clock_set: 300 * @s: QTestState instance to operate on. 301 * @val: Nanoseconds value to advance the clock to. 302 * 303 * Advance the QEMU_CLOCK_VIRTUAL to @val nanoseconds since the VM was launched. 304 * 305 * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds. 306 */ 307int64_t qtest_clock_set(QTestState *s, int64_t val); 308 309/** 310 * qtest_get_arch: 311 * 312 * Returns: The architecture for the QEMU executable under test. 313 */ 314const char *qtest_get_arch(void); 315 316/** 317 * qtest_add_func: 318 * @str: Test case path. 319 * @fn: Test case function 320 * 321 * Add a GTester testcase with the given name and function. 322 * The path is prefixed with the architecture under test, as 323 * returned by qtest_get_arch(). 324 */ 325void qtest_add_func(const char *str, void (*fn)); 326 327/** 328 * qtest_start: 329 * @args: other arguments to pass to QEMU 330 * 331 * Start QEMU and assign the resulting #QTestState to a global variable. 332 * The global variable is used by "shortcut" functions documented below. 333 * 334 * Returns: #QTestState instance. 335 */ 336static inline QTestState *qtest_start(const char *args) 337{ 338 global_qtest = qtest_init(args); 339 return global_qtest; 340} 341 342/** 343 * qtest_end: 344 * 345 * Shut down the QEMU process started by qtest_start(). 346 */ 347static inline void qtest_end(void) 348{ 349 qtest_quit(global_qtest); 350 global_qtest = NULL; 351} 352 353/** 354 * qmp: 355 * @fmt...: QMP message to send to qemu 356 * 357 * Sends a QMP message to QEMU and returns the response. 358 */ 359static inline QDict *qmp(const char *fmt, ...) 360{ 361 va_list ap; 362 QDict *response; 363 364 va_start(ap, fmt); 365 response = qtest_qmpv(global_qtest, fmt, ap); 366 va_end(ap); 367 return response; 368} 369 370/** 371 * qmp_discard_response: 372 * @fmt...: QMP message to send to qemu 373 * 374 * Sends a QMP message to QEMU and consumes the response. 375 */ 376static inline void qmp_discard_response(const char *fmt, ...) 377{ 378 va_list ap; 379 380 va_start(ap, fmt); 381 qtest_qmpv_discard_response(global_qtest, fmt, ap); 382 va_end(ap); 383} 384 385/** 386 * get_irq: 387 * @num: Interrupt to observe. 388 * 389 * Returns: The level of the @num interrupt. 390 */ 391static inline bool get_irq(int num) 392{ 393 return qtest_get_irq(global_qtest, num); 394} 395 396/** 397 * irq_intercept_in: 398 * @string: QOM path of a device. 399 * 400 * Associate qtest irqs with the GPIO-in pins of the device 401 * whose path is specified by @string. 402 */ 403static inline void irq_intercept_in(const char *string) 404{ 405 qtest_irq_intercept_in(global_qtest, string); 406} 407 408/** 409 * qtest_irq_intercept_out: 410 * @string: QOM path of a device. 411 * 412 * Associate qtest irqs with the GPIO-out pins of the device 413 * whose path is specified by @string. 414 */ 415static inline void irq_intercept_out(const char *string) 416{ 417 qtest_irq_intercept_out(global_qtest, string); 418} 419 420/** 421 * outb: 422 * @addr: I/O port to write to. 423 * @value: Value being written. 424 * 425 * Write an 8-bit value to an I/O port. 426 */ 427static inline void outb(uint16_t addr, uint8_t value) 428{ 429 qtest_outb(global_qtest, addr, value); 430} 431 432/** 433 * outw: 434 * @addr: I/O port to write to. 435 * @value: Value being written. 436 * 437 * Write a 16-bit value to an I/O port. 438 */ 439static inline void outw(uint16_t addr, uint16_t value) 440{ 441 qtest_outw(global_qtest, addr, value); 442} 443 444/** 445 * outl: 446 * @addr: I/O port to write to. 447 * @value: Value being written. 448 * 449 * Write a 32-bit value to an I/O port. 450 */ 451static inline void outl(uint16_t addr, uint32_t value) 452{ 453 qtest_outl(global_qtest, addr, value); 454} 455 456/** 457 * inb: 458 * @addr: I/O port to read from. 459 * 460 * Reads an 8-bit value from an I/O port. 461 * 462 * Returns: Value read. 463 */ 464static inline uint8_t inb(uint16_t addr) 465{ 466 return qtest_inb(global_qtest, addr); 467} 468 469/** 470 * inw: 471 * @addr: I/O port to read from. 472 * 473 * Reads a 16-bit value from an I/O port. 474 * 475 * Returns: Value read. 476 */ 477static inline uint16_t inw(uint16_t addr) 478{ 479 return qtest_inw(global_qtest, addr); 480} 481 482/** 483 * inl: 484 * @addr: I/O port to read from. 485 * 486 * Reads a 32-bit value from an I/O port. 487 * 488 * Returns: Value read. 489 */ 490static inline uint32_t inl(uint16_t addr) 491{ 492 return qtest_inl(global_qtest, addr); 493} 494 495/** 496 * writeb: 497 * @addr: Guest address to write to. 498 * @value: Value being written. 499 * 500 * Writes an 8-bit value to guest memory. 501 */ 502static inline void writeb(uint64_t addr, uint8_t value) 503{ 504 qtest_writeb(global_qtest, addr, value); 505} 506 507/** 508 * writew: 509 * @addr: Guest address to write to. 510 * @value: Value being written. 511 * 512 * Writes a 16-bit value to guest memory. 513 */ 514static inline void writew(uint64_t addr, uint16_t value) 515{ 516 qtest_writew(global_qtest, addr, value); 517} 518 519/** 520 * writel: 521 * @addr: Guest address to write to. 522 * @value: Value being written. 523 * 524 * Writes a 32-bit value to guest memory. 525 */ 526static inline void writel(uint64_t addr, uint32_t value) 527{ 528 qtest_writel(global_qtest, addr, value); 529} 530 531/** 532 * writeq: 533 * @addr: Guest address to write to. 534 * @value: Value being written. 535 * 536 * Writes a 64-bit value to guest memory. 537 */ 538static inline void writeq(uint64_t addr, uint64_t value) 539{ 540 qtest_writeq(global_qtest, addr, value); 541} 542 543/** 544 * readb: 545 * @addr: Guest address to read from. 546 * 547 * Reads an 8-bit value from guest memory. 548 * 549 * Returns: Value read. 550 */ 551static inline uint8_t readb(uint64_t addr) 552{ 553 return qtest_readb(global_qtest, addr); 554} 555 556/** 557 * readw: 558 * @addr: Guest address to read from. 559 * 560 * Reads a 16-bit value from guest memory. 561 * 562 * Returns: Value read. 563 */ 564static inline uint16_t readw(uint64_t addr) 565{ 566 return qtest_readw(global_qtest, addr); 567} 568 569/** 570 * readl: 571 * @addr: Guest address to read from. 572 * 573 * Reads a 32-bit value from guest memory. 574 * 575 * Returns: Value read. 576 */ 577static inline uint32_t readl(uint64_t addr) 578{ 579 return qtest_readl(global_qtest, addr); 580} 581 582/** 583 * readq: 584 * @addr: Guest address to read from. 585 * 586 * Reads a 64-bit value from guest memory. 587 * 588 * Returns: Value read. 589 */ 590static inline uint64_t readq(uint64_t addr) 591{ 592 return qtest_readq(global_qtest, addr); 593} 594 595/** 596 * memread: 597 * @addr: Guest address to read from. 598 * @data: Pointer to where memory contents will be stored. 599 * @size: Number of bytes to read. 600 * 601 * Read guest memory into a buffer. 602 */ 603static inline void memread(uint64_t addr, void *data, size_t size) 604{ 605 qtest_memread(global_qtest, addr, data, size); 606} 607 608/** 609 * memwrite: 610 * @addr: Guest address to write to. 611 * @data: Pointer to the bytes that will be written to guest memory. 612 * @size: Number of bytes to write. 613 * 614 * Write a buffer to guest memory. 615 */ 616static inline void memwrite(uint64_t addr, const void *data, size_t size) 617{ 618 qtest_memwrite(global_qtest, addr, data, size); 619} 620 621/** 622 * clock_step_next: 623 * 624 * Advance the QEMU_CLOCK_VIRTUAL to the next deadline. 625 * 626 * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds. 627 */ 628static inline int64_t clock_step_next(void) 629{ 630 return qtest_clock_step_next(global_qtest); 631} 632 633/** 634 * clock_step: 635 * @step: Number of nanoseconds to advance the clock by. 636 * 637 * Advance the QEMU_CLOCK_VIRTUAL by @step nanoseconds. 638 * 639 * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds. 640 */ 641static inline int64_t clock_step(int64_t step) 642{ 643 return qtest_clock_step(global_qtest, step); 644} 645 646/** 647 * clock_set: 648 * @val: Nanoseconds value to advance the clock to. 649 * 650 * Advance the QEMU_CLOCK_VIRTUAL to @val nanoseconds since the VM was launched. 651 * 652 * Returns: The current value of the QEMU_CLOCK_VIRTUAL in nanoseconds. 653 */ 654static inline int64_t clock_set(int64_t val) 655{ 656 return qtest_clock_set(global_qtest, val); 657} 658 659#endif 660