xref: /plan9-contrib/sys/src/ape/lib/ap/riscv64/brk.c (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1*ce95e1b3SDavid du Colombier #include "../plan9/lib.h"
2*ce95e1b3SDavid du Colombier #include <errno.h>
3*ce95e1b3SDavid du Colombier #include "../plan9/sys9.h"
4*ce95e1b3SDavid du Colombier 
5*ce95e1b3SDavid du Colombier char	end[];
6*ce95e1b3SDavid du Colombier static	char	*bloc = { end };
7*ce95e1b3SDavid du Colombier extern	int	_BRK_(void*);
8*ce95e1b3SDavid du Colombier 
9*ce95e1b3SDavid du Colombier char *
brk(char * p)10*ce95e1b3SDavid du Colombier brk(char *p)
11*ce95e1b3SDavid du Colombier {
12*ce95e1b3SDavid du Colombier 	unsigned long n;
13*ce95e1b3SDavid du Colombier 
14*ce95e1b3SDavid du Colombier 	n = (unsigned long)p;
15*ce95e1b3SDavid du Colombier 	n += 7;
16*ce95e1b3SDavid du Colombier 	n &= ~7;
17*ce95e1b3SDavid du Colombier 	if(_BRK_((void*)n) < 0){
18*ce95e1b3SDavid du Colombier 		errno = ENOMEM;
19*ce95e1b3SDavid du Colombier 		return (char *)-1;
20*ce95e1b3SDavid du Colombier 	}
21*ce95e1b3SDavid du Colombier 	bloc = (char *)n;
22*ce95e1b3SDavid du Colombier 	return 0;
23*ce95e1b3SDavid du Colombier }
24*ce95e1b3SDavid du Colombier 
25*ce95e1b3SDavid du Colombier void *
sbrk(unsigned long n)26*ce95e1b3SDavid du Colombier sbrk(unsigned long n)
27*ce95e1b3SDavid du Colombier {
28*ce95e1b3SDavid du Colombier 	n += 7;
29*ce95e1b3SDavid du Colombier 	n &= ~7;
30*ce95e1b3SDavid du Colombier 	_WRITE(2, "", 0);
31*ce95e1b3SDavid du Colombier 	if(_BRK_((void *)(bloc+n)) < 0){
32*ce95e1b3SDavid du Colombier 		errno = ENOMEM;
33*ce95e1b3SDavid du Colombier 		return (void *)-1;
34*ce95e1b3SDavid du Colombier 	}
35*ce95e1b3SDavid du Colombier 	bloc += n;
36*ce95e1b3SDavid du Colombier 	return (void *)(bloc-n);
37*ce95e1b3SDavid du Colombier }
38