Commit f9720205d1f847cb59e197e851b5276425363f6b

Authored by Bernd Schmidt
Committed by Bryan Wu
1 parent f778089cb2

Binfmt_flat: Add minimum support for the Blackfin relocations

Add minimum support for the Blackfin relocations, since we don't have
enough space in each reloc.  The idea is to store a value with one
relocation so that subsequent ones can access it.

Actually, this patch is required for Blackfin.  Currently if BINFMT_FLAT is
enabled, git-tree kernel will fail to compile.

Signed-off-by: Bernd Schmidt <bernd.schmidt@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Cc: David McCullough <davidm@snapgear.com>
Cc: Greg Ungerer <gerg@snapgear.com>
Cc: Miles Bader <miles.bader@necel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

Showing 6 changed files with 15 additions and 6 deletions Side-by-side Diff

... ... @@ -742,6 +742,7 @@
742 742 * __start to address 4 so that is okay).
743 743 */
744 744 if (rev > OLD_FLAT_VERSION) {
  745 + unsigned long persistent = 0;
745 746 for (i=0; i < relocs; i++) {
746 747 unsigned long addr, relval;
747 748  
... ... @@ -749,6 +750,8 @@
749 750 relocated (of course, the address has to be
750 751 relocated first). */
751 752 relval = ntohl(reloc[i]);
  753 + if (flat_set_persistent (relval, &persistent))
  754 + continue;
752 755 addr = flat_get_relocate_addr(relval);
753 756 rp = (unsigned long *) calc_reloc(addr, libinfo, id, 1);
754 757 if (rp == (unsigned long *)RELOC_FAILED) {
... ... @@ -757,7 +760,7 @@
757 760 }
758 761  
759 762 /* Get the pointer's value. */
760   - addr = flat_get_addr_from_rp(rp, relval, flags);
  763 + addr = flat_get_addr_from_rp(rp, relval, flags, &persistent);
761 764 if (addr != 0) {
762 765 /*
763 766 * Do the relocation. PIC relocs in the data section are
include/asm-h8300/flat.h
... ... @@ -9,6 +9,7 @@
9 9 #define flat_argvp_envp_on_stack() 1
10 10 #define flat_old_ram_flag(flags) 1
11 11 #define flat_reloc_valid(reloc, size) ((reloc) <= (size))
  12 +#define flat_set_persistent(relval, p) 0
12 13  
13 14 /*
14 15 * on the H8 a couple of the relocations have an instruction in the
... ... @@ -18,7 +19,7 @@
18 19 */
19 20  
20 21 #define flat_get_relocate_addr(rel) (rel)
21   -#define flat_get_addr_from_rp(rp, relval, flags) \
  22 +#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
22 23 (get_unaligned(rp) & ((flags & FLAT_FLAG_GOTPIC) ? 0xffffffff: 0x00ffffff))
23 24 #define flat_put_addr_at_rp(rp, addr, rel) \
24 25 put_unaligned (((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), rp)
include/asm-m32r/flat.h
... ... @@ -15,9 +15,10 @@
15 15 #define flat_stack_align(sp) (*sp += (*sp & 3 ? (4 - (*sp & 3)): 0))
16 16 #define flat_argvp_envp_on_stack() 0
17 17 #define flat_old_ram_flag(flags) (flags)
  18 +#define flat_set_persistent(relval, p) 0
18 19 #define flat_reloc_valid(reloc, size) \
19 20 (((reloc) - textlen_for_m32r_lo16_data) <= (size))
20   -#define flat_get_addr_from_rp(rp, relval, flags) \
  21 +#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
21 22 m32r_flat_get_addr_from_rp(rp, relval, (text_len) )
22 23  
23 24 #define flat_put_addr_at_rp(rp, addr, relval) \
include/asm-m68knommu/flat.h
... ... @@ -9,9 +9,10 @@
9 9 #define flat_argvp_envp_on_stack() 1
10 10 #define flat_old_ram_flag(flags) (flags)
11 11 #define flat_reloc_valid(reloc, size) ((reloc) <= (size))
12   -#define flat_get_addr_from_rp(rp, relval, flags) get_unaligned(rp)
  12 +#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
13 13 #define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
14 14 #define flat_get_relocate_addr(rel) (rel)
  15 +#define flat_set_persistent(relval, p) 0
15 16  
16 17 #endif /* __M68KNOMMU_FLAT_H__ */
include/asm-sh/flat.h
... ... @@ -16,9 +16,10 @@
16 16 #define flat_argvp_envp_on_stack() 0
17 17 #define flat_old_ram_flag(flags) (flags)
18 18 #define flat_reloc_valid(reloc, size) ((reloc) <= (size))
19   -#define flat_get_addr_from_rp(rp, relval, flags) get_unaligned(rp)
  19 +#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
20 20 #define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
21 21 #define flat_get_relocate_addr(rel) (rel)
  22 +#define flat_set_persistent(relval, p) 0
22 23  
23 24 #endif /* __ASM_SH_FLAT_H */
include/asm-v850/flat.h
... ... @@ -25,6 +25,7 @@
25 25 #define flat_stack_align(sp) /* nothing needed */
26 26 #define flat_argvp_envp_on_stack() 0
27 27 #define flat_old_ram_flag(flags) (flags)
  28 +#define flat_set_persistent(relval, p) 0
28 29  
29 30 /* We store the type of relocation in the top 4 bits of the `relval.' */
30 31  
... ... @@ -46,7 +47,8 @@
46 47 For the v850, RP should always be half-word aligned. */
47 48 static inline unsigned long flat_get_addr_from_rp (unsigned long *rp,
48 49 unsigned long relval,
49   - unsigned long flags)
  50 + unsigned long flags,
  51 + unsigned long *persistent)
50 52 {
51 53 short *srp = (short *)rp;
52 54