[okl4-developer] MR registers corrupted when using L4_Send, L4_Receive
Gabi Voiculescu
boy3dfx2 at yahoo.com
Tue Jan 20 07:41:11 EST 2009
Hi.
I am using okl4 2.1 (yes, I know it is a little old) on gumstix.
I recently wanted to study IPC with MR exchange (passing information from one thread to the other).
The existing iguana examples (like sleeping_barber) do not seem to be using the code sections of interest (for the default one barber and one consumer).
So I created my own example, and used L4_Send(), L4_Receive() and L4_Wait(), while testing the obtained results using L4_MsgStore() and L4_MsgWord().
I saw that the MR registers were corrupted when I read them in the "thread", when comparing with "main".
I expected MR[0] would be different (different tag), but I don't understand why are the other ones different...
Is this because the inline L4_Send, L4_Receive change ARM gp registers before they call L4_Ipc?
Are the helper message functions broken (the inlines aren't designed to work with L4_Send, L4_Receive) in okl4 2.1 ?
Thank you,
Gabi Voiculescu
The Original file:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <l4/thread.h>
#include <l4/ipc.h>
#include <iguana/thread.h>
#include <iguana/memsection.h>
#include <iguana/env.h>
static volatile L4_Thread_Id_t main_tid;
void thread(int argc, char** argv)
{
L4_Msg_t msg;
L4_MsgTag_t tag;
L4_ThreadId_t from_tid;
int i;
L4_Word_t mr1;
....
L4_MsgClear(&msg);
L4_Set_MsgLabel(&msg, 0x12);
L4_MsgLoad(&msg);
//tag = L4_Receive(main_tid);
tag = L4_Wait(&from_tid);
L4_MsgStore(tag, &msg);
if (L4_IpcFailed(tag)) {
printf("Player thread error syncing with main (0x%lx) (%ld).\n", (long) from_tid.raw,
(long) L4_ErrorCode() >> 1);
}
printf("\n\n");
/* Get Information from MRs: register information is different than what I send !!!! */
for (i=0; i<6; i++) {
mr1 = L4_MsgWord(&msg, i);
printf("Thread: mr[%d]=%lx\n", i, mr1);
}
printf("msg.tag.X.u = %d\n", msg.tag.X.u);
printf("L4_Label(tag) = %lx\n", L4_Label(tag) );
while(1);
....
}
int main(int argc, char **argv)
{
L4_ThreadId_t from_tid, thread_tid[2];
char thread_name[20];
L4_Msg_t msg;
L4_MsgTag_t tag;
int i;
L4_Word_t mr1;
main_tid = thread_l4tid(env_thread(iguana_getenv("MAIN")));
for (i=0; i<2; i++) {
sprintf(&thread_name[0], "THREAD%d", i);
thread_tid = thread_l4tid(env_thread(iguana_getenv(thread_name)));
}
L4_MsgClear(&msg);
L4_Set_Label(&tag, (L4_Word_t) i);
L4_Set_MsgLabel(&msg, i);
L4_Set_MemoryCopy(&msg.tag);
L4_Set_MsgTag(&msg.tag);
&msg.tag.X.u=2;
L4_MsgAppendWord(&msg, tag.raw);
L4_MsgAppendWord(&msg, 0x1234);
L4_MsgAppendWord(&msg, 0x5678);
L4_MsgLoad(&msg);
tag = L4_Send(thread_l4tid(thread_tid[i]));
L4_MsgStore(tag, &msg);
for (int j=0; j<6; j++) {
mr1 = L4_MsgWord(&msg, j);
printf("Main: Thread[%d]: mr[%d]=%lx\n", i, j, mr1);
}
printf("msg.tag.X.u = %d\n", msg.tag.X.u);
while(1);
}
Gives me the result:
Main: Thread[0]: mr[0]=80801c40
Main: Thread[0]: mr[1]=fffffff8
Main: Thread[0]: mr[2]=ffffffff
Main: Thread[0]: mr[3]=1
Main: Thread[0]: mr[4]=0
Main: Thread[0]: mr[5]=80805c50
msg.tag.X.u = 0
Main: Thread[1]: mr[0]=80801c40
Main: Thread[1]: mr[1]=fffffff8
Main: Thread[1]: mr[2]=ffffffff
Main: Thread[1]: mr[3]=1
Main: Thread[1]: mr[4]=0
Main: Thread[1]: mr[5]=80805c50
msg.tag.X.u = 0
Thread: mr[0]=20001
Thread: mr[1]=8002c0b8
Thread: mr[2]=0 <---notice change from here on
Thread: mr[3]=0
Thread: mr[4]=0
Thread: mr[5]=0
msg.tag.X.u = 2
Thread: mr[0]=24001
Thread: mr[1]=8002c048
Thread: mr[2]=0
Thread: mr[3]=0
Thread: mr[4]=0
Thread: mr[5]=0
msg.tag.X.u = 2
L4_Label(tag) = 0
L4_Label(tag) = 0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.okl4.org/pipermail/developer/attachments/20090119/66806cbf/attachment.htm
More information about the Developer
mailing list