static int bouncer_func(seL4_CPtr ep, seL4_Word arg1, seL4_Word arg2, seL4_Word arg3) { seL4_MessageInfo_t tag = seL4_MessageInfo_new(0, 0, 0, 0); seL4_Word sender_badge; seL4_Recv(ep, &sender_badge); while (1) { seL4_ReplyRecv(ep, tag, &sender_badge); } return 0; }
void init(){ printf("client-os: client os has started\n"); seL4_Word sender_badge; seL4_MessageInfo_t tag; seL4_Word msg,func_id; printf("client-os:receiver...........\n"); tag = seL4_Recv(TEE_EP_CPTR,&sender_badge); msg = seL4_GetMR(0); printf("client-os: msg = %d \n",msg ); seL4_SetMR(0,3221); seL4_ReplyRecv(TEE_EP_CPTR,tag,&sender_badge); }
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; }
/* function to run in the new thread */ void thread_2(void) { seL4_Word sender_badge; seL4_MessageInfo_t tag; seL4_Word msg; printf("thread_2: hallo wereld\n"); /* TODO 11: wait for a message to come in over the endpoint */ /* hint 1: seL4_Recv() * seL4_MessageInfo_t seL4_Recv(seL4_CPtr src, seL4_Word* sender) * @param src The capability to be invoked. * @param sender The badge of the endpoint capability that was invoked by the sender is written to this address. * @return A seL4_MessageInfo_t structure * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_11: * You can find out more about it in the API manual: http://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf * * hint 2: seL4_MessageInfo_t is generated during build. * The type definition and generated field access functions are defined in a generated file: * build/x86/pc99/libsel4/include/sel4/types_gen.h * It is generated from the following definition: * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_11: * You can find out more about it in the API manual: http://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf */ tag = seL4_Recv(ep_object.cptr, &sender_badge); /* TODO 12: make sure it is what we expected */ /* hint 1: check the badge. is it EP_BADGE? * hint 2: we are expecting only 1 message register * hint 3: seL4_MessageInfo_get_length() * seL4_Uint32 CONST seL4_MessageInfo_get_length(seL4_MessageInfo_t seL4_MessageInfo) * @param seL4_MessageInfo the seL4_MessageInfo_t to extract a field from * @return the number of message registers delivered * seL4_MessageInfo_get_length() is generated during build. It can be found in: * build/x86/pc99/libsel4/include/sel4/types_gen.h * It is generated from the following definition: * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_12: */ ZF_LOGF_IF(sender_badge != EP_BADGE, "Badge on the endpoint was not what was expected.\n"); ZF_LOGF_IF(seL4_MessageInfo_get_length(tag) != 1, "Length of the data send from root thread was not what was expected.\n" "\tHow many registers did you set with seL4_SetMR, within the root thread?\n"); /* TODO 13: get the message stored in the first message register */ /* hint: seL4_GetMR() * seL4_Word seL4_GetMR(int i) * @param i The message register to retreive * @return The message register value * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_13: * You can find out more about message registers in the API manual: http://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf */ msg = seL4_GetMR(0); printf("thread_2: got a message %#x from %#x\n", msg, sender_badge); /* modify the message */ msg = ~msg; /* TODO 14: copy the modified message back into the message register */ /* hint: seL4_SetMR() * void seL4_SetMR(int i, seL4_Word mr) * @param i The message register to write * @param mr The value of the message register * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_14: * You can find out more about message registers in the API manual: http://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf */ seL4_SetMR(0, msg); /* TODO 15: send the message back */ /* hint 1: seL4_ReplyRecv() * seL4_MessageInfo_t seL4_ReplyRecv(seL4_CPtr dest, seL4_MessageInfo_t msgInfo, seL4_Word *sender) * @param dest The capability to be invoked. * @param msgInfo The messageinfo structure for the IPC. This specifies information about the message to send (such as the number of message registers to send) as the Reply part. * @param sender The badge of the endpoint capability that was invoked by the sender is written to this address. This is a result of the Wait part. * @return A seL4_MessageInfo_t structure. This is a result of the Wait part. * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_15: * You can find out more about it in the API manual: http://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf * * hint 2: seL4_MessageInfo_t is generated during build. * The type definition and generated field access functions are defined in a generated file: * build/x86/pc99/libsel4/include/sel4/types_gen.h * It is generated from the following definition: * Link to source: https://wiki.sel4.systems/seL4%20Tutorial%203#TODO_15: * You can find out more about it in the API manual: http://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf */ seL4_ReplyRecv(ep_object.cptr, tag, &sender_badge); }