|
@@ -602,63 +602,24 @@ static inline void *split_cross_256mb(void *buf1, size_t size1)
|
|
static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
|
|
static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
|
|
__attribute__((aligned(CODE_GEN_ALIGN)));
|
|
__attribute__((aligned(CODE_GEN_ALIGN)));
|
|
|
|
|
|
-# ifdef _WIN32
|
|
|
|
-static inline void do_protect(void *addr, long size, int prot)
|
|
|
|
-{
|
|
|
|
- DWORD old_protect;
|
|
|
|
- VirtualProtect(addr, size, prot, &old_protect);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline void map_exec(void *addr, long size)
|
|
|
|
-{
|
|
|
|
- do_protect(addr, size, PAGE_EXECUTE_READWRITE);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline void map_none(void *addr, long size)
|
|
|
|
-{
|
|
|
|
- do_protect(addr, size, PAGE_NOACCESS);
|
|
|
|
-}
|
|
|
|
-# else
|
|
|
|
-static inline void do_protect(void *addr, long size, int prot)
|
|
|
|
-{
|
|
|
|
- uintptr_t start, end;
|
|
|
|
-
|
|
|
|
- start = (uintptr_t)addr;
|
|
|
|
- start &= qemu_real_host_page_mask;
|
|
|
|
-
|
|
|
|
- end = (uintptr_t)addr + size;
|
|
|
|
- end = ROUND_UP(end, qemu_real_host_page_size);
|
|
|
|
-
|
|
|
|
- mprotect((void *)start, end - start, prot);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline void map_exec(void *addr, long size)
|
|
|
|
-{
|
|
|
|
- do_protect(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static inline void map_none(void *addr, long size)
|
|
|
|
-{
|
|
|
|
- do_protect(addr, size, PROT_NONE);
|
|
|
|
-}
|
|
|
|
-# endif /* WIN32 */
|
|
|
|
-
|
|
|
|
static inline void *alloc_code_gen_buffer(void)
|
|
static inline void *alloc_code_gen_buffer(void)
|
|
{
|
|
{
|
|
void *buf = static_code_gen_buffer;
|
|
void *buf = static_code_gen_buffer;
|
|
|
|
+ void *end = static_code_gen_buffer + sizeof(static_code_gen_buffer);
|
|
size_t full_size, size;
|
|
size_t full_size, size;
|
|
|
|
|
|
- /* The size of the buffer, rounded down to end on a page boundary. */
|
|
|
|
- full_size = (((uintptr_t)buf + sizeof(static_code_gen_buffer))
|
|
|
|
- & qemu_real_host_page_mask) - (uintptr_t)buf;
|
|
|
|
|
|
+ /* page-align the beginning and end of the buffer */
|
|
|
|
+ buf = QEMU_ALIGN_PTR_UP(buf, qemu_real_host_page_size);
|
|
|
|
+ end = QEMU_ALIGN_PTR_DOWN(end, qemu_real_host_page_size);
|
|
|
|
|
|
/* Reserve a guard page. */
|
|
/* Reserve a guard page. */
|
|
|
|
+ full_size = end - buf;
|
|
size = full_size - qemu_real_host_page_size;
|
|
size = full_size - qemu_real_host_page_size;
|
|
|
|
|
|
/* Honor a command-line option limiting the size of the buffer. */
|
|
/* Honor a command-line option limiting the size of the buffer. */
|
|
if (size > tcg_ctx->code_gen_buffer_size) {
|
|
if (size > tcg_ctx->code_gen_buffer_size) {
|
|
- size = (((uintptr_t)buf + tcg_ctx->code_gen_buffer_size)
|
|
|
|
- & qemu_real_host_page_mask) - (uintptr_t)buf;
|
|
|
|
|
|
+ size = QEMU_ALIGN_DOWN(tcg_ctx->code_gen_buffer_size,
|
|
|
|
+ qemu_real_host_page_size);
|
|
}
|
|
}
|
|
tcg_ctx->code_gen_buffer_size = size;
|
|
tcg_ctx->code_gen_buffer_size = size;
|
|
|
|
|
|
@@ -669,8 +630,12 @@ static inline void *alloc_code_gen_buffer(void)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- map_exec(buf, size);
|
|
|
|
- map_none(buf + size, qemu_real_host_page_size);
|
|
|
|
|
|
+ if (qemu_mprotect_rwx(buf, size)) {
|
|
|
|
+ abort();
|
|
|
|
+ }
|
|
|
|
+ if (qemu_mprotect_none(buf + size, qemu_real_host_page_size)) {
|
|
|
|
+ abort();
|
|
|
|
+ }
|
|
qemu_madvise(buf, size, QEMU_MADV_HUGEPAGE);
|
|
qemu_madvise(buf, size, QEMU_MADV_HUGEPAGE);
|
|
|
|
|
|
return buf;
|
|
return buf;
|