rather than the Linux way; various non-C bits of the ACK assume it takes an int, so it's cleaner).
		
			
				
	
	
		
			45 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Raspberry Pi support library for the ACK
 | |
|  * © 2013 David Given
 | |
|  * This file is redistributable under the terms of the 3-clause BSD license.
 | |
|  * See the file 'Copying' in the root of the distribution for the full text.
 | |
|  */
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <errno.h>
 | |
| #include <unistd.h>
 | |
| #include <pi.h>
 | |
| 
 | |
| #define	OUT_OF_MEMORY (void*)(-1)	/* sbrk returns this on failure */
 | |
| #define STACK_BUFFER 1024 /* number of bytes to leave for stack */
 | |
| 
 | |
| extern char _end[1];
 | |
| static char* current = _end;
 | |
| 
 | |
| /* Top of heap: we assume that the block of memory the binary is loaded in
 | |
|  * is 256kB long. Because user pointers are always relative to the beginning
 | |
|  * of the block, this makes the end address easy to calculate. */
 | |
| static char* max = (char*) (128*1024);
 | |
| 
 | |
| int brk(void* newend)
 | |
| {
 | |
| 	if ((newend >= (void*)max) || (newend < (void*)_end))
 | |
| 		return -1;
 | |
| 
 | |
| 	current = newend;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| void* sbrk(int increment)
 | |
| {
 | |
| 	char* old;
 | |
| 	
 | |
| 	if (increment == 0)
 | |
| 		return current;
 | |
| 		
 | |
| 	old = current;
 | |
| 	if (brk(old + increment) < 0)
 | |
| 		return OUT_OF_MEMORY;
 | |
| 		
 | |
| 	return old;
 | |
| }
 |