Commit 4369415f1e62eff10201f20c984e02490c846046
1 parent
fbb4a2e3
keep static code gen buffer for user mode - mark user mode reserved pages after all big allocations
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4611 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
29 additions
and
5 deletions
exec.c
| ... | ... | @@ -187,14 +187,15 @@ static void map_exec(void *addr, long size) |
| 187 | 187 | #else |
| 188 | 188 | static void map_exec(void *addr, long size) |
| 189 | 189 | { |
| 190 | - unsigned long start, end; | |
| 190 | + unsigned long start, end, page_size; | |
| 191 | 191 | |
| 192 | + page_size = getpagesize(); | |
| 192 | 193 | start = (unsigned long)addr; |
| 193 | - start &= ~(qemu_real_host_page_size - 1); | |
| 194 | + start &= ~(page_size - 1); | |
| 194 | 195 | |
| 195 | 196 | end = (unsigned long)addr + size; |
| 196 | - end += qemu_real_host_page_size - 1; | |
| 197 | - end &= ~(qemu_real_host_page_size - 1); | |
| 197 | + end += page_size - 1; | |
| 198 | + end &= ~(page_size - 1); | |
| 198 | 199 | |
| 199 | 200 | mprotect((void *)start, end - start, |
| 200 | 201 | PROT_READ | PROT_WRITE | PROT_EXEC); |
| ... | ... | @@ -326,12 +327,34 @@ static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr, |
| 326 | 327 | target_ulong vaddr); |
| 327 | 328 | #endif |
| 328 | 329 | |
| 330 | +#define DEFAULT_CODE_GEN_BUFFER_SIZE (32 * 1024 * 1024) | |
| 331 | + | |
| 332 | +#if defined(CONFIG_USER_ONLY) | |
| 333 | +/* Currently it is not recommanded to allocate big chunks of data in | |
| 334 | + user mode. It will change when a dedicated libc will be used */ | |
| 335 | +#define USE_STATIC_CODE_GEN_BUFFER | |
| 336 | +#endif | |
| 337 | + | |
| 338 | +#ifdef USE_STATIC_CODE_GEN_BUFFER | |
| 339 | +static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]; | |
| 340 | +#endif | |
| 341 | + | |
| 329 | 342 | void code_gen_alloc(unsigned long tb_size) |
| 330 | 343 | { |
| 344 | +#ifdef USE_STATIC_CODE_GEN_BUFFER | |
| 345 | + code_gen_buffer = static_code_gen_buffer; | |
| 346 | + code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE; | |
| 347 | + map_exec(code_gen_buffer, code_gen_buffer_size); | |
| 348 | +#else | |
| 331 | 349 | code_gen_buffer_size = tb_size; |
| 332 | 350 | if (code_gen_buffer_size == 0) { |
| 351 | +#if defined(CONFIG_USER_ONLY) | |
| 352 | + /* in user mode, phys_ram_size is not meaningful */ | |
| 353 | + code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE; | |
| 354 | +#else | |
| 333 | 355 | /* XXX: needs ajustments */ |
| 334 | 356 | code_gen_buffer_size = (int)(phys_ram_size / 4); |
| 357 | +#endif | |
| 335 | 358 | } |
| 336 | 359 | if (code_gen_buffer_size < MIN_CODE_GEN_BUFFER_SIZE) |
| 337 | 360 | code_gen_buffer_size = MIN_CODE_GEN_BUFFER_SIZE; |
| ... | ... | @@ -363,6 +386,7 @@ void code_gen_alloc(unsigned long tb_size) |
| 363 | 386 | } |
| 364 | 387 | map_exec(code_gen_buffer, code_gen_buffer_size); |
| 365 | 388 | #endif |
| 389 | +#endif /* !USE_STATIC_CODE_GEN_BUFFER */ | |
| 366 | 390 | map_exec(code_gen_prologue, sizeof(code_gen_prologue)); |
| 367 | 391 | code_gen_buffer_max_size = code_gen_buffer_size - |
| 368 | 392 | code_gen_max_block_size(); |
| ... | ... | @@ -375,10 +399,10 @@ void code_gen_alloc(unsigned long tb_size) |
| 375 | 399 | size. */ |
| 376 | 400 | void cpu_exec_init_all(unsigned long tb_size) |
| 377 | 401 | { |
| 378 | - page_init(); | |
| 379 | 402 | cpu_gen_init(); |
| 380 | 403 | code_gen_alloc(tb_size); |
| 381 | 404 | code_gen_ptr = code_gen_buffer; |
| 405 | + page_init(); | |
| 382 | 406 | io_mem_init(); |
| 383 | 407 | } |
| 384 | 408 | ... | ... |