void testEP(env_t env) { UNUSED int error; cspacepath_t epb1; //badged endpoint (derived from env->aep) seL4_CapData_t badge1 = seL4_CapData_Badge_new (1); //mint a badged endpoint with badge value 1 error = vka_mint_object(&env->vka, &env->aep, &epb1, seL4_CanWrite, badge1); assert(error == 0); cspacepath_t epb2; //badged endpoint (derived from env->aep) seL4_CapData_t badge2 = seL4_CapData_Badge_new (2); //mint a badged endpoint with badge value 2 error = vka_mint_object(&env->vka, &env->aep, &epb2, seL4_CanWrite, badge2); assert(error == 0); seL4_Notify(epb1.capPtr, 0); seL4_Notify(epb2.capPtr, 0); seL4_Word senderBadge; seL4_Wait(env->aep.cptr, &senderBadge); printf("senderBadge= %d\n", senderBadge); //prints 3; the two badges 1|2 //======================================= // uint32_t label = 0xF; // uint32_t capsUnwrapped = 0; // uint32_t extraCaps = 0; // uint32_t length = 3; // seL4_MessageInfo_t tag = seL4_MessageInfo_new( // label, capsUnwrapped, extraCaps, length); // seL4_SetMR(0, 0); //0xAFF); // seL4_SetMR(1, 0); //0xBFF); // seL4_SetMR(2, 0xCFF); // seL4_SetMR(3, 0xDFF); // seL4_SetMR(4, 0xEFF); // seL4_SetMR(5, 0xFFF); // seL4_NBSend(epb1.capPtr, tag); // tag = seL4_Wait(env->aep.cptr, &senderBadge); // printf("senderBadge %d\n", senderBadge); // // // in build/x86/pc99/libsel4/include/sel4/types_gen.h // label = seL4_MessageInfo_get_label(tag); // length = seL4_MessageInfo_get_length(tag); // // printf("** label=%x \n", label); // printf("** length=%x \n", length); // printf("** seL4_GetMR0=%x \n", seL4_GetMR(0)); // printf("** seL4_GetMR1=%x \n", seL4_GetMR(1)); // printf("** seL4_GetMR2=%x \n", seL4_GetMR(2)); // printf("** seL4_GetMR3=%x \n", seL4_GetMR(3)); // printf("** seL4_GetMR4=%x \n", seL4_GetMR(4)); // printf("** seL4_GetMR4=%x \n", seL4_GetMR(5)); }
int sync_mutex_unlock(sync_mutex_t *mutex) { assert(mutex != NULL); /* Wake the next person up. */ __sync_synchronize(); seL4_Notify(mutex->aep, 1); return 0; }
int sync_mutex_init(sync_mutex_t *mutex, seL4_CPtr aep) { assert(mutex != NULL); #ifdef SEL4_DEBUG_KERNEL /* Check the cap actually is an AEP. */ assert(seL4_DebugCapIdentify(aep) == 6); #endif mutex->aep = aep; /* Prime the endpoint. */ seL4_Notify(mutex->aep, 1); return 0; }
/* * mmap service */ int mmap_main (void) { while (1) { seL4_Word badge = 0; seL4_Wait (_mmap_ep, &badge); int do_reply = false; if (badge == 0) { seL4_Word method = seL4_GetMR (0); if (method == MMAP_REQUEST) { /* queue request from root server */ do_reply = mmap_queue_schedule ( seL4_GetMR (1), seL4_GetMR (2), (struct frameinfo*)seL4_GetMR (3), (void*)seL4_GetMR (4), (struct pawpaw_event*)seL4_GetMR (5)); if (do_reply) { seL4_Notify (rootserver_async_cap, MMAP_IRQ); } } else if (method == MMAP_RESULT) { /* root server wanted to read some data out of our queue */ seL4_MessageInfo_t reply = seL4_MessageInfo_new (0, 0, 0, 3); if (!done_queue) { seL4_SetMR (0, 0); seL4_SetMR (1, 0); seL4_SetMR (2, 0); } else { seL4_SetMR (0, (seL4_Word)done_queue->cb); seL4_SetMR (1, (seL4_Word)done_queue->evt); seL4_SetMR (2, (seL4_Word)done_queue->frame); struct mmap_queue_item* cur = done_queue; done_queue = done_queue->next; free (cur); } seL4_Reply (reply); } else { panic ("unknown request from rootsvr\n"); } } else { /* response from filesystem */ struct frameinfo* evt_id = (struct frameinfo*)seL4_GetMR (1); /* find the matching mmap request */ struct mmap_queue_item* q = mmap_queue; while (q) { /* FIXME: ensure amount (MR0) == PAGE_SIZE or needed amount */ if (q->frame == evt_id) { q = mmap_move_done (q); break; } q = q->next; } /* read finished, notify server if we found one */ if (q) { seL4_Notify (rootserver_async_cap, MMAP_IRQ); } } } return 0; }