Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: src/trusted/service_runtime/win/sel_memory.c

Issue 7648002: Modify the NaCl_page_alloc_hint function to use VirtualQuery to check (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2011 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 /* 7 /*
8 * NaCl Service Runtime memory allocation code 8 * NaCl Service Runtime memory allocation code
9 */ 9 */
10 #include "native_client/src/include/portability.h" 10 #include "native_client/src/include/portability.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 SYSTEM_INFO sys_info; 54 SYSTEM_INFO sys_info;
55 55
56 int attempt_count; 56 int attempt_count;
57 57
58 void *hint = *p; 58 void *hint = *p;
59 void *addr; 59 void *addr;
60 void *end_addr; 60 void *end_addr;
61 void *chunk; 61 void *chunk;
62 void *unroll; 62 void *unroll;
63 63
64 MEMORY_BASIC_INFORMATION mem;
65 const SIZE_T kOneGb = 0x40000000;
66 char* start;
67
64 /* 68 /*
65 * We have to allocate every 64KB -- the windows allocation 69 * We have to allocate every 64KB -- the windows allocation
66 * granularity -- because VirtualFree will only accept an address 70 * granularity -- because VirtualFree will only accept an address
67 * that was returned by a call to VirtualAlloc. NB: memory pages 71 * that was returned by a call to VirtualAlloc. NB: memory pages
68 * put into the address space via MapViewOfFile{,Ex} must be 72 * put into the address space via MapViewOfFile{,Ex} must be
69 * released by UnmapViewOfFile. Thus, in order for us to open up a 73 * released by UnmapViewOfFile. Thus, in order for us to open up a
70 * hole in the NaCl application's address space to map in a file, we 74 * hole in the NaCl application's address space to map in a file, we
71 * must allocate the entire address space in 64KB chunks, so we can 75 * must allocate the entire address space in 64KB chunks, so we can
72 * later pick an arbitrary range of addresses (in 64KB chunks) to 76 * later pick an arbitrary range of addresses (in 64KB chunks) to
73 * free up and map in a file later. 77 * free up and map in a file later.
(...skipping 20 matching lines...) Expand all
94 sys_info.dwAllocationGranularity, 98 sys_info.dwAllocationGranularity,
95 NACL_MAP_PAGESIZE); 99 NACL_MAP_PAGESIZE);
96 } 100 }
97 101
98 /* 102 /*
99 * Round allocation request up to next NACL_MAP_PAGESIZE. This is 103 * Round allocation request up to next NACL_MAP_PAGESIZE. This is
100 * assumed to have taken place in NaCl_page_free. 104 * assumed to have taken place in NaCl_page_free.
101 */ 105 */
102 num_bytes = NaClRoundAllocPage(num_bytes); 106 num_bytes = NaClRoundAllocPage(num_bytes);
103 107
108 /*
109 * If the request is for 1Gb (the sandbox), look for a memory region that
110 * was reserved by our parent process.
111 */
112 addr = 0;
113 if (num_bytes == kOneGb) {
Mark Seaborn 2011/08/12 21:57:54 Having a special case for 1GB in NaCl_page_alloc()
114 start = sys_info.lpMinimumApplicationAddress;
115 while (VirtualQuery((LPCVOID)start, &mem, sizeof(mem)))
116 {
Mark Seaborn 2011/08/12 21:57:54 Style: '{' should be on previous line
117 if (mem.State == MEM_RESERVE && mem.RegionSize == kOneGb)
118 {
Mark Seaborn 2011/08/12 21:57:54 Ditto
119 addr = start;
120 break;
121 }
122 start += mem.RegionSize;
123 if ((LPVOID)start > sys_info.lpMaximumApplicationAddress)
124 break;
125 }
126 }
127
104 for (attempt_count = 0; 128 for (attempt_count = 0;
105 attempt_count < NACL_MEMORY_ALLOC_RETRY_MAX; 129 attempt_count < NACL_MEMORY_ALLOC_RETRY_MAX;
106 ++attempt_count) { 130 ++attempt_count) {
107 131
108 addr = VirtualAlloc(hint, num_bytes, MEM_RESERVE, PAGE_NOACCESS); 132 if (addr == NULL)
133 addr = VirtualAlloc(hint, num_bytes, MEM_RESERVE, PAGE_NOACCESS);
109 if (addr == NULL) { 134 if (addr == NULL) {
110 NaClLog(0, 135 NaClLog(0,
111 "NaCl_page_alloc: VirtualAlloc(*,0x%"NACL_PRIxS") failed\n", 136 "NaCl_page_alloc: VirtualAlloc(*,0x%"NACL_PRIxS") failed\n",
112 num_bytes); 137 num_bytes);
113 return -ENOMEM; 138 return -ENOMEM;
114 } 139 }
115 NaClLog(3, 140 NaClLog(3,
116 ("NaCl_page_alloc:" 141 ("NaCl_page_alloc:"
117 " VirtualAlloc(*,0x%"NACL_PRIxS")" 142 " VirtualAlloc(*,0x%"NACL_PRIxS")"
118 " succeeded, 0x%016"NACL_PRIxPTR"," 143 " succeeded, 0x%016"NACL_PRIxPTR","
(...skipping 27 matching lines...) Expand all
146 } 171 }
147 NaClLog(2, 172 NaClLog(2,
148 ("NaCl_page_alloc: *p = 0x%016"NACL_PRIxPTR"," 173 ("NaCl_page_alloc: *p = 0x%016"NACL_PRIxPTR","
149 " returning success.\n"), 174 " returning success.\n"),
150 (uintptr_t) addr); 175 (uintptr_t) addr);
151 *p = addr; 176 *p = addr;
152 return 0; 177 return 0;
153 retry: 178 retry:
154 NaClLog(2, "NaCl_page_alloc_hint: retrying w/o hint\n"); 179 NaClLog(2, "NaCl_page_alloc_hint: retrying w/o hint\n");
155 hint = NULL; 180 hint = NULL;
181 /*
182 * If the parent process had reserved memory, it's gone now.
183 */
184 addr = NULL;
156 } 185 }
157 186
158 return -ENOMEM; 187 return -ENOMEM;
159 } 188 }
160 189
161 int NaCl_page_alloc(void **p, 190 int NaCl_page_alloc(void **p,
162 size_t num_bytes) { 191 size_t num_bytes) {
163 *p = NULL; 192 *p = NULL;
164 return NaCl_page_alloc_hint(p, num_bytes); 193 return NaCl_page_alloc_hint(p, num_bytes);
165 } 194 }
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 break; 428 break;
400 case MADV_NORMAL: 429 case MADV_NORMAL:
401 memset(start, 0, length); 430 memset(start, 0, length);
402 break; 431 break;
403 default: 432 default:
404 return -EINVAL; 433 return -EINVAL;
405 } 434 }
406 NaClLog(2, "NaCl_madvise: done\n"); 435 NaClLog(2, "NaCl_madvise: done\n");
407 return 0; 436 return 0;
408 } 437 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698