[OpenBIOS] [commit] r992 - in trunk/openbios-devel: include/libopenbios libopenbios
repository service
svn at openbios.org
Thu Dec 30 14:56:15 CET 2010
Author: mcayland
Date: Thu Dec 30 14:56:14 2010
New Revision: 992
URL: http://tracker.coreboot.org/trac/openbios/changeset/992
Log:
Introduce ofmem_posix_memalign() function for arbitrary alignment.
Rework ofmem_malloc() so that it takes a parameter specifying the alignment for the allocation and then change the API
to match that of posix_memalign(). Then create ofmem_malloc() as a simple wrapper function onto ofmem_posix_memalign()
using a default alignment of CONFIG_OFMEM_MALLOC_ALIGN.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
Modified:
trunk/openbios-devel/include/libopenbios/ofmem.h
trunk/openbios-devel/libopenbios/ofmem_common.c
Modified: trunk/openbios-devel/include/libopenbios/ofmem.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/ofmem.h Thu Dec 30 14:56:12 2010 (r991)
+++ trunk/openbios-devel/include/libopenbios/ofmem.h Thu Dec 30 14:56:14 2010 (r992)
@@ -80,6 +80,7 @@
extern unsigned long pa2va(phys_addr_t pa);
/* malloc interface */
+extern int ofmem_posix_memalign( void **memptr, size_t alignment, size_t size );
extern void* ofmem_malloc( size_t size );
extern void ofmem_free( void *ptr );
extern void* ofmem_realloc( void *ptr, size_t size );
Modified: trunk/openbios-devel/libopenbios/ofmem_common.c
==============================================================================
--- trunk/openbios-devel/libopenbios/ofmem_common.c Thu Dec 30 14:56:12 2010 (r991)
+++ trunk/openbios-devel/libopenbios/ofmem_common.c Thu Dec 30 14:56:14 2010 (r992)
@@ -86,7 +86,7 @@
/* OF private allocations */
/************************************************************************/
-void* ofmem_malloc( size_t size )
+int ofmem_posix_memalign( void **memptr, size_t alignment, size_t size )
{
ofmem_t *ofmem = ofmem_arch_get_private();
alloc_desc_t *d, **pp;
@@ -94,12 +94,12 @@
ucell top;
if( !size )
- return NULL;
+ return ENOMEM;
if( !ofmem->next_malloc )
ofmem->next_malloc = (char*)ofmem_arch_get_malloc_base();
- size = align_size(size + sizeof(alloc_desc_t), CONFIG_OFMEM_MALLOC_ALIGN);
+ size = align_size(size + sizeof(alloc_desc_t), alignment);
/* look in the freelist */
for( pp=&ofmem->mfree; *pp && (**pp).size < size; pp = &(**pp).next ) {
@@ -110,15 +110,17 @@
ret = (void *)((uintptr_t)*pp + sizeof(alloc_desc_t));
memset( ret, 0, (**pp).size - sizeof(alloc_desc_t) );
*pp = (**pp).next;
- return ret;
+
+ *memptr = ret;
+ return 0;
}
top = ofmem_arch_get_heap_top();
- ret = align_ptr((uintptr_t)ofmem->next_malloc + sizeof(alloc_desc_t), CONFIG_OFMEM_MALLOC_ALIGN);
+ ret = align_ptr((uintptr_t)ofmem->next_malloc + sizeof(alloc_desc_t), alignment);
if( pointer2cell(ret) + size > top ) {
printk("out of malloc memory (%x)!\n", size );
- return NULL;
+ return ENOMEM;
}
d = (alloc_desc_t*)((uintptr_t)ret - sizeof(alloc_desc_t));
@@ -129,7 +131,23 @@
memset( ret, 0, size - sizeof(alloc_desc_t) );
- return ret;
+ *memptr = ret;
+ return 0;
+}
+
+void* ofmem_malloc( size_t size )
+{
+ void *memptr;
+ int res;
+
+ res = ofmem_posix_memalign( &memptr, CONFIG_OFMEM_MALLOC_ALIGN, size );
+ if (!res) {
+ /* Success */
+ return memptr;
+ } else {
+ /* Failure */
+ return NULL;
+ }
}
void ofmem_free( void *ptr )
More information about the OpenBIOS
mailing list