xref: /openbmc/linux/fs/binfmt_elf_fdpic.c (revision f77f13e2)
1 /* binfmt_elf_fdpic.c: FDPIC ELF binary format
2  *
3  * Copyright (C) 2003, 2004, 2006 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  * Derived from binfmt_elf.c
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version
10  * 2 of the License, or (at your option) any later version.
11  */
12 
13 #include <linux/module.h>
14 
15 #include <linux/fs.h>
16 #include <linux/stat.h>
17 #include <linux/sched.h>
18 #include <linux/mm.h>
19 #include <linux/mman.h>
20 #include <linux/errno.h>
21 #include <linux/signal.h>
22 #include <linux/binfmts.h>
23 #include <linux/string.h>
24 #include <linux/file.h>
25 #include <linux/fcntl.h>
26 #include <linux/slab.h>
27 #include <linux/pagemap.h>
28 #include <linux/security.h>
29 #include <linux/highmem.h>
30 #include <linux/highuid.h>
31 #include <linux/personality.h>
32 #include <linux/ptrace.h>
33 #include <linux/init.h>
34 #include <linux/elf.h>
35 #include <linux/elf-fdpic.h>
36 #include <linux/elfcore.h>
37 #include <linux/coredump.h>
38 
39 #include <asm/uaccess.h>
40 #include <asm/param.h>
41 #include <asm/pgalloc.h>
42 
43 typedef char *elf_caddr_t;
44 
45 #if 0
46 #define kdebug(fmt, ...) printk("FDPIC "fmt"\n" ,##__VA_ARGS__ )
47 #else
48 #define kdebug(fmt, ...) do {} while(0)
49 #endif
50 
51 #if 0
52 #define kdcore(fmt, ...) printk("FDPIC "fmt"\n" ,##__VA_ARGS__ )
53 #else
54 #define kdcore(fmt, ...) do {} while(0)
55 #endif
56 
57 MODULE_LICENSE("GPL");
58 
59 static int load_elf_fdpic_binary(struct linux_binprm *, struct pt_regs *);
60 static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *, struct file *);
61 static int elf_fdpic_map_file(struct elf_fdpic_params *, struct file *,
62 			      struct mm_struct *, const char *);
63 
64 static int create_elf_fdpic_tables(struct linux_binprm *, struct mm_struct *,
65 				   struct elf_fdpic_params *,
66 				   struct elf_fdpic_params *);
67 
68 #ifndef CONFIG_MMU
69 static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *,
70 					    unsigned long *);
71 static int elf_fdpic_map_file_constdisp_on_uclinux(struct elf_fdpic_params *,
72 						   struct file *,
73 						   struct mm_struct *);
74 #endif
75 
76 static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *,
77 					     struct file *, struct mm_struct *);
78 
79 #ifdef CONFIG_ELF_CORE
80 static int elf_fdpic_core_dump(struct coredump_params *cprm);
81 #endif
82 
83 static struct linux_binfmt elf_fdpic_format = {
84 	.module		= THIS_MODULE,
85 	.load_binary	= load_elf_fdpic_binary,
86 #ifdef CONFIG_ELF_CORE
87 	.core_dump	= elf_fdpic_core_dump,
88 #endif
89 	.min_coredump	= ELF_EXEC_PAGESIZE,
90 };
91 
92 static int __init init_elf_fdpic_binfmt(void)
93 {
94 	return register_binfmt(&elf_fdpic_format);
95 }
96 
97 static void __exit exit_elf_fdpic_binfmt(void)
98 {
99 	unregister_binfmt(&elf_fdpic_format);
100 }
101 
102 core_initcall(init_elf_fdpic_binfmt);
103 module_exit(exit_elf_fdpic_binfmt);
104 
105 static int is_elf_fdpic(struct elfhdr *hdr, struct file *file)
106 {
107 	if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0)
108 		return 0;
109 	if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN)
110 		return 0;
111 	if (!elf_check_arch(hdr) || !elf_check_fdpic(hdr))
112 		return 0;
113 	if (!file->f_op || !file->f_op->mmap)
114 		return 0;
115 	return 1;
116 }
117 
118 /*****************************************************************************/
119 /*
120  * read the program headers table into memory
121  */
122 static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params,
123 				 struct file *file)
124 {
125 	struct elf32_phdr *phdr;
126 	unsigned long size;
127 	int retval, loop;
128 
129 	if (params->hdr.e_phentsize != sizeof(struct elf_phdr))
130 		return -ENOMEM;
131 	if (params->hdr.e_phnum > 65536U / sizeof(struct elf_phdr))
132 		return -ENOMEM;
133 
134 	size = params->hdr.e_phnum * sizeof(struct elf_phdr);
135 	params->phdrs = kmalloc(size, GFP_KERNEL);
136 	if (!params->phdrs)
137 		return -ENOMEM;
138 
139 	retval = kernel_read(file, params->hdr.e_phoff,
140 			     (char *) params->phdrs, size);
141 	if (unlikely(retval != size))
142 		return retval < 0 ? retval : -ENOEXEC;
143 
144 	/* determine stack size for this binary */
145 	phdr = params->phdrs;
146 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
147 		if (phdr->p_type != PT_GNU_STACK)
148 			continue;
149 
150 		if (phdr->p_flags & PF_X)
151 			params->flags |= ELF_FDPIC_FLAG_EXEC_STACK;
152 		else
153 			params->flags |= ELF_FDPIC_FLAG_NOEXEC_STACK;
154 
155 		params->stack_size = phdr->p_memsz;
156 		break;
157 	}
158 
159 	return 0;
160 }
161 
162 /*****************************************************************************/
163 /*
164  * load an fdpic binary into various bits of memory
165  */
166 static int load_elf_fdpic_binary(struct linux_binprm *bprm,
167 				 struct pt_regs *regs)
168 {
169 	struct elf_fdpic_params exec_params, interp_params;
170 	struct elf_phdr *phdr;
171 	unsigned long stack_size, entryaddr;
172 #ifdef ELF_FDPIC_PLAT_INIT
173 	unsigned long dynaddr;
174 #endif
175 #ifndef CONFIG_MMU
176 	unsigned long stack_prot;
177 #endif
178 	struct file *interpreter = NULL; /* to shut gcc up */
179 	char *interpreter_name = NULL;
180 	int executable_stack;
181 	int retval, i;
182 
183 	kdebug("____ LOAD %d ____", current->pid);
184 
185 	memset(&exec_params, 0, sizeof(exec_params));
186 	memset(&interp_params, 0, sizeof(interp_params));
187 
188 	exec_params.hdr = *(struct elfhdr *) bprm->buf;
189 	exec_params.flags = ELF_FDPIC_FLAG_PRESENT | ELF_FDPIC_FLAG_EXECUTABLE;
190 
191 	/* check that this is a binary we know how to deal with */
192 	retval = -ENOEXEC;
193 	if (!is_elf_fdpic(&exec_params.hdr, bprm->file))
194 		goto error;
195 
196 	/* read the program header table */
197 	retval = elf_fdpic_fetch_phdrs(&exec_params, bprm->file);
198 	if (retval < 0)
199 		goto error;
200 
201 	/* scan for a program header that specifies an interpreter */
202 	phdr = exec_params.phdrs;
203 
204 	for (i = 0; i < exec_params.hdr.e_phnum; i++, phdr++) {
205 		switch (phdr->p_type) {
206 		case PT_INTERP:
207 			retval = -ENOMEM;
208 			if (phdr->p_filesz > PATH_MAX)
209 				goto error;
210 			retval = -ENOENT;
211 			if (phdr->p_filesz < 2)
212 				goto error;
213 
214 			/* read the name of the interpreter into memory */
215 			interpreter_name = kmalloc(phdr->p_filesz, GFP_KERNEL);
216 			if (!interpreter_name)
217 				goto error;
218 
219 			retval = kernel_read(bprm->file,
220 					     phdr->p_offset,
221 					     interpreter_name,
222 					     phdr->p_filesz);
223 			if (unlikely(retval != phdr->p_filesz)) {
224 				if (retval >= 0)
225 					retval = -ENOEXEC;
226 				goto error;
227 			}
228 
229 			retval = -ENOENT;
230 			if (interpreter_name[phdr->p_filesz - 1] != '\0')
231 				goto error;
232 
233 			kdebug("Using ELF interpreter %s", interpreter_name);
234 
235 			/* replace the program with the interpreter */
236 			interpreter = open_exec(interpreter_name);
237 			retval = PTR_ERR(interpreter);
238 			if (IS_ERR(interpreter)) {
239 				interpreter = NULL;
240 				goto error;
241 			}
242 
243 			/*
244 			 * If the binary is not readable then enforce
245 			 * mm->dumpable = 0 regardless of the interpreter's
246 			 * permissions.
247 			 */
248 			if (file_permission(interpreter, MAY_READ) < 0)
249 				bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
250 
251 			retval = kernel_read(interpreter, 0, bprm->buf,
252 					     BINPRM_BUF_SIZE);
253 			if (unlikely(retval != BINPRM_BUF_SIZE)) {
254 				if (retval >= 0)
255 					retval = -ENOEXEC;
256 				goto error;
257 			}
258 
259 			interp_params.hdr = *((struct elfhdr *) bprm->buf);
260 			break;
261 
262 		case PT_LOAD:
263 #ifdef CONFIG_MMU
264 			if (exec_params.load_addr == 0)
265 				exec_params.load_addr = phdr->p_vaddr;
266 #endif
267 			break;
268 		}
269 
270 	}
271 
272 	if (elf_check_const_displacement(&exec_params.hdr))
273 		exec_params.flags |= ELF_FDPIC_FLAG_CONSTDISP;
274 
275 	/* perform insanity checks on the interpreter */
276 	if (interpreter_name) {
277 		retval = -ELIBBAD;
278 		if (!is_elf_fdpic(&interp_params.hdr, interpreter))
279 			goto error;
280 
281 		interp_params.flags = ELF_FDPIC_FLAG_PRESENT;
282 
283 		/* read the interpreter's program header table */
284 		retval = elf_fdpic_fetch_phdrs(&interp_params, interpreter);
285 		if (retval < 0)
286 			goto error;
287 	}
288 
289 	stack_size = exec_params.stack_size;
290 	if (exec_params.flags & ELF_FDPIC_FLAG_EXEC_STACK)
291 		executable_stack = EXSTACK_ENABLE_X;
292 	else if (exec_params.flags & ELF_FDPIC_FLAG_NOEXEC_STACK)
293 		executable_stack = EXSTACK_DISABLE_X;
294 	else
295 		executable_stack = EXSTACK_DEFAULT;
296 
297 	if (stack_size == 0) {
298 		stack_size = interp_params.stack_size;
299 		if (interp_params.flags & ELF_FDPIC_FLAG_EXEC_STACK)
300 			executable_stack = EXSTACK_ENABLE_X;
301 		else if (interp_params.flags & ELF_FDPIC_FLAG_NOEXEC_STACK)
302 			executable_stack = EXSTACK_DISABLE_X;
303 		else
304 			executable_stack = EXSTACK_DEFAULT;
305 	}
306 
307 	retval = -ENOEXEC;
308 	if (stack_size == 0)
309 		goto error;
310 
311 	if (elf_check_const_displacement(&interp_params.hdr))
312 		interp_params.flags |= ELF_FDPIC_FLAG_CONSTDISP;
313 
314 	/* flush all traces of the currently running executable */
315 	retval = flush_old_exec(bprm);
316 	if (retval)
317 		goto error;
318 
319 	/* there's now no turning back... the old userspace image is dead,
320 	 * defunct, deceased, etc. after this point we have to exit via
321 	 * error_kill */
322 	set_personality(PER_LINUX_FDPIC);
323 	if (elf_read_implies_exec(&exec_params.hdr, executable_stack))
324 		current->personality |= READ_IMPLIES_EXEC;
325 
326 	setup_new_exec(bprm);
327 
328 	set_binfmt(&elf_fdpic_format);
329 
330 	current->mm->start_code = 0;
331 	current->mm->end_code = 0;
332 	current->mm->start_stack = 0;
333 	current->mm->start_data = 0;
334 	current->mm->end_data = 0;
335 	current->mm->context.exec_fdpic_loadmap = 0;
336 	current->mm->context.interp_fdpic_loadmap = 0;
337 
338 	current->flags &= ~PF_FORKNOEXEC;
339 
340 #ifdef CONFIG_MMU
341 	elf_fdpic_arch_lay_out_mm(&exec_params,
342 				  &interp_params,
343 				  &current->mm->start_stack,
344 				  &current->mm->start_brk);
345 
346 	retval = setup_arg_pages(bprm, current->mm->start_stack,
347 				 executable_stack);
348 	if (retval < 0) {
349 		send_sig(SIGKILL, current, 0);
350 		goto error_kill;
351 	}
352 #endif
353 
354 	/* load the executable and interpreter into memory */
355 	retval = elf_fdpic_map_file(&exec_params, bprm->file, current->mm,
356 				    "executable");
357 	if (retval < 0)
358 		goto error_kill;
359 
360 	if (interpreter_name) {
361 		retval = elf_fdpic_map_file(&interp_params, interpreter,
362 					    current->mm, "interpreter");
363 		if (retval < 0) {
364 			printk(KERN_ERR "Unable to load interpreter\n");
365 			goto error_kill;
366 		}
367 
368 		allow_write_access(interpreter);
369 		fput(interpreter);
370 		interpreter = NULL;
371 	}
372 
373 #ifdef CONFIG_MMU
374 	if (!current->mm->start_brk)
375 		current->mm->start_brk = current->mm->end_data;
376 
377 	current->mm->brk = current->mm->start_brk =
378 		PAGE_ALIGN(current->mm->start_brk);
379 
380 #else
381 	/* create a stack and brk area big enough for everyone
382 	 * - the brk heap starts at the bottom and works up
383 	 * - the stack starts at the top and works down
384 	 */
385 	stack_size = (stack_size + PAGE_SIZE - 1) & PAGE_MASK;
386 	if (stack_size < PAGE_SIZE * 2)
387 		stack_size = PAGE_SIZE * 2;
388 
389 	stack_prot = PROT_READ | PROT_WRITE;
390 	if (executable_stack == EXSTACK_ENABLE_X ||
391 	    (executable_stack == EXSTACK_DEFAULT && VM_STACK_FLAGS & VM_EXEC))
392 		stack_prot |= PROT_EXEC;
393 
394 	down_write(&current->mm->mmap_sem);
395 	current->mm->start_brk = do_mmap(NULL, 0, stack_size, stack_prot,
396 					 MAP_PRIVATE | MAP_ANONYMOUS |
397 					 MAP_UNINITIALIZED | MAP_GROWSDOWN,
398 					 0);
399 
400 	if (IS_ERR_VALUE(current->mm->start_brk)) {
401 		up_write(&current->mm->mmap_sem);
402 		retval = current->mm->start_brk;
403 		current->mm->start_brk = 0;
404 		goto error_kill;
405 	}
406 
407 	up_write(&current->mm->mmap_sem);
408 
409 	current->mm->brk = current->mm->start_brk;
410 	current->mm->context.end_brk = current->mm->start_brk;
411 	current->mm->context.end_brk +=
412 		(stack_size > PAGE_SIZE) ? (stack_size - PAGE_SIZE) : 0;
413 	current->mm->start_stack = current->mm->start_brk + stack_size;
414 #endif
415 
416 	install_exec_creds(bprm);
417 	current->flags &= ~PF_FORKNOEXEC;
418 	if (create_elf_fdpic_tables(bprm, current->mm,
419 				    &exec_params, &interp_params) < 0)
420 		goto error_kill;
421 
422 	kdebug("- start_code  %lx", current->mm->start_code);
423 	kdebug("- end_code    %lx", current->mm->end_code);
424 	kdebug("- start_data  %lx", current->mm->start_data);
425 	kdebug("- end_data    %lx", current->mm->end_data);
426 	kdebug("- start_brk   %lx", current->mm->start_brk);
427 	kdebug("- brk         %lx", current->mm->brk);
428 	kdebug("- start_stack %lx", current->mm->start_stack);
429 
430 #ifdef ELF_FDPIC_PLAT_INIT
431 	/*
432 	 * The ABI may specify that certain registers be set up in special
433 	 * ways (on i386 %edx is the address of a DT_FINI function, for
434 	 * example.  This macro performs whatever initialization to
435 	 * the regs structure is required.
436 	 */
437 	dynaddr = interp_params.dynamic_addr ?: exec_params.dynamic_addr;
438 	ELF_FDPIC_PLAT_INIT(regs, exec_params.map_addr, interp_params.map_addr,
439 			    dynaddr);
440 #endif
441 
442 	/* everything is now ready... get the userspace context ready to roll */
443 	entryaddr = interp_params.entry_addr ?: exec_params.entry_addr;
444 	start_thread(regs, entryaddr, current->mm->start_stack);
445 
446 	retval = 0;
447 
448 error:
449 	if (interpreter) {
450 		allow_write_access(interpreter);
451 		fput(interpreter);
452 	}
453 	kfree(interpreter_name);
454 	kfree(exec_params.phdrs);
455 	kfree(exec_params.loadmap);
456 	kfree(interp_params.phdrs);
457 	kfree(interp_params.loadmap);
458 	return retval;
459 
460 	/* unrecoverable error - kill the process */
461 error_kill:
462 	send_sig(SIGSEGV, current, 0);
463 	goto error;
464 
465 }
466 
467 /*****************************************************************************/
468 
469 #ifndef ELF_BASE_PLATFORM
470 /*
471  * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
472  * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
473  * will be copied to the user stack in the same manner as AT_PLATFORM.
474  */
475 #define ELF_BASE_PLATFORM NULL
476 #endif
477 
478 /*
479  * present useful information to the program by shovelling it onto the new
480  * process's stack
481  */
482 static int create_elf_fdpic_tables(struct linux_binprm *bprm,
483 				   struct mm_struct *mm,
484 				   struct elf_fdpic_params *exec_params,
485 				   struct elf_fdpic_params *interp_params)
486 {
487 	const struct cred *cred = current_cred();
488 	unsigned long sp, csp, nitems;
489 	elf_caddr_t __user *argv, *envp;
490 	size_t platform_len = 0, len;
491 	char *k_platform, *k_base_platform;
492 	char __user *u_platform, *u_base_platform, *p;
493 	long hwcap;
494 	int loop;
495 	int nr;	/* reset for each csp adjustment */
496 
497 #ifdef CONFIG_MMU
498 	/* In some cases (e.g. Hyper-Threading), we want to avoid L1 evictions
499 	 * by the processes running on the same package. One thing we can do is
500 	 * to shuffle the initial stack for them, so we give the architecture
501 	 * an opportunity to do so here.
502 	 */
503 	sp = arch_align_stack(bprm->p);
504 #else
505 	sp = mm->start_stack;
506 
507 	/* stack the program arguments and environment */
508 	if (elf_fdpic_transfer_args_to_stack(bprm, &sp) < 0)
509 		return -EFAULT;
510 #endif
511 
512 	hwcap = ELF_HWCAP;
513 
514 	/*
515 	 * If this architecture has a platform capability string, copy it
516 	 * to userspace.  In some cases (Sparc), this info is impossible
517 	 * for userspace to get any other way, in others (i386) it is
518 	 * merely difficult.
519 	 */
520 	k_platform = ELF_PLATFORM;
521 	u_platform = NULL;
522 
523 	if (k_platform) {
524 		platform_len = strlen(k_platform) + 1;
525 		sp -= platform_len;
526 		u_platform = (char __user *) sp;
527 		if (__copy_to_user(u_platform, k_platform, platform_len) != 0)
528 			return -EFAULT;
529 	}
530 
531 	/*
532 	 * If this architecture has a "base" platform capability
533 	 * string, copy it to userspace.
534 	 */
535 	k_base_platform = ELF_BASE_PLATFORM;
536 	u_base_platform = NULL;
537 
538 	if (k_base_platform) {
539 		platform_len = strlen(k_base_platform) + 1;
540 		sp -= platform_len;
541 		u_base_platform = (char __user *) sp;
542 		if (__copy_to_user(u_base_platform, k_base_platform, platform_len) != 0)
543 			return -EFAULT;
544 	}
545 
546 	sp &= ~7UL;
547 
548 	/* stack the load map(s) */
549 	len = sizeof(struct elf32_fdpic_loadmap);
550 	len += sizeof(struct elf32_fdpic_loadseg) * exec_params->loadmap->nsegs;
551 	sp = (sp - len) & ~7UL;
552 	exec_params->map_addr = sp;
553 
554 	if (copy_to_user((void __user *) sp, exec_params->loadmap, len) != 0)
555 		return -EFAULT;
556 
557 	current->mm->context.exec_fdpic_loadmap = (unsigned long) sp;
558 
559 	if (interp_params->loadmap) {
560 		len = sizeof(struct elf32_fdpic_loadmap);
561 		len += sizeof(struct elf32_fdpic_loadseg) *
562 			interp_params->loadmap->nsegs;
563 		sp = (sp - len) & ~7UL;
564 		interp_params->map_addr = sp;
565 
566 		if (copy_to_user((void __user *) sp, interp_params->loadmap,
567 				 len) != 0)
568 			return -EFAULT;
569 
570 		current->mm->context.interp_fdpic_loadmap = (unsigned long) sp;
571 	}
572 
573 	/* force 16 byte _final_ alignment here for generality */
574 #define DLINFO_ITEMS 15
575 
576 	nitems = 1 + DLINFO_ITEMS + (k_platform ? 1 : 0) +
577 		(k_base_platform ? 1 : 0) + AT_VECTOR_SIZE_ARCH;
578 
579 	if (bprm->interp_flags & BINPRM_FLAGS_EXECFD)
580 		nitems++;
581 
582 	csp = sp;
583 	sp -= nitems * 2 * sizeof(unsigned long);
584 	sp -= (bprm->envc + 1) * sizeof(char *);	/* envv[] */
585 	sp -= (bprm->argc + 1) * sizeof(char *);	/* argv[] */
586 	sp -= 1 * sizeof(unsigned long);		/* argc */
587 
588 	csp -= sp & 15UL;
589 	sp -= sp & 15UL;
590 
591 	/* put the ELF interpreter info on the stack */
592 #define NEW_AUX_ENT(id, val)						\
593 	do {								\
594 		struct { unsigned long _id, _val; } __user *ent;	\
595 									\
596 		ent = (void __user *) csp;				\
597 		__put_user((id), &ent[nr]._id);				\
598 		__put_user((val), &ent[nr]._val);			\
599 		nr++;							\
600 	} while (0)
601 
602 	nr = 0;
603 	csp -= 2 * sizeof(unsigned long);
604 	NEW_AUX_ENT(AT_NULL, 0);
605 	if (k_platform) {
606 		nr = 0;
607 		csp -= 2 * sizeof(unsigned long);
608 		NEW_AUX_ENT(AT_PLATFORM,
609 			    (elf_addr_t) (unsigned long) u_platform);
610 	}
611 
612 	if (k_base_platform) {
613 		nr = 0;
614 		csp -= 2 * sizeof(unsigned long);
615 		NEW_AUX_ENT(AT_BASE_PLATFORM,
616 			    (elf_addr_t) (unsigned long) u_base_platform);
617 	}
618 
619 	if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
620 		nr = 0;
621 		csp -= 2 * sizeof(unsigned long);
622 		NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
623 	}
624 
625 	nr = 0;
626 	csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long);
627 	NEW_AUX_ENT(AT_HWCAP,	hwcap);
628 	NEW_AUX_ENT(AT_PAGESZ,	PAGE_SIZE);
629 	NEW_AUX_ENT(AT_CLKTCK,	CLOCKS_PER_SEC);
630 	NEW_AUX_ENT(AT_PHDR,	exec_params->ph_addr);
631 	NEW_AUX_ENT(AT_PHENT,	sizeof(struct elf_phdr));
632 	NEW_AUX_ENT(AT_PHNUM,	exec_params->hdr.e_phnum);
633 	NEW_AUX_ENT(AT_BASE,	interp_params->elfhdr_addr);
634 	NEW_AUX_ENT(AT_FLAGS,	0);
635 	NEW_AUX_ENT(AT_ENTRY,	exec_params->entry_addr);
636 	NEW_AUX_ENT(AT_UID,	(elf_addr_t) cred->uid);
637 	NEW_AUX_ENT(AT_EUID,	(elf_addr_t) cred->euid);
638 	NEW_AUX_ENT(AT_GID,	(elf_addr_t) cred->gid);
639 	NEW_AUX_ENT(AT_EGID,	(elf_addr_t) cred->egid);
640 	NEW_AUX_ENT(AT_SECURE,	security_bprm_secureexec(bprm));
641 	NEW_AUX_ENT(AT_EXECFN,	bprm->exec);
642 
643 #ifdef ARCH_DLINFO
644 	nr = 0;
645 	csp -= AT_VECTOR_SIZE_ARCH * 2 * sizeof(unsigned long);
646 
647 	/* ARCH_DLINFO must come last so platform specific code can enforce
648 	 * special alignment requirements on the AUXV if necessary (eg. PPC).
649 	 */
650 	ARCH_DLINFO;
651 #endif
652 #undef NEW_AUX_ENT
653 
654 	/* allocate room for argv[] and envv[] */
655 	csp -= (bprm->envc + 1) * sizeof(elf_caddr_t);
656 	envp = (elf_caddr_t __user *) csp;
657 	csp -= (bprm->argc + 1) * sizeof(elf_caddr_t);
658 	argv = (elf_caddr_t __user *) csp;
659 
660 	/* stack argc */
661 	csp -= sizeof(unsigned long);
662 	__put_user(bprm->argc, (unsigned long __user *) csp);
663 
664 	BUG_ON(csp != sp);
665 
666 	/* fill in the argv[] array */
667 #ifdef CONFIG_MMU
668 	current->mm->arg_start = bprm->p;
669 #else
670 	current->mm->arg_start = current->mm->start_stack -
671 		(MAX_ARG_PAGES * PAGE_SIZE - bprm->p);
672 #endif
673 
674 	p = (char __user *) current->mm->arg_start;
675 	for (loop = bprm->argc; loop > 0; loop--) {
676 		__put_user((elf_caddr_t) p, argv++);
677 		len = strnlen_user(p, MAX_ARG_STRLEN);
678 		if (!len || len > MAX_ARG_STRLEN)
679 			return -EINVAL;
680 		p += len;
681 	}
682 	__put_user(NULL, argv);
683 	current->mm->arg_end = (unsigned long) p;
684 
685 	/* fill in the envv[] array */
686 	current->mm->env_start = (unsigned long) p;
687 	for (loop = bprm->envc; loop > 0; loop--) {
688 		__put_user((elf_caddr_t)(unsigned long) p, envp++);
689 		len = strnlen_user(p, MAX_ARG_STRLEN);
690 		if (!len || len > MAX_ARG_STRLEN)
691 			return -EINVAL;
692 		p += len;
693 	}
694 	__put_user(NULL, envp);
695 	current->mm->env_end = (unsigned long) p;
696 
697 	mm->start_stack = (unsigned long) sp;
698 	return 0;
699 }
700 
701 /*****************************************************************************/
702 /*
703  * transfer the program arguments and environment from the holding pages onto
704  * the stack
705  */
706 #ifndef CONFIG_MMU
707 static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *bprm,
708 					    unsigned long *_sp)
709 {
710 	unsigned long index, stop, sp;
711 	char *src;
712 	int ret = 0;
713 
714 	stop = bprm->p >> PAGE_SHIFT;
715 	sp = *_sp;
716 
717 	for (index = MAX_ARG_PAGES - 1; index >= stop; index--) {
718 		src = kmap(bprm->page[index]);
719 		sp -= PAGE_SIZE;
720 		if (copy_to_user((void *) sp, src, PAGE_SIZE) != 0)
721 			ret = -EFAULT;
722 		kunmap(bprm->page[index]);
723 		if (ret < 0)
724 			goto out;
725 	}
726 
727 	*_sp = (*_sp - (MAX_ARG_PAGES * PAGE_SIZE - bprm->p)) & ~15;
728 
729 out:
730 	return ret;
731 }
732 #endif
733 
734 /*****************************************************************************/
735 /*
736  * load the appropriate binary image (executable or interpreter) into memory
737  * - we assume no MMU is available
738  * - if no other PIC bits are set in params->hdr->e_flags
739  *   - we assume that the LOADable segments in the binary are independently relocatable
740  *   - we assume R/O executable segments are shareable
741  * - else
742  *   - we assume the loadable parts of the image to require fixed displacement
743  *   - the image is not shareable
744  */
745 static int elf_fdpic_map_file(struct elf_fdpic_params *params,
746 			      struct file *file,
747 			      struct mm_struct *mm,
748 			      const char *what)
749 {
750 	struct elf32_fdpic_loadmap *loadmap;
751 #ifdef CONFIG_MMU
752 	struct elf32_fdpic_loadseg *mseg;
753 #endif
754 	struct elf32_fdpic_loadseg *seg;
755 	struct elf32_phdr *phdr;
756 	unsigned long load_addr, stop;
757 	unsigned nloads, tmp;
758 	size_t size;
759 	int loop, ret;
760 
761 	/* allocate a load map table */
762 	nloads = 0;
763 	for (loop = 0; loop < params->hdr.e_phnum; loop++)
764 		if (params->phdrs[loop].p_type == PT_LOAD)
765 			nloads++;
766 
767 	if (nloads == 0)
768 		return -ELIBBAD;
769 
770 	size = sizeof(*loadmap) + nloads * sizeof(*seg);
771 	loadmap = kzalloc(size, GFP_KERNEL);
772 	if (!loadmap)
773 		return -ENOMEM;
774 
775 	params->loadmap = loadmap;
776 
777 	loadmap->version = ELF32_FDPIC_LOADMAP_VERSION;
778 	loadmap->nsegs = nloads;
779 
780 	load_addr = params->load_addr;
781 	seg = loadmap->segs;
782 
783 	/* map the requested LOADs into the memory space */
784 	switch (params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) {
785 	case ELF_FDPIC_FLAG_CONSTDISP:
786 	case ELF_FDPIC_FLAG_CONTIGUOUS:
787 #ifndef CONFIG_MMU
788 		ret = elf_fdpic_map_file_constdisp_on_uclinux(params, file, mm);
789 		if (ret < 0)
790 			return ret;
791 		break;
792 #endif
793 	default:
794 		ret = elf_fdpic_map_file_by_direct_mmap(params, file, mm);
795 		if (ret < 0)
796 			return ret;
797 		break;
798 	}
799 
800 	/* map the entry point */
801 	if (params->hdr.e_entry) {
802 		seg = loadmap->segs;
803 		for (loop = loadmap->nsegs; loop > 0; loop--, seg++) {
804 			if (params->hdr.e_entry >= seg->p_vaddr &&
805 			    params->hdr.e_entry < seg->p_vaddr + seg->p_memsz) {
806 				params->entry_addr =
807 					(params->hdr.e_entry - seg->p_vaddr) +
808 					seg->addr;
809 				break;
810 			}
811 		}
812 	}
813 
814 	/* determine where the program header table has wound up if mapped */
815 	stop = params->hdr.e_phoff;
816 	stop += params->hdr.e_phnum * sizeof (struct elf_phdr);
817 	phdr = params->phdrs;
818 
819 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
820 		if (phdr->p_type != PT_LOAD)
821 			continue;
822 
823 		if (phdr->p_offset > params->hdr.e_phoff ||
824 		    phdr->p_offset + phdr->p_filesz < stop)
825 			continue;
826 
827 		seg = loadmap->segs;
828 		for (loop = loadmap->nsegs; loop > 0; loop--, seg++) {
829 			if (phdr->p_vaddr >= seg->p_vaddr &&
830 			    phdr->p_vaddr + phdr->p_filesz <=
831 			    seg->p_vaddr + seg->p_memsz) {
832 				params->ph_addr =
833 					(phdr->p_vaddr - seg->p_vaddr) +
834 					seg->addr +
835 					params->hdr.e_phoff - phdr->p_offset;
836 				break;
837 			}
838 		}
839 		break;
840 	}
841 
842 	/* determine where the dynamic section has wound up if there is one */
843 	phdr = params->phdrs;
844 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
845 		if (phdr->p_type != PT_DYNAMIC)
846 			continue;
847 
848 		seg = loadmap->segs;
849 		for (loop = loadmap->nsegs; loop > 0; loop--, seg++) {
850 			if (phdr->p_vaddr >= seg->p_vaddr &&
851 			    phdr->p_vaddr + phdr->p_memsz <=
852 			    seg->p_vaddr + seg->p_memsz) {
853 				params->dynamic_addr =
854 					(phdr->p_vaddr - seg->p_vaddr) +
855 					seg->addr;
856 
857 				/* check the dynamic section contains at least
858 				 * one item, and that the last item is a NULL
859 				 * entry */
860 				if (phdr->p_memsz == 0 ||
861 				    phdr->p_memsz % sizeof(Elf32_Dyn) != 0)
862 					goto dynamic_error;
863 
864 				tmp = phdr->p_memsz / sizeof(Elf32_Dyn);
865 				if (((Elf32_Dyn *)
866 				     params->dynamic_addr)[tmp - 1].d_tag != 0)
867 					goto dynamic_error;
868 				break;
869 			}
870 		}
871 		break;
872 	}
873 
874 	/* now elide adjacent segments in the load map on MMU linux
875 	 * - on uClinux the holes between may actually be filled with system
876 	 *   stuff or stuff from other processes
877 	 */
878 #ifdef CONFIG_MMU
879 	nloads = loadmap->nsegs;
880 	mseg = loadmap->segs;
881 	seg = mseg + 1;
882 	for (loop = 1; loop < nloads; loop++) {
883 		/* see if we have a candidate for merging */
884 		if (seg->p_vaddr - mseg->p_vaddr == seg->addr - mseg->addr) {
885 			load_addr = PAGE_ALIGN(mseg->addr + mseg->p_memsz);
886 			if (load_addr == (seg->addr & PAGE_MASK)) {
887 				mseg->p_memsz +=
888 					load_addr -
889 					(mseg->addr + mseg->p_memsz);
890 				mseg->p_memsz += seg->addr & ~PAGE_MASK;
891 				mseg->p_memsz += seg->p_memsz;
892 				loadmap->nsegs--;
893 				continue;
894 			}
895 		}
896 
897 		mseg++;
898 		if (mseg != seg)
899 			*mseg = *seg;
900 	}
901 #endif
902 
903 	kdebug("Mapped Object [%s]:", what);
904 	kdebug("- elfhdr   : %lx", params->elfhdr_addr);
905 	kdebug("- entry    : %lx", params->entry_addr);
906 	kdebug("- PHDR[]   : %lx", params->ph_addr);
907 	kdebug("- DYNAMIC[]: %lx", params->dynamic_addr);
908 	seg = loadmap->segs;
909 	for (loop = 0; loop < loadmap->nsegs; loop++, seg++)
910 		kdebug("- LOAD[%d] : %08x-%08x [va=%x ms=%x]",
911 		       loop,
912 		       seg->addr, seg->addr + seg->p_memsz - 1,
913 		       seg->p_vaddr, seg->p_memsz);
914 
915 	return 0;
916 
917 dynamic_error:
918 	printk("ELF FDPIC %s with invalid DYNAMIC section (inode=%lu)\n",
919 	       what, file->f_path.dentry->d_inode->i_ino);
920 	return -ELIBBAD;
921 }
922 
923 /*****************************************************************************/
924 /*
925  * map a file with constant displacement under uClinux
926  */
927 #ifndef CONFIG_MMU
928 static int elf_fdpic_map_file_constdisp_on_uclinux(
929 	struct elf_fdpic_params *params,
930 	struct file *file,
931 	struct mm_struct *mm)
932 {
933 	struct elf32_fdpic_loadseg *seg;
934 	struct elf32_phdr *phdr;
935 	unsigned long load_addr, base = ULONG_MAX, top = 0, maddr = 0, mflags;
936 	loff_t fpos;
937 	int loop, ret;
938 
939 	load_addr = params->load_addr;
940 	seg = params->loadmap->segs;
941 
942 	/* determine the bounds of the contiguous overall allocation we must
943 	 * make */
944 	phdr = params->phdrs;
945 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
946 		if (params->phdrs[loop].p_type != PT_LOAD)
947 			continue;
948 
949 		if (base > phdr->p_vaddr)
950 			base = phdr->p_vaddr;
951 		if (top < phdr->p_vaddr + phdr->p_memsz)
952 			top = phdr->p_vaddr + phdr->p_memsz;
953 	}
954 
955 	/* allocate one big anon block for everything */
956 	mflags = MAP_PRIVATE;
957 	if (params->flags & ELF_FDPIC_FLAG_EXECUTABLE)
958 		mflags |= MAP_EXECUTABLE;
959 
960 	down_write(&mm->mmap_sem);
961 	maddr = do_mmap(NULL, load_addr, top - base,
962 			PROT_READ | PROT_WRITE | PROT_EXEC, mflags, 0);
963 	up_write(&mm->mmap_sem);
964 	if (IS_ERR_VALUE(maddr))
965 		return (int) maddr;
966 
967 	if (load_addr != 0)
968 		load_addr += PAGE_ALIGN(top - base);
969 
970 	/* and then load the file segments into it */
971 	phdr = params->phdrs;
972 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
973 		if (params->phdrs[loop].p_type != PT_LOAD)
974 			continue;
975 
976 		fpos = phdr->p_offset;
977 
978 		seg->addr = maddr + (phdr->p_vaddr - base);
979 		seg->p_vaddr = phdr->p_vaddr;
980 		seg->p_memsz = phdr->p_memsz;
981 
982 		ret = file->f_op->read(file, (void *) seg->addr,
983 				       phdr->p_filesz, &fpos);
984 		if (ret < 0)
985 			return ret;
986 
987 		/* map the ELF header address if in this segment */
988 		if (phdr->p_offset == 0)
989 			params->elfhdr_addr = seg->addr;
990 
991 		/* clear any space allocated but not loaded */
992 		if (phdr->p_filesz < phdr->p_memsz) {
993 			ret = clear_user((void *) (seg->addr + phdr->p_filesz),
994 					 phdr->p_memsz - phdr->p_filesz);
995 			if (ret)
996 				return ret;
997 		}
998 
999 		if (mm) {
1000 			if (phdr->p_flags & PF_X) {
1001 				if (!mm->start_code) {
1002 					mm->start_code = seg->addr;
1003 					mm->end_code = seg->addr +
1004 						phdr->p_memsz;
1005 				}
1006 			} else if (!mm->start_data) {
1007 				mm->start_data = seg->addr;
1008 #ifndef CONFIG_MMU
1009 				mm->end_data = seg->addr + phdr->p_memsz;
1010 #endif
1011 			}
1012 
1013 #ifdef CONFIG_MMU
1014 			if (seg->addr + phdr->p_memsz > mm->end_data)
1015 				mm->end_data = seg->addr + phdr->p_memsz;
1016 #endif
1017 		}
1018 
1019 		seg++;
1020 	}
1021 
1022 	return 0;
1023 }
1024 #endif
1025 
1026 /*****************************************************************************/
1027 /*
1028  * map a binary by direct mmap() of the individual PT_LOAD segments
1029  */
1030 static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params,
1031 					     struct file *file,
1032 					     struct mm_struct *mm)
1033 {
1034 	struct elf32_fdpic_loadseg *seg;
1035 	struct elf32_phdr *phdr;
1036 	unsigned long load_addr, delta_vaddr;
1037 	int loop, dvset, ret;
1038 
1039 	load_addr = params->load_addr;
1040 	delta_vaddr = 0;
1041 	dvset = 0;
1042 
1043 	seg = params->loadmap->segs;
1044 
1045 	/* deal with each load segment separately */
1046 	phdr = params->phdrs;
1047 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
1048 		unsigned long maddr, disp, excess, excess1;
1049 		int prot = 0, flags;
1050 
1051 		if (phdr->p_type != PT_LOAD)
1052 			continue;
1053 
1054 		kdebug("[LOAD] va=%lx of=%lx fs=%lx ms=%lx",
1055 		       (unsigned long) phdr->p_vaddr,
1056 		       (unsigned long) phdr->p_offset,
1057 		       (unsigned long) phdr->p_filesz,
1058 		       (unsigned long) phdr->p_memsz);
1059 
1060 		/* determine the mapping parameters */
1061 		if (phdr->p_flags & PF_R) prot |= PROT_READ;
1062 		if (phdr->p_flags & PF_W) prot |= PROT_WRITE;
1063 		if (phdr->p_flags & PF_X) prot |= PROT_EXEC;
1064 
1065 		flags = MAP_PRIVATE | MAP_DENYWRITE;
1066 		if (params->flags & ELF_FDPIC_FLAG_EXECUTABLE)
1067 			flags |= MAP_EXECUTABLE;
1068 
1069 		maddr = 0;
1070 
1071 		switch (params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) {
1072 		case ELF_FDPIC_FLAG_INDEPENDENT:
1073 			/* PT_LOADs are independently locatable */
1074 			break;
1075 
1076 		case ELF_FDPIC_FLAG_HONOURVADDR:
1077 			/* the specified virtual address must be honoured */
1078 			maddr = phdr->p_vaddr;
1079 			flags |= MAP_FIXED;
1080 			break;
1081 
1082 		case ELF_FDPIC_FLAG_CONSTDISP:
1083 			/* constant displacement
1084 			 * - can be mapped anywhere, but must be mapped as a
1085 			 *   unit
1086 			 */
1087 			if (!dvset) {
1088 				maddr = load_addr;
1089 				delta_vaddr = phdr->p_vaddr;
1090 				dvset = 1;
1091 			} else {
1092 				maddr = load_addr + phdr->p_vaddr - delta_vaddr;
1093 				flags |= MAP_FIXED;
1094 			}
1095 			break;
1096 
1097 		case ELF_FDPIC_FLAG_CONTIGUOUS:
1098 			/* contiguity handled later */
1099 			break;
1100 
1101 		default:
1102 			BUG();
1103 		}
1104 
1105 		maddr &= PAGE_MASK;
1106 
1107 		/* create the mapping */
1108 		disp = phdr->p_vaddr & ~PAGE_MASK;
1109 		down_write(&mm->mmap_sem);
1110 		maddr = do_mmap(file, maddr, phdr->p_memsz + disp, prot, flags,
1111 				phdr->p_offset - disp);
1112 		up_write(&mm->mmap_sem);
1113 
1114 		kdebug("mmap[%d] <file> sz=%lx pr=%x fl=%x of=%lx --> %08lx",
1115 		       loop, phdr->p_memsz + disp, prot, flags,
1116 		       phdr->p_offset - disp, maddr);
1117 
1118 		if (IS_ERR_VALUE(maddr))
1119 			return (int) maddr;
1120 
1121 		if ((params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) ==
1122 		    ELF_FDPIC_FLAG_CONTIGUOUS)
1123 			load_addr += PAGE_ALIGN(phdr->p_memsz + disp);
1124 
1125 		seg->addr = maddr + disp;
1126 		seg->p_vaddr = phdr->p_vaddr;
1127 		seg->p_memsz = phdr->p_memsz;
1128 
1129 		/* map the ELF header address if in this segment */
1130 		if (phdr->p_offset == 0)
1131 			params->elfhdr_addr = seg->addr;
1132 
1133 		/* clear the bit between beginning of mapping and beginning of
1134 		 * PT_LOAD */
1135 		if (prot & PROT_WRITE && disp > 0) {
1136 			kdebug("clear[%d] ad=%lx sz=%lx", loop, maddr, disp);
1137 			ret = clear_user((void __user *) maddr, disp);
1138 			if (ret)
1139 				return ret;
1140 			maddr += disp;
1141 		}
1142 
1143 		/* clear any space allocated but not loaded
1144 		 * - on uClinux we can just clear the lot
1145 		 * - on MMU linux we'll get a SIGBUS beyond the last page
1146 		 *   extant in the file
1147 		 */
1148 		excess = phdr->p_memsz - phdr->p_filesz;
1149 		excess1 = PAGE_SIZE - ((maddr + phdr->p_filesz) & ~PAGE_MASK);
1150 
1151 #ifdef CONFIG_MMU
1152 		if (excess > excess1) {
1153 			unsigned long xaddr = maddr + phdr->p_filesz + excess1;
1154 			unsigned long xmaddr;
1155 
1156 			flags |= MAP_FIXED | MAP_ANONYMOUS;
1157 			down_write(&mm->mmap_sem);
1158 			xmaddr = do_mmap(NULL, xaddr, excess - excess1,
1159 					 prot, flags, 0);
1160 			up_write(&mm->mmap_sem);
1161 
1162 			kdebug("mmap[%d] <anon>"
1163 			       " ad=%lx sz=%lx pr=%x fl=%x of=0 --> %08lx",
1164 			       loop, xaddr, excess - excess1, prot, flags,
1165 			       xmaddr);
1166 
1167 			if (xmaddr != xaddr)
1168 				return -ENOMEM;
1169 		}
1170 
1171 		if (prot & PROT_WRITE && excess1 > 0) {
1172 			kdebug("clear[%d] ad=%lx sz=%lx",
1173 			       loop, maddr + phdr->p_filesz, excess1);
1174 			ret = clear_user((void __user *) maddr + phdr->p_filesz,
1175 					 excess1);
1176 			if (ret)
1177 				return ret;
1178 		}
1179 
1180 #else
1181 		if (excess > 0) {
1182 			kdebug("clear[%d] ad=%lx sz=%lx",
1183 			       loop, maddr + phdr->p_filesz, excess);
1184 			ret = clear_user((void *) maddr + phdr->p_filesz, excess);
1185 			if (ret)
1186 				return ret;
1187 		}
1188 #endif
1189 
1190 		if (mm) {
1191 			if (phdr->p_flags & PF_X) {
1192 				if (!mm->start_code) {
1193 					mm->start_code = maddr;
1194 					mm->end_code = maddr + phdr->p_memsz;
1195 				}
1196 			} else if (!mm->start_data) {
1197 				mm->start_data = maddr;
1198 				mm->end_data = maddr + phdr->p_memsz;
1199 			}
1200 		}
1201 
1202 		seg++;
1203 	}
1204 
1205 	return 0;
1206 }
1207 
1208 /*****************************************************************************/
1209 /*
1210  * ELF-FDPIC core dumper
1211  *
1212  * Modelled on fs/exec.c:aout_core_dump()
1213  * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1214  *
1215  * Modelled on fs/binfmt_elf.c core dumper
1216  */
1217 #ifdef CONFIG_ELF_CORE
1218 
1219 /*
1220  * Decide whether a segment is worth dumping; default is yes to be
1221  * sure (missing info is worse than too much; etc).
1222  * Personally I'd include everything, and use the coredump limit...
1223  *
1224  * I think we should skip something. But I am not sure how. H.J.
1225  */
1226 static int maydump(struct vm_area_struct *vma, unsigned long mm_flags)
1227 {
1228 	int dump_ok;
1229 
1230 	/* Do not dump I/O mapped devices or special mappings */
1231 	if (vma->vm_flags & (VM_IO | VM_RESERVED)) {
1232 		kdcore("%08lx: %08lx: no (IO)", vma->vm_start, vma->vm_flags);
1233 		return 0;
1234 	}
1235 
1236 	/* If we may not read the contents, don't allow us to dump
1237 	 * them either. "dump_write()" can't handle it anyway.
1238 	 */
1239 	if (!(vma->vm_flags & VM_READ)) {
1240 		kdcore("%08lx: %08lx: no (!read)", vma->vm_start, vma->vm_flags);
1241 		return 0;
1242 	}
1243 
1244 	/* By default, dump shared memory if mapped from an anonymous file. */
1245 	if (vma->vm_flags & VM_SHARED) {
1246 		if (vma->vm_file->f_path.dentry->d_inode->i_nlink == 0) {
1247 			dump_ok = test_bit(MMF_DUMP_ANON_SHARED, &mm_flags);
1248 			kdcore("%08lx: %08lx: %s (share)", vma->vm_start,
1249 			       vma->vm_flags, dump_ok ? "yes" : "no");
1250 			return dump_ok;
1251 		}
1252 
1253 		dump_ok = test_bit(MMF_DUMP_MAPPED_SHARED, &mm_flags);
1254 		kdcore("%08lx: %08lx: %s (share)", vma->vm_start,
1255 		       vma->vm_flags, dump_ok ? "yes" : "no");
1256 		return dump_ok;
1257 	}
1258 
1259 #ifdef CONFIG_MMU
1260 	/* By default, if it hasn't been written to, don't write it out */
1261 	if (!vma->anon_vma) {
1262 		dump_ok = test_bit(MMF_DUMP_MAPPED_PRIVATE, &mm_flags);
1263 		kdcore("%08lx: %08lx: %s (!anon)", vma->vm_start,
1264 		       vma->vm_flags, dump_ok ? "yes" : "no");
1265 		return dump_ok;
1266 	}
1267 #endif
1268 
1269 	dump_ok = test_bit(MMF_DUMP_ANON_PRIVATE, &mm_flags);
1270 	kdcore("%08lx: %08lx: %s", vma->vm_start, vma->vm_flags,
1271 	       dump_ok ? "yes" : "no");
1272 	return dump_ok;
1273 }
1274 
1275 /* An ELF note in memory */
1276 struct memelfnote
1277 {
1278 	const char *name;
1279 	int type;
1280 	unsigned int datasz;
1281 	void *data;
1282 };
1283 
1284 static int notesize(struct memelfnote *en)
1285 {
1286 	int sz;
1287 
1288 	sz = sizeof(struct elf_note);
1289 	sz += roundup(strlen(en->name) + 1, 4);
1290 	sz += roundup(en->datasz, 4);
1291 
1292 	return sz;
1293 }
1294 
1295 /* #define DEBUG */
1296 
1297 #define DUMP_WRITE(addr, nr, foffset)	\
1298 	do { if (!dump_write(file, (addr), (nr))) return 0; *foffset += (nr); } while(0)
1299 
1300 static int alignfile(struct file *file, loff_t *foffset)
1301 {
1302 	static const char buf[4] = { 0, };
1303 	DUMP_WRITE(buf, roundup(*foffset, 4) - *foffset, foffset);
1304 	return 1;
1305 }
1306 
1307 static int writenote(struct memelfnote *men, struct file *file,
1308 			loff_t *foffset)
1309 {
1310 	struct elf_note en;
1311 	en.n_namesz = strlen(men->name) + 1;
1312 	en.n_descsz = men->datasz;
1313 	en.n_type = men->type;
1314 
1315 	DUMP_WRITE(&en, sizeof(en), foffset);
1316 	DUMP_WRITE(men->name, en.n_namesz, foffset);
1317 	if (!alignfile(file, foffset))
1318 		return 0;
1319 	DUMP_WRITE(men->data, men->datasz, foffset);
1320 	if (!alignfile(file, foffset))
1321 		return 0;
1322 
1323 	return 1;
1324 }
1325 #undef DUMP_WRITE
1326 
1327 static inline void fill_elf_fdpic_header(struct elfhdr *elf, int segs)
1328 {
1329 	memcpy(elf->e_ident, ELFMAG, SELFMAG);
1330 	elf->e_ident[EI_CLASS] = ELF_CLASS;
1331 	elf->e_ident[EI_DATA] = ELF_DATA;
1332 	elf->e_ident[EI_VERSION] = EV_CURRENT;
1333 	elf->e_ident[EI_OSABI] = ELF_OSABI;
1334 	memset(elf->e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD);
1335 
1336 	elf->e_type = ET_CORE;
1337 	elf->e_machine = ELF_ARCH;
1338 	elf->e_version = EV_CURRENT;
1339 	elf->e_entry = 0;
1340 	elf->e_phoff = sizeof(struct elfhdr);
1341 	elf->e_shoff = 0;
1342 	elf->e_flags = ELF_FDPIC_CORE_EFLAGS;
1343 	elf->e_ehsize = sizeof(struct elfhdr);
1344 	elf->e_phentsize = sizeof(struct elf_phdr);
1345 	elf->e_phnum = segs;
1346 	elf->e_shentsize = 0;
1347 	elf->e_shnum = 0;
1348 	elf->e_shstrndx = 0;
1349 	return;
1350 }
1351 
1352 static inline void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
1353 {
1354 	phdr->p_type = PT_NOTE;
1355 	phdr->p_offset = offset;
1356 	phdr->p_vaddr = 0;
1357 	phdr->p_paddr = 0;
1358 	phdr->p_filesz = sz;
1359 	phdr->p_memsz = 0;
1360 	phdr->p_flags = 0;
1361 	phdr->p_align = 0;
1362 	return;
1363 }
1364 
1365 static inline void fill_note(struct memelfnote *note, const char *name, int type,
1366 		unsigned int sz, void *data)
1367 {
1368 	note->name = name;
1369 	note->type = type;
1370 	note->datasz = sz;
1371 	note->data = data;
1372 	return;
1373 }
1374 
1375 /*
1376  * fill up all the fields in prstatus from the given task struct, except
1377  * registers which need to be filled up separately.
1378  */
1379 static void fill_prstatus(struct elf_prstatus *prstatus,
1380 			  struct task_struct *p, long signr)
1381 {
1382 	prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1383 	prstatus->pr_sigpend = p->pending.signal.sig[0];
1384 	prstatus->pr_sighold = p->blocked.sig[0];
1385 	rcu_read_lock();
1386 	prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1387 	rcu_read_unlock();
1388 	prstatus->pr_pid = task_pid_vnr(p);
1389 	prstatus->pr_pgrp = task_pgrp_vnr(p);
1390 	prstatus->pr_sid = task_session_vnr(p);
1391 	if (thread_group_leader(p)) {
1392 		struct task_cputime cputime;
1393 
1394 		/*
1395 		 * This is the record for the group leader.  It shows the
1396 		 * group-wide total, not its individual thread total.
1397 		 */
1398 		thread_group_cputime(p, &cputime);
1399 		cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
1400 		cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
1401 	} else {
1402 		cputime_to_timeval(p->utime, &prstatus->pr_utime);
1403 		cputime_to_timeval(p->stime, &prstatus->pr_stime);
1404 	}
1405 	cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
1406 	cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
1407 
1408 	prstatus->pr_exec_fdpic_loadmap = p->mm->context.exec_fdpic_loadmap;
1409 	prstatus->pr_interp_fdpic_loadmap = p->mm->context.interp_fdpic_loadmap;
1410 }
1411 
1412 static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1413 		       struct mm_struct *mm)
1414 {
1415 	const struct cred *cred;
1416 	unsigned int i, len;
1417 
1418 	/* first copy the parameters from user space */
1419 	memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1420 
1421 	len = mm->arg_end - mm->arg_start;
1422 	if (len >= ELF_PRARGSZ)
1423 		len = ELF_PRARGSZ - 1;
1424 	if (copy_from_user(&psinfo->pr_psargs,
1425 		           (const char __user *) mm->arg_start, len))
1426 		return -EFAULT;
1427 	for (i = 0; i < len; i++)
1428 		if (psinfo->pr_psargs[i] == 0)
1429 			psinfo->pr_psargs[i] = ' ';
1430 	psinfo->pr_psargs[len] = 0;
1431 
1432 	rcu_read_lock();
1433 	psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1434 	rcu_read_unlock();
1435 	psinfo->pr_pid = task_pid_vnr(p);
1436 	psinfo->pr_pgrp = task_pgrp_vnr(p);
1437 	psinfo->pr_sid = task_session_vnr(p);
1438 
1439 	i = p->state ? ffz(~p->state) + 1 : 0;
1440 	psinfo->pr_state = i;
1441 	psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
1442 	psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1443 	psinfo->pr_nice = task_nice(p);
1444 	psinfo->pr_flag = p->flags;
1445 	rcu_read_lock();
1446 	cred = __task_cred(p);
1447 	SET_UID(psinfo->pr_uid, cred->uid);
1448 	SET_GID(psinfo->pr_gid, cred->gid);
1449 	rcu_read_unlock();
1450 	strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1451 
1452 	return 0;
1453 }
1454 
1455 /* Here is the structure in which status of each thread is captured. */
1456 struct elf_thread_status
1457 {
1458 	struct list_head list;
1459 	struct elf_prstatus prstatus;	/* NT_PRSTATUS */
1460 	elf_fpregset_t fpu;		/* NT_PRFPREG */
1461 	struct task_struct *thread;
1462 #ifdef ELF_CORE_COPY_XFPREGS
1463 	elf_fpxregset_t xfpu;		/* ELF_CORE_XFPREG_TYPE */
1464 #endif
1465 	struct memelfnote notes[3];
1466 	int num_notes;
1467 };
1468 
1469 /*
1470  * In order to add the specific thread information for the elf file format,
1471  * we need to keep a linked list of every thread's pr_status and then create
1472  * a single section for them in the final core file.
1473  */
1474 static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1475 {
1476 	struct task_struct *p = t->thread;
1477 	int sz = 0;
1478 
1479 	t->num_notes = 0;
1480 
1481 	fill_prstatus(&t->prstatus, p, signr);
1482 	elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1483 
1484 	fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1485 		  &t->prstatus);
1486 	t->num_notes++;
1487 	sz += notesize(&t->notes[0]);
1488 
1489 	t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL, &t->fpu);
1490 	if (t->prstatus.pr_fpvalid) {
1491 		fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1492 			  &t->fpu);
1493 		t->num_notes++;
1494 		sz += notesize(&t->notes[1]);
1495 	}
1496 
1497 #ifdef ELF_CORE_COPY_XFPREGS
1498 	if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
1499 		fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1500 			  sizeof(t->xfpu), &t->xfpu);
1501 		t->num_notes++;
1502 		sz += notesize(&t->notes[2]);
1503 	}
1504 #endif
1505 	return sz;
1506 }
1507 
1508 static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
1509 			     elf_addr_t e_shoff, int segs)
1510 {
1511 	elf->e_shoff = e_shoff;
1512 	elf->e_shentsize = sizeof(*shdr4extnum);
1513 	elf->e_shnum = 1;
1514 	elf->e_shstrndx = SHN_UNDEF;
1515 
1516 	memset(shdr4extnum, 0, sizeof(*shdr4extnum));
1517 
1518 	shdr4extnum->sh_type = SHT_NULL;
1519 	shdr4extnum->sh_size = elf->e_shnum;
1520 	shdr4extnum->sh_link = elf->e_shstrndx;
1521 	shdr4extnum->sh_info = segs;
1522 }
1523 
1524 /*
1525  * dump the segments for an MMU process
1526  */
1527 #ifdef CONFIG_MMU
1528 static int elf_fdpic_dump_segments(struct file *file, size_t *size,
1529 			   unsigned long *limit, unsigned long mm_flags)
1530 {
1531 	struct vm_area_struct *vma;
1532 	int err = 0;
1533 
1534 	for (vma = current->mm->mmap; vma; vma = vma->vm_next) {
1535 		unsigned long addr;
1536 
1537 		if (!maydump(vma, mm_flags))
1538 			continue;
1539 
1540 		for (addr = vma->vm_start; addr < vma->vm_end;
1541 							addr += PAGE_SIZE) {
1542 			struct page *page = get_dump_page(addr);
1543 			if (page) {
1544 				void *kaddr = kmap(page);
1545 				*size += PAGE_SIZE;
1546 				if (*size > *limit)
1547 					err = -EFBIG;
1548 				else if (!dump_write(file, kaddr, PAGE_SIZE))
1549 					err = -EIO;
1550 				kunmap(page);
1551 				page_cache_release(page);
1552 			} else if (!dump_seek(file, PAGE_SIZE))
1553 				err = -EFBIG;
1554 			if (err)
1555 				goto out;
1556 		}
1557 	}
1558 out:
1559 	return err;
1560 }
1561 #endif
1562 
1563 /*
1564  * dump the segments for a NOMMU process
1565  */
1566 #ifndef CONFIG_MMU
1567 static int elf_fdpic_dump_segments(struct file *file, size_t *size,
1568 			   unsigned long *limit, unsigned long mm_flags)
1569 {
1570 	struct vm_area_struct *vma;
1571 
1572 	for (vma = current->mm->mmap; vma; vma = vma->vm_next) {
1573 		if (!maydump(vma, mm_flags))
1574 			continue;
1575 
1576 		if ((*size += PAGE_SIZE) > *limit)
1577 			return -EFBIG;
1578 
1579 		if (!dump_write(file, (void *) vma->vm_start,
1580 				vma->vm_end - vma->vm_start))
1581 			return -EIO;
1582 	}
1583 
1584 	return 0;
1585 }
1586 #endif
1587 
1588 static size_t elf_core_vma_data_size(unsigned long mm_flags)
1589 {
1590 	struct vm_area_struct *vma;
1591 	size_t size = 0;
1592 
1593 	for (vma = current->mm->mmap; vma; vma->vm_next)
1594 		if (maydump(vma, mm_flags))
1595 			size += vma->vm_end - vma->vm_start;
1596 	return size;
1597 }
1598 
1599 /*
1600  * Actual dumper
1601  *
1602  * This is a two-pass process; first we find the offsets of the bits,
1603  * and then they are actually written out.  If we run out of core limit
1604  * we just truncate.
1605  */
1606 static int elf_fdpic_core_dump(struct coredump_params *cprm)
1607 {
1608 #define	NUM_NOTES	6
1609 	int has_dumped = 0;
1610 	mm_segment_t fs;
1611 	int segs;
1612 	size_t size = 0;
1613 	int i;
1614 	struct vm_area_struct *vma;
1615 	struct elfhdr *elf = NULL;
1616 	loff_t offset = 0, dataoff, foffset;
1617 	int numnote;
1618 	struct memelfnote *notes = NULL;
1619 	struct elf_prstatus *prstatus = NULL;	/* NT_PRSTATUS */
1620 	struct elf_prpsinfo *psinfo = NULL;	/* NT_PRPSINFO */
1621  	LIST_HEAD(thread_list);
1622  	struct list_head *t;
1623 	elf_fpregset_t *fpu = NULL;
1624 #ifdef ELF_CORE_COPY_XFPREGS
1625 	elf_fpxregset_t *xfpu = NULL;
1626 #endif
1627 	int thread_status_size = 0;
1628 	elf_addr_t *auxv;
1629 	struct elf_phdr *phdr4note = NULL;
1630 	struct elf_shdr *shdr4extnum = NULL;
1631 	Elf_Half e_phnum;
1632 	elf_addr_t e_shoff;
1633 
1634 	/*
1635 	 * We no longer stop all VM operations.
1636 	 *
1637 	 * This is because those proceses that could possibly change map_count
1638 	 * or the mmap / vma pages are now blocked in do_exit on current
1639 	 * finishing this core dump.
1640 	 *
1641 	 * Only ptrace can touch these memory addresses, but it doesn't change
1642 	 * the map_count or the pages allocated. So no possibility of crashing
1643 	 * exists while dumping the mm->vm_next areas to the core file.
1644 	 */
1645 
1646 	/* alloc memory for large data structures: too large to be on stack */
1647 	elf = kmalloc(sizeof(*elf), GFP_KERNEL);
1648 	if (!elf)
1649 		goto cleanup;
1650 	prstatus = kzalloc(sizeof(*prstatus), GFP_KERNEL);
1651 	if (!prstatus)
1652 		goto cleanup;
1653 	psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
1654 	if (!psinfo)
1655 		goto cleanup;
1656 	notes = kmalloc(NUM_NOTES * sizeof(struct memelfnote), GFP_KERNEL);
1657 	if (!notes)
1658 		goto cleanup;
1659 	fpu = kmalloc(sizeof(*fpu), GFP_KERNEL);
1660 	if (!fpu)
1661 		goto cleanup;
1662 #ifdef ELF_CORE_COPY_XFPREGS
1663 	xfpu = kmalloc(sizeof(*xfpu), GFP_KERNEL);
1664 	if (!xfpu)
1665 		goto cleanup;
1666 #endif
1667 
1668 	if (cprm->signr) {
1669 		struct core_thread *ct;
1670 		struct elf_thread_status *tmp;
1671 
1672 		for (ct = current->mm->core_state->dumper.next;
1673 						ct; ct = ct->next) {
1674 			tmp = kzalloc(sizeof(*tmp), GFP_KERNEL);
1675 			if (!tmp)
1676 				goto cleanup;
1677 
1678 			tmp->thread = ct->task;
1679 			list_add(&tmp->list, &thread_list);
1680 		}
1681 
1682 		list_for_each(t, &thread_list) {
1683 			struct elf_thread_status *tmp;
1684 			int sz;
1685 
1686 			tmp = list_entry(t, struct elf_thread_status, list);
1687 			sz = elf_dump_thread_status(cprm->signr, tmp);
1688 			thread_status_size += sz;
1689 		}
1690 	}
1691 
1692 	/* now collect the dump for the current */
1693 	fill_prstatus(prstatus, current, cprm->signr);
1694 	elf_core_copy_regs(&prstatus->pr_reg, cprm->regs);
1695 
1696 	segs = current->mm->map_count;
1697 	segs += elf_core_extra_phdrs();
1698 
1699 	/* for notes section */
1700 	segs++;
1701 
1702 	/* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
1703 	 * this, kernel supports extended numbering. Have a look at
1704 	 * include/linux/elf.h for further information. */
1705 	e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
1706 
1707 	/* Set up header */
1708 	fill_elf_fdpic_header(elf, e_phnum);
1709 
1710 	has_dumped = 1;
1711 	current->flags |= PF_DUMPCORE;
1712 
1713 	/*
1714 	 * Set up the notes in similar form to SVR4 core dumps made
1715 	 * with info from their /proc.
1716 	 */
1717 
1718 	fill_note(notes + 0, "CORE", NT_PRSTATUS, sizeof(*prstatus), prstatus);
1719 	fill_psinfo(psinfo, current->group_leader, current->mm);
1720 	fill_note(notes + 1, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1721 
1722 	numnote = 2;
1723 
1724 	auxv = (elf_addr_t *) current->mm->saved_auxv;
1725 
1726 	i = 0;
1727 	do
1728 		i += 2;
1729 	while (auxv[i - 2] != AT_NULL);
1730 	fill_note(&notes[numnote++], "CORE", NT_AUXV,
1731 		  i * sizeof(elf_addr_t), auxv);
1732 
1733   	/* Try to dump the FPU. */
1734 	if ((prstatus->pr_fpvalid =
1735 	     elf_core_copy_task_fpregs(current, cprm->regs, fpu)))
1736 		fill_note(notes + numnote++,
1737 			  "CORE", NT_PRFPREG, sizeof(*fpu), fpu);
1738 #ifdef ELF_CORE_COPY_XFPREGS
1739 	if (elf_core_copy_task_xfpregs(current, xfpu))
1740 		fill_note(notes + numnote++,
1741 			  "LINUX", ELF_CORE_XFPREG_TYPE, sizeof(*xfpu), xfpu);
1742 #endif
1743 
1744 	fs = get_fs();
1745 	set_fs(KERNEL_DS);
1746 
1747 	offset += sizeof(*elf);				/* Elf header */
1748 	offset += segs * sizeof(struct elf_phdr);	/* Program headers */
1749 	foffset = offset;
1750 
1751 	/* Write notes phdr entry */
1752 	{
1753 		int sz = 0;
1754 
1755 		for (i = 0; i < numnote; i++)
1756 			sz += notesize(notes + i);
1757 
1758 		sz += thread_status_size;
1759 
1760 		phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
1761 		if (!phdr4note)
1762 			goto end_coredump;
1763 
1764 		fill_elf_note_phdr(phdr4note, sz, offset);
1765 		offset += sz;
1766 	}
1767 
1768 	/* Page-align dumped data */
1769 	dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
1770 
1771 	offset += elf_core_vma_data_size(cprm->mm_flags);
1772 	offset += elf_core_extra_data_size();
1773 	e_shoff = offset;
1774 
1775 	if (e_phnum == PN_XNUM) {
1776 		shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
1777 		if (!shdr4extnum)
1778 			goto end_coredump;
1779 		fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
1780 	}
1781 
1782 	offset = dataoff;
1783 
1784 	size += sizeof(*elf);
1785 	if (size > cprm->limit || !dump_write(cprm->file, elf, sizeof(*elf)))
1786 		goto end_coredump;
1787 
1788 	size += sizeof(*phdr4note);
1789 	if (size > cprm->limit
1790 	    || !dump_write(cprm->file, phdr4note, sizeof(*phdr4note)))
1791 		goto end_coredump;
1792 
1793 	/* write program headers for segments dump */
1794 	for (vma = current->mm->mmap; vma; vma = vma->vm_next) {
1795 		struct elf_phdr phdr;
1796 		size_t sz;
1797 
1798 		sz = vma->vm_end - vma->vm_start;
1799 
1800 		phdr.p_type = PT_LOAD;
1801 		phdr.p_offset = offset;
1802 		phdr.p_vaddr = vma->vm_start;
1803 		phdr.p_paddr = 0;
1804 		phdr.p_filesz = maydump(vma, cprm->mm_flags) ? sz : 0;
1805 		phdr.p_memsz = sz;
1806 		offset += phdr.p_filesz;
1807 		phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
1808 		if (vma->vm_flags & VM_WRITE)
1809 			phdr.p_flags |= PF_W;
1810 		if (vma->vm_flags & VM_EXEC)
1811 			phdr.p_flags |= PF_X;
1812 		phdr.p_align = ELF_EXEC_PAGESIZE;
1813 
1814 		size += sizeof(phdr);
1815 		if (size > cprm->limit
1816 		    || !dump_write(cprm->file, &phdr, sizeof(phdr)))
1817 			goto end_coredump;
1818 	}
1819 
1820 	if (!elf_core_write_extra_phdrs(cprm->file, offset, &size, cprm->limit))
1821 		goto end_coredump;
1822 
1823  	/* write out the notes section */
1824 	for (i = 0; i < numnote; i++)
1825 		if (!writenote(notes + i, cprm->file, &foffset))
1826 			goto end_coredump;
1827 
1828 	/* write out the thread status notes section */
1829 	list_for_each(t, &thread_list) {
1830 		struct elf_thread_status *tmp =
1831 				list_entry(t, struct elf_thread_status, list);
1832 
1833 		for (i = 0; i < tmp->num_notes; i++)
1834 			if (!writenote(&tmp->notes[i], cprm->file, &foffset))
1835 				goto end_coredump;
1836 	}
1837 
1838 	if (!dump_seek(cprm->file, dataoff - foffset))
1839 		goto end_coredump;
1840 
1841 	if (elf_fdpic_dump_segments(cprm->file, &size, &cprm->limit,
1842 				    cprm->mm_flags) < 0)
1843 		goto end_coredump;
1844 
1845 	if (!elf_core_write_extra_data(cprm->file, &size, cprm->limit))
1846 		goto end_coredump;
1847 
1848 	if (e_phnum == PN_XNUM) {
1849 		size += sizeof(*shdr4extnum);
1850 		if (size > cprm->limit
1851 		    || !dump_write(cprm->file, shdr4extnum,
1852 				   sizeof(*shdr4extnum)))
1853 			goto end_coredump;
1854 	}
1855 
1856 	if (cprm->file->f_pos != offset) {
1857 		/* Sanity check */
1858 		printk(KERN_WARNING
1859 		       "elf_core_dump: file->f_pos (%lld) != offset (%lld)\n",
1860 		       cprm->file->f_pos, offset);
1861 	}
1862 
1863 end_coredump:
1864 	set_fs(fs);
1865 
1866 cleanup:
1867 	while (!list_empty(&thread_list)) {
1868 		struct list_head *tmp = thread_list.next;
1869 		list_del(tmp);
1870 		kfree(list_entry(tmp, struct elf_thread_status, list));
1871 	}
1872 	kfree(phdr4note);
1873 	kfree(elf);
1874 	kfree(prstatus);
1875 	kfree(psinfo);
1876 	kfree(notes);
1877 	kfree(fpu);
1878 #ifdef ELF_CORE_COPY_XFPREGS
1879 	kfree(xfpu);
1880 #endif
1881 	return has_dumped;
1882 #undef NUM_NOTES
1883 }
1884 
1885 #endif		/* CONFIG_ELF_CORE */
1886