void __USER_TEXT __pong_thread(void *kip_ptr, void *utcb_ptr) { uint32_t msg[8] = { 0 }; while (1) L4_Ipc(L4_NILTHREAD, threads[PING_THREAD], 0, msg); }
void abort(void) { printf("testbench abort() called!\n"); L4_ThreadId_t dummy; for(;;) { L4_Ipc(L4_nilthread, L4_nilthread, L4_Timeouts(L4_Never, L4_Never), &dummy); } }
static void pager (void) { L4_ThreadId_t tid; L4_MsgTag_t tag; L4_Msg_t msg; L4_Send(master_tid); for (;;) { tag = L4_Wait(&tid); for (;;) { L4_Word_t faddr, fip; L4_MsgStore(tag, &msg); if (L4_UntypedWords (tag) != 2 || !L4_IpcSucceeded (tag)) { printf ("Malformed pagefault IPC from %p (tag=%p)\n", (void *) tid.raw, (void *) tag.raw); L4_KDB_Enter ("malformed pf"); break; } faddr = L4_MsgWord(&msg, 0); fip = L4_MsgWord (&msg, 1); L4_MsgClear(&msg); { L4_MapItem_t map; L4_SpaceId_t space; L4_Word_t seg, offset, cache, rwx, size; int r; seg = get_seg(KBENCH_SPACE, faddr, &offset, &cache, &rwx); assert(seg != ~0UL); size = L4_GetMinPageBits(); faddr &= ~((1ul << size)-1); offset &= ~((1ul << size)-1); space.raw = __L4_TCR_SenderSpace(); L4_MapItem_Map(&map, seg, offset, faddr, size, cache, rwx); r = L4_ProcessMapItem(space, map); assert(r == 1); } L4_MsgLoad(&msg); // tag = L4_ReplyWait (tid, &tid); tag = L4_MsgTag(); L4_Set_SendBlock(&tag); L4_Set_ReceiveBlock(&tag); tag = L4_Ipc(tid, L4_anythread, tag, &tid); } } }
static inline L4_Word_t pingpong_ipc_fass (L4_ThreadId_t dest, L4_Word_t untyped) { L4_MsgTag_t tag; tag.raw = 0; tag.X.u = untyped; tag.X.flags = (4 | 8); L4_ThreadId_t from; tag = L4_Ipc(dest, dest, tag, &from); return tag.raw; }
static inline L4_Word_t pingpong_ipc_rpc_server(L4_ThreadId_t dest, L4_Word_t untyped, L4_ThreadId_t *cap) { L4_MsgTag_t tag; tag.raw = 0; tag.X.u = untyped; //Untyped item number tag.X.flags = (4); //RBLOCK tag = L4_Ipc(dest, L4_anythread, tag, cap); return tag.raw; }
static inline L4_Word_t pingpong_ipc_open (L4_ThreadId_t dest, L4_Word_t untyped) { L4_MsgTag_t tag; tag.raw = 0; tag.X.u = untyped; //Untyped item number tag.X.flags = (4 | 8); //SRBLOCK L4_ThreadId_t from; tag = L4_Ipc(dest, L4_anythread, tag, &from); return tag.raw; }
static void utimer(void) { L4_KDB_SetThreadName(sos_my_tid(), "utimer"); L4_Accept(L4_UntypedWordsAcceptor); List *entryq; entryq = list_empty(); for (;;) { L4_Yield(); // Walk the timer list L4_Word_t now = L4_KDB_GetTick(); list_delete(entryq, processExpired, &now); // Wait for a new packet either blocking or non-blocking L4_MsgTag_t tag = L4_Niltag; if (list_null(entryq)) L4_Set_ReceiveBlock(&tag); else L4_Clear_ReceiveBlock(&tag); L4_ThreadId_t wait_tid = L4_nilthread; tag = L4_Ipc(L4_nilthread, L4_anythread, tag, &wait_tid); if (!L4_IpcFailed(tag)) { // Received a time out request queue it L4_Msg_t msg; L4_MsgStore(tag, &msg); // Get the message utimer_entry_t *entry = (utimer_entry_t *) L4_MsgWord(&msg, 0); entry->fTid = wait_tid; list_shift(entryq, entry); } else if (3 == L4_ErrorCode()) // Receive error # 1 continue; // no-partner - non-blocking else assert(!"Unhandled IPC error"); } }
void __USER_TEXT __root_thread(kip_t *kip_ptr, utcb_t *utcb_ptr) { l4_thread_t myself = utcb_ptr->t_globalid; char *free_mem = (char *) get_free_base(kip_ptr); uint32_t msg[8] = { 0 }; /* Allocate utcbs and stacks in Free memory region */ char *utcbs[2] = { free_mem, free_mem + UTCB_SIZE }; char *stacks[2] = { free_mem + 2 * UTCB_SIZE, free_mem + 2 * UTCB_SIZE + STACK_SIZE }; threads[PING_THREAD] = L4_THREAD_NUM(PING_THREAD, kip_ptr->thread_info.s.user_base); /* Ping */ threads[PONG_THREAD] = L4_THREAD_NUM(PONG_THREAD, kip_ptr->thread_info.s.user_base); /* Pong */ L4_ThreadControl(threads[PING_THREAD], myself, 0, myself, utcbs[PING_THREAD]); L4_ThreadControl(threads[PONG_THREAD], myself, 0, myself, utcbs[PONG_THREAD]); L4_Map(myself, (memptr_t) stacks[PING_THREAD], STACK_SIZE); L4_Map(myself, (memptr_t) stacks[PONG_THREAD], STACK_SIZE); L4_Start(threads[PING_THREAD], ping_thread, stacks[PING_THREAD] + STACK_SIZE); L4_Start(threads[PONG_THREAD], pong_thread, stacks[PONG_THREAD] + STACK_SIZE); while (1) L4_Ipc(L4_NILTHREAD, L4_NILTHREAD, 0, msg); }