> I don't understand what you are saying. If you're on a recent version of seL4 
> then that commit should definitely be there, as it's a merge from december 
> last year. Also don't see how MCP is relevant, it caused zero changes to 
> muslc.

I am using musllibc library from ‘b5c66eef4a8bb274d7a4b9b5b82bce412224dbf9' 
commit 

> Adrian
> 
> On Fri 04-Nov-2016 10:19 AM, Vasily A. Sartakov wrote:
>>> We have made some changes to muslc. If you diff against changeset 
>>> '615629bd6fcd6ddb69ad762e679f088c7bd878e2' you can see them. In particular 
>>> there are some changes to malloc that you could try reverting.
>>> 
>> Unfortunately, I am using a relatively fresh version of seL4  and 
>> corresponding libraries (3.2.x). The last sync with master trees was made 
>> just before MCP was added (mid of September), thus, the diff with master is 
>> just the last x86-related commit :( 
>> 
>> 
>> 
>> 
>>> Adrian
>>> 
>>> On Fri 04-Nov-2016 8:58 AM, Vasily A. Sartakov wrote:
>>> 
>>>> Greetings. 
>>>> 
>>>> 
>>>> I am keep working, and now I would like to discuss  my second 
>>>> memory-related issue. In contrast with first one, the second issue happens 
>>>> only in SCHED004 test, in malloc function: 
>>>> 
>>>> helper_thread_t **threads = (helper_thread_t **) 
>>>> malloc(sizeof(helper_thread_t*) * NUM_PRIOS);
>>>> 
>>>> malloc dies because there is no record inside TLB. someone tries to write 
>>>> something to an address, for example, 0x54f1c8. This address is important 
>>>> because it is located outside of the virtual memory allocated for the 
>>>> test. Previous, elf_loader allocates a region and the region ends exactly 
>>>> on 0x54efff. I have experimented with different setups, added some debug 
>>>> functions, and each time I saw the same picture: malloc dies because tries 
>>>> to write to next page outside the allocated region. 
>>>> 
>>>> I know what is the function tries to write. It is a pretrim,  part of 
>>>> libmuslc: 
>>>> 
>>>> static int pretrim(struct chunk *self, size_t n, int i, int j)
>>>> {
>>>>    size_t n1;
>>>>    struct chunk *next, *split;
>>>> 
>>>>    /* We cannot pretrim if it would require re-binning. */
>>>>    if (j < 40) return 0;
>>>>    if (j < i+3) {
>>>>            if (j != 63) return 0;
>>>>            n1 = CHUNK_SIZE(self);
>>>>            if (n1-n <= MMAP_THRESHOLD) return 0;
>>>>    } else {
>>>>            n1 = CHUNK_SIZE(self);
>>>>    }
>>>>    if (bin_index(n1-n) != j) return 0;
>>>> 
>>>>    next = NEXT_CHUNK(self);
>>>>    printf("next - %x, n1 = %x\n", next, n1);
>>>>    split = (void *)((char *)self + n);      <————— the split points 
>>>> outside the allocated region 
>>>>    split->prev = self->prev;     <————— here we die 
>>>>    split->next = self->next;
>>>>    split->prev->next = split;
>>>>    split->next->prev = split;
>>>>    split->psize = n | C_INUSE;
>>>>    split->csize = n1-n;
>>>>    next->psize = n1-n;
>>>>    self->csize = n | C_INUSE;
>>>>    return 1;
>>>> }
>>>> 
>>>> As a previous, I would like to ask, should I keep in mind something 
>>>> platform specific? maybe you have modified, like a_and asm functions or 
>>>> something else in libmuslc? 
>>>> Also, malloc itself raises questions: 
>>>> 
>>>> void *malloc(size_t n)
>>>> {
>>>>    struct chunk *c;
>>>>    int i, j;
>>>> 
>>>>    if (adjust_size(&n) < 0) return 0;
>>>> 
>>>> <….>
>>>> 
>>>>    i = bin_index_up(n);
>>>>    for (;;) {
>>>>            uint64_t mask = mal.binmap & -(1ULL<<i);   
>>>> 
>>>> mal.binmap is used uninitialised. also, when we set up bits inside it?  
>>>> Moreover, I have different values on ARM (0x80000000000) and MIPS 
>>>> (0x8000000000000000), I am not sure that it is ok 
>>>> 
>>>> Thank you! 
>>>> 
>>>> 
>>>> 
>>>> 
> 

-- 
Vasily A. Sartakov
[email protected]





_______________________________________________
Devel mailing list
[email protected]
https://sel4.systems/lists/listinfo/devel

Reply via email to