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

mpqemu-link.h (2222B)


      1/*
      2 * Communication channel between QEMU and remote device process
      3 *
      4 * Copyright © 2018, 2021 Oracle and/or its affiliates.
      5 *
      6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
      7 * See the COPYING file in the top-level directory.
      8 *
      9 */
     10
     11#ifndef MPQEMU_LINK_H
     12#define MPQEMU_LINK_H
     13
     14#include "qom/object.h"
     15#include "qemu/thread.h"
     16#include "io/channel.h"
     17#include "exec/hwaddr.h"
     18#include "io/channel-socket.h"
     19#include "hw/remote/proxy.h"
     20
     21#define REMOTE_MAX_FDS 8
     22
     23#define MPQEMU_MSG_HDR_SIZE offsetof(MPQemuMsg, data.u64)
     24
     25/**
     26 * MPQemuCmd:
     27 *
     28 * MPQemuCmd enum type to specify the command to be executed on the remote
     29 * device.
     30 *
     31 * This uses a private protocol between QEMU and the remote process. vfio-user
     32 * protocol would supersede this in the future.
     33 *
     34 */
     35typedef enum {
     36    MPQEMU_CMD_SYNC_SYSMEM,
     37    MPQEMU_CMD_RET,
     38    MPQEMU_CMD_PCI_CFGWRITE,
     39    MPQEMU_CMD_PCI_CFGREAD,
     40    MPQEMU_CMD_BAR_WRITE,
     41    MPQEMU_CMD_BAR_READ,
     42    MPQEMU_CMD_SET_IRQFD,
     43    MPQEMU_CMD_DEVICE_RESET,
     44    MPQEMU_CMD_MAX,
     45} MPQemuCmd;
     46
     47typedef struct {
     48    hwaddr gpas[REMOTE_MAX_FDS];
     49    uint64_t sizes[REMOTE_MAX_FDS];
     50    off_t offsets[REMOTE_MAX_FDS];
     51} SyncSysmemMsg;
     52
     53typedef struct {
     54    uint32_t addr;
     55    uint32_t val;
     56    int len;
     57} PciConfDataMsg;
     58
     59typedef struct {
     60    hwaddr addr;
     61    uint64_t val;
     62    unsigned size;
     63    bool memory;
     64} BarAccessMsg;
     65
     66/**
     67 * MPQemuMsg:
     68 * @cmd: The remote command
     69 * @size: Size of the data to be shared
     70 * @data: Structured data
     71 * @fds: File descriptors to be shared with remote device
     72 *
     73 * MPQemuMsg Format of the message sent to the remote device from QEMU.
     74 *
     75 */
     76
     77typedef struct {
     78    int cmd;
     79    size_t size;
     80
     81    union {
     82        uint64_t u64;
     83        PciConfDataMsg pci_conf_data;
     84        SyncSysmemMsg sync_sysmem;
     85        BarAccessMsg bar_access;
     86    } data;
     87
     88    int fds[REMOTE_MAX_FDS];
     89    int num_fds;
     90} MPQemuMsg;
     91
     92bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
     93bool mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
     94
     95uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
     96                                         Error **errp);
     97bool mpqemu_msg_valid(MPQemuMsg *msg);
     98
     99#endif