----- Original Message ----
From: Adam Lackorzynski <adam@os.inf.tu-dresden.de>
To: l4-hackers@os.inf.tu-dresden.de
Sent: Monday, March 17, 2008 5:37:39 AM
Subject: Re: Failed to create a new task

Hi,

Here's a diff of your program against a version that works, with
comments:


--- x.c    2008-03-16 22:30:26.000000000 +0100
+++ x.c    2008-03-16 22:30:26.000000000 +0100
@@ -3,6 +3,7 @@
#include <l4/sys/ipc.h>
#include <l4/rmgr/librmgr.h>
#include <l4/sigma0/sigma0.h> 
+#include <l4/util/util.h>

#include <stdio.h>

@@ -41,14 +42,13 @@
    l4_addr_t map_area = 0x60000000;
    l4_addr_t base;
    l4_umword_t rcv_fpage;
-    l4_umword_t snd_fpage;

    res = l4_ipc_call(SIGMA0_ID,                    // thread id
                            L4_IPC_SHORT_MSG,        // send descriptor
                            SIGMA0_REQ_FPAGE_ANY,    // snd_dword0
-                            snd_fpage,                    // snd_dword1
+                            l4_fpage(0, L4_LOG2_PAGESIZE, 0, 0).fpage,                    // snd_dword1
                            L4_IPC_MAPMSG(map_area, L4_WHOLE_ADDRESS_SPACE),// rcv_desc
-                            base,                            // *rcv_dword0
+                            &base,                            // *rcv_dword0
                            &rcv_fpage,                    // *rcv_dword1
                            timeout,
                            &result);

Please fix compiler warnings, gcc is not issueing them just for fun.
You've been giving an uninitialized value as an address to l4_ipc_call,
so no wonder strange things happen.


@@ -75,26 +75,17 @@
        enter_kdebug("FAILED in l4_ipc_wait: %d\n");
    }   

+    while(1) {
    l4_umword_t fault_addr = rcv_dword0 &~ 0x00000003; //rcv_dword0 & 0xFFFFFFFC
                                                                        // mask lower bits for (write/grant) flags?
    l4_umword_t rw_addr    = fault_addr | 0x00000002;        // mask the 2 nd lower bits to set write flags

-    while(1) {
-
-        l4_snd_fpage_t fpage;
-       
-        fpage.snd_base = rw_addr; // do wee need to left shift the address???
-       
-        //we can also use the function l4_fpage(address, size, write, grant)
-        fpage.fpage.fp.grant = 0;
-        fpage.fpage.fp.write = 1;
-        fpage.fpage.fp.page = rw_addr;
-        fpage.fpage.fp.size =  L4_LOG2_PAGESIZE; //12
+        l4_touch_rw((void *)rw_addr, 1);

Just to make sure the memory is really available.

        res = l4_ipc_reply_and_wait(src_id,                    //dest_id
                                            L4_IPC_SHORT_FPAGE,    //send descriptor
-                                            fpage.snd_base,        //snd_dword0
-                                            fpage.fpage.fpage,    //snd_dword1 - might change later to .fp
+                                            rw_addr & L4_PAGEMASK,        //snd_dword0
+                                            l4_fpage(rw_addr & L4_PAGEMASK, L4_LOG2_PAGESIZE, L4_FPAGE_RW, L4_FPAGE_MAP).fpage,
                                            &src_id,                    //src_id
                                            L4_IPC_SHORT_MSG,        //rcv descriptor
                                            &rcv_dword0,            //rcv_dword0

I just aggregated the l4_fpage to the one line, more compact.

>> thanks for the tips.





Never miss a thing. Make Yahoo your homepage.