cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qemu-file.h (6960B)


      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
     25#ifndef MIGRATION_QEMU_FILE_H
     26#define MIGRATION_QEMU_FILE_H
     27
     28#include <zlib.h>
     29#include "exec/cpu-common.h"
     30#include "io/channel.h"
     31
     32/* Read a chunk of data from a file at the given position.  The pos argument
     33 * can be ignored if the file is only be used for streaming.  The number of
     34 * bytes actually read should be returned.
     35 */
     36typedef ssize_t (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
     37                                        int64_t pos, size_t size,
     38                                        Error **errp);
     39
     40/* Close a file
     41 *
     42 * Return negative error number on error, 0 or positive value on success.
     43 *
     44 * The meaning of return value on success depends on the specific back-end being
     45 * used.
     46 */
     47typedef int (QEMUFileCloseFunc)(void *opaque, Error **errp);
     48
     49/* Called to return the OS file descriptor associated to the QEMUFile.
     50 */
     51typedef int (QEMUFileGetFD)(void *opaque);
     52
     53/* Called to change the blocking mode of the file
     54 */
     55typedef int (QEMUFileSetBlocking)(void *opaque, bool enabled, Error **errp);
     56
     57/*
     58 * This function writes an iovec to file. The handler must write all
     59 * of the data or return a negative errno value.
     60 */
     61typedef ssize_t (QEMUFileWritevBufferFunc)(void *opaque, struct iovec *iov,
     62                                           int iovcnt, int64_t pos,
     63                                           Error **errp);
     64
     65/*
     66 * This function provides hooks around different
     67 * stages of RAM migration.
     68 * 'opaque' is the backend specific data in QEMUFile
     69 * 'data' is call specific data associated with the 'flags' value
     70 */
     71typedef int (QEMURamHookFunc)(QEMUFile *f, void *opaque, uint64_t flags,
     72                              void *data);
     73
     74/*
     75 * Constants used by ram_control_* hooks
     76 */
     77#define RAM_CONTROL_SETUP     0
     78#define RAM_CONTROL_ROUND     1
     79#define RAM_CONTROL_HOOK      2
     80#define RAM_CONTROL_FINISH    3
     81#define RAM_CONTROL_BLOCK_REG 4
     82
     83/*
     84 * This function allows override of where the RAM page
     85 * is saved (such as RDMA, for example.)
     86 */
     87typedef size_t (QEMURamSaveFunc)(QEMUFile *f, void *opaque,
     88                               ram_addr_t block_offset,
     89                               ram_addr_t offset,
     90                               size_t size,
     91                               uint64_t *bytes_sent);
     92
     93/*
     94 * Return a QEMUFile for comms in the opposite direction
     95 */
     96typedef QEMUFile *(QEMURetPathFunc)(void *opaque);
     97
     98/*
     99 * Stop any read or write (depending on flags) on the underlying
    100 * transport on the QEMUFile.
    101 * Existing blocking reads/writes must be woken
    102 * Returns 0 on success, -err on error
    103 */
    104typedef int (QEMUFileShutdownFunc)(void *opaque, bool rd, bool wr,
    105                                   Error **errp);
    106
    107typedef struct QEMUFileOps {
    108    QEMUFileGetBufferFunc *get_buffer;
    109    QEMUFileCloseFunc *close;
    110    QEMUFileSetBlocking *set_blocking;
    111    QEMUFileWritevBufferFunc *writev_buffer;
    112    QEMURetPathFunc *get_return_path;
    113    QEMUFileShutdownFunc *shut_down;
    114} QEMUFileOps;
    115
    116typedef struct QEMUFileHooks {
    117    QEMURamHookFunc *before_ram_iterate;
    118    QEMURamHookFunc *after_ram_iterate;
    119    QEMURamHookFunc *hook_ram_load;
    120    QEMURamSaveFunc *save_page;
    121} QEMUFileHooks;
    122
    123QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops, bool has_ioc);
    124void qemu_file_set_hooks(QEMUFile *f, const QEMUFileHooks *hooks);
    125int qemu_get_fd(QEMUFile *f);
    126int qemu_fclose(QEMUFile *f);
    127int64_t qemu_ftell(QEMUFile *f);
    128int64_t qemu_ftell_fast(QEMUFile *f);
    129/*
    130 * put_buffer without copying the buffer.
    131 * The buffer should be available till it is sent asynchronously.
    132 */
    133void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, size_t size,
    134                           bool may_free);
    135bool qemu_file_mode_is_not_valid(const char *mode);
    136bool qemu_file_is_writable(QEMUFile *f);
    137
    138#include "migration/qemu-file-types.h"
    139
    140size_t qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset);
    141size_t qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size);
    142ssize_t qemu_put_compression_data(QEMUFile *f, z_stream *stream,
    143                                  const uint8_t *p, size_t size);
    144int qemu_put_qemu_file(QEMUFile *f_des, QEMUFile *f_src);
    145
    146/*
    147 * Note that you can only peek continuous bytes from where the current pointer
    148 * is; you aren't guaranteed to be able to peak to +n bytes unless you've
    149 * previously peeked +n-1.
    150 */
    151int qemu_peek_byte(QEMUFile *f, int offset);
    152void qemu_file_skip(QEMUFile *f, int size);
    153void qemu_update_position(QEMUFile *f, size_t size);
    154void qemu_file_reset_rate_limit(QEMUFile *f);
    155void qemu_file_update_transfer(QEMUFile *f, int64_t len);
    156void qemu_file_set_rate_limit(QEMUFile *f, int64_t new_rate);
    157int64_t qemu_file_get_rate_limit(QEMUFile *f);
    158int qemu_file_get_error_obj(QEMUFile *f, Error **errp);
    159void qemu_file_set_error_obj(QEMUFile *f, int ret, Error *err);
    160void qemu_file_set_error(QEMUFile *f, int ret);
    161int qemu_file_shutdown(QEMUFile *f);
    162QEMUFile *qemu_file_get_return_path(QEMUFile *f);
    163void qemu_fflush(QEMUFile *f);
    164void qemu_file_set_blocking(QEMUFile *f, bool block);
    165
    166void ram_control_before_iterate(QEMUFile *f, uint64_t flags);
    167void ram_control_after_iterate(QEMUFile *f, uint64_t flags);
    168void ram_control_load_hook(QEMUFile *f, uint64_t flags, void *data);
    169
    170/* Whenever this is found in the data stream, the flags
    171 * will be passed to ram_control_load_hook in the incoming-migration
    172 * side. This lets before_ram_iterate/after_ram_iterate add
    173 * transport-specific sections to the RAM migration data.
    174 */
    175#define RAM_SAVE_FLAG_HOOK     0x80
    176
    177#define RAM_SAVE_CONTROL_NOT_SUPP -1000
    178#define RAM_SAVE_CONTROL_DELAYED  -2000
    179
    180size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
    181                             ram_addr_t offset, size_t size,
    182                             uint64_t *bytes_sent);
    183QIOChannel *qemu_file_get_ioc(QEMUFile *file);
    184
    185#endif