Revision e3f4e2a4 exec.c
b/exec.c | ||
---|---|---|
204 | 204 |
static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc) |
205 | 205 |
{ |
206 | 206 |
void **lp, **p; |
207 |
PhysPageDesc *pd; |
|
207 | 208 |
|
208 | 209 |
p = (void **)l1_phys_map; |
209 | 210 |
#if TARGET_PHYS_ADDR_SPACE_BITS > 32 |
... | ... | |
223 | 224 |
} |
224 | 225 |
#endif |
225 | 226 |
lp = p + ((index >> L2_BITS) & (L1_SIZE - 1)); |
226 |
p = *lp; |
|
227 |
if (!p) { |
|
227 |
pd = *lp; |
|
228 |
if (!pd) { |
|
229 |
int i; |
|
228 | 230 |
/* allocate if not found */ |
229 | 231 |
if (!alloc) |
230 | 232 |
return NULL; |
231 |
p = qemu_vmalloc(sizeof(PhysPageDesc) * L2_SIZE); |
|
232 |
memset(p, 0, sizeof(PhysPageDesc) * L2_SIZE); |
|
233 |
*lp = p; |
|
233 |
pd = qemu_vmalloc(sizeof(PhysPageDesc) * L2_SIZE); |
|
234 |
*lp = pd; |
|
235 |
for (i = 0; i < L2_SIZE; i++) |
|
236 |
pd[i].phys_offset = IO_MEM_UNASSIGNED; |
|
234 | 237 |
} |
235 |
return ((PhysPageDesc *)p) + (index & (L2_SIZE - 1)); |
|
238 |
return ((PhysPageDesc *)pd) + (index & (L2_SIZE - 1));
|
|
236 | 239 |
} |
237 | 240 |
|
238 | 241 |
static inline PhysPageDesc *phys_page_find(target_phys_addr_t index) |
Also available in: Unified diff