2 * UCW Library -- Allocation of Large Aligned Buffers
4 * (c) 2006--2007 Martin Mares <mj@ucw.cz>
5 * (c) 2007 Pavel Charvat <char@ucw.cz>
7 * This software may be freely distributed and used according to the terms
8 * of the GNU Lesser General Public License.
21 die("page_alloc: Size %llu is too large for the current architecture", (long long) len);
22 ASSERT(!(len & (CPU_PAGE_SIZE-1)));
23 byte *p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
24 if (p == (byte*) MAP_FAILED)
25 die("Cannot mmap %llu bytes of memory: %m", (long long)len);
30 page_alloc_zero(u64 len)
32 void *p = page_alloc(len);
38 page_free(void *start, u64 len)
40 ASSERT(!(len & (CPU_PAGE_SIZE-1)));
41 ASSERT(!((uintptr_t) start & (CPU_PAGE_SIZE-1)));
46 page_realloc(void *start, u64 old_len, u64 new_len)
48 void *p = page_alloc(new_len);
49 memcpy(p, start, MIN(old_len, new_len));
50 page_free(start, old_len);
57 return ALIGN_TO(len, (u64)CPU_PAGE_SIZE);
63 u64 l = big_round(len);
64 if (l > SIZE_MAX - 2*CPU_PAGE_SIZE)
65 die("big_alloc: Size %llu is too large for the current architecture", (long long) len);
69 byte *p = page_alloc(l);
72 mprotect(p, CPU_PAGE_SIZE, PROT_NONE);
73 mprotect(p+l-CPU_PAGE_SIZE, CPU_PAGE_SIZE, PROT_NONE);
80 big_alloc_zero(u64 len)
82 void *p = big_alloc(len);
83 bzero(p, big_round(len));
88 big_free(void *start, u64 len)
91 u64 l = big_round(len);
94 mprotect(p, CPU_PAGE_SIZE, PROT_READ);
95 ASSERT(*(u64*)p == len);
105 byte *p = big_alloc(123456);