On Monday, 25 April 2022 01:04:44 CEST Adam Lackorzynski wrote:
Thanks for the example.
Thanks for looking at it! I appreciate the help.
I believe I see the issue but first I immediately change to buf_log2size to 12 for the reason of less suprise, and did not change further on the sizes. Then I noticed your way of handling the UTCB involved allocating memory. That's not needed. With the fpage you specify the window of the UTCB memory in the other task, so no need to allocation memory in the launcher task, if it is for reserving the virtual memory.
I didn't really understand this when looking through the existing code. It seemed that the memory was reserved, and that seemed to involve telling a region manager/mapper about it, such as in Remote_app_model where the prog_reserve_utcb_area method appears to attach an invalid dataspace (obtained from the reserved_area method) to an existing RM.
Meanwhile, the l4_factory_create_task function accepts a flexpage as parameter whose details are then provided in the IPC message. As you noted before, Fiasco is meant to handle this flexpage. And it does appear that if I just remove the dataspace allocation and provide the flexpage details, the UTCB gets set up in the new task at the appropriate location.
Then, the issue is that posix_memalign allocates memory which does not have the x-bit set, i.e., is memory that is not executable. Change it to buf = (char *)mmap(NULL, region_size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); if (buf == MAP_FAILED) { printf("Could not reserve memory.\n"); return 1; } and it should work (it did for me).
This seems like the obvious thing that I couldn't see: that the memory needs to have the appropriate permissions associated with it. Well, it seems a bit more obvious now!
For the larger region I had in mind, just to keep things simple, mmap is a bit cumbersome because it only supports page-level alignment, so I used the L4Re memory allocator to get a dataspace that I could attach at a suitably aligned address. I imagine that if the parent task were to terminate, having an independently allocated dataspace would be desirable, too.
Thanks once again for the guidance, and sorry I didn't see my mistake!
Paul