S12Z: Rename reloc R_S12Z_UKNWN_3 to R_S12Z_EXT18 and implement according to recently...
authorJohn Darrington <john@darrington.wattle.id.au>
Sun, 17 Jun 2018 05:04:11 +0000 (07:04 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 21 Aug 2018 17:24:21 +0000 (19:24 +0200)
* bfd/elf32-s12z.c: (opru18_reloc): New function.
* bfd/elf32-s12z.c: (elf_s12z_howto_table): Adjust Howto according to new knowledge.
* include/elf/s12z.h: Rename R_S12Z_UKNWN_3 to R_S12Z_EXT18.

bfd/ChangeLog
bfd/elf32-s12z.c
include/ChangeLog
include/elf/s12z.h

index 3da70d65c4035c003d3b36b9f35ecc644b653336..7fb7398b8103a484f91246b0c30d8f0fe36fc98f 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-23  John Darington <john@darrington.wattle.id.au>
+
+       * elf32-s12z.c (opru18_reloc): New function.
+       * elf32-s12z.c (elf_s12z_howto_table): Adjust Howto according to new knowledge.
+
 2018-08-21  mephi42  <mephi42@gmail.com>
 
        PR binutils/23315
index 400555d0269e891ff1bfc396447db9f0faf1af17..cab54c487b3af539289e0f199c064652e2aa0b1b 100644 (file)
@@ -33,6 +33,38 @@ static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
 static bfd_boolean s12z_info_to_howto_rel
   (bfd *, arelent *, Elf_Internal_Rela *);
 
+static bfd_reloc_status_type
+opru18_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol,
+                   void *data, asection *input_section ATTRIBUTE_UNUSED,
+                   bfd *output ATTRIBUTE_UNUSED, char **msg ATTRIBUTE_UNUSED)
+{
+  /* This reloc is used for 18 bit General Operand Addressing Postbyte in the
+     INST opru18 form.  This is an 18 bit reloc, but the most significant bit
+     is shifted one place to the left of where it would normally be.  See
+     Appendix A.4 of the S12Z reference manual.  */
+
+  bfd_size_type octets = reloc_entry->address * bfd_octets_per_byte (abfd);
+  bfd_vma result = bfd_get_24 (abfd, (unsigned char *) data + octets);
+  bfd_vma val = bfd_asymbol_value (symbol);
+
+  /* Keep the wanted bits and discard the rest.  */
+  result &= 0xFA0000;
+
+  val += symbol->section->output_section->vma;
+  val += symbol->section->output_offset;
+
+  /* The lowest 17 bits are copied verbatim.  */
+  result |= val & 0x1FFFF;
+
+  /* The 18th bit is put into the 19th position.  */
+  result |= (val & 0x020000) << 1;
+
+  bfd_put_24 (abfd, result, (unsigned char *) data + octets);
+
+  return bfd_reloc_ok;
+}
+
+
 static bfd_reloc_status_type
 shift_addend_reloc (bfd *abfd, arelent *reloc_entry, struct bfd_symbol *symbol ATTRIBUTE_UNUSED,
                    void *data ATTRIBUTE_UNUSED, asection *input_section ATTRIBUTE_UNUSED,
@@ -136,19 +168,19 @@ static reloc_howto_type elf_s12z_howto_table[] =
         0x00ffffff,            /* dst_mask */
         FALSE),                /* pcrel_offset */
 
-  /* The purpose of this reloc is not known */
-  HOWTO (R_S12Z_UKNWN_3,       /* type */
+  /* An 18 bit absolute relocation */
+  HOWTO (R_S12Z_EXT18,        /* type */
         0,                     /* rightshift */
-        3,                     /* size (0 = byte, 1 = short, 2 = long) */
-        0,                     /* bitsize */
+        5,                     /* size (0 = byte, 1 = short, 2 = long) */
+        18,                    /* bitsize */
         FALSE,                 /* pc_relative */
         0,                     /* bitpos */
-        complain_overflow_dont,/* complain_on_overflow */
-        bfd_elf_generic_reloc, /* special_function */
-        "R_S12Z_UKNWN_3",      /* name */
+        complain_overflow_bitfield,    /* complain_on_overflow */
+        opru18_reloc,          /* special_function */
+        "R_S12Z_EXT18",        /* name */
         FALSE,                 /* partial_inplace */
-        0,                     /* src_mask */
-        0,                     /* dst_mask */
+        0x0005ffff,            /* src_mask */
+        0x0005ffff,            /* dst_mask */
         FALSE),                /* pcrel_offset */
 
   /* A 32 bit absolute relocation  */
index f0dca586ad390a1be7b6156b1cadbb86b93609df..f23c7cc46ed5ab4e328ca06c9220b3ddbe3f4e1b 100644 (file)
@@ -1,3 +1,7 @@
+2018-08-23  John Darrington  <john@darrington.wattle.id.au>
+
+       * elf/s12z.h: Rename R_S12Z_UKNWN_3 to R_S12Z_EXT18.
+
 2018-08-21  Alan Modra  <amodra@gmail.com>
 
        * opcode/ppc.h (struct powerpc_operand): Correct "insert" comment.
index 72504ee9f42697acb8a78941356e543c8fc65a3c..fc74b9a7b8908a514d1eb8833111384fdcbfee73 100644 (file)
@@ -29,7 +29,7 @@ START_RELOC_NUMBERS (elf_s12z_reloc_type)
   RELOC_NUMBER (R_S12Z_UKNWN_2, 2)
   RELOC_NUMBER (R_S12Z_PCREL_7_15, 3)
   RELOC_NUMBER (R_S12Z_EXT24, 4)
-  RELOC_NUMBER (R_S12Z_UKNWN_3, 5)
+  RELOC_NUMBER (R_S12Z_EXT18, 5)
   RELOC_NUMBER (R_S12Z_EXT32, 6)
 END_RELOC_NUMBERS (R_S12Z_max)