aboutsummaryrefslogtreecommitdiffstats
path: root/hw/goldfish_pipe.h
diff options
context:
space:
mode:
Diffstat (limited to 'hw/goldfish_pipe.h')
-rw-r--r--hw/goldfish_pipe.h98
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 */