Hello seL4 devs and users,
I am trying to send two capabilities from one process to another via the
extraCaps mechanism in the IPC. I can get it working when I send just 1
cap, but when I am sending 2 caps, the 2nd one never makes it. The
extraCaps field on the receiver side is somehow always 1. Looking at the
seL4 manual, I understood that I could send more than 1 capability via an
IPC. But since on the receiver side, I can only specify one receive slot, I
assumed that if more than 1 capability is received, it will be put in the
consecutive slots. Not sure if this is a valid assumption.

Looking at kerne/libsel4/include/sel4/constants.h
<https://github.com/seL4/seL4/blob/master/libsel4/include/sel4/constants.h#L54>,
I see that seL4_MsgMaxExtraCaps is set to 2, so I think I should be able to
send 2 caps. I have spent about 3 days trying to make this work and thought
that at this stage, it would be best to ask :)


My C code on the sender side looks something like this:

   seL4_CPtr cap1 = <alloc some capability>
   seL4_CPtr cap2 = <alloc some capability>

    seL4_SetMR(0, 0xabcd);
    seL4_SetCap(0, cap1);
    seL4_SetCap(1, cap2);
    seL4_MessageInfo_t tag = seL4_MessageInfo_new(0, 0, 2, 1);
    tag = seL4_Call(receivers_ep_cap, tag);


On the receive side, the code looks something like this:

        /* Allocate one csapce slot */
       cspacepath_t received_cap_path_1;
       error = vka_cspace_alloc_path(simple-vka, &received_cap_path_1);  <-
slot = 2786
       assert(error == 0);

        /* Allocate another csapce slot */
        cspacepath_t received_cap_path_2;
        error = vka_cspace_alloc_path(simple-vka, &received_cap_path_2); <-
slot = 2785(somehow decreasing)
        assert(error == 0);

        /* Since the allocated slots are decreasing in count, I pick the
lesser one as my first slot
         * assuming that if more than 1 cap is received it will be put in
the next slot */
        seL4_CPtr min_cptr = MIN(received_cap_path_1.capPtr,
received_cap_path_2.capPtr);

        seL4_SetCapReceivePath(
            /* _service */ received_cap_path.root,
            /* index */ min_cptr,
            /* depth */ received_cap_path.capDepth);

        tag = recv(&sender_badge);
        assert(seL4_MessageInfo_get_extraCaps(tag) == 2);  <--- This asser
fails.


Thanks again!!
Sid
Graduate Student @ UBC
_______________________________________________
Devel mailing list -- devel@sel4.systems
To unsubscribe send an email to devel-leave@sel4.systems

Reply via email to