Hi 

> git diff 615629bd6fcd6ddb69ad762e679f088c7bd878e2 
> b5c66eef4a8bb274d7a4b9b5b82bce412224dbf9
> 
> will let you see all the changes we have made from the base muslc, or just
> 
> git diff 615629bd6fcd6ddb69ad762e679f088c7bd878e2 
> b5c66eef4a8bb274d7a4b9b5b82bce412224dbf9 -- src/malloc/malloc.c
> 
> to see the changes to malloc that I was referring to

Ahh, sorry, now I got you. 

I fount the problem. I do not know why, but arch/mips/bits/limits.h does not 
have '#define PAGE_SIZE 4096’, like in arm version: 


#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
 || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#define PAGE_SIZE 4096
#define LONG_BIT 32
#endif

#define LONG_MAX  0x7fffffffL
#define LLONG_MAX  0x7fffffffffffffffLL

As result, constructions like this: 

n += -n & PAGE_SIZE-1; 

from void *__expand_heap(size_t *pn) does not work. 

Now I have OOM due stack allocation, but I think I will solve it. 

Thank you



> Adrian
> 
> On Fri 04-Nov-2016 10:52 AM, Vasily A. Sartakov wrote:
>>> 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