/* 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 #include #include #include /* 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; }