aboutsummaryrefslogtreecommitdiffstats
path: root/meta-xilinx-bsp/recipes-microblaze/binutils/binutils-2.31/0023-fixing-the-.bss-relocation-issue.patch
blob: fc42ca58973af69cfe5fc6ae034e8046e79c9fd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
From 2a2298c9f32e96a71d6295e7ef52b37d834e5224 Mon Sep 17 00:00:00 2001
From: Nagaraju Mekala <nmekala@xilix.com>
Date: Wed, 24 Oct 2018 12:34:37 +0530
Subject: [PATCH 23/31] fixing the .bss relocation issue

Signed-off-by: Mahesh Bodapati <mbodapat@xilinx.com>
Signed-off-by: Nagaraju Mekala <nagaraju.mekala@xilinx.com>
---
 bfd/elf64-microblaze.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c
index 4d9b906..184b7d5 100644
--- a/bfd/elf64-microblaze.c
+++ b/bfd/elf64-microblaze.c
@@ -1480,7 +1480,7 @@ microblaze_elf_relocate_section (bfd *output_bfd,
 					 + input_section->output_offset
 					 + offset + INST_WORD_SIZE);
 			unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian);
-    			if (insn == 0xb2000000 || insn == 0xb2ffffff)
+			if ((insn & 0xff000000) == 0xb2000000)
 			  {
         		    insn &= ~0x00ffffff;
 			    insn |= (relocation >> 16) & 0xffffff;
@@ -1593,7 +1593,7 @@ microblaze_elf_relocate_section (bfd *output_bfd,
 					     + offset + INST_WORD_SIZE);
 			  }
 			unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian);
-    			if (insn == 0xb2000000 || insn == 0xb2ffffff)
+			if ((insn & 0xff000000) == 0xb2000000)
 			  {
         		    insn &= ~0x00ffffff;
 			    insn |= (relocation >> 16) & 0xffffff;
@@ -1722,7 +1722,7 @@ microblaze_bfd_write_imm_value_32 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val)
 {
     unsigned long instr = bfd_get_32 (abfd, bfd_addr);
 
-    if (instr == 0xb2000000 || instr == 0xb2ffffff)
+    if ((instr & 0xff000000) == 0xb2000000)
       {
         instr &= ~0x00ffffff;
         instr |= (val & 0xffffff);
@@ -1745,7 +1745,7 @@ microblaze_bfd_write_imm_value_64 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val)
     unsigned long instr_lo;
 
     instr_hi = bfd_get_32 (abfd, bfd_addr);
-    if (instr_hi == 0xb2000000 || instr_hi == 0xb2ffffff)
+    if ((instr_hi & 0xff000000) == 0xb2000000)
       {
         instr_hi &= ~0x00ffffff;
         instr_hi |= (val >> 16) & 0xffffff;
@@ -2238,7 +2238,10 @@ microblaze_elf_relax_section (bfd *abfd,
           unsigned long instr_lo =  bfd_get_32 (abfd, ocontents
                                                 + irelscan->r_offset
                                                 + INST_WORD_SIZE);
-          immediate = (instr_hi & 0x0000ffff) << 16;
+          if ((instr_hi & 0xff000000) == 0xb2000000)
+            immediate = (instr_hi & 0x00ffffff) << 24;
+	  else
+            immediate = (instr_hi & 0x0000ffff) << 16;
           immediate |= (instr_lo & 0x0000ffff);
 		      offset = calc_fixup (irelscan->r_addend, 0, sec);
 		      immediate -= offset;
@@ -2282,7 +2285,10 @@ microblaze_elf_relax_section (bfd *abfd,
           unsigned long instr_lo =  bfd_get_32 (abfd, ocontents
                                                 + irelscan->r_offset
                                                 + INST_WORD_SIZE);
-          immediate = (instr_hi & 0x0000ffff) << 16;
+          if ((instr_hi & 0xff000000) == 0xb2000000)
+            immediate = (instr_hi & 0x00ffffff) << 24;
+	  else
+            immediate = (instr_hi & 0x0000ffff) << 16;
           immediate |= (instr_lo & 0x0000ffff);
 		      target_address = immediate;
 		      offset = calc_fixup (target_address, 0, sec);
-- 
2.7.4