Home | History | Annotate | Download | only in docs
      1 Android QEMU FAST PIPES
      2 =======================
      3 
      4 Introduction:
      5 -------------
      6 
      7 The Android emulator implements a special virtual device used to provide
      8 _very_ fast communication channels between the guest system and the
      9 emulator itself.
     10 
     11 From the guest, usage is simply as follows:
     12 
     13   1/ Open the /dev/qemu_pipe device for read+write
     14 
     15   2/ Write a zero-terminated string describing which service you want to
     16      connect.
     17 
     18   3/ Simply use read() and write() to communicate with the service.
     19 
     20 In other words:
     21 
     22    fd = open("/dev/qemu_pipe", O_RDWR);
     23    const char* pipeName = "<pipename>";
     24    ret = write(fd, pipeName, strlen(pipeName)+1);
     25    if (ret < 0) {
     26        // error
     27    }
     28    ... ready to go
     29 
     30 Where <pipename> is the name of a specific emulator service you want to use.
     31 Supported service names are listed later in this document.
     32 
     33 
     34 Implementation details:
     35 -----------------------
     36 
     37 In the emulator source tree:
     38 
     39     ./hw/goldfish_pipe.c implements the virtual driver.
     40 
     41     ./hw/goldfish_pipe.h provides the interface that must be
     42     implemented by any emulator pipe service.
     43 
     44     ./android/hw-pipe-net.c contains the implementation of the network pipe
     45     services (i.e. 'tcp' and 'unix'). See below for details.
     46 
     47 In the kernel source tree:
     48 
     49     drivers/misc/qemupipe/qemu_pipe.c contains the driver source code
     50     that will be accessible as /dev/qemu_pipe within the guest.
     51 
     52 
     53 Device / Driver Protocol details:
     54 ---------------------------------
     55 
     56 The device and driver use an I/O memory page and an IRQ to communicate.
     57 
     58   - The driver writes to various I/O registers to send commands to the
     59     device.
     60 
     61   - The device raises an IRQ to instruct the driver that certain events
     62     occured.
     63 
     64   - The driver reads I/O registers to get the status of its latest command,
     65     or the list of events that occured in case of interrupt.
     66 
     67 Each opened file descriptor to /dev/qemu_pipe in the guest corresponds to a
     68 32-bit 'channel' value allocated by the driver.
     69 
     70 The following is a description of the various commands sent by the driver
     71 to the device. Variable names beginning with REG_ correspond to 32-bit I/O
     72 registers:
     73 
     74   1/ Creating a new channel:
     75 
     76      Used by the driver to indicate that the guest just opened /dev/qemu_pipe
     77      that will be identified by a 32-bit value named '<channel>' here:
     78 
     79         REG_CHANNEL = <channel>
     80         REG_CMD     = CMD_OPEN
     81 
     82      IMPORTANT: <channel> should never be 0
     83 
     84   2/ Closing a channel:
     85 
     86      Used by the driver to indicate that the guest called 'close' on the
     87      channel file descriptor.
     88 
     89         REG_CHANNEL = <channel>
     90         REG_CMD     = CMD_CLOSE
     91 
     92   3/ Writing data to the channel:
     93 
     94      Corresponds to when the guest does a write() or writev() on the
     95      channel's file descriptor. This command is used to send a single
     96      memory buffer:
     97 
     98         REG_CHANNEL = <channel>
     99         REG_ADDRESS = <buffer-address>
    100         REG_SIZE    = <buffer-size>
    101         REG_CMD     = CMD_WRITE_BUFFER
    102 
    103         status = REG_STATUS
    104 
    105     NOTE: The <buffer-address> is the *GUEST* buffer address, not the
    106           physical/kernel one.
    107 
    108     IMPORTANT: The buffer sent through this command SHALL ALWAYS be entirely
    109                contained inside a single page of guest memory. This is
    110                enforced to simplify both the driver and the device.
    111 
    112                When a write() spans several pages of guest memory, the
    113                driver will issue several CMD_WRITE_BUFFER commands in
    114                succession, transparently to the client.
    115 
    116     The value returned by REG_STATUS should be:
    117 
    118        > 0    The number of bytes that were written to the pipe
    119        0      To indicate end-of-stream status
    120        < 0    A negative error code (see below).
    121 
    122     On important error code is PIPE_ERROR_AGAIN, used to indicate that
    123     writes can't be performed yet. See CMD_WAKE_ON_WRITE for more.
    124 
    125   4/ Reading data from the channel:
    126 
    127     Corresponds to when the guest does a read() or readv() on the
    128     channel's file descriptor.
    129 
    130         REG_CHANNEL = <channel>
    131         REG_ADDRESS = <buffer-address>
    132         REG_SIZE    = <buffer-size>
    133         REG_CMD     = CMD_READ_BUFFER
    134 
    135         status = REG_STATUS
    136 
    137     Same restrictions on buffer addresses/lengths and same set of error
    138     codes.
    139 
    140   5/ Waiting for write ability:
    141 
    142     If CMD_WRITE_BUFFER returns PIPE_ERROR_AGAIN, and the file descriptor
    143     is not in non-blocking mode, the driver must put the client task on a
    144     wait queue until the pipe service can accept data again.
    145 
    146     Before this, the driver will do:
    147 
    148         REG_CHANNEL = <channel>
    149         REG_CMD     = CMD_WAKE_ON_WRITE
    150 
    151     To indicate to the virtual device that it is waiting and should be woken
    152     up when the pipe becomes writable again. How this is done is explained
    153     later.
    154 
    155   6/ Waiting for read ability:
    156 
    157     This is the same than CMD_WAKE_ON_WRITE, but for readability instead.
    158 
    159         REG_CHANNEL = <channel>
    160         REG_CMD     = CMD_WAKE_ON_WRITE
    161 
    162   7/ Polling for write-able/read-able state:
    163 
    164     The following command is used by the driver to implement the select(),
    165     poll() and epoll() system calls where a pipe channel is involved.
    166 
    167         REG_CHANNEL = <channel>
    168         REG_CMD     = CMD_POLL
    169         mask = REG_STATUS
    170 
    171     The mask value returned by REG_STATUS is a mix of bit-flags for
    172     which events are available / have occured since the last call.
    173     See PIPE_POLL_READ / PIPE_POLL_WRITE / PIPE_POLL_CLOSED.
    174 
    175   8/ Signaling events to the driver:
    176 
    177     The device can signal events to the driver by raising its IRQ.
    178     The driver's interrupt handler will then have to read a list of
    179     (channel,mask) pairs, terminated by a single 0 value for the channel.
    180 
    181     In other words, the driver's interrupt handler will do:
    182 
    183         for (;;) {
    184             channel = REG_CHANNEL
    185             if (channel == 0)  // END OF LIST
    186                 break;
    187 
    188             mask = REG_WAKES  // BIT FLAGS OF EVENTS
    189             ... process events
    190         }
    191 
    192     The events reported through this list are simply:
    193 
    194        PIPE_WAKE_READ   :: the channel is now readable.
    195        PIPE_WAKE_WRITE  :: the channel is now writable.
    196        PIPE_WAKE_CLOSED :: the pipe service closed the connection.
    197 
    198     The PIPE_WAKE_READ and PIPE_WAKE_WRITE are only reported for a given
    199     channel if CMD_WAKE_ON_READ or CMD_WAKE_ON_WRITE (respectively) were
    200     issued for it.
    201 
    202     PIPE_WAKE_CLOSED can be signaled at any time.
    203 
    204 
    205 Available services:
    206 -------------------
    207 
    208   tcp:<port>
    209   tcp:<hostname>:<port>
    210 
    211      Open a TCP socket to a given port. This provides a very fast
    212      pass-through that doesn't depend on the very slow internal emulator
    213      NAT router. Note that you can only use the file descriptor with read()
    214      and write() though, send() and recv() will return an ENOTSOCK error,
    215      as well as any socket ioctl().
    216 
    217   unix:<path>
    218 
    219      Open a Unix-domain socket on the host.
    220 
    221   opengles
    222 
    223      Connects to the OpenGL ES emulation process. For now, the implementation
    224      is equivalent to tcp:22468, but this may change in the future.
    225