@ -22,6 +22,8 @@
# include <xiuos.h>
# include <string.h>
# define DATA_IN_ExtSRAM
# define MEM_STATS
/* Covert pointer to other structure */
@ -43,6 +45,13 @@
/* These masks are used to get the flags and data field of memory blocks */
# define STATIC_BLOCK_MASK 0x80000000
# define DYNAMIC_BLOCK_MASK 0x40000000
# define DYNAMIC_BLOCK_NO_EXTMEM_MASK DYNAMIC_BLOCK_MASK
// #define DYNAMIC_BLOCK_EXTMEM1_MASK 0x40010000 ///< dynamic memory block external SRAM 1
// #define DYNAMIC_BLOCK_EXTMEM2_MASK 0x40020000 ///< dynamic memory block external SRAM 2
// #define DYNAMIC_BLOCK_EXTMEM3_MASK 0x40030000 ///< dynamic memory block external SRAM 3
// #define DYNAMIC_BLOCK_EXTMEM4_MASK 0x40040000 ///< dynamic memory block external SRAM 4
# define DYNAMIC_BLOCK_EXTMEMn_MASK(n) (DYNAMIC_BLOCK_MASK | (0xFF & n) << 16)
# define ALLOC_BLOCK_MASK 0xc0000000
# define DYNAMIC_REMAINING_MASK 0x3fffffff
@ -59,6 +68,7 @@ struct DynamicAllocNode
{
x_size_t size ; /* the size of dynamicAllocNode */
uint32 prev_adj_size ; /* the size of the previous adjacent node, (dynamic alloc node or dynamic free node */
uint32 flag ; /* |static_dynamic[32-24]|ext_sram[23-16]|res[15-8]|res[7-0]| */
} ;
/**
@ -68,7 +78,8 @@ struct DynamicFreeNode
{
x_size_t size ; /* the size of dynamicAllocNode */
uint32 prev_adj_size ; /* the size of the previous adjacent node, (dynamic alloc node or dynamic free node */
uint32 flag ; /* |static_dynamic_region_flag[32-24]|ext_sram_idx[23-16]|res[15-8]|res[7-0]| */
struct DynamicFreeNode * next ;
struct DynamicFreeNode * prev ;
} ;
@ -144,7 +155,7 @@ struct StaticMemoryDone
struct DynamicBuddyMemoryDone
{
void ( * init ) ( struct DynamicBuddyMemory * dynamic_buddy , x_ubase dynamic_buddy_start , x_ubase dynamic_buddy_size ) ;
void * ( * malloc ) ( struct DynamicBuddyMemory * dynamic_buddy , x_size_t size ) ;
void * ( * malloc ) ( struct DynamicBuddyMemory * dynamic_buddy , x_size_t size , uint32 extsram_mask ) ;
void ( * release ) ( struct ByteMemory * byte_memory , void * pointer ) ;
int ( * JudgeLegal ) ( struct DynamicBuddyMemory * dynamic_buddy , void * pointer ) ;
} ;
@ -155,6 +166,10 @@ static struct ByteMemory ByteManager;
# ifdef SEPARATE_COMPILE
static struct ByteMemory UserByteManager ;
# endif
# ifdef DATA_IN_ExtSRAM
static struct ByteMemory ExtByteManager [ EXTSRAM_MAX_NUM ] = { 0 } ;
# endif
/**
* This function determines whether the address is valid .
*
@ -187,7 +202,8 @@ static int SmallMemTypeAlloc(struct DynamicAllocNode *address)
{
NULL_PARAM_CHECK ( address ) ;
if ( address - > prev_adj_size & STATIC_BLOCK_MASK ) {
// if(address->prev_adj_size & STATIC_BLOCK_MASK) {
if ( address - > flag & STATIC_BLOCK_MASK ) {
return RET_TRUE ;
}
@ -205,7 +221,8 @@ static int MmAllocNode(struct DynamicAllocNode *memory_ptr)
{
NULL_PARAM_CHECK ( memory_ptr ) ;
if ( memory_ptr - > prev_adj_size & ALLOC_BLOCK_MASK ) {
// if(memory_ptr->prev_adj_size & ALLOC_BLOCK_MASK) {
if ( memory_ptr - > flag & ALLOC_BLOCK_MASK ) {
return RET_TRUE ;
}
return 0 ;
@ -233,7 +250,7 @@ static int CaculateBuddyIndex(x_size_t size)
} else {
ndx = MEM_LINKNRS - 1 ;
}
KPrintf ( " hehehe ndx = %d, size = %d \n " , ndx , size ) ;
return ndx ;
}
@ -289,21 +306,28 @@ static void InitBuddy(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_
/* record the start boundary of dynamic buddy memory */
dynamic_buddy - > mm_dynamic_start [ 0 ] = PTR2ALLOCNODE ( dynamic_buddy_start ) ;
dynamic_buddy - > mm_dynamic_start [ 0 ] - > size = SIZEOF_DYNAMICALLOCNODE_MEM ;
dynamic_buddy - > mm_dynamic_start [ 0 ] - > prev_adj_size = DYNAMIC_BLOCK_MASK ;
dynamic_buddy - > mm_dynamic_start [ 0 ] - > prev_adj_size = 0 ;
dynamic_buddy - > mm_dynamic_start [ 0 ] - > flag = DYNAMIC_BLOCK_MASK ;
/* the initialized free node */
node = ( struct DynamicFreeNode * ) ( ( x_ubase ) dynamic_buddy_start + SIZEOF_DYNAMICALLOCNODE_MEM ) ;
node - > size = ( uint32 ) ( dynamic_buddy_size - 2 * SIZEOF_DYNAMICALLOCNODE_MEM ) ;
KPrintf ( " kaishi : 0x%x, node : 0x%x, size : 0x%x \n " , ( x_ubase ) dynamic_buddy_start , node , dynamic_buddy_size ) ;
node - > size = ( dynamic_buddy_size - 2 * SIZEOF_DYNAMICALLOCNODE_MEM ) ;
KPrintf ( " hahaha size = %d \n " , node - > size ) ;
node - > prev_adj_size = SIZEOF_DYNAMICALLOCNODE_MEM ;
node - > flag = DYNAMIC_BLOCK_MASK ;
/* record the end boundary of dynamic buddy memory */
dynamic_buddy - > mm_dynamic_end [ 0 ] = PTR2ALLOCNODE ( ( x_ubase ) dynamic_buddy_start + ( x_ubase ) dynamic_buddy_size - SIZEOF_DYNAMICALLOCNODE_MEM ) ;
dynamic_buddy - > mm_dynamic_end [ 0 ] - > size = SIZEOF_DYNAMICALLOCNODE_MEM ;
dynamic_buddy - > mm_dynamic_end [ 0 ] - > prev_adj_size = node - > size ;
dynamic_buddy - > mm_dynamic_end [ 0 ] - > prev_adj_size | = DYNAMIC_BLOCK_MASK ;
// dynamic_buddy->mm_dynamic_end[0]->prev_adj_size |= DYNAMIC_BLOCK_MASK;
dynamic_buddy - > mm_dynamic_end [ 0 ] - > flag = DYNAMIC_BLOCK_MASK ;
/* insert node into dynamic buddy memory */
AddNewNodeIntoBuddy ( dynamic_buddy , node ) ;
KPrintf ( " 14 : %d \n " , dynamic_buddy - > mm_freenode_list [ 14 ] . size ) ;
KPrintf ( " dynamic_buddy_start = 0x%x,dynamic_buddy_size = 0x%x \n " , dynamic_buddy_start , dynamic_buddy_size ) ;
}
/**
@ -311,13 +335,15 @@ static void InitBuddy(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_
*
* @ param dynamic_buddy the heart dynamic buddy structure
* @ param size the memory size to be allocated
* @ param extsram_mask mask the memory region comes from ext sram
*
* @ return pointer address on success ; NULL on failure
*/
static void * BigMemMalloc ( struct DynamicBuddyMemory * dynamic_buddy , x_size_t size )
static void * BigMemMalloc ( struct DynamicBuddyMemory * dynamic_buddy , x_size_t size , uint32 extsram_mask )
{
int ndx = 0 ;
x_size_t allocsize = 0 ;
// x_size_t allocsize = 0;
uint32 allocsize = 0 ;
void * result = NONE ;
struct DynamicFreeNode * node = NONE ;
@ -325,7 +351,7 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz
/* calculate the real size */
allocsize = size + SIZEOF_DYNAMICALLOCNODE_MEM ;
KPrintf ( " allocsize = %d \n " , allocsize ) ;
/* if the size exceeds the upper limit, return MEM_LINKNRS - 1 */
if ( allocsize > = MEM_HIGH_RANGE ) {
ndx = MEM_LINKNRS - 1 ;
@ -339,12 +365,13 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz
node & & ( node - > size < allocsize ) ;
node = node - > next ) {
} ;
KPrintf ( " node 0x%x mm_freenode_list[%d] = 0x%x dynamic_buddy_start = 0x%x allocsize = %d \n " , node , ndx , & dynamic_buddy - > mm_freenode_list [ ndx ] , dynamic_buddy - > dynamic_buddy_start , allocsize ) ;
/* get the best-fit freeNode */
if ( node & & ( node - > size > allocsize ) ) {
struct DynamicFreeNode * remainder ;
struct DynamicFreeNode * next ;
x_size_t remaining ;
// x_size_t remaining;
uint32 remaining ;
node - > prev - > next = node - > next ;
if ( node - > next ) {
@ -352,31 +379,42 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz
}
remaining = node - > size - allocsize ;
KPrintf ( " node = 0x%x node size = %d alloc size = %d remaining size = %d \n " , node , node - > size , allocsize , remaining ) ;
if ( remaining > = MEM_LOW_RANGE ) {
next = PTR2FREENODE ( ( ( char * ) node ) + node - > size ) ;
/* create the remainder node */
remainder = PTR2FREENODE ( ( ( char * ) node ) + allocsize ) ;
remainder - > size = remaining ;
// KPrintf("remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d fg 0x%x\n",remainder,node,next,allocsize,remaining,remainder->size,remainder->flag);
remainder - > prev_adj_size = allocsize ;
// KPrintf("0 remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d, p s = %d fg 0x%x\n",remainder,node,next,allocsize,remaining,remainder->size,remainder->prev_adj_size,remainder->flag);
/* adjust the size of the node */
node - > size = allocsize ;
next - > prev_adj_size = ( remaining | ( next - > prev_adj_size & ALLOC_BLOCK_MASK ) ) ;
// next->prev_adj_size = (remaining|(next->prev_adj_size & ALLOC_BLOCK_MASK));
next - > prev_adj_size = remaining ;
/* insert the remainder freeNode back into the dynamic buddy memory */
KPrintf ( " 1 remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d, p s = %d fg 0x%x \n " , remainder , node , next , node - > size , remaining , remainder - > size , remainder - > prev_adj_size , remainder - > flag ) ;
AddNewNodeIntoBuddy ( dynamic_buddy , remainder ) ;
}
/* handle the case of an exact size match */
node - > prev_adj_size & = DYNAMIC_REMAINING_MASK ;
node - > prev_adj_size | = DYNAMIC_BLOCK_MASK ;
// node->prev_adj_size &= DYNAMIC_REMAINING_MASK;
// node->prev_adj_size |= DYNAMIC_BLOCK_MASK;
node - > flag = extsram_mask ;
// KPrintf("node flag = 0x%x prev_adj_size = 0x%x\n",node->flag,node->prev_adj_size);
result = ( void * ) ( ( char * ) node + SIZEOF_DYNAMICALLOCNODE_MEM ) ;
}
/* failure allocation */
if ( result = = NONE ) {
# ifndef DATA_IN_ExtSRAM
KPrintf ( " %s: allocation failed, size %d. \n " , __func__ , allocsize ) ;
# endif
return result ;
}
@ -413,7 +451,8 @@ static void BigMemFree( struct ByteMemory *byte_memory, void *pointer)
/* get the next sibling freeNode */
next = PTR2FREENODE ( ( char * ) node + node - > size ) ;
if ( ( ( next - > prev_adj_size & DYNAMIC_BLOCK_MASK ) = = 0 ) ) {
// if(((next->prev_adj_size & DYNAMIC_BLOCK_MASK) == 0)) {
if ( ( ( next - > flag & DYNAMIC_BLOCK_MASK ) = = 0 ) ) {
struct DynamicAllocNode * andbeyond ;
andbeyond = PTR2ALLOCNODE ( ( char * ) next + next - > size ) ;
@ -423,21 +462,25 @@ static void BigMemFree( struct ByteMemory *byte_memory, void *pointer)
}
node - > size + = next - > size ;
andbeyond - > prev_adj_size = ( node - > size | ( andbeyond - > prev_adj_size & ALLOC_BLOCK_MASK ) ) ;
// andbeyond->prev_adj_size = (node->size | (andbeyond->prev_adj_size & ALLOC_BLOCK_MASK));
andbeyond - > prev_adj_size = node - > size ;
next = ( struct DynamicFreeNode * ) andbeyond ;
}
/* get the prev sibling freeNode */
prev = ( struct DynamicFreeNode * ) ( ( char * ) node - ( node - > prev_adj_size & DYNAMIC_REMAINING_MASK ) ) ;
if ( ( prev - > prev_adj_size & DYNAMIC_BLOCK_MASK ) = = 0 ) {
// prev = (struct DynamicFreeNode*)((char*)node - (node->prev_adj_size & DYNAMIC_REMAINING_MASK));
prev = ( struct DynamicFreeNode * ) ( ( char * ) node - node - > prev_adj_size ) ;
// if((prev->prev_adj_size & DYNAMIC_BLOCK_MASK)==0) {
if ( ( prev - > flag & DYNAMIC_BLOCK_MASK ) = = 0 ) {
prev - > prev - > next = prev - > next ;
if ( prev - > next ) {
prev - > next - > prev = prev - > prev ;
}
prev - > size + = node - > size ;
next - > prev_adj_size = ( prev - > size | ( next - > prev_adj_size & ALLOC_BLOCK_MASK ) ) ;
// next->prev_adj_size = (prev->size | (next->prev_adj_size & ALLOC_BLOCK_MASK));
next - > prev_adj_size = prev - > size ;
node = prev ;
}
node - > prev_adj_size & = DYNAMIC_REMAINING_MASK ;
// node->prev_adj_size &= DYNAMIC_REMAINING_MASK;
/* insert freeNode into dynamic buddy memory */
AddNewNodeIntoBuddy ( & byte_memory - > dynamic_buddy_manager , node ) ;
@ -466,7 +509,7 @@ static void SmallMemInit(struct ByteMemory *byte_memory)
item = & byte_memory - > static_manager [ MM_SEGMENT_32B ] ;
/* allocate memory zone for [32b] */
item - > freelist = byte_memory - > dynamic_buddy_manager . done - > malloc ( & byte_memory - > dynamic_buddy_manager , SMALL_SIZE_32B ( SIZEOF_32B ) ) ;
item - > freelist = byte_memory - > dynamic_buddy_manager . done - > malloc ( & byte_memory - > dynamic_buddy_manager , SMALL_SIZE_32B ( SIZEOF_32B ) , DYNAMIC_BLOCK_NO_EXTMEM_MASK ) ;
if ( ! item - > freelist ) {
KPrintf ( " %s: no memory for small memory[32B]. \n " , __func__ ) ;
item - > block_free_count = 0 ;
@ -481,14 +524,14 @@ static void SmallMemInit(struct ByteMemory *byte_memory)
for ( offset = 0 ; offset < item - > block_total_count ; offset + + ) {
node = PTR2ALLOCNODE ( ( char * ) item - > freelist + offset * ( SIZEOF_32B + SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
node - > size = ( x_size_t ) ( ( char * ) item - > freelist + ( offset + 1 ) * ( SIZEOF_32B + SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
node - > prev_adj_size = STATIC_BLOCK_MASK ;
node - > flag = STATIC_BLOCK_MASK ;
}
node - > size = NONE ;
item = & byte_memory - > static_manager [ MM_SEGMENT_64B ] ;
/* allocate memory zone for [64B] */
item - > freelist = byte_memory - > dynamic_buddy_manager . done - > malloc ( & byte_memory - > dynamic_buddy_manager , SMALL_SIZE_64B ( SIZEOF_64B ) ) ;
item - > freelist = byte_memory - > dynamic_buddy_manager . done - > malloc ( & byte_memory - > dynamic_buddy_manager , SMALL_SIZE_64B ( SIZEOF_64B ) , DYNAMIC_BLOCK_NO_EXTMEM_MASK ) ;
if ( ! item - > freelist ) {
KPrintf ( " %s: no memory for small memory[64B]. \n " , __func__ ) ;
return ;
@ -502,7 +545,7 @@ static void SmallMemInit(struct ByteMemory *byte_memory)
for ( offset = 0 ; offset < item - > block_total_count ; offset + + ) {
node = PTR2ALLOCNODE ( ( char * ) item - > freelist + offset * ( SIZEOF_64B + SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
node - > size = ( x_size_t ) ( ( char * ) item - > freelist + ( offset + 1 ) * ( SIZEOF_64B + SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
node - > prev_adj_size = STATIC_BLOCK_MASK ;
node - > flag = STATIC_BLOCK_MASK ;
}
node - > size = NONE ;
@ -548,6 +591,7 @@ static void SmallMemFree(void *pointer)
*/
static void * SmallMemMalloc ( struct ByteMemory * byte_memory , x_size_t size )
{
uint8 i = 0 ;
void * result = NONE ;
struct DynamicAllocNode * node = NONE ;
struct segment * static_segment = NONE ;
@ -564,7 +608,7 @@ static void *SmallMemMalloc(struct ByteMemory *byte_memory, x_size_t size)
/* get the head static memory block */
result = static_segment - > freelist ;
node = PTR2ALLOCNODE ( static_segment - > freelist ) ;
node - > prev_adj_size = STATIC_BLOCK_MASK ;
node - > flag = STATIC_BLOCK_MASK ;
/* update the statistic information of static segment */
static_segment - > freelist = ( uint8 * ) ( long ) ( node - > size ) ;
@ -578,7 +622,20 @@ static void *SmallMemMalloc(struct ByteMemory *byte_memory, x_size_t size)
}
/* the static memory block is exhausted, now turn to dynamic buddy memory for allocation. */
result = byte_memory - > dynamic_buddy_manager . done - > malloc ( & byte_memory - > dynamic_buddy_manager , size ) ;
result = byte_memory - > dynamic_buddy_manager . done - > malloc ( & byte_memory - > dynamic_buddy_manager , size , DYNAMIC_BLOCK_NO_EXTMEM_MASK ) ;
# ifdef DATA_IN_ExtSRAM
if ( NONE = = result ) {
for ( i = 0 ; i < EXTSRAM_MAX_NUM ; i + + ) {
if ( NONE ! = ExtByteManager [ i ] . done ) {
result = ExtByteManager [ i ] . dynamic_buddy_manager . done - > malloc ( & ExtByteManager [ i ] . dynamic_buddy_manager , size , DYNAMIC_BLOCK_EXTMEMn_MASK ( i + 1 ) ) ;
if ( result ) {
CHECK ( ExtByteManager [ i ] . dynamic_buddy_manager . done - > JudgeLegal ( & ExtByteManager [ i ] . dynamic_buddy_manager , ret - SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
break ;
}
}
}
}
# endif
return result ;
}
@ -597,18 +654,31 @@ static struct StaticMemoryDone StaticDone = {
*/
void * x_malloc ( x_size_t size )
{
uint8 i = 0 ;
void * ret = NONE ;
register x_base lock = 0 ;
/* parameter detection */
// /* parameter detection */
// if((size == 0) || (size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory))
// return NONE;
# ifdef DATA_IN_ExtSRAM
/* parameter detection */
if ( size = = 0 ) {
return NONE ;
}
// if((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)){
// goto try_extmem;
// }
# else
/* parameter detection */
if ( ( size = = 0 ) | | ( size > ByteManager . dynamic_buddy_manager . dynamic_buddy_end - ByteManager . dynamic_buddy_manager . dynamic_buddy_start - ByteManager . dynamic_buddy_manager . active_memory ) )
return NONE ;
# endif
/* hold lock before allocation */
lock = CriticalAreaLock ( ) ;
/* alignment */
size = ALIGN_MEN_UP ( size , MEM_ALIGN_SIZE ) ;
/* determine allocation operation from static segments or dynamic buddy memory */
# ifdef KERNEL_SMALL_MEM_ALLOC
if ( size < = SIZEOF_32B ) {
@ -618,10 +688,28 @@ void *x_malloc(x_size_t size)
} else
# endif
{
ret = ByteManager . dynamic_buddy_manager . done - > malloc ( & ByteManager . dynamic_buddy_manager , size ) ;
ret = ByteManager . dynamic_buddy_manager . done - > malloc ( & ByteManager . dynamic_buddy_manager , size , DYNAMIC_BLOCK_NO_EXTMEM_MASK ) ;
if ( ret ! = NONE )
CHECK ( ByteManager . dynamic_buddy_manager . done - > JudgeLegal ( & ByteManager . dynamic_buddy_manager , ret - SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
// try_extmem:
# ifdef DATA_IN_ExtSRAM
if ( NONE = = ret ) {
KPrintf ( " wwg debug ... \n " ) ;
for ( i = 0 ; i < EXTSRAM_MAX_NUM ; i + + ) {
if ( NONE ! = ExtByteManager [ i ] . done ) {
KPrintf ( " ExtByteManager[%d].done = 0x%x \n " , i , ExtByteManager [ i ] . done ) ;
ret = ExtByteManager [ i ] . dynamic_buddy_manager . done - > malloc ( & ExtByteManager [ i ] . dynamic_buddy_manager , size , DYNAMIC_BLOCK_EXTMEMn_MASK ( i + 1 ) ) ;
if ( ret ) {
CHECK ( ExtByteManager [ i ] . dynamic_buddy_manager . done - > JudgeLegal ( & ExtByteManager [ i ] . dynamic_buddy_manager , ret - SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
break ;
}
KPrintf ( " ret = 0x%x \n " , ret ) ;
}
}
}
# endif
}
if ( ret ! = NONE )
CHECK ( ByteManager . dynamic_buddy_manager . done - > JudgeLegal ( & ByteManager . dynamic_buddy_manager , ret - SIZEOF_DYNAMICALLOCNODE_MEM ) ) ;
KPrintf ( " malloc i = %d size %d ret = 0x%x \n " , i , size , ret ) ;
/* release lock */
CriticalAreaUnLock ( lock ) ;
return ret ;
@ -726,20 +814,83 @@ void x_free(void *pointer)
lock = CriticalAreaLock ( ) ;
node = PTR2ALLOCNODE ( ( char * ) pointer - SIZEOF_DYNAMICALLOCNODE_MEM ) ;
CHECK ( ByteManager . done - > JudgeAllocated ( node ) ) ;
/* judge release the memory block ro static_segment or dynamic buddy memory */
# ifdef KERNEL_SMALL_MEM_ALLOC
if ( node - > prev_adj_size & STATIC_BLOCK_MASK ) {
if ( node - > flag & STATIC_BLOCK_MASK ) {
ByteManager . static_manager - > done - > release ( pointer ) ;
} else
# endif
{
# ifdef DATA_IN_ExtSRAM
/* judge the pointer is not malloced from extern memory*/
if ( 0 = = ( node - > flag & 0xFF0000 ) ) {
ByteManager . dynamic_buddy_manager . done - > release ( & ByteManager , pointer ) ;
}
/* judge the pointer is malloced from extern memory*/
if ( 0 ! = ( node - > flag & 0xFF0000 ) ) {
KPrintf ( " wwg debug node->flag = 0x%x \n " , node - > flag ) ;
ExtByteManager [ ( ( node - > flag & 0xFF0000 ) > > 16 ) - 1 ] . dynamic_buddy_manager . done - > release ( & ExtByteManager [ ( ( node - > flag & 0xFF0000 ) > > 16 ) - 1 ] , pointer ) ;
}
# else
ByteManager . dynamic_buddy_manager . done - > release ( & ByteManager , pointer ) ;
# endif
}
/* release the lock */
CriticalAreaUnLock ( lock ) ;
}
# ifdef DATA_IN_ExtSRAM
/**
* This function initializes the dynamic buddy memory of extern sram .
*
* @ param start_phy_address the start physical address for static and dynamic memory
* @ param end_phy_address the end physical address for static and dynamic memory
* @ param extsram_idx the idx of extsram chip
*/
void ExtSramInitBoardMemory ( void * start_phy_address , void * end_phy_address , uint8 extsram_idx )
{
register x_size_t offset = 0 ;
NULL_PARAM_CHECK ( start_phy_address ) ;
NULL_PARAM_CHECK ( end_phy_address ) ;
KDEBUG_NOT_IN_INTERRUPT ;
struct DynamicBuddyMemory * uheap = & ExtByteManager [ extsram_idx ] . dynamic_buddy_manager ;
/* align begin and end addr to page */
ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_start = ALIGN_MEN_UP ( ( x_ubase ) start_phy_address , MM_PAGE_SIZE ) ;
ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_end = ALIGN_MEN_DOWN ( ( x_ubase ) end_phy_address , MM_PAGE_SIZE ) ;
KPrintf ( " %s: 0x%x-0x%x extsram_idx = %d \n " , __func__ , ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_start , ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_end , extsram_idx ) ;
/* parameter detection */
if ( ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_start > = ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_end ) {
KPrintf ( " ExtSramInitBoardMemory, wrong address[0x%x - 0x%x] \n " ,
( x_ubase ) start_phy_address , ( x_ubase ) end_phy_address ) ;
return ;
}
uheap - > mm_total_size = 0 ;
memset ( uheap - > mm_freenode_list , 0 , SIZEOF_XSFREENODE_MEM * MEM_LINKNRS ) ;
/* initialize the freeNodeList */
for ( offset = 1 ; offset < MEM_LINKNRS ; offset + + ) {
uheap - > mm_freenode_list [ offset - 1 ] . next = & uheap - > mm_freenode_list [ offset ] ;
uheap - > mm_freenode_list [ offset ] . prev = & uheap - > mm_freenode_list [ offset - 1 ] ;
}
ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . done = & DynamicDone ;
ExtByteManager [ extsram_idx ] . done = & NodeDone ;
/* dynamic buddy memory initialization */
ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . done - > init ( & ExtByteManager [ extsram_idx ] . dynamic_buddy_manager , ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_start , ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_end - ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . dynamic_buddy_start ) ;
KPrintf ( " [0x%x - 0x%x]ExtByteManager[%d].dynamic_buddy_manager.done = 0x%x \n " , start_phy_address , end_phy_address , extsram_idx , ExtByteManager [ extsram_idx ] . dynamic_buddy_manager . done ) ;
}
# endif
/**
* This function initializes the static segments and dynamic buddy memory structures .
*
@ -1025,7 +1176,7 @@ void ShowBuddy(void)
KPrintf ( " \n \033 [41;1mlist memory information \033 [0m \n " , __func__ ) ;
for ( debug = ByteManager . dynamic_buddy_manager . mm_freenode_list [ 0 ] . next ;
debug ; debug = debug - > next ) {
KPrintf ( " %s,current is %x,next is %x, size %u, flag %x \n " , __func__ , debug , debug - > next , debug - > size , debug - > prev_adj_size & ALLOC_BLOCK_MASK ) ;
KPrintf ( " %s,current is %x,next is %x, size %u, flag %x \n " , __func__ , debug , debug - > next , debug - > size , debug - > flag & ALLOC_BLOCK_MASK ) ;
} ;
KPrintf ( " \n list memory information \n \n " ) ;
CriticalAreaUnLock ( lock ) ;