3 * Windows support for mapping code into the process address space
6 * Mono Team (mono-list@lists.ximian.com)
8 * Copyright 2001-2008 Novell, Inc.
9 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
15 #if defined(HOST_WIN32)
17 #include "mono/utils/mono-mmap-windows-internals.h"
18 #include <mono/utils/mono-counters.h>
21 static void *malloced_shared_area = NULL;
27 static int saved_pagesize = 0;
29 return saved_pagesize;
30 GetSystemInfo (&info);
31 saved_pagesize = info.dwPageSize;
32 return saved_pagesize;
36 mono_valloc_granule (void)
39 static int saved_valloc_granule = 0;
40 if (saved_valloc_granule)
41 return saved_valloc_granule;
42 GetSystemInfo (&info);
43 saved_valloc_granule = info.dwAllocationGranularity;
44 return saved_valloc_granule;
48 mono_mmap_win_prot_from_flags (int flags)
50 int prot = flags & (MONO_MMAP_READ|MONO_MMAP_WRITE|MONO_MMAP_EXEC);
52 case 0: prot = PAGE_NOACCESS; break;
53 case MONO_MMAP_READ: prot = PAGE_READONLY; break;
54 case MONO_MMAP_READ|MONO_MMAP_EXEC: prot = PAGE_EXECUTE_READ; break;
55 case MONO_MMAP_READ|MONO_MMAP_WRITE: prot = PAGE_READWRITE; break;
56 case MONO_MMAP_READ|MONO_MMAP_WRITE|MONO_MMAP_EXEC: prot = PAGE_EXECUTE_READWRITE; break;
57 case MONO_MMAP_WRITE: prot = PAGE_READWRITE; break;
58 case MONO_MMAP_WRITE|MONO_MMAP_EXEC: prot = PAGE_EXECUTE_READWRITE; break;
59 case MONO_MMAP_EXEC: prot = PAGE_EXECUTE; break;
61 g_assert_not_reached ();
67 mono_valloc (void *addr, size_t length, int flags, MonoMemAccountType type)
70 int mflags = MEM_RESERVE|MEM_COMMIT;
71 int prot = mono_mmap_win_prot_from_flags (flags);
72 /* translate the flags */
74 if (!mono_valloc_can_alloc (length))
77 ptr = VirtualAlloc (addr, length, mflags, prot);
79 account_mem (type, (ssize_t)length);
85 mono_valloc_aligned (size_t length, size_t alignment, int flags, MonoMemAccountType type)
87 int prot = mono_mmap_win_prot_from_flags (flags);
88 char *mem = VirtualAlloc (NULL, length + alignment, MEM_RESERVE, prot);
94 if (!mono_valloc_can_alloc (length))
97 aligned = aligned_address (mem, length, alignment);
99 aligned = VirtualAlloc (aligned, length, MEM_COMMIT, prot);
102 account_mem (type, (ssize_t)length);
108 mono_vfree (void *addr, size_t length, MonoMemAccountType type)
110 MEMORY_BASIC_INFORMATION mbi;
111 SIZE_T query_result = VirtualQuery (addr, &mbi, sizeof (mbi));
114 g_assert (query_result);
116 res = VirtualFree (mbi.AllocationBase, 0, MEM_RELEASE);
120 account_mem (type, -(ssize_t)length);
125 #if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
127 mono_file_map (size_t length, int flags, int fd, guint64 offset, void **ret_handle)
131 HANDLE file, mapping;
132 int prot = mono_mmap_win_prot_from_flags (flags);
133 /* translate the flags */
134 /*if (flags & MONO_MMAP_PRIVATE)
135 mflags |= MAP_PRIVATE;
136 if (flags & MONO_MMAP_SHARED)
137 mflags |= MAP_SHARED;
138 if (flags & MONO_MMAP_ANON)
139 mflags |= MAP_ANONYMOUS;
140 if (flags & MONO_MMAP_FIXED)
142 if (flags & MONO_MMAP_32BIT)
143 mflags |= MAP_32BIT;*/
145 mflags = FILE_MAP_READ;
146 if (flags & MONO_MMAP_WRITE)
147 mflags = FILE_MAP_COPY;
149 file = (HANDLE) _get_osfhandle (fd);
151 mapping = CreateFileMapping (file, NULL, prot, 0, 0, NULL);
156 ptr = MapViewOfFile (mapping, mflags, 0, offset, length);
159 CloseHandle (mapping);
162 *ret_handle = (void*)mapping;
167 mono_file_unmap (void *addr, void *handle)
169 UnmapViewOfFile (addr);
170 CloseHandle ((HANDLE)handle);
173 #endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
176 mono_mprotect (void *addr, size_t length, int flags)
179 int prot = mono_mmap_win_prot_from_flags (flags);
181 if (flags & MONO_MMAP_DISCARD) {
182 VirtualFree (addr, length, MEM_DECOMMIT);
183 VirtualAlloc (addr, length, MEM_COMMIT, prot);
186 return VirtualProtect (addr, length, prot, &oldprot) == 0;
190 mono_shared_area (void)
192 if (!malloced_shared_area)
193 malloced_shared_area = malloc_shared_area (0);
194 /* get the pid here */
195 return malloced_shared_area;
199 mono_shared_area_remove (void)
201 if (malloced_shared_area)
202 g_free (malloced_shared_area);
203 malloced_shared_area = NULL;
207 mono_shared_area_for_pid (void *pid)
213 mono_shared_area_unload (void *area)
218 mono_shared_area_instances (void **array, int count)