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