1*1f5207b7SJohn Levon #include <sys/mman.h>
2*1f5207b7SJohn Levon #include <sys/types.h>
3*1f5207b7SJohn Levon 
4*1f5207b7SJohn Levon /*
5*1f5207b7SJohn Levon  * Allow old BSD naming too, it would be a pity to have to make a
6*1f5207b7SJohn Levon  * separate file just for this.
7*1f5207b7SJohn Levon  */
8*1f5207b7SJohn Levon #ifndef MAP_ANONYMOUS
9*1f5207b7SJohn Levon #define MAP_ANONYMOUS MAP_ANON
10*1f5207b7SJohn Levon #endif
11*1f5207b7SJohn Levon 
12*1f5207b7SJohn Levon /*
13*1f5207b7SJohn Levon  * Our blob allocator enforces the strict CHUNK size
14*1f5207b7SJohn Levon  * requirement, as a portability check.
15*1f5207b7SJohn Levon  */
blob_alloc(unsigned long size)16*1f5207b7SJohn Levon void *blob_alloc(unsigned long size)
17*1f5207b7SJohn Levon {
18*1f5207b7SJohn Levon 	void *ptr;
19*1f5207b7SJohn Levon 
20*1f5207b7SJohn Levon 	if (size & ~CHUNK)
21*1f5207b7SJohn Levon 		die("internal error: bad allocation size (%lu bytes)", size);
22*1f5207b7SJohn Levon 	ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
23*1f5207b7SJohn Levon 	if (ptr == MAP_FAILED)
24*1f5207b7SJohn Levon 		ptr = NULL;
25*1f5207b7SJohn Levon 	return ptr;
26*1f5207b7SJohn Levon }
27*1f5207b7SJohn Levon 
blob_free(void * addr,unsigned long size)28*1f5207b7SJohn Levon void blob_free(void *addr, unsigned long size)
29*1f5207b7SJohn Levon {
30*1f5207b7SJohn Levon 	if (!size || (size & ~CHUNK) || ((unsigned long) addr & 512))
31*1f5207b7SJohn Levon 		die("internal error: bad blob free (%lu bytes at %p)", size, addr);
32*1f5207b7SJohn Levon #ifndef DEBUG
33*1f5207b7SJohn Levon 	munmap(addr, size);
34*1f5207b7SJohn Levon #else
35*1f5207b7SJohn Levon 	mprotect(addr, size, PROT_NONE);
36*1f5207b7SJohn Levon #endif
37*1f5207b7SJohn Levon }
38