c3dc5bec05
The flat loader uses an architecture's flat_stack_align() to align the stack but assumes word-alignment is enough for the data sections. However, on the Xtensa S6000 we have registers up to 128bit width which can be used from userspace and therefor need userspace stack and data-section alignment of at least this size. This patch drops flat_stack_align() and uses the same alignment that is required for slab caches, ARCH_SLAB_MINALIGN, or wordsize if it's not defined by the architecture. It also fixes m32r which was obviously kaput, aligning an uninitialized stack entry instead of the stack pointer. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Oskar Schirmer <os@emlix.com> Cc: David Howells <dhowells@redhat.com> Cc: Russell King <rmk@arm.linux.org.uk> Cc: Bryan Wu <cooloney@kernel.org> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Acked-by: Paul Mundt <lethal@linux-sh.org> Cc: Greg Ungerer <gerg@uclinux.org> Signed-off-by: Johannes Weiner <jw@emlix.com> Acked-by: Mike Frysinger <vapier.adi@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
/*
|
|
* include/asm-blackfin/flat.h -- uClinux flat-format executables
|
|
*
|
|
* Copyright (C) 2003,
|
|
*
|
|
*/
|
|
|
|
#ifndef __BLACKFIN_FLAT_H__
|
|
#define __BLACKFIN_FLAT_H__
|
|
|
|
#include <asm/unaligned.h>
|
|
|
|
#define flat_argvp_envp_on_stack() 0
|
|
#define flat_old_ram_flag(flags) (flags)
|
|
|
|
extern unsigned long bfin_get_addr_from_rp (unsigned long *ptr,
|
|
unsigned long relval,
|
|
unsigned long flags,
|
|
unsigned long *persistent);
|
|
|
|
extern void bfin_put_addr_at_rp(unsigned long *ptr, unsigned long addr,
|
|
unsigned long relval);
|
|
|
|
/* The amount by which a relocation can exceed the program image limits
|
|
without being regarded as an error. */
|
|
|
|
#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
|
|
|
|
#define flat_get_addr_from_rp(rp, relval, flags, persistent) \
|
|
bfin_get_addr_from_rp(rp, relval, flags, persistent)
|
|
#define flat_put_addr_at_rp(rp, val, relval) \
|
|
bfin_put_addr_at_rp(rp, val, relval)
|
|
|
|
/* Convert a relocation entry into an address. */
|
|
static inline unsigned long
|
|
flat_get_relocate_addr (unsigned long relval)
|
|
{
|
|
return relval & 0x03ffffff; /* Mask out top 6 bits */
|
|
}
|
|
|
|
static inline int flat_set_persistent(unsigned long relval,
|
|
unsigned long *persistent)
|
|
{
|
|
int type = (relval >> 26) & 7;
|
|
if (type == 3) {
|
|
*persistent = relval << 16;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static inline int flat_addr_absolute(unsigned long relval)
|
|
{
|
|
return (relval & (1 << 29)) != 0;
|
|
}
|
|
|
|
#endif /* __BLACKFIN_FLAT_H__ */
|