[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 21/23] translate-all: use qemu_protect_rwx/none helpe
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PULL 21/23] translate-all: use qemu_protect_rwx/none helpers |
Date: |
Mon, 9 Oct 2017 17:55:58 -0700 |
From: "Emilio G. Cota" <address@hidden>
The helpers require the address and size to be page-aligned, so
do that before calling them.
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: Emilio G. Cota <address@hidden>
Signed-off-by: Richard Henderson <address@hidden>
---
accel/tcg/translate-all.c | 61 ++++++++++-------------------------------------
1 file changed, 13 insertions(+), 48 deletions(-)
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index c5ce99d549..d5195a0f5a 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -600,63 +600,24 @@ static inline void *split_cross_256mb(void *buf1, size_t
size1)
static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
__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)
{
void *buf = static_code_gen_buffer;
+ void *end = static_code_gen_buffer + sizeof(static_code_gen_buffer);
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. */
+ full_size = end - buf;
size = full_size - qemu_real_host_page_size;
/* Honor a command-line option limiting the size of the buffer. */
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;
@@ -667,8 +628,12 @@ static inline void *alloc_code_gen_buffer(void)
}
#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);
return buf;
--
2.13.6
- [Qemu-devel] [PULL 10/23] exec-all: bring tb->invalid into tb->cflags, (continued)
- [Qemu-devel] [PULL 10/23] exec-all: bring tb->invalid into tb->cflags, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 12/23] exec-all: introduce TB_PAGE_ADDR_FMT, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 11/23] translate-all: define and use DEBUG_TB_FLUSH_GATE, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 13/23] translate-all: define and use DEBUG_TB_INVALIDATE_GATE, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 15/23] exec-all: extract tb->tc_* into a separate struct tc_tb, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 17/23] tcg: take .helpers out of TCGContext, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 14/23] translate-all: define and use DEBUG_TB_CHECK_GATE, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 19/23] util: move qemu_real_host_page_size/mask to osdep.h, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 16/23] tci: move tci_regs to tcg_qemu_tb_exec's stack, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 20/23] osdep: introduce qemu_mprotect_rwx/none, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 21/23] translate-all: use qemu_protect_rwx/none helpers,
Richard Henderson <=
- [Qemu-devel] [PULL 18/23] tcg: allocate optimizer temps with tcg_malloc, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 22/23] tcg: define TCG_HIGHWATER, Richard Henderson, 2017/10/09
- [Qemu-devel] [PULL 23/23] tcg/mips: delete commented out extern keyword., Richard Henderson, 2017/10/09
- Re: [Qemu-devel] [PULL 00/23] Queued TCG patches, no-reply, 2017/10/09
- Re: [Qemu-devel] [PULL 00/23] Queued TCG patches, no-reply, 2017/10/09
- Re: [Qemu-devel] [PULL 00/23] Queued TCG patches, Peter Maydell, 2017/10/10