Re: [PATCH] binfmt_flat: minimum support for theBlackfin relocations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jivin Robin Getz lays it down ...
> On Tue 18 Sep 2007 04:09, Bryan Wu pondered:
> > From: Bernd Schmidt <[email protected]>
> > 
> > This just adds 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.
> > 
> > Signed-off-by: Bernd Schmidt <[email protected]>
> > Signed-off-by: Bryan Wu <[email protected]>
> > Cc: David McCullough <[email protected]>
> > Cc: Greg Ungerer <[email protected]>
> 
> Adding the other appropriate maintainers. for h8, m32r, sh and v850.

Looks fine to me,  obviously impacts the existing arches very little.
Can't see why it shouldn't get included,

Cheers,
Davidm

> > ---
> >  fs/binfmt_flat.c             |    5 ++++-
> >  include/asm-h8300/flat.h     |    3 ++-
> >  include/asm-m32r/flat.h      |    3 ++-
> >  include/asm-m68knommu/flat.h |    3 ++-
> >  include/asm-sh/flat.h        |    3 ++-
> >  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 7b0265d..13b58f8 100644
> > --- a/fs/binfmt_flat.c
> > +++ b/fs/binfmt_flat.c
> > @@ -742,6 +742,7 @@ 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;
> >  
> > @@ -749,6 +750,8 @@ static int load_flat_file(struct linux_binprm * bprm,
> >  			   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) {
> > @@ -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
> > diff --git a/include/asm-h8300/flat.h b/include/asm-h8300/flat.h
> > index c20eee7..2a87350 100644
> > --- a/include/asm-h8300/flat.h
> > +++ b/include/asm-h8300/flat.h
> > @@ -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
> > @@ -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)
> > diff --git a/include/asm-m32r/flat.h b/include/asm-m32r/flat.h
> > index 1b285f6..d851cf0 100644
> > --- a/include/asm-m32r/flat.h
> > +++ b/include/asm-m32r/flat.h
> > @@ -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) \
> > diff --git a/include/asm-m68knommu/flat.h b/include/asm-m68knommu/flat.h
> > index 2d836ed..814b517 100644
> > --- a/include/asm-m68knommu/flat.h
> > +++ b/include/asm-m68knommu/flat.h
> > @@ -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__ */
> > diff --git a/include/asm-sh/flat.h b/include/asm-sh/flat.h
> > index 0d5cc04..dc4f595 100644
> > --- a/include/asm-sh/flat.h
> > +++ b/include/asm-sh/flat.h
> > @@ -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 */
> > diff --git a/include/asm-v850/flat.h b/include/asm-v850/flat.h
> > index 3888f59..17f0ea5 100644
> > --- a/include/asm-v850/flat.h
> > +++ b/include/asm-v850/flat.h
> > @@ -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.'
> > */
> >  
> > @@ -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;

-- 
David McCullough,  [email protected],   Ph:+61 734352815
Secure Computing - SnapGear  http://www.uCdot.org http://www.cyberguard.com
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux