| 1 | /* Memory management internal definitions */ |
|---|
| 2 | |
|---|
| 3 | |
|---|
| 4 | #if !defined(_MEMINTH) |
|---|
| 5 | #define _MEMINTH |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | /* All user-visible stuff */ |
|---|
| 9 | |
|---|
| 10 | #include "memuser.h" |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | /* >>> Potentially system dependent configuration stuff */ |
|---|
| 14 | /* See memuser.h as well. */ |
|---|
| 15 | |
|---|
| 16 | /* The storage management library can either use system-provided */ |
|---|
| 17 | /* versions of malloc, free and friends, or it can implement a buddy */ |
|---|
| 18 | /* scheme based on something like sbrk. If you want to do the former, */ |
|---|
| 19 | /* define USE_MALLOC_FREE. */ |
|---|
| 20 | |
|---|
| 21 | /* #define USE_MALLOC_FREE */ |
|---|
| 22 | |
|---|
| 23 | /* Now we need macros for routines to copy and zero-fill blocks of */ |
|---|
| 24 | /* memory, and to either do malloc/free/whatever or to do an sbrk. Since */ |
|---|
| 25 | /* different systems have different types that these routines expect, we */ |
|---|
| 26 | /* wrap everything in macros. */ |
|---|
| 27 | |
|---|
| 28 | #if defined(USE_MALLOC_FREE) |
|---|
| 29 | #if defined(__STDC__) |
|---|
| 30 | extern void *malloc(unsigned long); |
|---|
| 31 | extern void free(void *); |
|---|
| 32 | extern void *realloc(void *, unsigned long); |
|---|
| 33 | #define MALLOC(size) ((pointer)malloc((unsigned long)(size))) |
|---|
| 34 | #define FREE(p) (free((void *)(p))) |
|---|
| 35 | #define REALLOC(p, size) ((pointer)realloc((void *)(p), (unsigned long)(size))) |
|---|
| 36 | #else |
|---|
| 37 | extern char *malloc(); |
|---|
| 38 | extern void free(); |
|---|
| 39 | extern char *realloc(); |
|---|
| 40 | #define MALLOC(size) ((pointer)malloc((int)(size))) |
|---|
| 41 | #define FREE(p) (free((char *)(p))) |
|---|
| 42 | #define REALLOC(p, size) ((pointer)realloc((char *)(p), (int)(size))) |
|---|
| 43 | #endif |
|---|
| 44 | #else |
|---|
| 45 | #if defined(__STDC__) |
|---|
| 46 | #ifdef HAVE_UNISTD_H |
|---|
| 47 | #include <unistd.h> |
|---|
| 48 | #else |
|---|
| 49 | extern char *sbrk(int); |
|---|
| 50 | #endif |
|---|
| 51 | #define SBRK(size) ((pointer)sbrk((int)(size))) |
|---|
| 52 | #else |
|---|
| 53 | extern char *sbrk(); |
|---|
| 54 | #define SBRK(size) ((pointer)sbrk((int)(size))) |
|---|
| 55 | #endif |
|---|
| 56 | #endif |
|---|
| 57 | |
|---|
| 58 | /* You may need to muck with these depending on whether you have */ |
|---|
| 59 | /* bcopy or memcpy. */ |
|---|
| 60 | |
|---|
| 61 | #if defined(__STDC__) |
|---|
| 62 | #if STDC_HEADERS |
|---|
| 63 | #include <string.h> |
|---|
| 64 | #else |
|---|
| 65 | extern void *memcpy(); /* TRS, 6/17/94: removed arg types to suppress warning on mips/gcc */ |
|---|
| 66 | /* extern void *memcpy(void *, const void *, unsigned long); */ |
|---|
| 67 | |
|---|
| 68 | extern void *memset(); /* SPK 3/01/01: removed arg types to suppress |
|---|
| 69 | warning on linux-rh-6.2/egcs-2.91/66 */ |
|---|
| 70 | /* extern void *memset(void *, int, unsigned long); */ |
|---|
| 71 | #endif |
|---|
| 72 | #define MEM_COPY(dest, src, size) (void)memcpy((void *)(dest), (const void *)(src), (unsigned long)(size)) |
|---|
| 73 | #define MEM_ZERO(ptr, size) (void)memset((void *)(ptr), 0, (unsigned long)(size)) |
|---|
| 74 | #else |
|---|
| 75 | extern void bcopy(); |
|---|
| 76 | extern void bzero(); |
|---|
| 77 | #define MEM_COPY(dest, src, size) bcopy((char *)(src), (char *)(dest), (int)(size)) |
|---|
| 78 | #define MEM_ZERO(ptr, size) bzero((char *)(ptr), (int)(size)) |
|---|
| 79 | #endif |
|---|
| 80 | |
|---|
| 81 | |
|---|
| 82 | #if defined(__STDC__) |
|---|
| 83 | #define ARGS(args) args |
|---|
| 84 | #else |
|---|
| 85 | #define ARGS(args) () |
|---|
| 86 | #endif |
|---|
| 87 | |
|---|
| 88 | |
|---|
| 89 | /* >>> System independent stuff here. */ |
|---|
| 90 | |
|---|
| 91 | struct segment_ |
|---|
| 92 | { |
|---|
| 93 | pointer base_address; |
|---|
| 94 | SIZE_T limit; |
|---|
| 95 | }; |
|---|
| 96 | |
|---|
| 97 | typedef struct segment_ *segment; |
|---|
| 98 | |
|---|
| 99 | |
|---|
| 100 | struct block_ |
|---|
| 101 | { |
|---|
| 102 | int used; |
|---|
| 103 | int size_index; |
|---|
| 104 | struct block_ *next; |
|---|
| 105 | struct block_ *prev; |
|---|
| 106 | segment seg; |
|---|
| 107 | }; |
|---|
| 108 | |
|---|
| 109 | typedef struct block_ *block; |
|---|
| 110 | |
|---|
| 111 | |
|---|
| 112 | #define HEADER_SIZE ((SIZE_T)ROUNDUP(sizeof(struct block_))) |
|---|
| 113 | #define MAX_SIZE_INDEX (8*sizeof(SIZE_T)-2) |
|---|
| 114 | #define MAX_SEG_SIZE ((SIZE_T)1 << MAX_SIZE_INDEX) |
|---|
| 115 | #define MAX_SIZE ((SIZE_T)(MAX_SEG_SIZE-HEADER_SIZE)) |
|---|
| 116 | #define MIN_ALLOC_SIZE_INDEX 15 |
|---|
| 117 | |
|---|
| 118 | #define NICE_BLOCK_SIZE ((SIZE_T)4096-ROUNDUP(sizeof(struct block_))) |
|---|
| 119 | |
|---|
| 120 | |
|---|
| 121 | extern void mem_fatal ARGS((char *)); |
|---|
| 122 | |
|---|
| 123 | |
|---|
| 124 | #undef ARGS |
|---|
| 125 | |
|---|
| 126 | #endif |
|---|