Perform device reset in the remote process when QEMU performs device reset. This is required to reset the internal state (like registers, etc...) of emulated devices Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> Signed-off-by: John G Johnson <john.g.johnson@oracle.com> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 7cb220a51f565dc0817bd76e2f540e89c2d2b850.1611938319.git.jag.raman@oracle.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Communication channel between QEMU and remote device process
 | 
						|
 *
 | 
						|
 * Copyright © 2018, 2021 Oracle and/or its affiliates.
 | 
						|
 *
 | 
						|
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 | 
						|
 * See the COPYING file in the top-level directory.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef MPQEMU_LINK_H
 | 
						|
#define MPQEMU_LINK_H
 | 
						|
 | 
						|
#include "qom/object.h"
 | 
						|
#include "qemu/thread.h"
 | 
						|
#include "io/channel.h"
 | 
						|
#include "exec/hwaddr.h"
 | 
						|
#include "io/channel-socket.h"
 | 
						|
#include "hw/remote/proxy.h"
 | 
						|
 | 
						|
#define REMOTE_MAX_FDS 8
 | 
						|
 | 
						|
#define MPQEMU_MSG_HDR_SIZE offsetof(MPQemuMsg, data.u64)
 | 
						|
 | 
						|
/**
 | 
						|
 * MPQemuCmd:
 | 
						|
 *
 | 
						|
 * MPQemuCmd enum type to specify the command to be executed on the remote
 | 
						|
 * device.
 | 
						|
 *
 | 
						|
 * This uses a private protocol between QEMU and the remote process. vfio-user
 | 
						|
 * protocol would supersede this in the future.
 | 
						|
 *
 | 
						|
 */
 | 
						|
typedef enum {
 | 
						|
    MPQEMU_CMD_SYNC_SYSMEM,
 | 
						|
    MPQEMU_CMD_RET,
 | 
						|
    MPQEMU_CMD_PCI_CFGWRITE,
 | 
						|
    MPQEMU_CMD_PCI_CFGREAD,
 | 
						|
    MPQEMU_CMD_BAR_WRITE,
 | 
						|
    MPQEMU_CMD_BAR_READ,
 | 
						|
    MPQEMU_CMD_SET_IRQFD,
 | 
						|
    MPQEMU_CMD_DEVICE_RESET,
 | 
						|
    MPQEMU_CMD_MAX,
 | 
						|
} MPQemuCmd;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    hwaddr gpas[REMOTE_MAX_FDS];
 | 
						|
    uint64_t sizes[REMOTE_MAX_FDS];
 | 
						|
    off_t offsets[REMOTE_MAX_FDS];
 | 
						|
} SyncSysmemMsg;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    uint32_t addr;
 | 
						|
    uint32_t val;
 | 
						|
    int len;
 | 
						|
} PciConfDataMsg;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    hwaddr addr;
 | 
						|
    uint64_t val;
 | 
						|
    unsigned size;
 | 
						|
    bool memory;
 | 
						|
} BarAccessMsg;
 | 
						|
 | 
						|
/**
 | 
						|
 * MPQemuMsg:
 | 
						|
 * @cmd: The remote command
 | 
						|
 * @size: Size of the data to be shared
 | 
						|
 * @data: Structured data
 | 
						|
 * @fds: File descriptors to be shared with remote device
 | 
						|
 *
 | 
						|
 * MPQemuMsg Format of the message sent to the remote device from QEMU.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
typedef struct {
 | 
						|
    int cmd;
 | 
						|
    size_t size;
 | 
						|
 | 
						|
    union {
 | 
						|
        uint64_t u64;
 | 
						|
        PciConfDataMsg pci_conf_data;
 | 
						|
        SyncSysmemMsg sync_sysmem;
 | 
						|
        BarAccessMsg bar_access;
 | 
						|
    } data;
 | 
						|
 | 
						|
    int fds[REMOTE_MAX_FDS];
 | 
						|
    int num_fds;
 | 
						|
} MPQemuMsg;
 | 
						|
 | 
						|
bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
 | 
						|
bool mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
 | 
						|
 | 
						|
uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
 | 
						|
                                         Error **errp);
 | 
						|
bool mpqemu_msg_valid(MPQemuMsg *msg);
 | 
						|
 | 
						|
#endif
 |