## 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.