2 #include <l4/re/namespace>
3 #include <l4/re/util/cap_alloc>
4 #include <l4/cxx/ipc_stream>
5 #include <l4/ankh/protocol>
7 #include <l4/ankh/session>
8 #include <l4/shmc/ringbuf.h>
9 #include <l4/ankh/client-c.h>
10 #include <l4/sys/kdebug.h>
11 #include <l4/sys/debugger.h>
15 // XXX: support several ANKH connections
16 static L4::Cap<void> ankh_server;
17 l4shmc_area_t ankh_shmarea;
18 l4shmc_ringbuf_t _snd, _rcv;
19 l4shmc_chunk_t ankh_info_chunk;
20 AnkhSessionDescriptor* ankh_conn_info = NULL;
25 L4_CV l4shmc_ringbuf_t *l4ankh_get_sendbuf(void) L4_NOTHROW
28 L4_CV l4shmc_ringbuf_t *l4ankh_get_recvbuf(void) L4_NOTHROW
31 L4_CV void l4ankh_init(void) L4_NOTHROW
33 if (!(ankh_server = L4Re::Env::env()->get_cap<void>("ankh"))) {
34 printf("Could not find Ankh server.\n");
38 memset(&_snd, 0, sizeof(_snd));
39 memset(&_rcv, 0, sizeof(_rcv));
45 * * pass a cap name as parameter to support multiple connections
46 * * return a local handle (or a struct ptr)
49 l4ankh_open(char *shm_name, int bufsize) L4_NOTHROW
54 int err = l4shmc_attach(shm_name, &ankh_shmarea);
57 err = l4shmc_rb_init_buffer(&_snd, &ankh_shmarea, "tx_ring", "tx_signal", bufsize);
59 err = l4shmc_rb_init_buffer(&_rcv, &ankh_shmarea, "rx_ring", "rx_signal", bufsize);
61 err = l4shmc_add_chunk(&ankh_shmarea, "info", sizeof(struct AnkhSessionDescriptor),
65 L4::Ipc_iostream s(l4_utcb());
66 s << l4_umword_t(Ankh::Opcode::Activate);
67 l4_msgtag_t res = s.call(ankh_server.cap(), Ankh::Protocol::Ankh);
68 ASSERT_EQUAL(l4_ipc_error(res, l4_utcb()), 0);
69 printf("activated Ankh connection.\n");
75 L4_CV AnkhSessionDescriptor *l4ankh_get_info() L4_NOTHROW
78 ankh_conn_info = static_cast<AnkhSessionDescriptor*>(l4shmc_chunk_ptr(&ankh_info_chunk));
79 return ankh_conn_info;
84 extern "C" __attribute__((weak)) void fixup_shm_caphandlers(
85 int, l4shmc_area_t*, l4shmc_ringbuf_t*, l4shmc_ringbuf_t*);
88 L4_CV int l4ankh_prepare_send(l4_cap_idx_t owner) L4_NOTHROW
90 int r = l4shmc_rb_attach_sender(&_snd, "tx_signal", owner);
95 L4_CV int l4ankh_prepare_recv(l4_cap_idx_t owner) L4_NOTHROW
97 l4shmc_rb_attach_receiver(&_rcv, owner);
99 if (fixup_shm_caphandlers)
100 fixup_shm_caphandlers((int)&ankh_server, &ankh_shmarea, &_snd, &_rcv);
106 L4_CV int l4ankh_recv_blocking(char *buffer, unsigned *size) L4_NOTHROW
108 ASSERT_NOT_NULL(buffer);
109 ASSERT_NOT_NULL(size);
113 err = l4shmc_rb_receiver_wait_for_data(&_rcv, 1);
116 err = l4shmc_rb_receiver_copy_out(HEAD(&_rcv), buffer, size);
123 L4_CV int l4ankh_recv_nonblocking(char *buffer, unsigned *size) L4_NOTHROW
125 ASSERT_NOT_NULL(buffer);
126 ASSERT_NOT_NULL(size);
130 err = l4shmc_rb_receiver_wait_for_data(&_rcv, 0);
132 err = l4shmc_rb_receiver_copy_out(HEAD(&_rcv), buffer, size);
140 L4_CV int l4ankh_send(char *data, unsigned size, char block) L4_NOTHROW
142 int err = l4shmc_rb_sender_next_copy_in(&_snd, data, size, block);
144 l4shmc_rb_sender_commit_packet(&_snd);