2
0

hw.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /* Declarations for use by hardware emulation. */
  2. #ifndef QEMU_HW_H
  3. #define QEMU_HW_H
  4. #include "qemu-common.h"
  5. #include "irq.h"
  6. /* VM Load/Save */
  7. /* This function writes a chunk of data to a file at the given position.
  8. * The pos argument can be ignored if the file is only being used for
  9. * streaming. The handler should try to write all of the data it can.
  10. */
  11. typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
  12. int64_t pos, int size);
  13. /* Read a chunk of data from a file at the given position. The pos argument
  14. * can be ignored if the file is only be used for streaming. The number of
  15. * bytes actually read should be returned.
  16. */
  17. typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
  18. int64_t pos, int size);
  19. /* Close a file and return an error code */
  20. typedef int (QEMUFileCloseFunc)(void *opaque);
  21. /* Called to determine if the file has exceeded it's bandwidth allocation. The
  22. * bandwidth capping is a soft limit, not a hard limit.
  23. */
  24. typedef int (QEMUFileRateLimit)(void *opaque);
  25. QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer,
  26. QEMUFileGetBufferFunc *get_buffer,
  27. QEMUFileCloseFunc *close,
  28. QEMUFileRateLimit *rate_limit);
  29. QEMUFile *qemu_fopen(const char *filename, const char *mode);
  30. QEMUFile *qemu_fopen_socket(int fd);
  31. QEMUFile *qemu_popen(FILE *popen_file, const char *mode);
  32. QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
  33. int qemu_popen_fd(QEMUFile *f);
  34. void qemu_fflush(QEMUFile *f);
  35. int qemu_fclose(QEMUFile *f);
  36. void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
  37. void qemu_put_byte(QEMUFile *f, int v);
  38. static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
  39. {
  40. qemu_put_byte(f, (int)v);
  41. }
  42. #define qemu_put_sbyte qemu_put_byte
  43. void qemu_put_be16(QEMUFile *f, unsigned int v);
  44. void qemu_put_be32(QEMUFile *f, unsigned int v);
  45. void qemu_put_be64(QEMUFile *f, uint64_t v);
  46. int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
  47. int qemu_get_byte(QEMUFile *f);
  48. static inline unsigned int qemu_get_ubyte(QEMUFile *f)
  49. {
  50. return (unsigned int)qemu_get_byte(f);
  51. }
  52. #define qemu_get_sbyte qemu_get_byte
  53. unsigned int qemu_get_be16(QEMUFile *f);
  54. unsigned int qemu_get_be32(QEMUFile *f);
  55. uint64_t qemu_get_be64(QEMUFile *f);
  56. int qemu_file_rate_limit(QEMUFile *f);
  57. int qemu_file_has_error(QEMUFile *f);
  58. void qemu_file_set_error(QEMUFile *f);
  59. /* Try to send any outstanding data. This function is useful when output is
  60. * halted due to rate limiting or EAGAIN errors occur as it can be used to
  61. * resume output. */
  62. void qemu_file_put_notify(QEMUFile *f);
  63. static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
  64. {
  65. qemu_put_be64(f, *pv);
  66. }
  67. static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
  68. {
  69. qemu_put_be32(f, *pv);
  70. }
  71. static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
  72. {
  73. qemu_put_be16(f, *pv);
  74. }
  75. static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
  76. {
  77. qemu_put_byte(f, *pv);
  78. }
  79. static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
  80. {
  81. *pv = qemu_get_be64(f);
  82. }
  83. static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
  84. {
  85. *pv = qemu_get_be32(f);
  86. }
  87. static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
  88. {
  89. *pv = qemu_get_be16(f);
  90. }
  91. static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
  92. {
  93. *pv = qemu_get_byte(f);
  94. }
  95. // Signed versions for type safety
  96. static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
  97. {
  98. qemu_put_buffer(f, (const uint8_t *)buf, size);
  99. }
  100. static inline void qemu_put_sbe16(QEMUFile *f, int v)
  101. {
  102. qemu_put_be16(f, (unsigned int)v);
  103. }
  104. static inline void qemu_put_sbe32(QEMUFile *f, int v)
  105. {
  106. qemu_put_be32(f, (unsigned int)v);
  107. }
  108. static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
  109. {
  110. qemu_put_be64(f, (uint64_t)v);
  111. }
  112. static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
  113. {
  114. return qemu_get_buffer(f, (uint8_t *)buf, size);
  115. }
  116. static inline int qemu_get_sbe16(QEMUFile *f)
  117. {
  118. return (int)qemu_get_be16(f);
  119. }
  120. static inline int qemu_get_sbe32(QEMUFile *f)
  121. {
  122. return (int)qemu_get_be32(f);
  123. }
  124. static inline int64_t qemu_get_sbe64(QEMUFile *f)
  125. {
  126. return (int64_t)qemu_get_be64(f);
  127. }
  128. static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
  129. {
  130. qemu_put_8s(f, (const uint8_t *)pv);
  131. }
  132. static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
  133. {
  134. qemu_put_be16s(f, (const uint16_t *)pv);
  135. }
  136. static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
  137. {
  138. qemu_put_be32s(f, (const uint32_t *)pv);
  139. }
  140. static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
  141. {
  142. qemu_put_be64s(f, (const uint64_t *)pv);
  143. }
  144. static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
  145. {
  146. qemu_get_8s(f, (uint8_t *)pv);
  147. }
  148. static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
  149. {
  150. qemu_get_be16s(f, (uint16_t *)pv);
  151. }
  152. static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
  153. {
  154. qemu_get_be32s(f, (uint32_t *)pv);
  155. }
  156. static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
  157. {
  158. qemu_get_be64s(f, (uint64_t *)pv);
  159. }
  160. #ifdef NEED_CPU_H
  161. #if TARGET_LONG_BITS == 64
  162. #define qemu_put_betl qemu_put_be64
  163. #define qemu_get_betl qemu_get_be64
  164. #define qemu_put_betls qemu_put_be64s
  165. #define qemu_get_betls qemu_get_be64s
  166. #define qemu_put_sbetl qemu_put_sbe64
  167. #define qemu_get_sbetl qemu_get_sbe64
  168. #define qemu_put_sbetls qemu_put_sbe64s
  169. #define qemu_get_sbetls qemu_get_sbe64s
  170. #else
  171. #define qemu_put_betl qemu_put_be32
  172. #define qemu_get_betl qemu_get_be32
  173. #define qemu_put_betls qemu_put_be32s
  174. #define qemu_get_betls qemu_get_be32s
  175. #define qemu_put_sbetl qemu_put_sbe32
  176. #define qemu_get_sbetl qemu_get_sbe32
  177. #define qemu_put_sbetls qemu_put_sbe32s
  178. #define qemu_get_sbetls qemu_get_sbe32s
  179. #endif
  180. #endif
  181. int64_t qemu_ftell(QEMUFile *f);
  182. int64_t qemu_fseek(QEMUFile *f, int64_t pos, int whence);
  183. typedef void SaveStateHandler(QEMUFile *f, void *opaque);
  184. typedef int SaveLiveStateHandler(QEMUFile *f, int stage, void *opaque);
  185. typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
  186. int register_savevm(const char *idstr,
  187. int instance_id,
  188. int version_id,
  189. SaveStateHandler *save_state,
  190. LoadStateHandler *load_state,
  191. void *opaque);
  192. int register_savevm_live(const char *idstr,
  193. int instance_id,
  194. int version_id,
  195. SaveLiveStateHandler *save_live_state,
  196. SaveStateHandler *save_state,
  197. LoadStateHandler *load_state,
  198. void *opaque);
  199. void unregister_savevm(const char *idstr, void *opaque);
  200. typedef void QEMUResetHandler(void *opaque);
  201. void qemu_register_reset(QEMUResetHandler *func, void *opaque);
  202. /* handler to set the boot_device for a specific type of QEMUMachine */
  203. /* return 0 if success */
  204. typedef int QEMUBootSetHandler(void *opaque, const char *boot_device);
  205. void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque);
  206. /* These should really be in isa.h, but are here to make pc.h happy. */
  207. typedef void (IOPortWriteFunc)(void *opaque, uint32_t address, uint32_t data);
  208. typedef uint32_t (IOPortReadFunc)(void *opaque, uint32_t address);
  209. #endif