Hello,
I think I have misunderstood StringItem IPC but I don't know where is my mistake.
My roottask spawns a thread that sends a stringitem to roottask. I have checked with debugger that this stringitem contains my string :
si = L4_StringItem(str.length_trim, (void *) str.c);
L4_Clear(&msg); L4_Append(&msg, si); L4_Set_Label(&msg, CALL$PRINT); L4_Load(&msg);
L4_Call(L4_Pager());
str is a struct vms$string :
struct vms$string { vms$pointer length; vms$pointer length_trim; unsigned char *c; };
My roottask receives this IPC in following function:
void sys$loop() { int running;
L4_ThreadId_t partner; L4_MsgBuffer_t buffer; L4_MsgTag_t tag; L4_Msg_t msg;
running = 1;
L4_Accept(L4_MapGrantItems(L4_CompleteAddressSpace) + L4_StringItemsAcceptor); tag = L4_Wait(&partner);
while(running) { L4_Clear(&msg); L4_Store(tag, &msg);
if ((tag.raw & L4_REQUEST_MASK) == L4_PAGEFAULT) { sys$pagefault(partner, L4_Get(&msg, 0), L4_Get(&msg, 1), tag.raw); } else { switch(L4_Label(tag)) { case CALL$PRINT: notice("Here!\n"); break;
default: PANIC(1, notice(IPC_F_UNKNOWN "unknown IPC from $%lX " "with label $%lX\n", L4_ThreadNo(partner), L4_Label(tag))); } }
tag = L4_ReplyWait(partner, &partner); }
return; }
When system boots, I can intercept on serial line:
... %SYS-F-PAGEFLT, pagefault request from $3C at $0000000000800110 %SYS-F-PAGEFLT, pagefault request from $3C at $000000000010FFF8 %SYS-F-PAGEFLT, pagefault request from $3C at $00000000008015C0 %SYS-F-PAGEFLT, pagefault request from $3C at $0000000000801C10 Here! %IPC-F-UNKNOWN, unknown IPC from $0 with label $0
Panic at sys$loop, sys/sys_loop.c line 73 Have a nice day !
Backtrace:
<00> [$000000000104F5B8] -> $0000000001004ED5 (sys$loop) <01> [$000000000104F838] -> $0000000001005813 (main)
Pagefault messages are written by sys$pagefault() subroutine. As sys$loop() function writes 'Here!', it receives an IPC with CALL$PRINT label.
First question: I don't know how read this stringitem. I have tried with msgbuff without any result. I suppose I have misunderstood how StringItem IPC works.
Second question: I don't understand last line: "%IPC-F-UNKNOWN, unknown IPC from $0 with label $0". I suppose this error comes from a bad stringitem IPC.
I haven't found any stringitem IPC example. Help is welcome.
Regards,
JB
Some news:
Wirh following code, I can read my stringitem:
case CALL$PRINT: // This memory is mapped by calling thread L4_StoreMRs(1, 2, string_item.raw);
if ((string = (unsigned char *) sys$alloc((string_item.X.string_length + 1) * sizeof(unsigned char))) != NULL) { sys$memcopy((vms$pointer) string, (vms$pointer) string_item.X.str.string_ptr, string_item.X.string_length); string[string_item.X.string_length] = 0; notice("%s\n", string); sys$free(string); } break;
but I always obtain :
%IPC-F-UNKNOWN, unknown IPC from $0 with label $0
What is thread 0 ?
Regards,
JKB
l4-hackers@os.inf.tu-dresden.de