void ffiseL4_Send(unsigned char *c, long clen, unsigned char *a, long alen) { seL4_CPtr ep; int offset = 1; memcpy(&ep, a + offset, sizeof(ep)); offset += sizeof(ep); seL4_Word len; memcpy(&len, a + offset, sizeof(len)); offset += sizeof(len); memcpy(&seL4_GetIPCBuffer()->msg[0], a + offset, len); seL4_Send( ep, seL4_MessageInfo_new(0, 0, 0, ROUND_UP_UNSAFE(len, sizeof(seL4_Word)) / sizeof(seL4_Word))); a[0] = FFI_SUCCESS; }
void ffiseL4_ReplyRecv(unsigned char *c, long clen, unsigned char *a, long alen) { seL4_CPtr ep; int offset = 1; memcpy(&ep, a + offset, sizeof(ep)); offset += sizeof(ep); seL4_Word len; memcpy(&len, a + offset, sizeof(len)); offset += sizeof(len); seL4_Word badge; memcpy(&seL4_GetIPCBuffer()->msg[0], a + offset, len); seL4_MessageInfo_t info = seL4_ReplyRecv( ep, seL4_MessageInfo_new(0, 0, 0, ROUND_UP_UNSAFE(len, sizeof(seL4_Word)) / sizeof(seL4_Word)), &badge); len = seL4_MessageInfo_get_length(info) * sizeof(seL4_Word); offset = 1; memcpy(a + offset, &len, sizeof(len)); offset += sizeof(len); memcpy(a + offset, &badge, sizeof(badge)); offset += sizeof(badge); memcpy(a + offset, &seL4_GetIPCBuffer()->msg[0], len); a[0] = FFI_SUCCESS; }
#include <sync/sem-bare.h> #include <utils/util.h> /*? macros.show_includes(me.instance.type.includes) ?*/ /* Interface-specific error handling. */ /*- set error_handler = '%s_error_handler' % me.interface.name -*/ /*? error.make_error_handler(me.interface.name, error_handler) ?*/ /*- set id = me.parent.to_ends.index(me) -*/ /*- set ep = alloc('ep_%d' % id, seL4_EndpointObject, read=True) -*/ /*- set handoff = alloc('handoff_%d' % id, seL4_EndpointObject, read=True, write=True) -*/ static volatile int handoff_value; char to_/*? id ?*/_/*? me.interface.name ?*/_data[ROUND_UP_UNSAFE(sizeof(int), PAGE_SIZE_4K)]; static volatile int *value = (volatile int*)to_/*? id ?*/_/*? me.interface.name ?*/_data; /*? register_shared_variable('%s_%d_data' % (me.parent.name, id), 'to_%d_%s_data' % (id, me.interface.name), 'RW') ?*/ /*- set lock = alloc('lock_%d' % id, seL4_NotificationObject, read=True, write=True) -*/ static volatile int lock_count = 1; static int lock(void) { int result = sync_bin_sem_bare_wait(/*? lock ?*/, &lock_count); __sync_synchronize(); return result; } static int unlock(void) { __sync_synchronize(); return sync_bin_sem_bare_post(/*? lock ?*/, &lock_count);