示例#1
0
文件: main.c 项目: jm--/seL4Examples
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));

}
示例#2
0
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;
}
示例#3
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;
}
示例#4
0
文件: swap.c 项目: ahixon/papaya
/*
 * 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;
}