普通文本  |  73行  |  2.53 KB

## Overview

This is the native ivshmem-server implementation catering to the GCE CVD
vSoC project.

We are breaking from the general philosophy of ivshmem-server inter-vm
communication.

There is no concept of inter-vm communication. The server itself is meant to
run on the L1 Guest (or L0 even). We will call this domain as 'host-side'. The
following functions are envisoned:

* Create the shared-memory window, listen for VM connection (and subsequent
  disconnection). Note that the server can only accomodate one VM connection at
  a time. This may need to be enforced as there may be mulitple VMs (but each
  of them need a dedicated shared_memory and VM <--> server UNIX Domain
  sockets).

* Parse a JSON file describing memory layout and other information. Use
  this information to initialize the shared memory.

* Create two UNIX Domain sockets. One to communicate with QEMU and the other
  to communicate with host clients.

* For QEMU, speak the ivshmem protocol, i.e. pass a vmid, pass the shm fd
  to the qemu VM along with event fds. One for host to guest signalling and the
  other for guest to host signalling. Please see:
  QEMU_SRC/docs/specs/ivshmem-spec.txt. The only twist is that the server
  pretends to be another peer VM to comply to the ivshmem protocol.

* For the client, speak the ad-hoc client protocol:

   ivshmem_client <--> ivshmem_server handshake.

   Client -> 'GET PROTOCOL_VER'
   Server -> 'PROTOCOL_VER 0'
   Client -> INFORM REGION_NAME_LEN: 0x0000000a
   Client -> GET REGION: HW_COMPOSER
   Server -> 0xffffffff(If region name not found)
   Server -> 0xAABBC000 (region start offset)
   Server -> 0xAABBC0000 (region end offset)
   Server -> <Send cmsg with guest_to_host eventfd>
   Server -> <Send cmsg with host_to_guest eventfd>
   Server -> <Send cmsg with shmfd>

 * This also launches QEMU with the appropriate parameters

Building:
  From this directory issue the following in the command line
  `bazel build src:ivserver`

Running:
  Once the binary is built using bazel. Just run it from this directory
  as the default options expect the JSON files under conf directory.
  e.g.
  `./bazel-bin/src/ivserver`

  If you encounter either
  * Error in creating shared_memory file: File exists
  * Bind failed: Address already in use

  Please run the following commands and retry launching.
  `rm /dev/shm/ivshmem`
  `rm /tmp/ivsh*`

TODO:
 * Refactor.
 * Separate the JSON configuration into QEMU and mem-layout specific files.
 * Conform to Google coding standards.
 * Add some documentation on the default options.
 * Fault Tolerance.