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?
so far, i have figured out the problem with the interrupt problem, but i cannot seem to acknowledge the interrupt after i have received it. The problem apparently is that the MR0 doesn't seem to completely clear the 32nd bit always seem to be set. my code looks like this:
L4_LoadMR(0, 0); L4_Send(root); //so i can actually see what value is sent out in the ipc
since we know there is no type or untyped words i simply check the label and i obtain this number :
decimal: 32768 binary: 1000000000000000
why is this so and how do i completely zero MR0?
l4-hackers@os.inf.tu-dresden.de