[coreboot] libpayload: memalign, take 2

Jordan Crouse jordan.crouse at amd.com
Tue Sep 2 16:50:02 CEST 2008


On 01/09/08 15:28 +0200, Patrick Georgi wrote:
> Hi there,
> 
> after the discussion on the list about memalign, I wrote version that's
> better integrated with the other memory management stuff, and doesn't
> come with its own pool allocator.
> 
> 
> Regards,
> Patrick Georgi

> Signed-off-by: Patrick Georgi <patrick.georgi at coresystems.de>

Acked-by: Jordan Crouse <jordan.crouse at amd.com>

We need to get this in there. But I promise that that damn malloc()
engine is going to get gutted soon, because it constantly makes 
my eyes hurt when see it.

Patrick - if you get a chance, can you submit a short doxygen comment
for memalign?  I know the rest of the file isn't documented yet, but
we need to start getting into the habit of documenting external 
functions.

Jordan

> Index: include/libpayload.h
> ===================================================================
> --- include/libpayload.h	(revision 3536)
> +++ include/libpayload.h	(working copy)
> @@ -164,6 +164,7 @@
>  void *malloc(size_t size);
>  void *calloc(size_t nmemb, size_t size);
>  void *realloc(void *ptr, size_t size);
> +void *memalign(size_t align, size_t size);
>  
>  /* libc/exec.c */
>  int exec(long addr, int argc, char **argv);
> Index: libc/malloc.c
> ===================================================================
> --- libc/malloc.c	(revision 3536)
> +++ libc/malloc.c	(working copy)
> @@ -72,7 +72,7 @@
>  	*((hdrtype_t *) hstart) = FREE_BLOCK(size);
>  }
>  
> -static void *alloc(int len)
> +static void *alloc(int len, int align)
>  {
>  	hdrtype_t header;
>  	void *ptr = hstart;
> @@ -92,13 +92,20 @@
>  		header = *((hdrtype_t *) ptr);
>  		int size = SIZE(header);
>  
> -		if (!HAS_MAGIC(header) || size == 0) {
> +		if (!HAS_MAGIC(header)) {
>  			printf("memory allocator panic.\n");
>  			halt();
>  		}
>  
>  		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);
>  				int nsize = size - (HDRSIZE + len);
>  
> @@ -186,13 +193,13 @@
>  
>  void *malloc(size_t size)
>  {
> -	return alloc(size);
> +	return alloc(size, 1);
>  }
>  
>  void *calloc(size_t nmemb, size_t size)
>  {
>  	size_t total = nmemb * size;
> -	void *ptr = alloc(total);
> +	void *ptr = alloc(total, 1);
>  
>  	if (ptr)
>  		memset(ptr, 0, total);
> @@ -206,7 +213,7 @@
>  	unsigned int osize;
>  
>  	if (ptr == NULL)
> -		return alloc(size);
> +		return alloc(size, 1);
>  
>  	pptr = ptr - HDRSIZE;
>  
> @@ -222,7 +229,7 @@
>  	 * reallocated the new space.
>  	 */
>  	free(ptr);
> -	ret = alloc(size);
> +	ret = alloc(size, 1);
>  
>  	/*
>  	 * if ret == NULL, then doh - failure.
> @@ -237,6 +244,11 @@
>  	return ret;
>  }
>  
> +void *memalign(size_t align, size_t size)
> +{
> +	return alloc(size, align);
> +}
> +
>  /* This is for debugging purposes. */
>  #ifdef TEST
>  void print_malloc_map(void)

> --
> coreboot mailing list
> coreboot at coreboot.org
> http://www.coreboot.org/mailman/listinfo/coreboot


-- 
Jordan Crouse
Systems Software Development Engineer 
Advanced Micro Devices, Inc.





More information about the coreboot mailing list