3 #define _GNU_SOURCE // needed for MAP_ANONYMOUS to be avaliable
10 # include <sys/mman.h>
15 int AllocateMemory(uintptr_t VirtAddr, size_t ByteCount);
16 uintptr_t FindFreeRange(size_t ByteCount, int MaxBits);
19 int AllocateMemory(uintptr_t VirtAddr, size_t ByteCount)
21 uintptr_t base = (VirtAddr >> 12) << 12;
22 size_t size = (VirtAddr & 0xFFF) + ByteCount;
27 MEMORY_BASIC_INFORMATION info;
28 VirtualQuery( (void*)base, &info, sizeof(info) );
29 if( info.State != MEM_FREE ) {
30 printf("ERROR: Unable to allocate memory %p+0x%x, already allocated\n",
39 } while( size >= 0x1000 );
40 tmp = VirtualAlloc((void*)base, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);
42 printf("ERROR: Unable to allocate memory %p+%x (0x%x)\n",
48 // printf("AllocateMemory: mmap(%p, 0x%lx, ...)\n", (void*)base, ByteCount);
49 tmp = mmap((void*)base, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
50 if( tmp == MAP_FAILED ) {
51 printf("ERROR: Unable to allocate memory\n");
52 perror("AllocateMemory");
55 // printf("AllocateMemory: RETURN 0\n");
60 uintptr_t FindFreeRange(size_t ByteCount, int MaxBits)
62 uintptr_t base, ofs, size;
64 static const int PAGE_SIZE = 0x1000;
66 size = (ByteCount + PAGE_SIZE - 1) / PAGE_SIZE;
69 end <<= (sizeof(intptr_t)*8-MaxBits);
70 end >>= (sizeof(intptr_t)*8-MaxBits);
71 // printf("end = %p\n", (void*)end);
73 // for( base = 0; base < end - size; base -= PAGE_SIZE )
74 for( base = end - size + 1; base > 0; base -= PAGE_SIZE )
76 for( ofs = 0; ofs < size; ofs += PAGE_SIZE ) {
78 MEMORY_BASIC_INFORMATION info;
79 VirtualQuery( (void*)(base + ofs), &info, sizeof(info) );
80 if( info.State != MEM_FREE )
83 if( msync( (void*)(base+ofs), 1, 0) == 0 )
86 perror("FindFreeRange, msync");