mirror of
https://github.com/Dasharo/skiboot.git
synced 2026-03-06 14:50:44 -08:00
SPDX makes it a simpler diff. I have audited the commit history of each file to ensure that they are exclusively authored by IBM and thus we have the right to relicense. The motivation behind this is twofold: 1) We want to enable experiments with coreboot, which is GPLv2 licensed 2) An upcoming firmware component wants to incorporate code from skiboot and code from the Linux kernel, which is GPLv2 licensed. I have gone through the IBM internal way of gaining approval for this. The following files are not exclusively authored by IBM, so are *not* included in this update (I will be seeking approval from contributors): core/direct-controls.c core/flash.c core/pcie-slot.c external/common/arch_flash_unknown.c external/common/rules.mk external/gard/Makefile external/gard/rules.mk external/opal-prd/Makefile external/pflash/Makefile external/xscom-utils/Makefile hdata/vpd.c hw/dts.c hw/ipmi/ipmi-watchdog.c hw/phb4.c include/cpu.h include/phb4.h include/platform.h libflash/libffs.c libstb/mbedtls/sha512.c libstb/mbedtls/sha512.h platforms/astbmc/barreleye.c platforms/astbmc/garrison.c platforms/astbmc/mihawk.c platforms/astbmc/nicole.c platforms/astbmc/p8dnu.c platforms/astbmc/p8dtu.c platforms/astbmc/p9dsu.c platforms/astbmc/vesnin.c platforms/rhesus/ec/config.h platforms/rhesus/ec/gpio.h platforms/rhesus/gpio.c platforms/rhesus/rhesus.c platforms/astbmc/talos.c platforms/astbmc/romulus.c Signed-off-by: Stewart Smith <stewart@linux.ibm.com> [oliver: fixed up the drift] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
77 lines
1.6 KiB
C
77 lines
1.6 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/*
|
|
* Implement malloc()/free() etc on top of our memory region allocator,
|
|
* which provides mem_alloc()/mem_free().
|
|
*
|
|
* Copyright 2013-2015 IBM Corp.
|
|
*/
|
|
|
|
#include <mem_region.h>
|
|
#include <lock.h>
|
|
#include <string.h>
|
|
#include <mem_region-malloc.h>
|
|
|
|
#define DEFAULT_ALIGN __alignof__(long)
|
|
|
|
void *__memalign(size_t blocksize, size_t bytes, const char *location)
|
|
{
|
|
void *p;
|
|
|
|
lock(&skiboot_heap.free_list_lock);
|
|
p = mem_alloc(&skiboot_heap, bytes, blocksize, location);
|
|
unlock(&skiboot_heap.free_list_lock);
|
|
|
|
return p;
|
|
}
|
|
|
|
void *__malloc(size_t bytes, const char *location)
|
|
{
|
|
return __memalign(DEFAULT_ALIGN, bytes, location);
|
|
}
|
|
|
|
void __free(void *p, const char *location)
|
|
{
|
|
lock(&skiboot_heap.free_list_lock);
|
|
mem_free(&skiboot_heap, p, location);
|
|
unlock(&skiboot_heap.free_list_lock);
|
|
}
|
|
|
|
void *__realloc(void *ptr, size_t size, const char *location)
|
|
{
|
|
void *newptr;
|
|
|
|
/* Two classic malloc corner cases. */
|
|
if (!size) {
|
|
__free(ptr, location);
|
|
return NULL;
|
|
}
|
|
if (!ptr)
|
|
return __malloc(size, location);
|
|
|
|
lock(&skiboot_heap.free_list_lock);
|
|
if (mem_resize(&skiboot_heap, ptr, size, location)) {
|
|
newptr = ptr;
|
|
} else {
|
|
newptr = mem_alloc(&skiboot_heap, size, DEFAULT_ALIGN,
|
|
location);
|
|
if (newptr) {
|
|
size_t copy = mem_allocated_size(ptr);
|
|
if (copy > size)
|
|
copy = size;
|
|
memcpy(newptr, ptr, copy);
|
|
mem_free(&skiboot_heap, ptr, location);
|
|
}
|
|
}
|
|
unlock(&skiboot_heap.free_list_lock);
|
|
return newptr;
|
|
}
|
|
|
|
void *__zalloc(size_t bytes, const char *location)
|
|
{
|
|
void *p = __malloc(bytes, location);
|
|
|
|
if (p)
|
|
memset(p, 0, bytes);
|
|
return p;
|
|
}
|