Questions about Pistachio

Gregory fiffty.element at yahoo.com
Mon May 23 02:15:09 CEST 2011


I am experimenting with l4 pistachio and i seem to be running into some rather 
weird problems.

1) when i attempt to create a thread, my thread creation code does seem to work 
if it is in "main()" however if i move the code into another function an call 
that function from main, the code works. What happens is that if I attempt to 
create a thread from "main" when i call "L4_ThreadControl()" the function 
returns an error value (which is found to be '6'), which indicates that the the 
UTCB location is invalid. However, the latter does not happen when the exact 
same thread creation code is in a different function. Now this does not bother 
me that much, as long as i can still successfully create threads, but, i am a 
bit curious as to why this happens.

2) the piece of code that i use to create threads (derived from the l4test app), 
obtains the utcb location of new thread looks like this:

L4_Word_t root_utcb = *(*L4_Word_t)&root_local_id;
root_utcb &= ~(L4_UtcbAreaSize(kip) - 1);
L4_Word_t new_utcb = root_utcb + (L4_UtcbSize(kip) * (L4_ThreadNo(new_tid) - 
L4_ThreadNo(root_tid)));

Now this piece of code works, but, i do not understand why the second line is 
needed if the local thread id is already equal to the utcb location. Why is this 
needed?

3) I cannot seem to receive interrupt IPCs. I have seen no code built on 
pistachio that handle interrupts thus far, so my code looks like this:

L4_Thread_t irq;

//simple handler function that simply acknowledges the interrupt ipc
void handler_func(void)
{
printf("the handler has been called\n");
L4_Msg_t msg;
L4_MsgTag_t tag;
L4_Clear(&msg);
L4_Load(&msg);
tag = L4_Send(irq, L4_TimePeriod(1000000));
if(L4_IpcFailed(tag))
/*prints out the error. ">>1" is used to remove propagation bit
printf("the ipc failed with error [%d]", (int)L4_ErrorCode()>>1);
}

int main()
{
... //initialization, etc
irq = L4_GlobalId(1,1); //in hopes of getting the keyboard interrupt
L4_AssociateInterrupt(irq, handler); //the handler thread is setup ealier
L4_Sleep(L4_Never); //so that the code doesn't exit
}

this piece of code prints out:
the handler has been called
the ipc failed with error [1]

Which base on the v4 reference manual mean "timeout, from is defined in this 
case". Also if i "sleep" for less than L4_Never the kernel crashes and reports 
that there is an invalid opcode. Where am i going wrong?





More information about the l4-hackers mailing list