From fd3df3812f8297133a598802b552252f45c80d0c Mon Sep 17 00:00:00 2001 From: Nagaraju Mekala Date: Tue, 9 Oct 2018 10:14:22 +0530 Subject: [PATCH 20/52] - Fixed address computation issues with 64bit address - Fixed imml dissassamble issue Conflicts: gas/config/tc-microblaze.c opcodes/microblaze-dis.c --- bfd/bfd-in2.h | 5 +++ bfd/elf64-microblaze.c | 14 ++++---- gas/config/tc-microblaze.c | 74 +++++++++++++++++++++++++++++++++----- opcodes/microblaze-dis.c | 2 +- 4 files changed, 79 insertions(+), 16 deletions(-) Index: gdb-9.2/bfd/bfd-in2.h =================================================================== --- gdb-9.2.orig/bfd/bfd-in2.h +++ gdb-9.2/bfd/bfd-in2.h @@ -5378,6 +5378,11 @@ done here - only used for relaxing */ * +done here - only used for relaxing */ BFD_RELOC_MICROBLAZE_64, +/* This is a 64 bit reloc that stores the 32 bit relative + * +value in two words (with an imml instruction). No relocation is + * +done here - only used for relaxing */ + BFD_RELOC_MICROBLAZE_EA64, + /* This is a 64 bit reloc that stores the 32 bit pc relative * +value in two words (with an imm instruction). No relocation is * +done here - only used for relaxing */ Index: gdb-9.2/bfd/elf64-microblaze.c =================================================================== --- gdb-9.2.orig/bfd/elf64-microblaze.c +++ gdb-9.2/bfd/elf64-microblaze.c @@ -121,15 +121,15 @@ static reloc_howto_type microblaze_elf_h 0, /* Rightshift. */ 4, /* Size (0 = byte, 1 = short, 2 = long). */ 64, /* Bitsize. */ - TRUE, /* PC_relative. */ + FALSE, /* PC_relative. */ 0, /* Bitpos. */ complain_overflow_dont, /* Complain on overflow. */ bfd_elf_generic_reloc,/* Special Function. */ "R_MICROBLAZE_IMML_64", /* Name. */ FALSE, /* Partial Inplace. */ 0, /* Source Mask. */ - 0x0000ffff, /* Dest Mask. */ - TRUE), /* PC relative offset? */ + 0xffffffffffffff, /* Dest Mask. */ + FALSE), /* PC relative offset? */ /* A 64 bit relocation. Table entry not really used. */ HOWTO (R_MICROBLAZE_64, /* Type. */ @@ -585,9 +585,9 @@ microblaze_elf_reloc_type_lookup (bfd * case BFD_RELOC_32: microblaze_reloc = R_MICROBLAZE_32; break; - /* RVA is treated the same as 32 */ + /* RVA is treated the same as 64 */ case BFD_RELOC_RVA: - microblaze_reloc = R_MICROBLAZE_32; + microblaze_reloc = R_MICROBLAZE_IMML_64; break; case BFD_RELOC_32_PCREL: microblaze_reloc = R_MICROBLAZE_32_PCREL; @@ -619,7 +619,7 @@ microblaze_elf_reloc_type_lookup (bfd * case BFD_RELOC_VTABLE_ENTRY: microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; break; - case BFD_RELOC_MICROBLAZE_64: + case BFD_RELOC_MICROBLAZE_EA64: microblaze_reloc = R_MICROBLAZE_IMML_64; break; case BFD_RELOC_MICROBLAZE_64_GOTPC: @@ -1982,7 +1982,7 @@ microblaze_elf_relax_section (bfd *abfd, efix = calc_fixup (target_address, 0, sec); /* Validate the in-band val. */ - val = bfd_get_32 (abfd, contents + irel->r_offset); + val = bfd_get_64 (abfd, contents + irel->r_offset); if (val != irel->r_addend && ELF64_R_TYPE (irel->r_info) == R_MICROBLAZE_32_NONE) { fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); } Index: gdb-9.2/opcodes/microblaze-dis.c =================================================================== --- gdb-9.2.orig/opcodes/microblaze-dis.c +++ gdb-9.2/opcodes/microblaze-dis.c @@ -77,7 +77,7 @@ static char * get_field_imml (struct string_buf *buf, long instr) { char *p = strbuf (buf); - sprintf (p, "%d", (short)((instr & IMML_MASK) >> IMM_LOW)); + sprintf (p, "%d", (int)((instr & IMML_MASK) >> IMM_LOW)); return p; }