diff options
Diffstat (limited to 'hw/goldfish_pipe.h')
-rw-r--r-- | hw/goldfish_pipe.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/hw/goldfish_pipe.h b/hw/goldfish_pipe.h new file mode 100644 index 0000000..03bc443 --- /dev/null +++ b/hw/goldfish_pipe.h @@ -0,0 +1,98 @@ +/* Copyright (C) 2011 The Android Open Source Project +** +** This software is licensed under the terms of the GNU General Public +** License version 2, as published by the Free Software Foundation, and +** may be copied, distributed, and modified under those terms. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +*/ +#ifndef _HW_GOLDFISH_PIPE_H +#define _HW_GOLDFISH_PIPE_H + +#include <stdint.h> +#include "android/hw-qemud.h" + +/* The following functions should called from hw/goldfish_trace.c and are + * used to implement QEMUD 'fast-pipes' in the Android emulator. + */ +extern void goldfish_pipe_thread_death(int tid); +extern void goldfish_pipe_write(int tid, int offset, uint32_t value); +extern uint32_t goldfish_pipe_read(int tid, int offset); + +/* The following definitions are used to define a "pipe handler" type. + * Each pipe handler manages a given, named pipe type, and must provide + * a few callbacks that will be used at appropriate times: + * + * - init :: + * is called when a guest client has connected to a given + * pipe. The function should return an opaque pointer that + * will be passed as the first parameter to other callbacks. + * + * Note: pipeOpaque is the value that was passed to + * goldfish_pipe_add_type() to register the pipe handler. + * + * - close :: + * is called when the pipe is closed.(either from the guest, or + * when the handler itself calls qemud_client_close() on the + * corresponding QemudClient object passed to init()). + * + * - sendBuffers :: + * is called when the guest is sending data through the pipe. This + * callback receives a list of buffer descriptors that indicate + * where the data is located in memory. + * + * Must return 0 on success, or -1 on failure, with errno of: + * + * ENOMEM -> indicates that the message is too large + * EAGAIN -> indicates that the handler is not ready + * to accept the message yet. + * + * - recvBuffers :: + * Is called when the guest wants to receive data from the pipe. + * The caller provides a list of memory buffers to put the data into. + * + * Must return the size of the incoming data on success, or -1 + * on error, with errno of: + * + * ENOMEM -> buffer too small to receive the message + * EAGAIN -> no incoming data yet + * + * - wakeOn :: + * is called to indicate that the guest wants to be waked when the + * pipe becomes able to either receive data from the guest, or send it + * new incoming data. It is the responsability of the pipe handler to + * signal the corresponding events by sending a single byte containing + * QEMUD_PIPE_WAKE_XXX bit flags through qemud_client_send() to do so. + */ + +enum { + QEMUD_PIPE_WAKE_ON_SEND = (1 << 0), + QEMUD_PIPE_WAKE_ON_RECV = (1 << 1), +}; + +/* Buffer descriptor for sendBuffers() and recvBuffers() callbacks */ +typedef struct GoldfishPipeBuffer { + uint8_t* data; + size_t size; +} GoldfishPipeBuffer; + +/* Pipe handler funcs */ +typedef struct { + void* (*init)( QemudClient* client, void* pipeOpaque ); + void (*close)( void* opaque ); + int (*sendBuffers)( void* opaque, const GoldfishPipeBuffer* buffers, int numBuffers ); + int (*recvBuffers)( void* opaque, GoldfishPipeBuffer* buffers, int numBuffers ); + void (*wakeOn)( void* opaque, int flags ); +} QemudPipeHandlerFuncs; + +/* Register a new pipe handler type. 'pipeOpaque' is passed directly + * to 'init() when a new pipe is connected to. + */ +extern void goldfish_pipe_add_type(const char* pipeName, + void* pipeOpaque, + const QemudPipeHandlerFuncs* pipeFuncs ); + +#endif /* _HW_GOLDFISH_PIPE_H */ |