qemu/include/migration/qemu-file.h
<<
>>
Prefs
   1/*
   2 * QEMU System Emulator
   3 *
   4 * Copyright (c) 2003-2008 Fabrice Bellard
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a copy
   7 * of this software and associated documentation files (the "Software"), to deal
   8 * in the Software without restriction, including without limitation the rights
   9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 * copies of the Software, and to permit persons to whom the Software is
  11 * furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 * THE SOFTWARE.
  23 */
  24#ifndef QEMU_FILE_H
  25#define QEMU_FILE_H 1
  26#include "exec/cpu-common.h"
  27
  28/* This function writes a chunk of data to a file at the given position.
  29 * The pos argument can be ignored if the file is only being used for
  30 * streaming.  The handler should try to write all of the data it can.
  31 */
  32typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
  33                                    int64_t pos, int size);
  34
  35/* Read a chunk of data from a file at the given position.  The pos argument
  36 * can be ignored if the file is only be used for streaming.  The number of
  37 * bytes actually read should be returned.
  38 */
  39typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
  40                                    int64_t pos, int size);
  41
  42/* Close a file
  43 *
  44 * Return negative error number on error, 0 or positive value on success.
  45 *
  46 * The meaning of return value on success depends on the specific back-end being
  47 * used.
  48 */
  49typedef int (QEMUFileCloseFunc)(void *opaque);
  50
  51/* Called to return the OS file descriptor associated to the QEMUFile.
  52 */
  53typedef int (QEMUFileGetFD)(void *opaque);
  54
  55/*
  56 * This function writes an iovec to file.
  57 */
  58typedef ssize_t (QEMUFileWritevBufferFunc)(void *opaque, struct iovec *iov,
  59                                           int iovcnt, int64_t pos);
  60
  61/*
  62 * This function provides hooks around different
  63 * stages of RAM migration.
  64 */
  65typedef int (QEMURamHookFunc)(QEMUFile *f, void *opaque, uint64_t flags);
  66
  67/*
  68 * Constants used by ram_control_* hooks
  69 */
  70#define RAM_CONTROL_SETUP    0
  71#define RAM_CONTROL_ROUND    1
  72#define RAM_CONTROL_HOOK     2
  73#define RAM_CONTROL_FINISH   3
  74
  75/*
  76 * This function allows override of where the RAM page
  77 * is saved (such as RDMA, for example.)
  78 */
  79typedef size_t (QEMURamSaveFunc)(QEMUFile *f, void *opaque,
  80                               ram_addr_t block_offset,
  81                               ram_addr_t offset,
  82                               size_t size,
  83                               int *bytes_sent);
  84
  85typedef struct QEMUFileOps {
  86    QEMUFilePutBufferFunc *put_buffer;
  87    QEMUFileGetBufferFunc *get_buffer;
  88    QEMUFileCloseFunc *close;
  89    QEMUFileGetFD *get_fd;
  90    QEMUFileWritevBufferFunc *writev_buffer;
  91    QEMURamHookFunc *before_ram_iterate;
  92    QEMURamHookFunc *after_ram_iterate;
  93    QEMURamHookFunc *hook_ram_load;
  94    QEMURamSaveFunc *save_page;
  95} QEMUFileOps;
  96
  97QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops);
  98QEMUFile *qemu_fopen(const char *filename, const char *mode);
  99QEMUFile *qemu_fdopen(int fd, const char *mode);
 100QEMUFile *qemu_fopen_socket(int fd, const char *mode);
 101QEMUFile *qemu_popen_cmd(const char *command, const char *mode);
 102int qemu_get_fd(QEMUFile *f);
 103int qemu_fclose(QEMUFile *f);
 104int64_t qemu_ftell(QEMUFile *f);
 105void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size);
 106void qemu_put_byte(QEMUFile *f, int v);
 107/*
 108 * put_buffer without copying the buffer.
 109 * The buffer should be available till it is sent asynchronously.
 110 */
 111void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size);
 112bool qemu_file_mode_is_not_valid(const char *mode);
 113
 114static inline void qemu_put_ubyte(QEMUFile *f, unsigned int v)
 115{
 116    qemu_put_byte(f, (int)v);
 117}
 118
 119#define qemu_put_sbyte qemu_put_byte
 120
 121void qemu_put_be16(QEMUFile *f, unsigned int v);
 122void qemu_put_be32(QEMUFile *f, unsigned int v);
 123void qemu_put_be64(QEMUFile *f, uint64_t v);
 124int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset);
 125int qemu_get_buffer(QEMUFile *f, uint8_t *buf, int size);
 126int qemu_peek_byte(QEMUFile *f, int offset);
 127int qemu_get_byte(QEMUFile *f);
 128void qemu_file_skip(QEMUFile *f, int size);
 129void qemu_update_position(QEMUFile *f, size_t size);
 130
 131static inline unsigned int qemu_get_ubyte(QEMUFile *f)
 132{
 133    return (unsigned int)qemu_get_byte(f);
 134}
 135
 136#define qemu_get_sbyte qemu_get_byte
 137
 138unsigned int qemu_get_be16(QEMUFile *f);
 139unsigned int qemu_get_be32(QEMUFile *f);
 140uint64_t qemu_get_be64(QEMUFile *f);
 141
 142int qemu_file_rate_limit(QEMUFile *f);
 143void qemu_file_reset_rate_limit(QEMUFile *f);
 144void qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
 145int64_t qemu_file_get_rate_limit(QEMUFile *f);
 146int qemu_file_get_error(QEMUFile *f);
 147void qemu_file_set_error(QEMUFile *f, int ret);
 148void qemu_fflush(QEMUFile *f);
 149
 150static inline void qemu_put_be64s(QEMUFile *f, const uint64_t *pv)
 151{
 152    qemu_put_be64(f, *pv);
 153}
 154
 155static inline void qemu_put_be32s(QEMUFile *f, const uint32_t *pv)
 156{
 157    qemu_put_be32(f, *pv);
 158}
 159
 160static inline void qemu_put_be16s(QEMUFile *f, const uint16_t *pv)
 161{
 162    qemu_put_be16(f, *pv);
 163}
 164
 165static inline void qemu_put_8s(QEMUFile *f, const uint8_t *pv)
 166{
 167    qemu_put_byte(f, *pv);
 168}
 169
 170static inline void qemu_get_be64s(QEMUFile *f, uint64_t *pv)
 171{
 172    *pv = qemu_get_be64(f);
 173}
 174
 175static inline void qemu_get_be32s(QEMUFile *f, uint32_t *pv)
 176{
 177    *pv = qemu_get_be32(f);
 178}
 179
 180static inline void qemu_get_be16s(QEMUFile *f, uint16_t *pv)
 181{
 182    *pv = qemu_get_be16(f);
 183}
 184
 185static inline void qemu_get_8s(QEMUFile *f, uint8_t *pv)
 186{
 187    *pv = qemu_get_byte(f);
 188}
 189
 190// Signed versions for type safety
 191static inline void qemu_put_sbuffer(QEMUFile *f, const int8_t *buf, int size)
 192{
 193    qemu_put_buffer(f, (const uint8_t *)buf, size);
 194}
 195
 196static inline void qemu_put_sbe16(QEMUFile *f, int v)
 197{
 198    qemu_put_be16(f, (unsigned int)v);
 199}
 200
 201static inline void qemu_put_sbe32(QEMUFile *f, int v)
 202{
 203    qemu_put_be32(f, (unsigned int)v);
 204}
 205
 206static inline void qemu_put_sbe64(QEMUFile *f, int64_t v)
 207{
 208    qemu_put_be64(f, (uint64_t)v);
 209}
 210
 211static inline size_t qemu_get_sbuffer(QEMUFile *f, int8_t *buf, int size)
 212{
 213    return qemu_get_buffer(f, (uint8_t *)buf, size);
 214}
 215
 216static inline int qemu_get_sbe16(QEMUFile *f)
 217{
 218    return (int)qemu_get_be16(f);
 219}
 220
 221static inline int qemu_get_sbe32(QEMUFile *f)
 222{
 223    return (int)qemu_get_be32(f);
 224}
 225
 226static inline int64_t qemu_get_sbe64(QEMUFile *f)
 227{
 228    return (int64_t)qemu_get_be64(f);
 229}
 230
 231static inline void qemu_put_s8s(QEMUFile *f, const int8_t *pv)
 232{
 233    qemu_put_8s(f, (const uint8_t *)pv);
 234}
 235
 236static inline void qemu_put_sbe16s(QEMUFile *f, const int16_t *pv)
 237{
 238    qemu_put_be16s(f, (const uint16_t *)pv);
 239}
 240
 241static inline void qemu_put_sbe32s(QEMUFile *f, const int32_t *pv)
 242{
 243    qemu_put_be32s(f, (const uint32_t *)pv);
 244}
 245
 246static inline void qemu_put_sbe64s(QEMUFile *f, const int64_t *pv)
 247{
 248    qemu_put_be64s(f, (const uint64_t *)pv);
 249}
 250
 251static inline void qemu_get_s8s(QEMUFile *f, int8_t *pv)
 252{
 253    qemu_get_8s(f, (uint8_t *)pv);
 254}
 255
 256static inline void qemu_get_sbe16s(QEMUFile *f, int16_t *pv)
 257{
 258    qemu_get_be16s(f, (uint16_t *)pv);
 259}
 260
 261static inline void qemu_get_sbe32s(QEMUFile *f, int32_t *pv)
 262{
 263    qemu_get_be32s(f, (uint32_t *)pv);
 264}
 265
 266static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
 267{
 268    qemu_get_be64s(f, (uint64_t *)pv);
 269}
 270#endif
 271