Lines Matching +full:px +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0-only
37 #include <linux/elf-randomize.h>
78 * If we don't support core dumping, then supply a NULL so we
97 #define ELF_PAGESTART(_v) ((_v) & ~(int)(ELF_MIN_ALIGN-1))
98 #define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
99 #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
124 nbyte = ELF_MIN_ALIGN - nbyte; in padzero()
126 return -EFAULT; in padzero()
140 #define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
142 (((unsigned long) (sp - items)) &~ 15UL)
143 #define STACK_ALLOC(sp, len) (sp -= len)
160 struct mm_struct *mm = current->mm; in create_elf_tables()
161 unsigned long p = bprm->p; in create_elf_tables()
162 int argc = bprm->argc; in create_elf_tables()
163 int envc = bprm->envc; in create_elf_tables()
179 * In some cases (e.g. Hyper-Threading), we want to avoid L1 in create_elf_tables()
198 return -EFAULT; in create_elf_tables()
211 return -EFAULT; in create_elf_tables()
221 return -EFAULT; in create_elf_tables()
224 elf_info = (elf_addr_t *)mm->saved_auxv; in create_elf_tables()
246 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum); in create_elf_tables()
248 if (bprm->interp_flags & BINPRM_FLAGS_PRESERVE_ARGV0) in create_elf_tables()
252 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid)); in create_elf_tables()
253 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid)); in create_elf_tables()
254 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid)); in create_elf_tables()
255 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid)); in create_elf_tables()
256 NEW_AUX_ENT(AT_SECURE, bprm->secureexec); in create_elf_tables()
267 NEW_AUX_ENT(AT_EXECFN, bprm->exec); in create_elf_tables()
276 if (bprm->have_execfd) { in create_elf_tables()
277 NEW_AUX_ENT(AT_EXECFD, bprm->execfd); in create_elf_tables()
285 memset(elf_info, 0, (char *)mm->saved_auxv + in create_elf_tables()
286 sizeof(mm->saved_auxv) - (char *)elf_info); in create_elf_tables()
291 ei_index = elf_info - (elf_addr_t *)mm->saved_auxv; in create_elf_tables()
295 bprm->p = STACK_ROUND(sp, items); in create_elf_tables()
299 sp = (elf_addr_t __user *)bprm->p - items - ei_index; in create_elf_tables()
300 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */ in create_elf_tables()
302 sp = (elf_addr_t __user *)bprm->p; in create_elf_tables()
308 * far ahead a user-space access may be in order to grow the stack. in create_elf_tables()
311 return -EINTR; in create_elf_tables()
312 vma = find_extend_vma_locked(mm, bprm->p); in create_elf_tables()
315 return -EFAULT; in create_elf_tables()
319 return -EFAULT; in create_elf_tables()
322 p = mm->arg_end = mm->arg_start; in create_elf_tables()
323 while (argc-- > 0) { in create_elf_tables()
326 return -EFAULT; in create_elf_tables()
329 return -EINVAL; in create_elf_tables()
333 return -EFAULT; in create_elf_tables()
334 mm->arg_end = p; in create_elf_tables()
337 mm->env_end = mm->env_start = p; in create_elf_tables()
338 while (envc-- > 0) { in create_elf_tables()
341 return -EFAULT; in create_elf_tables()
344 return -EINVAL; in create_elf_tables()
348 return -EFAULT; in create_elf_tables()
349 mm->env_end = p; in create_elf_tables()
352 if (copy_to_user(sp, mm->saved_auxv, ei_index * sizeof(elf_addr_t))) in create_elf_tables()
353 return -EFAULT; in create_elf_tables()
358 * Map "eppnt->p_filesz" bytes from "filep" offset "eppnt->p_offset"
367 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr); in elf_map()
368 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr); in elf_map()
372 /* mmap() will return -EINVAL if given a zero size, but a in elf_map()
382 * So we first map the 'big' image - and unmap the remainder at in elf_map()
389 vm_munmap(map_addr+size, total_size-size); in elf_map()
394 PTR_ERR((void *)map_addr) == -EEXIST) in elf_map()
395 pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n", in elf_map()
396 task_pid_nr(current), current->comm, (void *)addr); in elf_map()
402 * Map "eppnt->p_filesz" bytes from "filep" offset "eppnt->p_offset"
413 if (eppnt->p_filesz) { in elf_load()
417 if (eppnt->p_memsz > eppnt->p_filesz) { in elf_load()
418 zero_start = map_addr + ELF_PAGEOFFSET(eppnt->p_vaddr) + in elf_load()
419 eppnt->p_filesz; in elf_load()
420 zero_end = map_addr + ELF_PAGEOFFSET(eppnt->p_vaddr) + in elf_load()
421 eppnt->p_memsz; in elf_load()
428 return -EFAULT; in elf_load()
432 zero_end = zero_start + ELF_PAGEOFFSET(eppnt->p_vaddr) + in elf_load()
433 eppnt->p_memsz; in elf_load()
435 if (eppnt->p_memsz > eppnt->p_filesz) { in elf_load()
446 error = vm_brk_flags(zero_start, zero_end - zero_start, in elf_load()
457 elf_addr_t min_addr = -1; in total_mapping_size()
469 return pt_load ? (max_addr - min_addr) : 0; in total_mapping_size()
478 return (rv < 0) ? rv : -EIO; in elf_read()
492 /* skip non-power of two alignments as invalid */ in maximum_alignment()
504 * load_elf_phdrs() - load ELF program headers
516 int retval = -1; in load_elf_phdrs()
523 if (elf_ex->e_phentsize != sizeof(struct elf_phdr)) in load_elf_phdrs()
528 size = sizeof(struct elf_phdr) * elf_ex->e_phnum; in load_elf_phdrs()
537 retval = elf_read(elf_file, elf_phdata, size, elf_ex->e_phoff); in load_elf_phdrs()
550 * struct arch_elf_state - arch-specific ELF loading state
566 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
572 * @state: Architecture-specific state preserved throughout the process
580 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
593 * arch_check_elf() - check an ELF executable
597 * @state: Architecture-specific state preserved throughout the process
604 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
650 if (interp_elf_ex->e_type != ET_EXEC && in load_elf_interp()
651 interp_elf_ex->e_type != ET_DYN) in load_elf_interp()
656 if (!interpreter->f_op->mmap) in load_elf_interp()
660 interp_elf_ex->e_phnum); in load_elf_interp()
662 error = -EINVAL; in load_elf_interp()
667 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) { in load_elf_interp()
668 if (eppnt->p_type == PT_LOAD) { in load_elf_interp()
670 int elf_prot = make_prot(eppnt->p_flags, arch_state, in load_elf_interp()
675 vaddr = eppnt->p_vaddr; in load_elf_interp()
676 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) in load_elf_interp()
678 else if (no_base && interp_elf_ex->e_type == ET_DYN) in load_elf_interp()
679 load_addr = -vaddr; in load_elf_interp()
689 interp_elf_ex->e_type == ET_DYN) { in load_elf_interp()
690 load_addr = map_addr - ELF_PAGESTART(vaddr); in load_elf_interp()
699 k = load_addr + eppnt->p_vaddr; in load_elf_interp()
701 eppnt->p_filesz > eppnt->p_memsz || in load_elf_interp()
702 eppnt->p_memsz > TASK_SIZE || in load_elf_interp()
703 TASK_SIZE - eppnt->p_memsz < k) { in load_elf_interp()
704 error = -ENOMEM; in load_elf_interp()
729 return -ENOENT; in parse_elf_property()
732 return -EIO; in parse_elf_property()
734 datasz -= *off; in parse_elf_property()
737 return -ENOEXEC; in parse_elf_property()
740 datasz -= sizeof(*pr); in parse_elf_property()
742 if (pr->pr_datasz > datasz) in parse_elf_property()
743 return -ENOEXEC; in parse_elf_property()
746 step = round_up(pr->pr_datasz, ELF_GNU_PROPERTY_ALIGN); in parse_elf_property()
748 return -ENOEXEC; in parse_elf_property()
751 if (have_prev_type && pr->pr_type <= *prev_type) in parse_elf_property()
752 return -ENOEXEC; in parse_elf_property()
753 *prev_type = pr->pr_type; in parse_elf_property()
755 ret = arch_parse_elf_property(pr->pr_type, data + o, in parse_elf_property()
756 pr->pr_datasz, ELF_COMPAT, arch); in parse_elf_property()
786 if (WARN_ON_ONCE(phdr->p_type != PT_GNU_PROPERTY)) in parse_elf_properties()
787 return -ENOEXEC; in parse_elf_properties()
790 if (phdr->p_filesz > sizeof(note)) in parse_elf_properties()
791 return -ENOEXEC; in parse_elf_properties()
793 pos = phdr->p_offset; in parse_elf_properties()
794 n = kernel_read(f, &note, phdr->p_filesz, &pos); in parse_elf_properties()
798 return -EIO; in parse_elf_properties()
803 GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) in parse_elf_properties()
804 return -ENOEXEC; in parse_elf_properties()
809 return -ENOEXEC; in parse_elf_properties()
811 if (note.nhdr.n_descsz > n - off) in parse_elf_properties()
812 return -ENOEXEC; in parse_elf_properties()
822 return ret == -ENOENT ? 0 : ret; in parse_elf_properties()
841 struct elfhdr *elf_ex = (struct elfhdr *)bprm->buf; in load_elf_binary()
847 retval = -ENOEXEC; in load_elf_binary()
849 if (memcmp(elf_ex->e_ident, ELFMAG, SELFMAG) != 0) in load_elf_binary()
852 if (elf_ex->e_type != ET_EXEC && elf_ex->e_type != ET_DYN) in load_elf_binary()
858 if (!bprm->file->f_op->mmap) in load_elf_binary()
861 elf_phdata = load_elf_phdrs(elf_ex, bprm->file); in load_elf_binary()
866 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) { in load_elf_binary()
869 if (elf_ppnt->p_type == PT_GNU_PROPERTY) { in load_elf_binary()
874 if (elf_ppnt->p_type != PT_INTERP) in load_elf_binary()
878 * This is the program interpreter used for shared libraries - in load_elf_binary()
881 retval = -ENOEXEC; in load_elf_binary()
882 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2) in load_elf_binary()
885 retval = -ENOMEM; in load_elf_binary()
886 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL); in load_elf_binary()
890 retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz, in load_elf_binary()
891 elf_ppnt->p_offset); in load_elf_binary()
895 retval = -ENOEXEC; in load_elf_binary()
896 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0') in load_elf_binary()
906 * If the binary is not readable then enforce mm->dumpable = 0 in load_elf_binary()
913 retval = -ENOMEM; in load_elf_binary()
931 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) in load_elf_binary()
932 switch (elf_ppnt->p_type) { in load_elf_binary()
934 if (elf_ppnt->p_flags & PF_X) in load_elf_binary()
942 bprm->file, false, in load_elf_binary()
951 retval = -ELIBBAD; in load_elf_binary()
953 if (memcmp(interp_elf_ex->e_ident, ELFMAG, SELFMAG) != 0) in load_elf_binary()
969 for (i = 0; i < interp_elf_ex->e_phnum; i++, elf_ppnt++) in load_elf_binary()
970 switch (elf_ppnt->p_type) { in load_elf_binary()
985 retval = parse_elf_properties(interpreter ?: bprm->file, in load_elf_binary()
1010 current->personality |= READ_IMPLIES_EXEC; in load_elf_binary()
1013 if (!(current->personality & ADDR_NO_RANDOMIZE) && snapshot_randomize_va_space) in load_elf_binary()
1014 current->flags |= PF_RANDOMIZE; in load_elf_binary()
1035 i < elf_ex->e_phnum; i++, elf_ppnt++) { in load_elf_binary()
1041 if (elf_ppnt->p_type != PT_LOAD) in load_elf_binary()
1044 elf_prot = make_prot(elf_ppnt->p_flags, &arch_state, in load_elf_binary()
1049 vaddr = elf_ppnt->p_vaddr; in load_elf_binary()
1054 * MAP_FIXED_NOREPLACE in the once-per-binary logic following. in load_elf_binary()
1058 } else if (elf_ex->e_type == ET_EXEC) { in load_elf_binary()
1065 } else if (elf_ex->e_type == ET_DYN) { in load_elf_binary()
1092 elf_ex->e_phnum); in load_elf_binary()
1094 retval = -EINVAL; in load_elf_binary()
1099 alignment = maximum_alignment(elf_phdata, elf_ex->e_phnum); in load_elf_binary()
1126 if (current->flags & PF_RANDOMIZE) in load_elf_binary()
1130 load_bias &= ~(alignment - 1); in load_elf_binary()
1147 load_bias = elf_load(bprm->file, 0, elf_ppnt, in load_elf_binary()
1151 PTR_ERR((void*)load_bias) : -EINVAL; in load_elf_binary()
1157 load_bias &= ~(alignment - 1); in load_elf_binary()
1170 load_bias = ELF_PAGESTART(load_bias - vaddr); in load_elf_binary()
1173 error = elf_load(bprm->file, load_bias + vaddr, elf_ppnt, in load_elf_binary()
1177 PTR_ERR((void*)error) : -EINVAL; in load_elf_binary()
1183 if (elf_ex->e_type == ET_DYN) { in load_elf_binary()
1184 load_bias += error - in load_elf_binary()
1194 if (elf_ppnt->p_offset <= elf_ex->e_phoff && in load_elf_binary()
1195 elf_ex->e_phoff < elf_ppnt->p_offset + elf_ppnt->p_filesz) { in load_elf_binary()
1196 phdr_addr = elf_ex->e_phoff - elf_ppnt->p_offset + in load_elf_binary()
1197 elf_ppnt->p_vaddr; in load_elf_binary()
1200 k = elf_ppnt->p_vaddr; in load_elf_binary()
1201 if ((elf_ppnt->p_flags & PF_X) && k < start_code) in load_elf_binary()
1211 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz || in load_elf_binary()
1212 elf_ppnt->p_memsz > TASK_SIZE || in load_elf_binary()
1213 TASK_SIZE - elf_ppnt->p_memsz < k) { in load_elf_binary()
1215 retval = -EINVAL; in load_elf_binary()
1219 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz; in load_elf_binary()
1221 if ((elf_ppnt->p_flags & PF_X) && end_code < k) in load_elf_binary()
1225 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz; in load_elf_binary()
1230 e_entry = elf_ex->e_entry + load_bias; in load_elf_binary()
1238 current->mm->start_brk = current->mm->brk = ELF_PAGEALIGN(elf_brk); in load_elf_binary()
1251 elf_entry += interp_elf_ex->e_entry; in load_elf_binary()
1255 (int)elf_entry : -EINVAL; in load_elf_binary()
1268 retval = -EINVAL; in load_elf_binary()
1288 mm = current->mm; in load_elf_binary()
1289 mm->end_code = end_code; in load_elf_binary()
1290 mm->start_code = start_code; in load_elf_binary()
1291 mm->start_data = start_data; in load_elf_binary()
1292 mm->end_data = end_data; in load_elf_binary()
1293 mm->start_stack = bprm->p; in load_elf_binary()
1295 if ((current->flags & PF_RANDOMIZE) && (snapshot_randomize_va_space > 1)) { in load_elf_binary()
1304 elf_ex->e_type == ET_DYN && !interpreter) { in load_elf_binary()
1305 mm->brk = mm->start_brk = ELF_ET_DYN_BASE; in load_elf_binary()
1308 mm->brk = mm->start_brk = mm->brk + PAGE_SIZE; in load_elf_binary()
1311 mm->brk = mm->start_brk = arch_randomize_brk(mm); in load_elf_binary()
1313 current->brk_randomized = 1; in load_elf_binary()
1317 if (current->personality & MMAP_PAGE_ZERO) { in load_elf_binary()
1318 /* Why this, you ask??? Well SVr4 maps page 0 as read-only, in load_elf_binary()
1347 START_THREAD(elf_ex, regs, elf_entry, bprm->p); in load_elf_binary()
1366 /* This is really simpleminded and specialized - we are loading an
1375 error = -ENOEXEC; in load_elf_library()
1385 !elf_check_arch(&elf_ex) || !file->f_op->mmap) in load_elf_library()
1395 error = -ENOMEM; in load_elf_library()
1401 error = -ENOEXEC; in load_elf_library()
1407 if ((eppnt + i)->p_type == PT_LOAD) in load_elf_library()
1412 while (eppnt->p_type != PT_LOAD) in load_elf_library()
1416 error = elf_load(file, ELF_PAGESTART(eppnt->p_vaddr), in load_elf_library()
1422 if (error != ELF_PAGESTART(eppnt->p_vaddr)) in load_elf_library()
1456 sz += roundup(strlen(en->name) + 1, 4); in notesize()
1457 sz += roundup(en->datasz, 4); in notesize()
1465 en.n_namesz = strlen(men->name) + 1; in writenote()
1466 en.n_descsz = men->datasz; in writenote()
1467 en.n_type = men->type; in writenote()
1470 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) && in writenote()
1471 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4); in writenote()
1479 memcpy(elf->e_ident, ELFMAG, SELFMAG); in fill_elf_header()
1480 elf->e_ident[EI_CLASS] = ELF_CLASS; in fill_elf_header()
1481 elf->e_ident[EI_DATA] = ELF_DATA; in fill_elf_header()
1482 elf->e_ident[EI_VERSION] = EV_CURRENT; in fill_elf_header()
1483 elf->e_ident[EI_OSABI] = ELF_OSABI; in fill_elf_header()
1485 elf->e_type = ET_CORE; in fill_elf_header()
1486 elf->e_machine = machine; in fill_elf_header()
1487 elf->e_version = EV_CURRENT; in fill_elf_header()
1488 elf->e_phoff = sizeof(struct elfhdr); in fill_elf_header()
1489 elf->e_flags = flags; in fill_elf_header()
1490 elf->e_ehsize = sizeof(struct elfhdr); in fill_elf_header()
1491 elf->e_phentsize = sizeof(struct elf_phdr); in fill_elf_header()
1492 elf->e_phnum = segs; in fill_elf_header()
1497 phdr->p_type = PT_NOTE; in fill_elf_note_phdr()
1498 phdr->p_offset = offset; in fill_elf_note_phdr()
1499 phdr->p_vaddr = 0; in fill_elf_note_phdr()
1500 phdr->p_paddr = 0; in fill_elf_note_phdr()
1501 phdr->p_filesz = sz; in fill_elf_note_phdr()
1502 phdr->p_memsz = 0; in fill_elf_note_phdr()
1503 phdr->p_flags = 0; in fill_elf_note_phdr()
1504 phdr->p_align = 4; in fill_elf_note_phdr()
1510 note->name = name; in fill_note()
1511 note->type = type; in fill_note()
1512 note->datasz = sz; in fill_note()
1513 note->data = data; in fill_note()
1523 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr; in fill_prstatus()
1524 prstatus->pr_sigpend = p->pending.signal.sig[0]; in fill_prstatus()
1525 prstatus->pr_sighold = p->blocked.sig[0]; in fill_prstatus()
1527 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent)); in fill_prstatus()
1529 prstatus->pr_pid = task_pid_vnr(p); in fill_prstatus()
1530 prstatus->pr_pgrp = task_pgrp_vnr(p); in fill_prstatus()
1531 prstatus->pr_sid = task_session_vnr(p); in fill_prstatus()
1537 * group-wide total, not its individual thread total. in fill_prstatus()
1540 prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime); in fill_prstatus()
1541 prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime); in fill_prstatus()
1546 prstatus->pr_utime = ns_to_kernel_old_timeval(utime); in fill_prstatus()
1547 prstatus->pr_stime = ns_to_kernel_old_timeval(stime); in fill_prstatus()
1550 prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime); in fill_prstatus()
1551 prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime); in fill_prstatus()
1564 len = mm->arg_end - mm->arg_start; in fill_psinfo()
1566 len = ELF_PRARGSZ-1; in fill_psinfo()
1567 if (copy_from_user(&psinfo->pr_psargs, in fill_psinfo()
1568 (const char __user *)mm->arg_start, len)) in fill_psinfo()
1569 return -EFAULT; in fill_psinfo()
1571 if (psinfo->pr_psargs[i] == 0) in fill_psinfo()
1572 psinfo->pr_psargs[i] = ' '; in fill_psinfo()
1573 psinfo->pr_psargs[len] = 0; in fill_psinfo()
1576 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent)); in fill_psinfo()
1578 psinfo->pr_pid = task_pid_vnr(p); in fill_psinfo()
1579 psinfo->pr_pgrp = task_pgrp_vnr(p); in fill_psinfo()
1580 psinfo->pr_sid = task_session_vnr(p); in fill_psinfo()
1582 state = READ_ONCE(p->__state); in fill_psinfo()
1584 psinfo->pr_state = i; in fill_psinfo()
1585 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i]; in fill_psinfo()
1586 psinfo->pr_zomb = psinfo->pr_sname == 'Z'; in fill_psinfo()
1587 psinfo->pr_nice = task_nice(p); in fill_psinfo()
1588 psinfo->pr_flag = p->flags; in fill_psinfo()
1591 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid)); in fill_psinfo()
1592 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid)); in fill_psinfo()
1594 get_task_comm(psinfo->pr_fname, p); in fill_psinfo()
1601 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv; in fill_auxv_note()
1605 while (auxv[i - 2] != AT_NULL); in fill_auxv_note()
1619 * long count -- how many files are mapped
1620 * long page_size -- units for file_ofs
1636 count = cprm->vma_count; in fill_files_note()
1638 return -EINVAL; in fill_files_note()
1647 return -EINVAL; in fill_files_note()
1656 return -ENOMEM; in fill_files_note()
1660 remaining = size - names_ofs; in fill_files_note()
1662 for (i = 0; i < cprm->vma_count; i++) { in fill_files_note()
1663 struct core_vma_metadata *m = &cprm->vma_meta[i]; in fill_files_note()
1667 file = m->file; in fill_files_note()
1672 if (PTR_ERR(filename) == -ENAMETOOLONG) { in fill_files_note()
1682 n = (name_curpos + remaining) - filename; in fill_files_note()
1683 remaining = filename - name_curpos; in fill_files_note()
1687 *start_end_ofs++ = m->start; in fill_files_note()
1688 *start_end_ofs++ = m->end; in fill_files_note()
1689 *start_end_ofs++ = m->pgoff; in fill_files_note()
1697 * Count usually is less than mm->map_count, in fill_files_note()
1700 n = cprm->vma_count - count; in fill_files_note()
1703 memmove(name_base - shift_bytes, name_base, in fill_files_note()
1704 name_curpos - name_base); in fill_files_note()
1705 name_curpos -= shift_bytes; in fill_files_note()
1708 size = name_curpos - (char *)data; in fill_files_note()
1742 if (regset->writeback) in do_thread_regset_writeback()
1743 regset->writeback(task, regset, 1); in do_thread_regset_writeback()
1751 #define SET_PR_FPVALID(S) ((S)->pr_fpvalid = 1)
1766 fill_prstatus(&t->prstatus.common, t->task, signr); in fill_thread_core_info()
1767 regset_get(t->task, &view->regsets[0], in fill_thread_core_info()
1768 sizeof(t->prstatus.pr_reg), &t->prstatus.pr_reg); in fill_thread_core_info()
1770 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, in fill_thread_core_info()
1771 PRSTATUS_SIZE, &t->prstatus); in fill_thread_core_info()
1772 info->size += notesize(&t->notes[0]); in fill_thread_core_info()
1774 do_thread_regset_writeback(t->task, &view->regsets[0]); in fill_thread_core_info()
1781 for (view_iter = 1; view_iter < view->n; ++view_iter) { in fill_thread_core_info()
1782 const struct user_regset *regset = &view->regsets[view_iter]; in fill_thread_core_info()
1783 int note_type = regset->core_note_type; in fill_thread_core_info()
1788 do_thread_regset_writeback(t->task, regset); in fill_thread_core_info()
1791 if (regset->active && regset->active(t->task, regset) <= 0) in fill_thread_core_info()
1794 ret = regset_get_alloc(t->task, regset, ~0U, &data); in fill_thread_core_info()
1798 if (WARN_ON_ONCE(note_iter >= info->thread_notes)) in fill_thread_core_info()
1802 SET_PR_FPVALID(&t->prstatus); in fill_thread_core_info()
1804 fill_note(&t->notes[note_iter], is_fpreg ? "CORE" : "LINUX", in fill_thread_core_info()
1807 info->size += notesize(&t->notes[note_iter]); in fill_thread_core_info()
1818 struct task_struct *p = t->task; in fill_thread_core_info()
1821 fill_prstatus(&t->prstatus.common, p, signr); in fill_thread_core_info()
1822 elf_core_copy_task_regs(p, &t->prstatus.pr_reg); in fill_thread_core_info()
1824 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus), in fill_thread_core_info()
1825 &(t->prstatus)); in fill_thread_core_info()
1826 info->size += notesize(&t->notes[0]); in fill_thread_core_info()
1834 t->prstatus.pr_fpvalid = 1; in fill_thread_core_info()
1835 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(*fpu), fpu); in fill_thread_core_info()
1836 info->size += notesize(&t->notes[1]); in fill_thread_core_info()
1855 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo); in fill_note_info()
1863 info->thread_notes = 0; in fill_note_info()
1864 for (int i = 0; i < view->n; ++i) in fill_note_info()
1865 if (view->regsets[i].core_note_type != 0) in fill_note_info()
1866 ++info->thread_notes; in fill_note_info()
1872 if (unlikely(info->thread_notes == 0) || in fill_note_info()
1873 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) { in fill_note_info()
1882 view->e_machine, view->e_flags); in fill_note_info()
1885 info->thread_notes = 2; in fill_note_info()
1892 info->thread = kzalloc(offsetof(struct elf_thread_core_info, in fill_note_info()
1893 notes[info->thread_notes]), in fill_note_info()
1895 if (unlikely(!info->thread)) in fill_note_info()
1898 info->thread->task = dump_task; in fill_note_info()
1899 for (ct = dump_task->signal->core_state->dumper.next; ct; ct = ct->next) { in fill_note_info()
1901 notes[info->thread_notes]), in fill_note_info()
1906 t->task = ct->task; in fill_note_info()
1907 t->next = info->thread->next; in fill_note_info()
1908 info->thread->next = t; in fill_note_info()
1914 for (t = info->thread; t != NULL; t = t->next) in fill_note_info()
1915 if (!fill_thread_core_info(t, view, cprm->siginfo->si_signo, info)) in fill_note_info()
1919 * Fill in the two process-wide notes. in fill_note_info()
1921 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm); in fill_note_info()
1922 info->size += notesize(&info->psinfo); in fill_note_info()
1924 fill_siginfo_note(&info->signote, &info->csigdata, cprm->siginfo); in fill_note_info()
1925 info->size += notesize(&info->signote); in fill_note_info()
1927 fill_auxv_note(&info->auxv, current->mm); in fill_note_info()
1928 info->size += notesize(&info->auxv); in fill_note_info()
1930 if (fill_files_note(&info->files, cprm) == 0) in fill_note_info()
1931 info->size += notesize(&info->files); in fill_note_info()
1938 * process-wide notes are interleaved after the first thread-specific note.
1944 struct elf_thread_core_info *t = info->thread; in write_note_info()
1949 if (!writenote(&t->notes[0], cprm)) in write_note_info()
1952 if (first && !writenote(&info->psinfo, cprm)) in write_note_info()
1954 if (first && !writenote(&info->signote, cprm)) in write_note_info()
1956 if (first && !writenote(&info->auxv, cprm)) in write_note_info()
1958 if (first && info->files.data && in write_note_info()
1959 !writenote(&info->files, cprm)) in write_note_info()
1962 for (i = 1; i < info->thread_notes; ++i) in write_note_info()
1963 if (t->notes[i].data && in write_note_info()
1964 !writenote(&t->notes[i], cprm)) in write_note_info()
1968 t = t->next; in write_note_info()
1976 struct elf_thread_core_info *threads = info->thread; in free_note_info()
1980 threads = t->next; in free_note_info()
1981 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus); in free_note_info()
1982 for (i = 1; i < info->thread_notes; ++i) in free_note_info()
1983 kvfree(t->notes[i].data); in free_note_info()
1986 kfree(info->psinfo.data); in free_note_info()
1987 kvfree(info->files.data); in free_note_info()
1993 elf->e_shoff = e_shoff; in fill_extnum_info()
1994 elf->e_shentsize = sizeof(*shdr4extnum); in fill_extnum_info()
1995 elf->e_shnum = 1; in fill_extnum_info()
1996 elf->e_shstrndx = SHN_UNDEF; in fill_extnum_info()
2000 shdr4extnum->sh_type = SHT_NULL; in fill_extnum_info()
2001 shdr4extnum->sh_size = elf->e_shnum; in fill_extnum_info()
2002 shdr4extnum->sh_link = elf->e_shstrndx; in fill_extnum_info()
2003 shdr4extnum->sh_info = segs; in fill_extnum_info()
2009 * This is a two-pass process; first we find the offsets of the bits,
2029 segs = cprm->vma_count + elf_core_extra_phdrs(cprm); in elf_core_dump()
2040 * Collect all the non-memory information about the process for the in elf_core_dump()
2068 offset += cprm->vma_data_size; in elf_core_dump()
2088 for (i = 0; i < cprm->vma_count; i++) { in elf_core_dump()
2089 struct core_vma_metadata *meta = cprm->vma_meta + i; in elf_core_dump()
2094 phdr.p_vaddr = meta->start; in elf_core_dump()
2096 phdr.p_filesz = meta->dump_size; in elf_core_dump()
2097 phdr.p_memsz = meta->end - meta->start; in elf_core_dump()
2100 if (meta->flags & VM_READ) in elf_core_dump()
2102 if (meta->flags & VM_WRITE) in elf_core_dump()
2104 if (meta->flags & VM_EXEC) in elf_core_dump()
2126 for (i = 0; i < cprm->vma_count; i++) { in elf_core_dump()
2127 struct core_vma_metadata *meta = cprm->vma_meta + i; in elf_core_dump()
2129 if (!dump_user_range(cprm, meta->start, meta->dump_size)) in elf_core_dump()