/** @file
Header file for memory allocation tracking functions.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _MYALLOC_H_
#define _MYALLOC_H_
#include
#include
#include
#include
//
// Default operation is to use the memory allocation tracking functions.
// To over-ride add "#define USE_MYALLOC 0" to your program header and/or
// source files as needed. Or, just do not include this header file in
// your project.
//
#ifndef USE_MYALLOC
#define USE_MYALLOC 1
#endif
#if USE_MYALLOC
//
// Replace C library allocation routines with MyAlloc routines.
//
#define malloc(size) MyAlloc ((size), __FILE__, __LINE__)
#define calloc(count, size) MyAlloc ((count) * (size), __FILE__, __LINE__)
#define realloc(ptr, size) MyRealloc ((ptr), (size), __FILE__, __LINE__)
#define free(ptr) MyFree ((ptr), __FILE__, __LINE__)
#define alloc_check(final) MyCheck ((final), __FILE__, __LINE__)
//
// Structure for checking/tracking memory allocations.
//
typedef struct MyAllocStruct {
UINTN Cksum;
struct MyAllocStruct *Next;
UINTN Line;
UINTN Size;
UINT8 *File;
UINT8 *Buffer;
} MY_ALLOC_STRUCT;
//
// Cksum := (UINTN)This + (UINTN)Next + Line + Size + (UINTN)File +
// (UINTN)Buffer;
//
// Next := Pointer to next allocation structure in the list.
//
// Line := __LINE__
//
// Size := Size of allocation request.
//
// File := Pointer to __FILE__ string stored immediately following
// MY_ALLOC_STRUCT in memory.
//
// Buffer := Pointer to UINT32 aligned storage immediately following
// the NULL terminated __FILE__ string. This is UINT32
// aligned because the underflow signature is 32-bits and
// this will place the first caller address on a 64-bit
// boundary.
//
//
// Signatures used to check for buffer overflow/underflow conditions.
//
#define MYALLOC_HEAD_MAGIK 0xBADFACED
#define MYALLOC_TAIL_MAGIK 0xDEADBEEF
/**
Check for corruptions in the allocated memory chain. If a corruption
is detection program operation stops w/ an exit(1) call.
@param Final When FALSE, MyCheck() returns if the allocated memory chain
has not been corrupted. When TRUE, MyCheck() returns if there
are no un-freed allocations. If there are un-freed allocations,
they are displayed and exit(1) is called.
@param File Set to __FILE__ by macro expansion.
@param Line Set to __LINE__ by macro expansion.
**/
VOID
MyCheck (
BOOLEAN Final,
UINT8 File[],
UINTN Line
)
;
/**
Allocate a new link in the allocation chain along with enough storage
for the File[] string, requested Size and alignment overhead. If
memory cannot be allocated or the allocation chain has been corrupted,
exit(1) will be called.
@param Size Number of bytes (UINT8) requested by the called.
Size cannot be zero.
@param File Set to __FILE__ by macro expansion.
@param Line Set to __LINE__ by macro expansion.
@return Pointer to the caller's buffer.
**/
VOID *
MyAlloc (
UINTN Size,
UINT8 File[],
UINTN Line
)
;
/**
This does a MyAlloc(), memcpy() and MyFree(). There is no optimization
for shrinking or expanding buffers. An invalid parameter will cause
MyRealloc() to fail with a call to exit(1).
@param Ptr Pointer to the caller's buffer to be re-allocated.
Ptr cannot be NULL.
@param Size Size of new buffer. Size cannot be zero.
@param File Set to __FILE__ by macro expansion.
@param Line Set to __LINE__ by macro expansion.
@return Pointer to new caller's buffer.
**/
VOID *
MyRealloc (
VOID *Ptr,
UINTN Size,
UINT8 File[],
UINTN Line
)
;
/**
Release a previously allocated buffer. Invalid parameters will cause
MyFree() to fail with an exit(1) call.
@param Ptr Pointer to the caller's buffer to be freed.
A NULL pointer will be ignored.
@param File Set to __FILE__ by macro expansion.
@param Line Set to __LINE__ by macro expansion.
**/
VOID
MyFree (
VOID *Ptr,
UINT8 File[],
UINTN Line
)
;
#else /* USE_MYALLOC */
//
// Nothing to do when USE_MYALLOC is zero.
//
#define alloc_check(final)
#endif /* USE_MYALLOC */
#endif /* _MYALLOC_H_ */
/* eof - MyAlloc.h */