Skip to content

Commit

Permalink
Binfmt_flat: Add minimum support for the Blackfin relocations
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Bryan Wu <[email protected]>
Cc: David McCullough <[email protected]>
Cc: Greg Ungerer <[email protected]>
Cc: Miles Bader <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
  • Loading branch information
Bernd Schmidt authored and Bryan Wu committed Oct 3, 2007
1 parent f778089 commit f972020
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 6 deletions.
5 changes: 4 additions & 1 deletion fs/binfmt_flat.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,13 +742,16 @@ static int load_flat_file(struct linux_binprm * bprm,
* __start to address 4 so that is okay).
*/
if (rev > OLD_FLAT_VERSION) {
unsigned long persistent = 0;
for (i=0; i < relocs; i++) {
unsigned long addr, relval;

/* Get the address of the pointer to be
relocated (of course, the address has to be
relocated first). */
relval = ntohl(reloc[i]);
if (flat_set_persistent (relval, &persistent))
continue;
addr = flat_get_relocate_addr(relval);
rp = (unsigned long *) calc_reloc(addr, libinfo, id, 1);
if (rp == (unsigned long *)RELOC_FAILED) {
Expand All @@ -757,7 +760,7 @@ static int load_flat_file(struct linux_binprm * bprm,
}

/* Get the pointer's value. */
addr = flat_get_addr_from_rp(rp, relval, flags);
addr = flat_get_addr_from_rp(rp, relval, flags, &persistent);
if (addr != 0) {
/*
* Do the relocation. PIC relocs in the data section are
Expand Down
3 changes: 2 additions & 1 deletion include/asm-h8300/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#define flat_argvp_envp_on_stack() 1
#define flat_old_ram_flag(flags) 1
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
#define flat_set_persistent(relval, p) 0

/*
* on the H8 a couple of the relocations have an instruction in the
Expand All @@ -18,7 +19,7 @@
*/

#define flat_get_relocate_addr(rel) (rel)
#define flat_get_addr_from_rp(rp, relval, flags) \
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
(get_unaligned(rp) & ((flags & FLAT_FLAG_GOTPIC) ? 0xffffffff: 0x00ffffff))
#define flat_put_addr_at_rp(rp, addr, rel) \
put_unaligned (((*(char *)(rp)) << 24) | ((addr) & 0x00ffffff), rp)
Expand Down
3 changes: 2 additions & 1 deletion include/asm-m32r/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@
#define flat_stack_align(sp) (*sp += (*sp & 3 ? (4 - (*sp & 3)): 0))
#define flat_argvp_envp_on_stack() 0
#define flat_old_ram_flag(flags) (flags)
#define flat_set_persistent(relval, p) 0
#define flat_reloc_valid(reloc, size) \
(((reloc) - textlen_for_m32r_lo16_data) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags) \
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
m32r_flat_get_addr_from_rp(rp, relval, (text_len) )

#define flat_put_addr_at_rp(rp, addr, relval) \
Expand Down
3 changes: 2 additions & 1 deletion include/asm-m68knommu/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
#define flat_argvp_envp_on_stack() 1
#define flat_old_ram_flag(flags) (flags)
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags) get_unaligned(rp)
#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
#define flat_get_relocate_addr(rel) (rel)
#define flat_set_persistent(relval, p) 0

#endif /* __M68KNOMMU_FLAT_H__ */
3 changes: 2 additions & 1 deletion include/asm-sh/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
#define flat_argvp_envp_on_stack() 0
#define flat_old_ram_flag(flags) (flags)
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
#define flat_get_addr_from_rp(rp, relval, flags) get_unaligned(rp)
#define flat_get_addr_from_rp(rp, relval, flags, p) get_unaligned(rp)
#define flat_put_addr_at_rp(rp, val, relval) put_unaligned(val,rp)
#define flat_get_relocate_addr(rel) (rel)
#define flat_set_persistent(relval, p) 0

#endif /* __ASM_SH_FLAT_H */
4 changes: 3 additions & 1 deletion include/asm-v850/flat.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#define flat_stack_align(sp) /* nothing needed */
#define flat_argvp_envp_on_stack() 0
#define flat_old_ram_flag(flags) (flags)
#define flat_set_persistent(relval, p) 0

/* We store the type of relocation in the top 4 bits of the `relval.' */

Expand All @@ -46,7 +47,8 @@ flat_get_relocate_addr (unsigned long relval)
For the v850, RP should always be half-word aligned. */
static inline unsigned long flat_get_addr_from_rp (unsigned long *rp,
unsigned long relval,
unsigned long flags)
unsigned long flags,
unsigned long *persistent)
{
short *srp = (short *)rp;

Expand Down

0 comments on commit f972020

Please sign in to comment.