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