sandbox: Improve/augment memory allocation functions

Implement realloc() and free() for sandbox, by adding a header to each
block which contains the block size.

Signed-off-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Che-Liang Chiou <clchiou@chromium.org>
Reviewed-by: Hung-ying Tyan <tyanh@chromium.org>
This commit is contained in:
Simon Glass 2013-11-10 10:26:57 -07:00
parent f4d8de48f5
commit 77595c6d9e
2 changed files with 72 additions and 2 deletions

View File

@ -27,6 +27,10 @@
/* Operating System Interface */
struct os_mem_hdr {
size_t length; /* number of bytes in the block */
};
ssize_t os_read(int fd, void *buf, size_t count)
{
return read(fd, buf, count);
@ -128,8 +132,45 @@ void os_tty_raw(int fd)
void *os_malloc(size_t length)
{
return mmap(NULL, length, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
struct os_mem_hdr *hdr;
hdr = mmap(NULL, length + sizeof(*hdr), PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (hdr == MAP_FAILED)
return NULL;
hdr->length = length;
return hdr + 1;
}
void *os_free(void *ptr)
{
struct os_mem_hdr *hdr = ptr;
hdr--;
if (ptr)
munmap(hdr, hdr->length + sizeof(*hdr));
}
void *os_realloc(void *ptr, size_t length)
{
struct os_mem_hdr *hdr = ptr;
void *buf = NULL;
hdr--;
if (length != 0) {
buf = os_malloc(length);
if (!buf)
return buf;
if (ptr) {
if (length > hdr->length)
length = hdr->length;
memcpy(buf, ptr, length);
}
}
os_free(ptr);
return buf;
}
void os_usleep(unsigned long usec)

View File

@ -106,6 +106,35 @@ void os_tty_raw(int fd);
*/
void *os_malloc(size_t length);
/**
* Free memory previous allocated with os_malloc()/os_realloc()
*
* This returns the memory to the OS.
*
* \param ptr Pointer to memory block to free
*/
void *os_free(void *ptr);
/**
* Reallocate previously-allocated memory to increase/decrease space
*
* This works in a similar way to the C library realloc() function. If
* length is 0, then ptr is freed. Otherwise the space used by ptr is
* expanded or reduced depending on whether length is larger or smaller
* than before.
*
* If ptr is NULL, then this is similar to calling os_malloc().
*
* This function may need to move the memory block to make room for any
* extra space, in which case the new pointer is returned.
*
* \param ptr Pointer to memory block to reallocate
* \param length New length for memory block
* \return pointer to new memory block, or NULL on failure or if length
* is 0.
*/
void *os_realloc(void *ptr, size_t length);
/**
* Access to the usleep function of the os
*