source: bootcd/isolinux/syslinux-6.03/core/mem/init.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 2.5 KB
Line 
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
9struct free_arena_header __core_malloc_head[NHEAP];
10
11//static __hugebss char main_heap[128 << 10];
12extern char __lowmem_heap[];
13extern char free_high_memory[];
14
15#define E820_MEM_MAX 0xfff00000 /* 4 GB - 1 MB */
16int 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
52static 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
72uint16_t *bios_free_mem;
73void 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}
Note: See TracBrowser for help on using the repository browser.