Add memalign(align, size).

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Jordan Crouse <jordan.crouse@amd.com>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3559 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Patrick Georgi
2008-09-02 15:49:32 +00:00
parent 56471f14db
commit 5ccfa1ac79
2 changed files with 28 additions and 8 deletions

View File

@ -221,6 +221,7 @@ void free(void *ptr);
void *malloc(size_t size); void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size); void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size); void *realloc(void *ptr, size_t size);
void *memalign(size_t align, size_t size);
/** @} */ /** @} */
/** /**

View File

@ -72,7 +72,7 @@ static void setup(void)
*((hdrtype_t *) hstart) = FREE_BLOCK(size); *((hdrtype_t *) hstart) = FREE_BLOCK(size);
} }
static void *alloc(int len) static void *alloc(int len, int align)
{ {
hdrtype_t header; hdrtype_t header;
void *ptr = hstart; void *ptr = hstart;
@ -92,13 +92,20 @@ static void *alloc(int len)
header = *((hdrtype_t *) ptr); header = *((hdrtype_t *) ptr);
int size = SIZE(header); int size = SIZE(header);
if (!HAS_MAGIC(header) || size == 0) { if (!HAS_MAGIC(header)) {
printf("memory allocator panic.\n"); printf("memory allocator panic.\n");
halt(); halt();
} }
if (header & FLAG_FREE) { if (header & FLAG_FREE) {
if (len <= size) { int realaddr = (int)(ptr + HDRSIZE);
int overhead = ((realaddr+align-1) & ~(align-1)) - realaddr;
if (len + overhead <= size) {
if (overhead != 0) {
*((hdrtype_t *) ptr) = FREE_BLOCK(overhead - HDRSIZE);
ptr += overhead;
size -= overhead;
}
void *nptr = ptr + (HDRSIZE + len); void *nptr = ptr + (HDRSIZE + len);
int nsize = size - (HDRSIZE + len); int nsize = size - (HDRSIZE + len);
@ -186,13 +193,13 @@ void free(void *ptr)
void *malloc(size_t size) void *malloc(size_t size)
{ {
return alloc(size); return alloc(size, 1);
} }
void *calloc(size_t nmemb, size_t size) void *calloc(size_t nmemb, size_t size)
{ {
size_t total = nmemb * size; size_t total = nmemb * size;
void *ptr = alloc(total); void *ptr = alloc(total, 1);
if (ptr) if (ptr)
memset(ptr, 0, total); memset(ptr, 0, total);
@ -206,7 +213,7 @@ void *realloc(void *ptr, size_t size)
unsigned int osize; unsigned int osize;
if (ptr == NULL) if (ptr == NULL)
return alloc(size); return alloc(size, 1);
pptr = ptr - HDRSIZE; pptr = ptr - HDRSIZE;
@ -222,7 +229,7 @@ void *realloc(void *ptr, size_t size)
* reallocated the new space. * reallocated the new space.
*/ */
free(ptr); free(ptr);
ret = alloc(size); ret = alloc(size, 1);
/* /*
* if ret == NULL, then doh - failure. * if ret == NULL, then doh - failure.
@ -237,11 +244,23 @@ void *realloc(void *ptr, size_t size)
return ret; return ret;
} }
/**
* Allocate an aligned chunk of memory
*
* @param align alignment, must be power of two
* @param size size of chunk in bytes
* @return Return the address of such a memory region or NULL
*/
void *memalign(size_t align, size_t size)
{
return alloc(size, align);
}
/* This is for debugging purposes. */ /* This is for debugging purposes. */
#ifdef TEST #ifdef TEST
void print_malloc_map(void) void print_malloc_map(void)
{ {
void *ptr = hstart; void *ptr = hstart;
while (ptr < hend) { while (ptr < hend) {
hdrtype_t hdr = *((hdrtype_t *) ptr); hdrtype_t hdr = *((hdrtype_t *) ptr);