Files
skiboot/core/malloc.c
Stewart Smith 49496485fe Re-license IBM written files as Apache 2.0 OR GPLv2+
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>
2020-03-12 20:33:18 +11:00

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;
}