[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/2] w64: Fix data type of tb_next and other
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/2] w64: Fix data type of tb_next and other variables used for host addresses |
Date: |
Thu, 29 Mar 2012 20:27:51 +0000 |
On Sat, Mar 24, 2012 at 21:25, Stefan Weil <address@hidden> wrote:
> QEMU host addresses must use uintptr_t to be portable for hosts with
> an unusual size of long (w64).
>
> tb_jmp_offset is an uint16_t value, therefore the local variable offset
> in function tb_set_jmp_target was changed from unsigned long to uint16_t.
>
> The type cast to long in function tb_add_jump now also uses uintptr_t.
> For the bit operation used here, the signedness of the type cast does
> not matter.
>
> Some remaining unsigned long values are either only used for ARM assembler
> code or will be fixed in a later patch for PPC.
>
> v2:
> Fix signature of tb_find_pc in exec.c, too (hint from Blue Swirl, thanks).
> There remain lots of other long / unsigned long in exec.c which must be
> replaced by uintptr_t. This will be done in a separate patch. Here
> only one of these type casts is fixed.
>
> Signed-off-by: Stefan Weil <address@hidden>
> ---
> exec-all.h | 33 ++++++++++++++++-----------------
> exec.c | 4 ++--
> translate-all.c | 6 +++---
> 3 files changed, 21 insertions(+), 22 deletions(-)
>
> diff --git a/exec-all.h b/exec-all.h
> index 93a5b22..a6d6519 100644
> --- a/exec-all.h
> +++ b/exec-all.h
> @@ -85,7 +85,7 @@ void cpu_gen_init(void);
> int cpu_gen_code(CPUArchState *env, struct TranslationBlock *tb,
> int *gen_code_size_ptr);
> int cpu_restore_state(struct TranslationBlock *tb,
> - CPUArchState *env, unsigned long searched_pc);
> + CPUArchState *env, uintptr_t searched_pc);
> void cpu_resume_from_signal(CPUArchState *env1, void *puc);
> void cpu_io_recompile(CPUArchState *env, void *retaddr);
> TranslationBlock *tb_gen_code(CPUArchState *env,
> @@ -93,7 +93,7 @@ TranslationBlock *tb_gen_code(CPUArchState *env,
> int cflags);
> void cpu_exec_init(CPUArchState *env);
> void QEMU_NORETURN cpu_loop_exit(CPUArchState *env1);
> -int page_unprotect(target_ulong address, unsigned long pc, void *puc);
> +int page_unprotect(target_ulong address, uintptr_t pc, void *puc);
Now I get this error on i386:
/src/qemu/exec.c:2505: error: conflicting types for 'page_unprotect'
/src/qemu/exec-all.h:96: note: previous declaration of 'page_unprotect' was here
> void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
> int is_cpu_write_access);
> void tlb_flush_page(CPUArchState *env, target_ulong addr);
> @@ -150,7 +150,7 @@ struct TranslationBlock {
> #ifdef USE_DIRECT_JUMP
> uint16_t tb_jmp_offset[2]; /* offset of jump instruction */
> #else
> - unsigned long tb_next[2]; /* address of jump generated code */
> + uintptr_t tb_next[2]; /* address of jump generated code */
> #endif
> /* list of TBs jumping to this one. This is a circular list using
> the two least significant bits of the pointers to tell what is
> @@ -202,14 +202,14 @@ static inline void tb_set_jmp_target1(uintptr_t
> jmp_addr, uintptr_t addr)
> void ppc_tb_set_jmp_target(unsigned long jmp_addr, unsigned long addr);
> #define tb_set_jmp_target1 ppc_tb_set_jmp_target
> #elif defined(__i386__) || defined(__x86_64__)
> -static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long
> addr)
> +static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr)
> {
> /* patch the branch destination */
> *(uint32_t *)jmp_addr = addr - (jmp_addr + 4);
> /* no need to flush icache explicitly */
> }
> #elif defined(__arm__)
> -static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long
> addr)
> +static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr)
> {
> #if !QEMU_GNUC_PREREQ(4, 1)
> register unsigned long _beg __asm ("a1");
> @@ -237,19 +237,17 @@ static inline void tb_set_jmp_target1(unsigned long
> jmp_addr, unsigned long addr
> #endif
>
> static inline void tb_set_jmp_target(TranslationBlock *tb,
> - int n, unsigned long addr)
> + int n, uintptr_t addr)
> {
> - unsigned long offset;
> -
> - offset = tb->tb_jmp_offset[n];
> - tb_set_jmp_target1((unsigned long)(tb->tc_ptr + offset), addr);
> + uint16_t offset = tb->tb_jmp_offset[n];
> + tb_set_jmp_target1((uintptr_t)(tb->tc_ptr + offset), addr);
> }
>
> #else
>
> /* set the jump target */
> static inline void tb_set_jmp_target(TranslationBlock *tb,
> - int n, unsigned long addr)
> + int n, uintptr_t addr)
> {
> tb->tb_next[n] = addr;
> }
> @@ -262,15 +260,15 @@ static inline void tb_add_jump(TranslationBlock *tb,
> int n,
> /* NOTE: this test is only needed for thread safety */
> if (!tb->jmp_next[n]) {
> /* patch the native jump address */
> - tb_set_jmp_target(tb, n, (unsigned long)tb_next->tc_ptr);
> + tb_set_jmp_target(tb, n, (uintptr_t)tb_next->tc_ptr);
>
> /* add in TB jmp circular list */
> tb->jmp_next[n] = tb_next->jmp_first;
> - tb_next->jmp_first = (TranslationBlock *)((long)(tb) | (n));
> + tb_next->jmp_first = (TranslationBlock *)((uintptr_t)(tb) | (n));
> }
> }
>
> -TranslationBlock *tb_find_pc(unsigned long pc_ptr);
> +TranslationBlock *tb_find_pc(uintptr_t pc_ptr);
>
> #include "qemu-lock.h"
>
> @@ -288,13 +286,14 @@ extern void *tci_tb_ptr;
> # define GETPC() tci_tb_ptr
> # endif
> #elif defined(__s390__) && !defined(__s390x__)
> -# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) &
> 0x7fffffffUL) - 1))
> +# define GETPC() \
> + ((void *)(((uintptr_t)__builtin_return_address(0) & 0x7fffffffUL) - 1))
> #elif defined(__arm__)
> /* Thumb return addresses have the low bit set, so we need to subtract two.
> This is still safe in ARM mode because instructions are 4 bytes. */
> -# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2))
> +# define GETPC() ((void *)((uintptr_t)__builtin_return_address(0) - 2))
> #else
> -# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1))
> +# define GETPC() ((void *)((uintptr_t)__builtin_return_address(0) - 1))
> #endif
>
> #if !defined(CONFIG_USER_ONLY)
> diff --git a/exec.c b/exec.c
> index f4f0775..b66c1db 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1379,7 +1379,7 @@ void tb_link_page(TranslationBlock *tb,
>
> /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
> tb[1].tc_ptr. Return NULL if not found */
> -TranslationBlock *tb_find_pc(unsigned long tc_ptr)
> +TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
> {
> int m_min, m_max, m;
> unsigned long v;
> @@ -4483,7 +4483,7 @@ void cpu_io_recompile(CPUArchState *env, void *retaddr)
> target_ulong pc, cs_base;
> uint64_t flags;
>
> - tb = tb_find_pc((unsigned long)retaddr);
> + tb = tb_find_pc((uintptr_t)retaddr);
> if (!tb) {
> cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p",
> retaddr);
> diff --git a/translate-all.c b/translate-all.c
> index 8c7d303..5bd2d37 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -109,11 +109,11 @@ int cpu_gen_code(CPUArchState *env, TranslationBlock
> *tb, int *gen_code_size_ptr
> /* The cpu state corresponding to 'searched_pc' is restored.
> */
> int cpu_restore_state(TranslationBlock *tb,
> - CPUArchState *env, unsigned long searched_pc)
> + CPUArchState *env, uintptr_t searched_pc)
> {
> TCGContext *s = &tcg_ctx;
> int j;
> - unsigned long tc_ptr;
> + uintptr_t tc_ptr;
> #ifdef CONFIG_PROFILER
> int64_t ti;
> #endif
> @@ -133,7 +133,7 @@ int cpu_restore_state(TranslationBlock *tb,
> }
>
> /* find opc index corresponding to search_pc */
> - tc_ptr = (unsigned long)tb->tc_ptr;
> + tc_ptr = (uintptr_t)tb->tc_ptr;
> if (searched_pc < tc_ptr)
> return -1;
>
> --
> 1.7.9
>