Commit f9720205d1f847cb59e197e851b5276425363f6b
Committed by
Bryan Wu
1 parent
f778089cb2
Exists in
master
and in
4 other branches
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
fs/binfmt_flat.c
... | ... | @@ -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 |