blob: 20b9ce3d9f43dbac895405c68b1c0fc04d6499cf [file] [log] [blame]
Imre Kise6d73412021-10-18 14:01:47 +02001// SPDX-License-Identifier: BSD-3-Clause
2/*
Imre Kiseeee9642021-12-17 13:59:46 +01003 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
Imre Kise6d73412021-10-18 14:01:47 +02004 */
5
6#include "compiler.h"
Imre Kise6d73412021-10-18 14:01:47 +02007#include <errno.h>
8#include <stdint.h>
9#include <unistd.h>
10
11/* Allocating heap area */
Imre Kiseeee9642021-12-17 13:59:46 +010012#ifndef SP_HEAP_SIZE
13#error "SP_HEAP_SIZE is undefined, please define it in the build system"
Imre Kise6d73412021-10-18 14:01:47 +020014#endif
15
Imre Kiseeee9642021-12-17 13:59:46 +010016static uint8_t sp_heap[SP_HEAP_SIZE] __aligned(16);
Imre Kise6d73412021-10-18 14:01:47 +020017static uint8_t *program_break = sp_heap;
18
19/**
20 * Basic sbrk implementation which increases the program break through the
21 * sp_heap buffer.
22 */
23void *_sbrk(ptrdiff_t incr)
24{
25 uint8_t *previous_break = program_break;
26 uint8_t *new_break = program_break + incr;
27
28 if ((new_break < sp_heap) || (new_break > (sp_heap + sizeof(sp_heap)))) {
29 errno = ENOMEM;
30 return (void *)(uintptr_t) -1;
31 }
32
33 program_break += incr;
34
35 return (void *) previous_break;
36}