From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:57854) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sq1KQ-0004nl-2W for qemu-devel@nongnu.org; Sat, 14 Jul 2012 08:20:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sq1KO-0003gz-6l for qemu-devel@nongnu.org; Sat, 14 Jul 2012 08:20:05 -0400 Received: from mail-ob0-f173.google.com ([209.85.214.173]:56163) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sq1KN-0003eX-S3 for qemu-devel@nongnu.org; Sat, 14 Jul 2012 08:20:04 -0400 Received: by obbta14 with SMTP id ta14so6459800obb.4 for ; Sat, 14 Jul 2012 05:20:03 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <1340636155-26426-1-git-send-email-peter.maydell@linaro.org> From: Blue Swirl Date: Sat, 14 Jul 2012 12:19:41 +0000 Message-ID: Content-Type: text/plain; charset=UTF-8 Subject: Re: [Qemu-devel] [PATCH] disas: Fix printing of addresses in disassembly List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: qemu-devel@nongnu.org, patches@linaro.org On Mon, Jul 9, 2012 at 10:27 AM, Peter Maydell wrote: > Ping? [patchwork url http://patchwork.ozlabs.org/patch/167132/] Thanks, applied. > > -- PMM > > On 25 June 2012 15:55, Peter Maydell wrote: >> In our disassembly code, the bfd_vma type is always 64 bits, >> even if the target's virtual address width is only 32 bits. This >> means that when we print out addresses we need to truncate them >> to 32 bits, to avoid odd output which has incorrectly sign-extended >> a value to 64 bits, for instance this ARM example: >> 0x80479a60: e59f4088 ldr r4, [pc, #136] ; 0xffffffff80479a4f >> >> (It would also be possible to truncate before passing the address >> to info->print_address_func(), but truncating in the final print >> function is the same approach that binutils takes to this problem.) >> >> Signed-off-by: Peter Maydell >> --- >> disas.c | 19 +++++++++++++++++++ >> 1 files changed, 19 insertions(+), 0 deletions(-) >> >> diff --git a/disas.c b/disas.c >> index 93d8d30..7b2acc9 100644 >> --- a/disas.c >> +++ b/disas.c >> @@ -64,6 +64,22 @@ generic_print_address (bfd_vma addr, struct disassemble_info *info) >> (*info->fprintf_func) (info->stream, "0x%" PRIx64, addr); >> } >> >> +/* Print address in hex, truncated to the width of a target virtual address. */ >> +static void >> +generic_print_target_address(bfd_vma addr, struct disassemble_info *info) >> +{ >> + uint64_t mask = ~0ULL >> (64 - TARGET_VIRT_ADDR_SPACE_BITS); >> + generic_print_address(addr & mask, info); >> +} >> + >> +/* Print address in hex, truncated to the width of a host virtual address. */ >> +static void >> +generic_print_host_address(bfd_vma addr, struct disassemble_info *info) >> +{ >> + uint64_t mask = ~0ULL >> (64 - (sizeof(void *) * 8)); >> + generic_print_address(addr & mask, info); >> +} >> + >> /* Just return the given address. */ >> >> int >> @@ -154,6 +170,7 @@ void target_disas(FILE *out, target_ulong code, target_ulong size, int flags) >> disasm_info.read_memory_func = target_read_memory; >> disasm_info.buffer_vma = code; >> disasm_info.buffer_length = size; >> + disasm_info.print_address_func = generic_print_target_address; >> >> #ifdef TARGET_WORDS_BIGENDIAN >> disasm_info.endian = BFD_ENDIAN_BIG; >> @@ -274,6 +291,7 @@ void disas(FILE *out, void *code, unsigned long size) >> int (*print_insn)(bfd_vma pc, disassemble_info *info); >> >> INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf); >> + disasm_info.print_address_func = generic_print_host_address; >> >> disasm_info.buffer = code; >> disasm_info.buffer_vma = (uintptr_t)code; >> @@ -386,6 +404,7 @@ void monitor_disas(Monitor *mon, CPUArchState *env, >> monitor_disas_env = env; >> monitor_disas_is_physical = is_physical; >> disasm_info.read_memory_func = monitor_read_memory; >> + disasm_info.print_address_func = generic_print_target_address; >> >> disasm_info.buffer_vma = pc; >> >> -- >> 1.7.1 >> >> >