44 lines
1.1 KiB
C
44 lines
1.1 KiB
C
/* sbrk support */
|
|
|
|
/* The current plan is to have one sbrk handler for all cpus.
|
|
Hence use `asm' for each global variable here to avoid the cpu prefix.
|
|
We can't intrude on the user's namespace (another reason to use asm). */
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/syscall.h>
|
|
#include <errno.h>
|
|
#include <stddef.h>
|
|
|
|
/* These variables are publicly accessible for debugging purposes.
|
|
The user is also free to set sbrk_size to something different.
|
|
See mem-layout.c. */
|
|
|
|
extern int sbrk_size asm ("sbrk_size");
|
|
|
|
caddr_t sbrk_start asm ("sbrk_start");
|
|
caddr_t sbrk_loc asm ("sbrk_loc");
|
|
|
|
/*caddr_t _sbrk_r (struct _reent *, size_t) asm ("__sbrk_r");*/
|
|
|
|
/* FIXME: We need a semaphore here. */
|
|
|
|
caddr_t
|
|
_sbrk_r (struct _reent *r, size_t nbytes)
|
|
{
|
|
caddr_t result;
|
|
|
|
if (
|
|
/* Ensure we don't underflow. */
|
|
sbrk_loc + nbytes < sbrk_start
|
|
/* Ensure we don't overflow. */
|
|
|| sbrk_loc + nbytes > sbrk_start + sbrk_size)
|
|
{
|
|
errno = ENOMEM;
|
|
return ((caddr_t) -1);
|
|
}
|
|
|
|
result = sbrk_loc;
|
|
sbrk_loc += nbytes;
|
|
return result;
|
|
}
|