diff options
| author | Bernd Schmidt <bernd.schmidt@analog.com> | 2007-10-03 11:41:43 -0400 |
|---|---|---|
| committer | Bryan Wu <bryan.wu@analog.com> | 2007-10-03 11:41:43 -0400 |
| commit | f9720205d1f847cb59e197e851b5276425363f6b (patch) | |
| tree | a90405713cd06f8ead8fff25338a2df5427ac95a | |
| parent | f778089cb2445dfc6dfd30a7a567925fd8589f1e (diff) | |
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>
| -rw-r--r-- | fs/binfmt_flat.c | 5 | ||||
| -rw-r--r-- | include/asm-h8300/flat.h | 3 | ||||
| -rw-r--r-- | include/asm-m32r/flat.h | 3 | ||||
| -rw-r--r-- | include/asm-m68knommu/flat.h | 3 | ||||
| -rw-r--r-- | include/asm-sh/flat.h | 3 | ||||
| -rw-r--r-- | include/asm-v850/flat.h | 4 |
6 files changed, 15 insertions, 6 deletions
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 861141b4f6d6..34e9b06a7444 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
| @@ -742,6 +742,7 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
| 742 | * __start to address 4 so that is okay). | 742 | * __start to address 4 so that is okay). |
| 743 | */ | 743 | */ |
| 744 | if (rev > OLD_FLAT_VERSION) { | 744 | if (rev > OLD_FLAT_VERSION) { |
| 745 | unsigned long persistent = 0; | ||
| 745 | for (i=0; i < relocs; i++) { | 746 | for (i=0; i < relocs; i++) { |
| 746 | unsigned long addr, relval; | 747 | unsigned long addr, relval; |
| 747 | 748 | ||
| @@ -749,6 +750,8 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
| 749 | relocated (of course, the address has to be | 750 | relocated (of course, the address has to be |
| 750 | relocated first). */ | 751 | relocated first). */ |
| 751 | relval = ntohl(reloc[i]); | 752 | relval = ntohl(reloc[i]); |
| 753 | if (flat_set_persistent (relval, &persistent)) | ||
| 754 | continue; | ||
| 752 | addr = flat_get_relocate_addr(relval); | 755 | addr = flat_get_relocate_addr(relval); |
| 753 | rp = (unsigned long *) calc_reloc(addr, libinfo, id, 1); | 756 | rp = (unsigned long *) calc_reloc(addr, libinfo, id, 1); |
| 754 | if (rp == (unsigned long *)RELOC_FAILED) { | 757 | if (rp == (unsigned long *)RELOC_FAILED) { |
| @@ -757,7 +760,7 @@ static int load_flat_file(struct linux_binprm * bprm, | |||
| 757 | } | 760 | } |
| 758 | 761 | ||
| 759 | /* Get the pointer's value. */ | 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 | if (addr != 0) { | 764 | if (addr != 0) { |
| 762 | /* | 765 | /* |
| 763 | * Do the relocation. PIC relocs in the data section are | 766 | * Do the relocation. PIC relocs in the data section are |
diff --git a/include/asm-h8300/flat.h b/include/asm-h8300/flat.h index c20eee767d6f..2a873508a9a1 100644 --- a/include/asm-h8300/flat.h +++ b/include/asm-h8300/flat.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #define flat_argvp_envp_on_stack() 1 | 9 | #define flat_argvp_envp_on_stack() 1 |
| 10 | #define flat_old_ram_flag(flags) 1 | 10 | #define flat_old_ram_flag(flags) 1 |
| 11 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 11 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) |
| 12 | #define flat_set_persistent(relval, p) 0 | ||
| 12 | 13 | ||
| 13 | /* | 14 | /* |
| 14 | * on the H8 a couple of the relocations have an instruction in the | 15 | * on the H8 a couple of the relocations have an instruction in the |
| @@ -18,7 +19,7 @@ | |||
| 18 | */ | 19 | */ |
| 19 | 20 | ||
| 20 | #define flat_get_relocate_addr(rel) (rel) | 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 | (get_unaligned(rp) & ((flags & FLAT_FLAG_GOTPIC) ? 0xffffffff: 0x00ffffff)) | 23 | (get_unaligned(rp) & ((flags & FLAT_FLAG_GOTPIC) ? 0xffffffff: 0x00ffffff)) |
| 23 | #define flat_put_addr_at_rp(rp, addr, rel) \ | 24 | #define flat_put_addr_at_rp(rp, addr, rel) \ |
| 24 | put_unaligned (((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), rp) | 25 | put_unaligned (((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), rp) |
diff --git a/include/asm-m32r/flat.h b/include/asm-m32r/flat.h index 1b285f65cab6..d851cf0c4aa5 100644 --- a/include/asm-m32r/flat.h +++ b/include/asm-m32r/flat.h | |||
| @@ -15,9 +15,10 @@ | |||
| 15 | #define flat_stack_align(sp) (*sp += (*sp & 3 ? (4 - (*sp & 3)): 0)) | 15 | #define flat_stack_align(sp) (*sp += (*sp & 3 ? (4 - (*sp & 3)): 0)) |
| 16 | #define flat_argvp_envp_on_stack() 0 | 16 | #define flat_argvp_envp_on_stack() 0 |
| 17 | #define flat_old_ram_flag(flags) (flags) | 17 | #define flat_old_ram_flag(flags) (flags) |
| 18 | #define flat_set_persistent(relval, p) 0 | ||
| 18 | #define flat_reloc_valid(reloc, size) \ | 19 | #define flat_reloc_valid(reloc, size) \ |
| 19 | (((reloc) - textlen_for_m32r_lo16_data) <= (size)) | 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 | m32r_flat_get_addr_from_rp(rp, relval, (text_len) ) | 22 | m32r_flat_get_addr_from_rp(rp, relval, (text_len) ) |
| 22 | 23 | ||
| 23 | #define flat_put_addr_at_rp(rp, addr, relval) \ | 24 | #define flat_put_addr_at_rp(rp, addr, relval) \ |
diff --git a/include/asm-m68knommu/flat.h b/include/asm-m68knommu/flat.h index 2d836edc4344..814b5174a8e0 100644 --- a/include/asm-m68knommu/flat.h +++ b/include/asm-m68knommu/flat.h | |||
| @@ -9,8 +9,9 @@ | |||
| 9 | #define flat_argvp_envp_on_stack() 1 | 9 | #define flat_argvp_envp_on_stack() 1 |
| 10 | #define flat_old_ram_flag(flags) (flags) | 10 | #define flat_old_ram_flag(flags) (flags) |
| 11 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 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 | #define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp) | 13 | #define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp) |
| 14 | #define flat_get_relocate_addr(rel) (rel) | 14 | #define flat_get_relocate_addr(rel) (rel) |
| 15 | #define flat_set_persistent(relval, p) 0 | ||
| 15 | 16 | ||
| 16 | #endif /* __M68KNOMMU_FLAT_H__ */ | 17 | #endif /* __M68KNOMMU_FLAT_H__ */ |
diff --git a/include/asm-sh/flat.h b/include/asm-sh/flat.h index 0d5cc04ab005..dc4f5950dafa 100644 --- a/include/asm-sh/flat.h +++ b/include/asm-sh/flat.h | |||
| @@ -16,8 +16,9 @@ | |||
| 16 | #define flat_argvp_envp_on_stack() 0 | 16 | #define flat_argvp_envp_on_stack() 0 |
| 17 | #define flat_old_ram_flag(flags) (flags) | 17 | #define flat_old_ram_flag(flags) (flags) |
| 18 | #define flat_reloc_valid(reloc, size) ((reloc) <= (size)) | 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 | #define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp) | 20 | #define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp) |
| 21 | #define flat_get_relocate_addr(rel) (rel) | 21 | #define flat_get_relocate_addr(rel) (rel) |
| 22 | #define flat_set_persistent(relval, p) 0 | ||
| 22 | 23 | ||
| 23 | #endif /* __ASM_SH_FLAT_H */ | 24 | #endif /* __ASM_SH_FLAT_H */ |
diff --git a/include/asm-v850/flat.h b/include/asm-v850/flat.h index 3888f59d6881..17f0ea566611 100644 --- a/include/asm-v850/flat.h +++ b/include/asm-v850/flat.h | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #define flat_stack_align(sp) /* nothing needed */ | 25 | #define flat_stack_align(sp) /* nothing needed */ |
| 26 | #define flat_argvp_envp_on_stack() 0 | 26 | #define flat_argvp_envp_on_stack() 0 |
| 27 | #define flat_old_ram_flag(flags) (flags) | 27 | #define flat_old_ram_flag(flags) (flags) |
| 28 | #define flat_set_persistent(relval, p) 0 | ||
| 28 | 29 | ||
| 29 | /* We store the type of relocation in the top 4 bits of the `relval.' */ | 30 | /* We store the type of relocation in the top 4 bits of the `relval.' */ |
| 30 | 31 | ||
| @@ -46,7 +47,8 @@ flat_get_relocate_addr (unsigned long relval) | |||
| 46 | For the v850, RP should always be half-word aligned. */ | 47 | For the v850, RP should always be half-word aligned. */ |
| 47 | static inline unsigned long flat_get_addr_from_rp (unsigned long *rp, | 48 | static inline unsigned long flat_get_addr_from_rp (unsigned long *rp, |
| 48 | unsigned long relval, | 49 | unsigned long relval, |
| 49 | unsigned long flags) | 50 | unsigned long flags, |
| 51 | unsigned long *persistent) | ||
| 50 | { | 52 | { |
| 51 | short *srp = (short *)rp; | 53 | short *srp = (short *)rp; |
| 52 | 54 | ||
