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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
From cec495577424c4d5c4c77949a624bc33991ac673 Mon Sep 17 00:00:00 2001
From: Nagaraju Mekala <nmekala@xilix.com>
Date: Wed, 24 Oct 2018 12:34:37 +0530
Subject: [PATCH 21/38] fixing the .bss relocation issue
Conflicts:
bfd/elf64-microblaze.c
Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org>
---
bfd/elf64-microblaze.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c
index 97131c352c7..fe73de86659 100644
--- a/bfd/elf64-microblaze.c
+++ b/bfd/elf64-microblaze.c
@@ -1555,14 +1555,14 @@ microblaze_elf_relocate_section (bfd *output_bfd,
bfd_put_16 (input_bfd, relocation & 0xffff,
contents + offset + endian);
- unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian);
- if (insn == 0xb2000000 || insn == 0xb2ffffff)
- {
- insn &= ~0x00ffffff;
- insn |= (relocation >> 16) & 0xffffff;
- bfd_put_32 (input_bfd, insn,
- contents + offset + endian);
- }
+ unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian);
+ if ((insn & 0xff000000) == 0xb2000000)
+ {
+ insn &= ~0x00ffffff;
+ insn |= (relocation >> 16) & 0xffffff;
+ bfd_put_32 (input_bfd, insn,
+ contents + offset + endian);
+ }
else
{
bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff,
@@ -1673,7 +1673,7 @@ microblaze_elf_relocate_section (bfd *output_bfd,
contents + offset + endian);
}
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;
@@ -1791,7 +1791,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);
@@ -1814,7 +1814,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;
@@ -2320,7 +2320,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;
@@ -2364,7 +2367,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.25.1
|