Home | History | Annotate | Download | only in mem
      1 #include <stdlib.h>
      2 #include <errno.h>
      3 #include <string.h>
      4 #include "malloc.h"
      5 #include "core.h"
      6 #include <syslinux/memscan.h>
      7 #include <dprintf.h>
      8 
      9 struct free_arena_header __core_malloc_head[NHEAP];
     10 
     11 //static __hugebss char main_heap[128 << 10];
     12 extern char __lowmem_heap[];
     13 extern char free_high_memory[];
     14 
     15 #define E820_MEM_MAX 0xfff00000	/* 4 GB - 1 MB */
     16 int scan_highmem_area(void *data, addr_t start, addr_t len,
     17 		      enum syslinux_memmap_types type)
     18 {
     19 	struct free_arena_header *fp;
     20 
     21 	(void)data;
     22 
     23 	dprintf("start = %x, len = %x, type = %d", start, len, type);
     24 
     25 	if (start < 0x100000 || start > E820_MEM_MAX
     26 			     || type != SMT_FREE)
     27 		return 0;
     28 
     29 	if (start < __com32.cs_memsize) {
     30 		len -= __com32.cs_memsize - start;
     31 		start = __com32.cs_memsize;
     32 	}
     33 	if (len > E820_MEM_MAX - start)
     34 		len = E820_MEM_MAX - start;
     35 
     36 	if (len >= 2 * sizeof(struct arena_header)) {
     37 		fp = (struct free_arena_header *)start;
     38 		fp->a.attrs = ARENA_TYPE_USED | (HEAP_MAIN << ARENA_HEAP_POS);
     39 #ifdef DEBUG_MALLOC
     40 		fp->a.magic = ARENA_MAGIC;
     41 #endif
     42 		ARENA_SIZE_SET(fp->a.attrs, len);
     43 		dprintf("will inject a block start:0x%x size 0x%x", start, len);
     44 		__inject_free_block(fp);
     45 	}
     46 
     47 	__com32.cs_memsize = start + len; /* update the HighMemSize */
     48 	return 0;
     49 }
     50 
     51 #if 0
     52 static void mpool_dump(enum heap heap)
     53 {
     54 	struct free_arena_header *head = &__core_malloc_head[heap];
     55 	struct free_arena_header *fp;
     56 	int size, type, i = 0;
     57 	addr_t start, end;
     58 
     59 	fp = head->next_free;
     60 	while (fp != head) {
     61 		size = ARENA_SIZE_GET(fp->a.attrs);
     62 		type = ARENA_TYPE_GET(fp->a.attrs);
     63 		start = (addr_t)fp;
     64 		end = start + size;
     65 		printf("area[%d]: start = 0x%08x, end = 0x%08x, type = %d\n",
     66 			i++, start, end, type);
     67 		fp = fp->next_free;
     68 	}
     69 }
     70 #endif
     71 
     72 uint16_t *bios_free_mem;
     73 void mem_init(void)
     74 {
     75 	struct free_arena_header *fp;
     76 	int i;
     77 
     78 	//dprintf("enter");
     79 
     80 	/* Initialize the head nodes */
     81 	fp = &__core_malloc_head[0];
     82 	for (i = 0 ; i < NHEAP ; i++) {
     83 	fp->a.next = fp->a.prev = fp->next_free = fp->prev_free = fp;
     84 	fp->a.attrs = ARENA_TYPE_HEAD | (i << ARENA_HEAP_POS);
     85 	fp->a.tag = MALLOC_HEAD;
     86 	fp++;
     87 	}
     88 
     89 	//dprintf("__lowmem_heap = 0x%p bios_free = 0x%p",
     90 	//	__lowmem_heap, *bios_free_mem);
     91 
     92 	/* Initialize the lowmem heap */
     93 	fp = (struct free_arena_header *)__lowmem_heap;
     94 	fp->a.attrs = ARENA_TYPE_USED | (HEAP_LOWMEM << ARENA_HEAP_POS);
     95 	ARENA_SIZE_SET(fp->a.attrs, (*bios_free_mem << 10) - (uintptr_t)fp);
     96 #ifdef DEBUG_MALLOC
     97 	fp->a.magic = ARENA_MAGIC;
     98 #endif
     99 	__inject_free_block(fp);
    100 
    101 	/* Initialize the main heap */
    102 	__com32.cs_memsize = (size_t)free_high_memory;
    103 	syslinux_scan_memory(scan_highmem_area, NULL);
    104 }
    105