2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* ELF register definitions..
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version
|
|
|
|
* 2 of the License, or (at your option) any later version.
|
|
|
|
*/
|
2012-10-09 16:47:26 +08:00
|
|
|
#ifndef _ASM_POWERPC_ELF_H
|
|
|
|
#define _ASM_POWERPC_ELF_H
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-10-09 16:47:26 +08:00
|
|
|
#include <linux/sched.h> /* for task_struct */
|
|
|
|
#include <asm/page.h>
|
|
|
|
#include <asm/string.h>
|
|
|
|
#include <uapi/asm/elf.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This is used to ensure we don't load something for the wrong architecture.
|
|
|
|
*/
|
|
|
|
#define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)
|
2008-01-03 09:03:11 +08:00
|
|
|
#define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-12-20 19:58:12 +08:00
|
|
|
#define CORE_DUMP_USE_REGSET
|
2005-09-20 11:47:41 +08:00
|
|
|
#define ELF_EXEC_PAGESIZE PAGE_SIZE
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
|
|
|
|
use of this is to invoke "./ld.so someprog" to test out a new version of
|
|
|
|
the loader. We need to make sure that it is out of the way of the program
|
|
|
|
that it will "exec", and that there is sufficient room for the brk. */
|
|
|
|
|
powerpc: Use generic PIE randomization
Back in 2009 we merged 501cb16d3cfd "Randomise PIEs", which added support for
randomizing PIE (Position Independent Executable) binaries.
That commit added randomize_et_dyn(), which correctly randomized the addresses,
but failed to honor PF_RANDOMIZE. That means it was not possible to disable PIE
randomization via the personality flag, or /proc/sys/kernel/randomize_va_space.
Since then there has been generic support for PIE randomization added to
binfmt_elf.c, selectable via ARCH_BINFMT_ELF_RANDOMIZE_PIE.
Enabling that allows us to drop randomize_et_dyn(), which means we start
honoring PF_RANDOMIZE correctly.
It also causes a fairly major change to how we layout PIE binaries.
Currently we will place the binary at 512MB-520MB for 32 bit binaries, or
512MB-1.5GB for 64 bit binaries, eg:
$ cat /proc/$$/maps
4e550000-4e580000 r-xp 00000000 08:02 129813 /bin/dash
4e580000-4e590000 rw-p 00020000 08:02 129813 /bin/dash
10014110000-10014140000 rw-p 00000000 00:00 0 [heap]
3fffaa3f0000-3fffaa5a0000 r-xp 00000000 08:02 921 /lib/powerpc64le-linux-gnu/libc-2.19.so
3fffaa5a0000-3fffaa5b0000 rw-p 001a0000 08:02 921 /lib/powerpc64le-linux-gnu/libc-2.19.so
3fffaa5c0000-3fffaa5d0000 rw-p 00000000 00:00 0
3fffaa5d0000-3fffaa5f0000 r-xp 00000000 00:00 0 [vdso]
3fffaa5f0000-3fffaa620000 r-xp 00000000 08:02 1246 /lib/powerpc64le-linux-gnu/ld-2.19.so
3fffaa620000-3fffaa630000 rw-p 00020000 08:02 1246 /lib/powerpc64le-linux-gnu/ld-2.19.so
3ffffc340000-3ffffc370000 rw-p 00000000 00:00 0 [stack]
With this commit applied we don't do any special randomisation for the binary,
and instead rely on mmap randomisation. This means the binary ends up at high
addresses, eg:
$ cat /proc/$$/maps
3fff99820000-3fff999d0000 r-xp 00000000 08:02 921 /lib/powerpc64le-linux-gnu/libc-2.19.so
3fff999d0000-3fff999e0000 rw-p 001a0000 08:02 921 /lib/powerpc64le-linux-gnu/libc-2.19.so
3fff999f0000-3fff99a00000 rw-p 00000000 00:00 0
3fff99a00000-3fff99a20000 r-xp 00000000 00:00 0 [vdso]
3fff99a20000-3fff99a50000 r-xp 00000000 08:02 1246 /lib/powerpc64le-linux-gnu/ld-2.19.so
3fff99a50000-3fff99a60000 rw-p 00020000 08:02 1246 /lib/powerpc64le-linux-gnu/ld-2.19.so
3fff99a60000-3fff99a90000 r-xp 00000000 08:02 129813 /bin/dash
3fff99a90000-3fff99aa0000 rw-p 00020000 08:02 129813 /bin/dash
3fffc3de0000-3fffc3e10000 rw-p 00000000 00:00 0 [stack]
3fffc55e0000-3fffc5610000 rw-p 00000000 00:00 0 [heap]
Although this should be OK, it's possible it might break badly written
binaries that make assumptions about the address space layout.
Signed-off-by: Vineeth Vijayan <vvijayan@mvista.com>
[mpe: Rewrite changelog]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2014-11-14 17:12:05 +08:00
|
|
|
#define ELF_ET_DYN_BASE 0x20000000
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2013-11-20 19:15:01 +08:00
|
|
|
#define ELF_CORE_EFLAGS (is_elf2_task() ? 2 : 0)
|
|
|
|
|
2007-10-17 14:26:55 +08:00
|
|
|
/*
|
|
|
|
* Our registers are always unsigned longs, whether we're a 32 bit
|
|
|
|
* process or 64 bit, on either a 64 bit or 32 bit kernel.
|
|
|
|
*
|
|
|
|
* This macro relies on elf_regs[i] having the right type to truncate to,
|
|
|
|
* either u32 or u64. It defines the body of the elf_core_copy_regs
|
|
|
|
* function, either the native one with elf_gregset_t elf_regs or
|
|
|
|
* the 32-bit one with elf_gregset_t32 elf_regs.
|
|
|
|
*/
|
|
|
|
#define PPC_ELF_CORE_COPY_REGS(elf_regs, regs) \
|
|
|
|
int i, nregs = min(sizeof(*regs) / sizeof(unsigned long), \
|
|
|
|
(size_t)ELF_NGREG); \
|
|
|
|
for (i = 0; i < nregs; i++) \
|
|
|
|
elf_regs[i] = ((unsigned long *) regs)[i]; \
|
|
|
|
memset(&elf_regs[i], 0, (ELF_NGREG - i) * sizeof(elf_regs[0]))
|
|
|
|
|
|
|
|
/* Common routine for both 32-bit and 64-bit native processes */
|
2005-09-20 08:17:27 +08:00
|
|
|
static inline void ppc_elf_core_copy_regs(elf_gregset_t elf_regs,
|
2007-10-17 14:26:55 +08:00
|
|
|
struct pt_regs *regs)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2007-10-17 14:26:55 +08:00
|
|
|
PPC_ELF_CORE_COPY_REGS(elf_regs, regs);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2005-09-20 08:17:27 +08:00
|
|
|
#define ELF_CORE_COPY_REGS(gregs, regs) ppc_elf_core_copy_regs(gregs, regs);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-10-17 14:25:40 +08:00
|
|
|
typedef elf_vrregset_t elf_fpxregset_t;
|
|
|
|
|
2005-09-20 08:17:27 +08:00
|
|
|
/* ELF_HWCAP yields a mask that user programs can use to figure out what
|
2005-04-17 06:20:36 +08:00
|
|
|
instruction set this cpu supports. This could be done in userspace,
|
|
|
|
but it's not easy, and we've already done it here. */
|
2005-09-20 08:17:27 +08:00
|
|
|
# define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
|
2013-04-18 01:33:11 +08:00
|
|
|
# define ELF_HWCAP2 (cur_cpu_spec->cpu_user_features2)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* This yields a string that ld.so will use to load implementation
|
|
|
|
specific libraries for optimization. This is more specific in
|
2006-01-14 07:11:39 +08:00
|
|
|
intent than poking at uname or /proc/cpuinfo. */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-01-14 07:11:39 +08:00
|
|
|
#define ELF_PLATFORM (cur_cpu_spec->platform)
|
2008-07-16 07:58:51 +08:00
|
|
|
|
|
|
|
/* While ELF_PLATFORM indicates the ISA supported by the platform, it
|
|
|
|
* may not accurately reflect the underlying behavior of the hardware
|
|
|
|
* (as in the case of running in Power5+ compatibility mode on a
|
|
|
|
* Power6 machine). ELF_BASE_PLATFORM allows ld.so to load libraries
|
|
|
|
* that are tuned for the real hardware.
|
|
|
|
*/
|
|
|
|
#define ELF_BASE_PLATFORM (powerpc_base_platform)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-01-14 07:11:39 +08:00
|
|
|
#ifdef __powerpc64__
|
|
|
|
# define ELF_PLAT_INIT(_r, load_addr) do { \
|
|
|
|
_r->gpr[2] = load_addr; \
|
|
|
|
} while (0)
|
|
|
|
#endif /* __powerpc64__ */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2005-09-20 08:17:27 +08:00
|
|
|
#ifdef __powerpc64__
|
2008-10-16 21:39:57 +08:00
|
|
|
# define SET_PERSONALITY(ex) \
|
2005-04-17 06:20:36 +08:00
|
|
|
do { \
|
2013-11-20 19:15:00 +08:00
|
|
|
if (((ex).e_flags & 0x3) == 2) \
|
|
|
|
set_thread_flag(TIF_ELF2ABI); \
|
2014-05-17 23:05:43 +08:00
|
|
|
else \
|
|
|
|
clear_thread_flag(TIF_ELF2ABI); \
|
2005-04-17 06:20:36 +08:00
|
|
|
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
2010-01-30 18:20:59 +08:00
|
|
|
set_thread_flag(TIF_32BIT); \
|
2005-04-17 06:20:36 +08:00
|
|
|
else \
|
2010-01-30 18:20:59 +08:00
|
|
|
clear_thread_flag(TIF_32BIT); \
|
2005-06-08 19:59:15 +08:00
|
|
|
if (personality(current->personality) != PER_LINUX32) \
|
2008-07-01 00:12:13 +08:00
|
|
|
set_personality(PER_LINUX | \
|
|
|
|
(current->personality & (~PER_MASK))); \
|
2005-04-17 06:20:36 +08:00
|
|
|
} while (0)
|
|
|
|
/*
|
|
|
|
* An executable for which elf_read_implies_exec() returns TRUE will
|
2005-05-01 23:58:45 +08:00
|
|
|
* have the READ_IMPLIES_EXEC personality flag set automatically. This
|
|
|
|
* is only required to work around bugs in old 32bit toolchains. Since
|
|
|
|
* the 64bit ABI has never had these issues dont enable the workaround
|
|
|
|
* even if we have an executable stack.
|
2005-04-17 06:20:36 +08:00
|
|
|
*/
|
2010-08-27 11:49:11 +08:00
|
|
|
# define elf_read_implies_exec(ex, exec_stk) (is_32bit_task() ? \
|
2009-04-28 11:32:36 +08:00
|
|
|
(exec_stk == EXSTACK_DEFAULT) : 0)
|
2005-09-20 08:17:27 +08:00
|
|
|
#else
|
2009-04-28 11:32:36 +08:00
|
|
|
# define elf_read_implies_exec(ex, exec_stk) (exec_stk == EXSTACK_DEFAULT)
|
2005-09-20 08:17:27 +08:00
|
|
|
#endif /* __powerpc64__ */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
extern int dcache_bsize;
|
|
|
|
extern int icache_bsize;
|
|
|
|
extern int ucache_bsize;
|
|
|
|
|
2005-11-11 18:15:21 +08:00
|
|
|
/* vDSO has arch_setup_additional_pages */
|
|
|
|
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
|
2005-04-17 06:20:36 +08:00
|
|
|
struct linux_binprm;
|
2005-11-11 18:15:21 +08:00
|
|
|
extern int arch_setup_additional_pages(struct linux_binprm *bprm,
|
2008-12-25 20:38:35 +08:00
|
|
|
int uses_interp);
|
2011-07-14 20:07:13 +08:00
|
|
|
#define VDSO_AUX_ENT(a,b) NEW_AUX_ENT(a,b)
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-02-22 09:50:02 +08:00
|
|
|
/* 1GB for 64bit, 8MB for 32bit */
|
|
|
|
#define STACK_RND_MASK (is_32bit_task() ? \
|
|
|
|
(0x7ff >> (PAGE_SHIFT - 12)) : \
|
|
|
|
(0x3ffff >> (PAGE_SHIFT - 12)))
|
|
|
|
|
2006-11-28 02:18:55 +08:00
|
|
|
#ifdef CONFIG_SPU_BASE
|
[POWERPC] coredump: Add SPU elf notes to coredump.
This patch adds SPU elf notes to the coredump. It creates a separate note
for each of /regs, /fpcr, /lslr, /decr, /decr_status, /mem, /signal1,
/signal1_type, /signal2, /signal2_type, /event_mask, /event_status,
/mbox_info, /ibox_info, /wbox_info, /dma_info, /proxydma_info, /object-id.
A new macro, ARCH_HAVE_EXTRA_NOTES, was created for architectures to
specify they have extra elf core notes.
A new macro, ELF_CORE_EXTRA_NOTES_SIZE, was created so the size of the
additional notes could be calculated and added to the notes phdr entry.
A new macro, ELF_CORE_WRITE_EXTRA_NOTES, was created so the new notes
would be written after the existing notes.
The SPU coredump code resides in spufs. Stub functions are provided in the
kernel which are hooked into the spufs code which does the actual work via
register_arch_coredump_calls().
A new set of __spufs_<file>_read/get() functions was provided to allow the
coredump code to read from the spufs files without having to lock the
SPU context for each file read from.
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Dwayne Grant McConnell <decimal@us.ibm.com>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
2006-11-23 07:46:37 +08:00
|
|
|
/* Notes used in ET_CORE. Note name is "SPU/<fd>/<filename>". */
|
|
|
|
#define NT_SPU 1
|
|
|
|
|
|
|
|
#define ARCH_HAVE_EXTRA_ELF_NOTES
|
[POWERPC] spufs: Cleanup ELF coredump extra notes logic
To start with, arch_notes_size() etc. is a little too ambiguous a name for
my liking, so change the function names to be more explicit.
Calling through macros is ugly, especially with hidden parameters, so don't
do that, call the routines directly.
Use ARCH_HAVE_EXTRA_ELF_NOTES as the only flag, and based on it decide
whether we want the extern declarations or the empty versions.
Since we have empty routines, actually use them in the coredump code to
save a few #ifdefs.
We want to change the handling of foffset so that the write routine updates
foffset as it goes, instead of using file->f_pos (so that writing to a pipe
works). So pass foffset to the write routine, and for now just set it to
file->f_pos at the end of writing.
It should also be possible for the write routine to fail, so change it to
return int and treat a non-zero return as failure.
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-09-19 12:38:12 +08:00
|
|
|
|
|
|
|
#endif /* CONFIG_SPU_BASE */
|
[POWERPC] coredump: Add SPU elf notes to coredump.
This patch adds SPU elf notes to the coredump. It creates a separate note
for each of /regs, /fpcr, /lslr, /decr, /decr_status, /mem, /signal1,
/signal1_type, /signal2, /signal2_type, /event_mask, /event_status,
/mbox_info, /ibox_info, /wbox_info, /dma_info, /proxydma_info, /object-id.
A new macro, ARCH_HAVE_EXTRA_NOTES, was created for architectures to
specify they have extra elf core notes.
A new macro, ELF_CORE_EXTRA_NOTES_SIZE, was created so the size of the
additional notes could be calculated and added to the notes phdr entry.
A new macro, ELF_CORE_WRITE_EXTRA_NOTES, was created so the new notes
would be written after the existing notes.
The SPU coredump code resides in spufs. Stub functions are provided in the
kernel which are hooked into the spufs code which does the actual work via
register_arch_coredump_calls().
A new set of __spufs_<file>_read/get() functions was provided to allow the
coredump code to read from the spufs files without having to lock the
SPU context for each file read from.
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Dwayne Grant McConnell <decimal@us.ibm.com>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
2006-11-23 07:46:37 +08:00
|
|
|
|
2005-09-20 08:17:27 +08:00
|
|
|
#endif /* _ASM_POWERPC_ELF_H */
|