diff options
| author | Daisuke HATAYAMA <d.hatayama@jp.fujitsu.com> | 2010-03-05 13:44:07 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-06 11:26:45 -0800 | 
| commit | 1fcccbac89f5bbc5e41aa72086960059fce372da (patch) | |
| tree | 9e42ee69f0216e612e5bd4338d6203dbad2d002f /arch/um/sys-i386 | |
| parent | 088e7af73a962fcc8883b7a6392544d8342553d6 (diff) | |
| download | olio-linux-3.10-1fcccbac89f5bbc5e41aa72086960059fce372da.tar.xz olio-linux-3.10-1fcccbac89f5bbc5e41aa72086960059fce372da.zip  | |
elf coredump: replace ELF_CORE_EXTRA_* macros by functions
elf_core_dump() and elf_fdpic_core_dump() use #ifdef and the corresponding
macro for hiding _multiline_ logics in functions.  This patch removes
#ifdef and replaces ELF_CORE_EXTRA_* by corresponding functions.  For
architectures not implemeonting ELF_CORE_EXTRA_*, we use weak functions in
order to reduce a range of modification.
This cleanup is for my next patches, but I think this cleanup itself is
worth doing regardless of my firnal purpose.
Signed-off-by: Daisuke HATAYAMA <d.hatayama@jp.fujitsu.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Greg Ungerer <gerg@snapgear.com>
Cc: Roland McGrath <roland@redhat.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/um/sys-i386')
| -rw-r--r-- | arch/um/sys-i386/Makefile | 2 | ||||
| -rw-r--r-- | arch/um/sys-i386/asm/elf.h | 43 | ||||
| -rw-r--r-- | arch/um/sys-i386/elfcore.c | 67 | 
3 files changed, 69 insertions, 43 deletions
diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile index 1b549bca464..804b28dd032 100644 --- a/arch/um/sys-i386/Makefile +++ b/arch/um/sys-i386/Makefile @@ -6,6 +6,8 @@ obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \  	ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \  	sys_call_table.o tls.o +obj-$(CONFIG_BINFMT_ELF) += elfcore.o +  subarch-obj-y = lib/semaphore_32.o lib/string_32.o  subarch-obj-$(CONFIG_HIGHMEM) += mm/highmem_32.o  subarch-obj-$(CONFIG_MODULES) += kernel/module.o diff --git a/arch/um/sys-i386/asm/elf.h b/arch/um/sys-i386/asm/elf.h index 770885472ed..e64cd41d7ba 100644 --- a/arch/um/sys-i386/asm/elf.h +++ b/arch/um/sys-i386/asm/elf.h @@ -116,47 +116,4 @@ do {								\  	}							\  } while (0) -/* - * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out - * extra segments containing the vsyscall DSO contents.  Dumping its - * contents makes post-mortem fully interpretable later without matching up - * the same kernel and hardware config to see what PC values meant. - * Dumping its extra ELF program headers includes all the other information - * a debugger needs to easily find how the vsyscall DSO was being used. - */ -#define ELF_CORE_EXTRA_PHDRS						      \ -	(vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0 ) - -#define ELF_CORE_WRITE_EXTRA_PHDRS					      \ -if ( vsyscall_ehdr ) {							      \ -	const struct elfhdr *const ehdrp = (struct elfhdr *)vsyscall_ehdr;    \ -	const struct elf_phdr *const phdrp =				      \ -		(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);   \ -	int i;								      \ -	Elf32_Off ofs = 0;						      \ -	for (i = 0; i < ehdrp->e_phnum; ++i) {				      \ -		struct elf_phdr phdr = phdrp[i];			      \ -		if (phdr.p_type == PT_LOAD) {				      \ -			ofs = phdr.p_offset = offset;			      \ -			offset += phdr.p_filesz;			      \ -		}							      \ -		else							      \ -			phdr.p_offset += ofs;				      \ -		phdr.p_paddr = 0; /* match other core phdrs */		      \ -		DUMP_WRITE(&phdr, sizeof(phdr));			      \ -	}								      \ -} -#define ELF_CORE_WRITE_EXTRA_DATA					      \ -if ( vsyscall_ehdr ) {							      \ -	const struct elfhdr *const ehdrp = (struct elfhdr *)vsyscall_ehdr;    \ -	const struct elf_phdr *const phdrp =				      \ -		(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);   \ -	int i;								      \ -	for (i = 0; i < ehdrp->e_phnum; ++i) {				      \ -		if (phdrp[i].p_type == PT_LOAD)				      \ -			DUMP_WRITE((void *) phdrp[i].p_vaddr,		      \ -				   phdrp[i].p_filesz);			      \ -	}								      \ -} -  #endif diff --git a/arch/um/sys-i386/elfcore.c b/arch/um/sys-i386/elfcore.c new file mode 100644 index 00000000000..30cac52a04b --- /dev/null +++ b/arch/um/sys-i386/elfcore.c @@ -0,0 +1,67 @@ +#include <linux/elf.h> +#include <linux/coredump.h> +#include <linux/fs.h> +#include <linux/mm.h> + +#include <asm/elf.h> + + +Elf32_Half elf_core_extra_phdrs(void) +{ +	return vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0; +} + +int elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size, +			       unsigned long limit) +{ +	if ( vsyscall_ehdr ) { +		const struct elfhdr *const ehdrp = +			(struct elfhdr *) vsyscall_ehdr; +		const struct elf_phdr *const phdrp = +			(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff); +		int i; +		Elf32_Off ofs = 0; + +		for (i = 0; i < ehdrp->e_phnum; ++i) { +			struct elf_phdr phdr = phdrp[i]; + +			if (phdr.p_type == PT_LOAD) { +				ofs = phdr.p_offset = offset; +				offset += phdr.p_filesz; +			} else { +				phdr.p_offset += ofs; +			} +			phdr.p_paddr = 0; /* match other core phdrs */ +			*size += sizeof(phdr); +			if (*size > limit +			    || !dump_write(file, &phdr, sizeof(phdr))) +				return 0; +		} +	} +	return 1; +} + +int elf_core_write_extra_data(struct file *file, size_t *size, +			      unsigned long limit) +{ +	if ( vsyscall_ehdr ) { +		const struct elfhdr *const ehdrp = +			(struct elfhdr *) vsyscall_ehdr; +		const struct elf_phdr *const phdrp = +			(const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff); +		int i; + +		for (i = 0; i < ehdrp->e_phnum; ++i) { +			if (phdrp[i].p_type == PT_LOAD) { +				void *addr = (void *) phdrp[i].p_vaddr; +				size_t filesz = phdrp[i].p_filesz; + +				*size += filesz; +				if (*size > limit +				    || !dump_write(file, addr, filesz)) +					return 0; +			} +		} +	} +	return 1; +}  |