Lines Matching +full:lock +full:- +full:pr
1 /* This is the Linux kernel elf-loading code, ported into user space */
10 #include "user/tswap-target.h"
11 #include "user/page-protection.h"
12 #include "exec/page-protection.h"
13 #include "exec/mmap-lock.h"
14 #include "exec/translation-block.h"
16 #include "user/guest-base.h"
17 #include "user-internals.h"
18 #include "signal-common.h"
20 #include "user-mmap.h"
25 #include "qemu/guest-random.h"
30 #include "qemu/error-report.h"
35 #include "target/arm/cpu-features.h"
105 PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */
106 PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */
107 PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */
123 return info->personality == PER_LINUX_FDPIC; in info_is_fdpic()
167 return cpu->env.features[FEAT_1_EDX]; in get_elf_hwcap()
178 regs->rax = 0; in init_thread()
179 regs->rsp = infop->start_stack; in init_thread()
180 regs->rip = infop->entry; in init_thread()
195 (*regs)[0] = tswapreg(env->regs[15]); in elf_core_copy_regs()
196 (*regs)[1] = tswapreg(env->regs[14]); in elf_core_copy_regs()
197 (*regs)[2] = tswapreg(env->regs[13]); in elf_core_copy_regs()
198 (*regs)[3] = tswapreg(env->regs[12]); in elf_core_copy_regs()
199 (*regs)[4] = tswapreg(env->regs[R_EBP]); in elf_core_copy_regs()
200 (*regs)[5] = tswapreg(env->regs[R_EBX]); in elf_core_copy_regs()
201 (*regs)[6] = tswapreg(env->regs[11]); in elf_core_copy_regs()
202 (*regs)[7] = tswapreg(env->regs[10]); in elf_core_copy_regs()
203 (*regs)[8] = tswapreg(env->regs[9]); in elf_core_copy_regs()
204 (*regs)[9] = tswapreg(env->regs[8]); in elf_core_copy_regs()
205 (*regs)[10] = tswapreg(env->regs[R_EAX]); in elf_core_copy_regs()
206 (*regs)[11] = tswapreg(env->regs[R_ECX]); in elf_core_copy_regs()
207 (*regs)[12] = tswapreg(env->regs[R_EDX]); in elf_core_copy_regs()
208 (*regs)[13] = tswapreg(env->regs[R_ESI]); in elf_core_copy_regs()
209 (*regs)[14] = tswapreg(env->regs[R_EDI]); in elf_core_copy_regs()
210 (*regs)[15] = tswapreg(get_task_state(env_cpu_const(env))->orig_ax); in elf_core_copy_regs()
211 (*regs)[16] = tswapreg(env->eip); in elf_core_copy_regs()
212 (*regs)[17] = tswapreg(env->segs[R_CS].selector & 0xffff); in elf_core_copy_regs()
213 (*regs)[18] = tswapreg(env->eflags); in elf_core_copy_regs()
214 (*regs)[19] = tswapreg(env->regs[R_ESP]); in elf_core_copy_regs()
215 (*regs)[20] = tswapreg(env->segs[R_SS].selector & 0xffff); in elf_core_copy_regs()
216 (*regs)[21] = tswapreg(env->segs[R_FS].selector & 0xffff); in elf_core_copy_regs()
217 (*regs)[22] = tswapreg(env->segs[R_GS].selector & 0xffff); in elf_core_copy_regs()
218 (*regs)[23] = tswapreg(env->segs[R_DS].selector & 0xffff); in elf_core_copy_regs()
219 (*regs)[24] = tswapreg(env->segs[R_ES].selector & 0xffff); in elf_core_copy_regs()
220 (*regs)[25] = tswapreg(env->segs[R_FS].selector & 0xffff); in elf_core_copy_regs()
221 (*regs)[26] = tswapreg(env->segs[R_GS].selector & 0xffff); in elf_core_copy_regs()
232 * has specified -R reserved_va, which would trigger an assert(). in init_guest_commpage()
235 TARGET_VSYSCALL_PAGE + TARGET_PAGE_SIZE - 1 > reserved_va) { in init_guest_commpage()
277 regs->esp = infop->start_stack; in init_thread()
278 regs->eip = infop->entry; in init_thread()
280 /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program in init_thread()
287 regs->edx = 0; in init_thread()
302 (*regs)[0] = tswapreg(env->regs[R_EBX]); in elf_core_copy_regs()
303 (*regs)[1] = tswapreg(env->regs[R_ECX]); in elf_core_copy_regs()
304 (*regs)[2] = tswapreg(env->regs[R_EDX]); in elf_core_copy_regs()
305 (*regs)[3] = tswapreg(env->regs[R_ESI]); in elf_core_copy_regs()
306 (*regs)[4] = tswapreg(env->regs[R_EDI]); in elf_core_copy_regs()
307 (*regs)[5] = tswapreg(env->regs[R_EBP]); in elf_core_copy_regs()
308 (*regs)[6] = tswapreg(env->regs[R_EAX]); in elf_core_copy_regs()
309 (*regs)[7] = tswapreg(env->segs[R_DS].selector & 0xffff); in elf_core_copy_regs()
310 (*regs)[8] = tswapreg(env->segs[R_ES].selector & 0xffff); in elf_core_copy_regs()
311 (*regs)[9] = tswapreg(env->segs[R_FS].selector & 0xffff); in elf_core_copy_regs()
312 (*regs)[10] = tswapreg(env->segs[R_GS].selector & 0xffff); in elf_core_copy_regs()
313 (*regs)[11] = tswapreg(get_task_state(env_cpu_const(env))->orig_ax); in elf_core_copy_regs()
314 (*regs)[12] = tswapreg(env->eip); in elf_core_copy_regs()
315 (*regs)[13] = tswapreg(env->segs[R_CS].selector & 0xffff); in elf_core_copy_regs()
316 (*regs)[14] = tswapreg(env->eflags); in elf_core_copy_regs()
317 (*regs)[15] = tswapreg(env->regs[R_ESP]); in elf_core_copy_regs()
318 (*regs)[16] = tswapreg(env->segs[R_SS].selector & 0xffff); in elf_core_copy_regs()
329 NEW_AUX_ENT(AT_SYSINFO, vdso_info->entry); \
354 abi_long stack = infop->start_stack; in init_thread()
357 regs->uregs[16] = ARM_CPU_MODE_USR; in init_thread()
358 if (infop->entry & 1) { in init_thread()
359 regs->uregs[16] |= CPSR_T; in init_thread()
361 regs->uregs[15] = infop->entry & 0xfffffffe; in init_thread()
362 regs->uregs[13] = infop->start_stack; in init_thread()
363 /* FIXME - what to for failure of get_user()? */ in init_thread()
364 get_user_ual(regs->uregs[2], stack + 8); /* envp */ in init_thread()
365 get_user_ual(regs->uregs[1], stack + 4); /* envp */ in init_thread()
367 regs->uregs[0] = 0; in init_thread()
370 regs->uregs[10] = infop->start_data; in init_thread()
380 regs->uregs[7] = infop->loadmap_addr; in init_thread()
381 if (infop->interpreter_loadmap_addr) { in init_thread()
383 regs->uregs[8] = infop->interpreter_loadmap_addr; in init_thread()
384 regs->uregs[9] = infop->interpreter_pt_dynamic_addr; in init_thread()
386 regs->uregs[8] = 0; in init_thread()
387 regs->uregs[9] = infop->pt_dynamic_addr; in init_thread()
397 (*regs)[0] = tswapreg(env->regs[0]); in elf_core_copy_regs()
398 (*regs)[1] = tswapreg(env->regs[1]); in elf_core_copy_regs()
399 (*regs)[2] = tswapreg(env->regs[2]); in elf_core_copy_regs()
400 (*regs)[3] = tswapreg(env->regs[3]); in elf_core_copy_regs()
401 (*regs)[4] = tswapreg(env->regs[4]); in elf_core_copy_regs()
402 (*regs)[5] = tswapreg(env->regs[5]); in elf_core_copy_regs()
403 (*regs)[6] = tswapreg(env->regs[6]); in elf_core_copy_regs()
404 (*regs)[7] = tswapreg(env->regs[7]); in elf_core_copy_regs()
405 (*regs)[8] = tswapreg(env->regs[8]); in elf_core_copy_regs()
406 (*regs)[9] = tswapreg(env->regs[9]); in elf_core_copy_regs()
407 (*regs)[10] = tswapreg(env->regs[10]); in elf_core_copy_regs()
408 (*regs)[11] = tswapreg(env->regs[11]); in elf_core_copy_regs()
409 (*regs)[12] = tswapreg(env->regs[12]); in elf_core_copy_regs()
410 (*regs)[13] = tswapreg(env->regs[13]); in elf_core_copy_regs()
411 (*regs)[14] = tswapreg(env->regs[14]); in elf_core_copy_regs()
412 (*regs)[15] = tswapreg(env->regs[15]); in elf_core_copy_regs()
415 (*regs)[17] = tswapreg(env->regs[0]); /* XXX */ in elf_core_copy_regs()
476 * M-profile allocates maximum of 2GB address space, so can never in init_guest_commpage()
479 if (arm_feature(&cpu->env, ARM_FEATURE_M)) { in init_guest_commpage()
483 commpage = HI_COMMPAGE & -host_page_size; in init_guest_commpage()
488 -1, 0); in init_guest_commpage()
506 page_set_flags(commpage, commpage | (host_page_size - 1), in init_guest_commpage()
526 do { if (arm_feature(&cpu->env, feat)) { hwcaps |= hwcap; } } while (0) in get_elf_hwcap()
668 #include "vdso-be8.c.inc"
669 #include "vdso-be32.c.inc"
680 # define VDSO_HEADER "vdso-le.c.inc"
697 abi_long stack = infop->start_stack; in init_thread()
700 regs->pc = infop->entry & ~0x3ULL; in init_thread()
701 regs->sp = stack; in init_thread()
713 (*regs)[i] = tswapreg(env->xregs[i]); in elf_core_copy_regs()
715 (*regs)[32] = tswapreg(env->pc); in elf_core_copy_regs()
1052 # define VDSO_HEADER "vdso-be.c.inc"
1054 # define VDSO_HEADER "vdso-le.c.inc"
1080 /* There are not many sparc32 hwcap bits -- we have all of them. */ in get_elf_hwcap()
1086 uint32_t features = env->def.features; in get_elf_hwcap()
1108 regs->pc = infop->entry; in init_thread()
1109 regs->npc = regs->pc + 4; in init_thread()
1110 regs->y = 0; in init_thread()
1111 regs->u_regs[14] = (infop->start_stack - 16 * sizeof(abi_ulong) in init_thread()
1112 - TARGET_STACK_BIAS); in init_thread()
1178 QEMU_PPC_FEATURE2_HAS_IEEE128 = 0x00400000, /* VSX IEEE Bin Float 128-bit */
1183 QEMU_PPC_FEATURE2_MMA = 0x00020000, /* Matrix-Multiply Assist */
1196 do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0) in get_elf_hwcap()
1199 if ((cpu->env.insns_flags2 & flags) == flags) { \ in get_elf_hwcap()
1230 do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0) in get_elf_hwcap2()
1232 do { if (cpu->env.insns_flags2 & flag) { features |= feature; } } while (0) in get_elf_hwcap2()
1252 * - keep the final alignment of sp (sp & 0xf)
1253 * - make sure the 32-bit value at the first 16 byte aligned position of
1256 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
1269 NEW_AUX_ENT(AT_DCACHEBSIZE, cpu->env.dcache_line_size); \
1270 NEW_AUX_ENT(AT_ICACHEBSIZE, cpu->env.icache_line_size); \
1276 _regs->gpr[1] = infop->start_stack; in init_thread()
1280 get_user_u64(val, infop->entry + 8); in init_thread()
1281 _regs->gpr[2] = val + infop->load_bias; in init_thread()
1282 get_user_u64(val, infop->entry); in init_thread()
1283 infop->entry = val + infop->load_bias; in init_thread()
1285 _regs->gpr[12] = infop->entry; /* r12 set to global entry address */ in init_thread()
1288 _regs->nip = infop->entry; in init_thread()
1300 for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { in elf_core_copy_regs()
1301 (*regs)[i] = tswapreg(env->gpr[i]); in elf_core_copy_regs()
1304 (*regs)[32] = tswapreg(env->nip); in elf_core_copy_regs()
1305 (*regs)[33] = tswapreg(env->msr); in elf_core_copy_regs()
1306 (*regs)[35] = tswapreg(env->ctr); in elf_core_copy_regs()
1307 (*regs)[36] = tswapreg(env->lr); in elf_core_copy_regs()
1318 # define VDSO_HEADER "vdso-32.c.inc"
1320 # define VDSO_HEADER "vdso-64.c.inc"
1322 # define VDSO_HEADER "vdso-64le.c.inc"
1341 regs->csr.crmd = 2 << 3; in init_thread()
1342 regs->csr.era = infop->entry; in init_thread()
1343 regs->regs[3] = infop->start_stack; in init_thread()
1363 for (i = 1; i < ARRAY_SIZE(env->gpr); i++) { in elf_core_copy_regs()
1364 (*regs)[TARGET_EF_R0 + i] = tswapreg(env->gpr[i]); in elf_core_copy_regs()
1367 (*regs)[TARGET_EF_CSR_ERA] = tswapreg(env->pc); in elf_core_copy_regs()
1368 (*regs)[TARGET_EF_CSR_BADV] = tswapreg(env->CSR_BADV); in elf_core_copy_regs()
1400 if (FIELD_EX32(cpu->env.cpucfg[1], CPUCFG1, UAL)) { in get_elf_hwcap()
1404 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, FP)) { in get_elf_hwcap()
1408 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LAM)) { in get_elf_hwcap()
1412 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) { in get_elf_hwcap()
1416 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LASX)) { in get_elf_hwcap()
1446 do { if ((cpu->env.insn_flags & (_flags)) == _flags) \
1477 regs->cp0_status = 2 << CP0St_KSU; in init_thread()
1478 regs->cp0_epc = infop->entry; in init_thread()
1479 regs->regs[29] = infop->start_stack; in init_thread()
1513 for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) { in elf_core_copy_regs()
1514 (*regs)[TARGET_EF_R0 + i] = tswapreg(env->active_tc.gpr[i]); in elf_core_copy_regs()
1519 (*regs)[TARGET_EF_LO] = tswapreg(env->active_tc.LO[0]); in elf_core_copy_regs()
1520 (*regs)[TARGET_EF_HI] = tswapreg(env->active_tc.HI[0]); in elf_core_copy_regs()
1521 (*regs)[TARGET_EF_CP0_EPC] = tswapreg(env->active_tc.PC); in elf_core_copy_regs()
1522 (*regs)[TARGET_EF_CP0_BADVADDR] = tswapreg(env->CP0_BadVAddr); in elf_core_copy_regs()
1523 (*regs)[TARGET_EF_CP0_STATUS] = tswapreg(env->CP0_Status); in elf_core_copy_regs()
1524 (*regs)[TARGET_EF_CP0_CAUSE] = tswapreg(env->CP0_Cause); in elf_core_copy_regs()
1552 do { if (cpu->env.insn_flags & (_flag)) { hwcaps |= _hwcap; } } while (0)
1555 do { if (cpu->env._reg & (_mask)) { hwcaps |= _hwcap; } } while (0)
1559 if (extract32(cpu->env._reg, (_start), (_length)) == (_val)) { \
1594 regs->pc = infop->entry; in init_thread()
1595 regs->r1 = infop->start_stack; in init_thread()
1611 (*regs)[pos++] = tswapreg(env->regs[i]); in elf_core_copy_regs()
1614 (*regs)[pos++] = tswapreg(env->pc); in elf_core_copy_regs()
1617 (*regs)[pos++] = tswapreg(env->ear); in elf_core_copy_regs()
1619 (*regs)[pos++] = tswapreg(env->esr); in elf_core_copy_regs()
1633 regs->pc = infop->entry; in init_thread()
1634 regs->gpr[1] = infop->start_stack; in init_thread()
1652 (*regs)[32] = tswapreg(env->pc); in elf_core_copy_regs()
1669 regs->pc = infop->entry; in init_thread()
1670 regs->regs[15] = infop->start_stack; in init_thread()
1694 (*regs)[i] = tswapreg(env->gregs[i]); in elf_core_copy_regs()
1697 (*regs)[TARGET_REG_PC] = tswapreg(env->pc); in elf_core_copy_regs()
1698 (*regs)[TARGET_REG_PR] = tswapreg(env->pr); in elf_core_copy_regs()
1699 (*regs)[TARGET_REG_SR] = tswapreg(env->sr); in elf_core_copy_regs()
1700 (*regs)[TARGET_REG_GBR] = tswapreg(env->gbr); in elf_core_copy_regs()
1701 (*regs)[TARGET_REG_MACH] = tswapreg(env->mach); in elf_core_copy_regs()
1702 (*regs)[TARGET_REG_MACL] = tswapreg(env->macl); in elf_core_copy_regs()
1713 SH_CPU_HAS_DSP = 0x0008, /* SH-DSP: DSP support */
1718 SH_CPU_HAS_OP32 = 0x0100, /* 32-bit instruction support */
1731 if (cpu->env.features & SH_FEATURE_SH4A) { in get_elf_hwcap()
1751 regs->usp = infop->start_stack; in init_thread()
1752 regs->sr = 0; in init_thread()
1753 regs->pc = infop->entry; in init_thread()
1762 (*regs)[0] = tswapreg(env->dregs[1]); in elf_core_copy_regs()
1763 (*regs)[1] = tswapreg(env->dregs[2]); in elf_core_copy_regs()
1764 (*regs)[2] = tswapreg(env->dregs[3]); in elf_core_copy_regs()
1765 (*regs)[3] = tswapreg(env->dregs[4]); in elf_core_copy_regs()
1766 (*regs)[4] = tswapreg(env->dregs[5]); in elf_core_copy_regs()
1767 (*regs)[5] = tswapreg(env->dregs[6]); in elf_core_copy_regs()
1768 (*regs)[6] = tswapreg(env->dregs[7]); in elf_core_copy_regs()
1769 (*regs)[7] = tswapreg(env->aregs[0]); in elf_core_copy_regs()
1770 (*regs)[8] = tswapreg(env->aregs[1]); in elf_core_copy_regs()
1771 (*regs)[9] = tswapreg(env->aregs[2]); in elf_core_copy_regs()
1772 (*regs)[10] = tswapreg(env->aregs[3]); in elf_core_copy_regs()
1773 (*regs)[11] = tswapreg(env->aregs[4]); in elf_core_copy_regs()
1774 (*regs)[12] = tswapreg(env->aregs[5]); in elf_core_copy_regs()
1775 (*regs)[13] = tswapreg(env->aregs[6]); in elf_core_copy_regs()
1776 (*regs)[14] = tswapreg(env->dregs[0]); in elf_core_copy_regs()
1777 (*regs)[15] = tswapreg(env->aregs[7]); in elf_core_copy_regs()
1778 (*regs)[16] = tswapreg(env->dregs[0]); /* FIXME: orig_d0 */ in elf_core_copy_regs()
1779 (*regs)[17] = tswapreg(env->sr); in elf_core_copy_regs()
1780 (*regs)[18] = tswapreg(env->pc); in elf_core_copy_regs()
1781 (*regs)[19] = 0; /* FIXME: regs->format | regs->vector */ in elf_core_copy_regs()
1797 regs->pc = infop->entry; in init_thread()
1798 regs->ps = 8; in init_thread()
1799 regs->usp = infop->start_stack; in init_thread()
1823 * 31-bit processes can use 64-bit registers (high gprs). in get_elf_hwcap()
1874 regs->psw.addr = infop->entry; in init_thread()
1875 regs->psw.mask = PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | \ in init_thread()
1878 regs->gprs[15] = infop->start_stack; in init_thread()
1899 (*regs)[TARGET_REG_PSWM] = tswapreg(env->psw.mask); in elf_core_copy_regs()
1900 (*regs)[TARGET_REG_PSWA] = tswapreg(env->psw.addr); in elf_core_copy_regs()
1902 (*regs)[TARGET_REG_GPRS + i] = tswapreg(env->regs[i]); in elf_core_copy_regs()
1906 aregs[i] = tswap32(env->aregs[i]); in elf_core_copy_regs()
1924 #define VDSO_HEADER "vdso-32.c.inc"
1927 #define VDSO_HEADER "vdso-64.c.inc"
1934 #define MISA_BIT(EXT) (1 << (EXT - 'A')) in get_elf_hwcap()
1940 return cpu->env.misa_ext & mask; in get_elf_hwcap()
1947 regs->sepc = infop->entry; in init_thread()
1948 regs->sp = infop->start_stack; in init_thread()
1968 regs->iaoq[0] = infop->entry | PRIV_USER; in init_thread()
1969 regs->iaoq[1] = regs->iaoq[0] + 4; in init_thread()
1970 regs->gr[23] = 0; in init_thread()
1971 regs->gr[24] = infop->argv; in init_thread()
1972 regs->gr[25] = infop->argc; in init_thread()
1973 /* The top-of-stack contains a linkage buffer. */ in init_thread()
1974 regs->gr[30] = infop->start_stack + 64; in init_thread()
1975 regs->gr[31] = infop->entry; in init_thread()
1988 MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED_NOREPLACE, -1, 0); in init_guest_commpage()
2020 regs->windowbase = 0; in init_thread()
2021 regs->windowstart = 1; in init_thread()
2022 regs->areg[1] = infop->start_stack; in init_thread()
2023 regs->pc = infop->entry; in init_thread()
2025 regs->areg[4] = infop->loadmap_addr; in init_thread()
2026 regs->areg[5] = infop->interpreter_loadmap_addr; in init_thread()
2027 if (infop->interpreter_loadmap_addr) { in init_thread()
2028 regs->areg[6] = infop->interpreter_pt_dynamic_addr; in init_thread()
2030 regs->areg[6] = infop->pt_dynamic_addr; in init_thread()
2057 (*regs)[TARGET_REG_PC] = tswapreg(env->pc); in elf_core_copy_regs()
2058 (*regs)[TARGET_REG_PS] = tswapreg(env->sregs[PS] & ~PS_EXCM); in elf_core_copy_regs()
2059 (*regs)[TARGET_REG_LBEG] = tswapreg(env->sregs[LBEG]); in elf_core_copy_regs()
2060 (*regs)[TARGET_REG_LEND] = tswapreg(env->sregs[LEND]); in elf_core_copy_regs()
2061 (*regs)[TARGET_REG_LCOUNT] = tswapreg(env->sregs[LCOUNT]); in elf_core_copy_regs()
2062 (*regs)[TARGET_REG_SAR] = tswapreg(env->sregs[SAR]); in elf_core_copy_regs()
2063 (*regs)[TARGET_REG_WINDOWSTART] = tswapreg(env->sregs[WINDOW_START]); in elf_core_copy_regs()
2064 (*regs)[TARGET_REG_WINDOWBASE] = tswapreg(env->sregs[WINDOW_BASE]); in elf_core_copy_regs()
2065 (*regs)[TARGET_REG_THREADPTR] = tswapreg(env->uregs[THREADPTR]); in elf_core_copy_regs()
2067 for (i = 0; i < env->config->nareg; ++i) { in elf_core_copy_regs()
2068 (*regs)[TARGET_REG_AR0 + i] = tswapreg(env->phys_regs[i]); in elf_core_copy_regs()
2085 regs->sepc = infop->entry; in init_thread()
2086 regs->sp = infop->start_stack; in init_thread()
2146 error_setg(errp, "Ill-formed GNU_PROPERTY_AARCH64_FEATURE_1_AND"); in arch_parse_elf_property()
2150 info->note_flags = *data; in arch_parse_elf_property()
2201 bswap16s(&ehdr->e_type); /* Object file type */ in bswap_ehdr()
2202 bswap16s(&ehdr->e_machine); /* Architecture */ in bswap_ehdr()
2203 bswap32s(&ehdr->e_version); /* Object file version */ in bswap_ehdr()
2204 bswaptls(&ehdr->e_entry); /* Entry point virtual address */ in bswap_ehdr()
2205 bswaptls(&ehdr->e_phoff); /* Program header table file offset */ in bswap_ehdr()
2206 bswaptls(&ehdr->e_shoff); /* Section header table file offset */ in bswap_ehdr()
2207 bswap32s(&ehdr->e_flags); /* Processor-specific flags */ in bswap_ehdr()
2208 bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */ in bswap_ehdr()
2209 bswap16s(&ehdr->e_phentsize); /* Program header table entry size */ in bswap_ehdr()
2210 bswap16s(&ehdr->e_phnum); /* Program header table entry count */ in bswap_ehdr()
2211 bswap16s(&ehdr->e_shentsize); /* Section header table entry size */ in bswap_ehdr()
2212 bswap16s(&ehdr->e_shnum); /* Section header table entry count */ in bswap_ehdr()
2213 bswap16s(&ehdr->e_shstrndx); /* Section header string table index */ in bswap_ehdr()
2223 bswap32s(&phdr->p_type); /* Segment type */ in bswap_phdr()
2224 bswap32s(&phdr->p_flags); /* Segment flags */ in bswap_phdr()
2225 bswaptls(&phdr->p_offset); /* Segment file offset */ in bswap_phdr()
2226 bswaptls(&phdr->p_vaddr); /* Segment virtual address */ in bswap_phdr()
2227 bswaptls(&phdr->p_paddr); /* Segment physical address */ in bswap_phdr()
2228 bswaptls(&phdr->p_filesz); /* Segment size in file */ in bswap_phdr()
2229 bswaptls(&phdr->p_memsz); /* Segment size in memory */ in bswap_phdr()
2230 bswaptls(&phdr->p_align); /* Segment alignment */ in bswap_phdr()
2241 bswap32s(&shdr->sh_name); in bswap_shdr()
2242 bswap32s(&shdr->sh_type); in bswap_shdr()
2243 bswaptls(&shdr->sh_flags); in bswap_shdr()
2244 bswaptls(&shdr->sh_addr); in bswap_shdr()
2245 bswaptls(&shdr->sh_offset); in bswap_shdr()
2246 bswaptls(&shdr->sh_size); in bswap_shdr()
2247 bswap32s(&shdr->sh_link); in bswap_shdr()
2248 bswap32s(&shdr->sh_info); in bswap_shdr()
2249 bswaptls(&shdr->sh_addralign); in bswap_shdr()
2250 bswaptls(&shdr->sh_entsize); in bswap_shdr()
2260 bswap32s(&sym->st_name); in bswap_sym()
2261 bswaptls(&sym->st_value); in bswap_sym()
2262 bswaptls(&sym->st_size); in bswap_sym()
2263 bswap16s(&sym->st_shndx); in bswap_sym()
2273 bswap16s(&abiflags->version); in bswap_mips_abiflags()
2274 bswap32s(&abiflags->ases); in bswap_mips_abiflags()
2275 bswap32s(&abiflags->isa_ext); in bswap_mips_abiflags()
2276 bswap32s(&abiflags->flags1); in bswap_mips_abiflags()
2277 bswap32s(&abiflags->flags2); in bswap_mips_abiflags()
2291 return (ehdr->e_ident[EI_MAG0] == ELFMAG0 in elf_check_ident()
2292 && ehdr->e_ident[EI_MAG1] == ELFMAG1 in elf_check_ident()
2293 && ehdr->e_ident[EI_MAG2] == ELFMAG2 in elf_check_ident()
2294 && ehdr->e_ident[EI_MAG3] == ELFMAG3 in elf_check_ident()
2295 && ehdr->e_ident[EI_CLASS] == ELF_CLASS in elf_check_ident()
2296 && ehdr->e_ident[EI_DATA] == ELF_DATA in elf_check_ident()
2297 && ehdr->e_ident[EI_VERSION] == EV_CURRENT); in elf_check_ident()
2304 return (elf_check_arch(ehdr->e_machine) in elf_check_ehdr()
2305 && elf_check_abi(ehdr->e_flags) in elf_check_ehdr()
2306 && ehdr->e_ehsize == sizeof(struct elfhdr) in elf_check_ehdr()
2307 && ehdr->e_phentsize == sizeof(struct elf_phdr) in elf_check_ehdr()
2308 && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)); in elf_check_ehdr()
2325 return 0; /* bullet-proofing */ in copy_elf_strings()
2329 int offset = ((p - 1) % TARGET_PAGE_SIZE) + 1; in copy_elf_strings()
2330 for (i = argc - 1; i >= 0; --i) { in copy_elf_strings()
2334 exit(-1); in copy_elf_strings()
2339 if (len > (p - stack_limit)) { in copy_elf_strings()
2344 tmp -= bytes_to_copy; in copy_elf_strings()
2345 p -= bytes_to_copy; in copy_elf_strings()
2346 offset -= bytes_to_copy; in copy_elf_strings()
2347 len -= bytes_to_copy; in copy_elf_strings()
2352 memcpy_to_target(p, scratch, top - p); in copy_elf_strings()
2359 memcpy_to_target(p, scratch + offset, top - p); in copy_elf_strings()
2362 int remaining = TARGET_PAGE_SIZE - (p % TARGET_PAGE_SIZE); in copy_elf_strings()
2367 exit(-1); in copy_elf_strings()
2370 if (len > (stack_limit - p)) { in copy_elf_strings()
2376 memcpy_fromfs(scratch + (p - top), tmp, bytes_to_copy); in copy_elf_strings()
2379 remaining -= bytes_to_copy; in copy_elf_strings()
2381 len -= bytes_to_copy; in copy_elf_strings()
2384 memcpy_to_target(top, scratch, p - top); in copy_elf_strings()
2391 memcpy_to_target(top, scratch, p - top); in copy_elf_strings()
2427 if (info->exec_stack) { in setup_arg_pages()
2431 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in setup_arg_pages()
2432 if (error == -1) { in setup_arg_pages()
2434 exit(-1); in setup_arg_pages()
2440 info->stack_limit = error + guard; in setup_arg_pages()
2441 return info->stack_limit + size - sizeof(void *); in setup_arg_pages()
2443 info->stack_limit = error + size; in setup_arg_pages()
2461 error_setg(errp, "PT_LOAD with non-writable bss"); in zero_bss()
2480 align_bss -= TARGET_PAGE_SIZE; in zero_bss()
2490 "non-writable page"); in zero_bss()
2495 memset(g2h_untagged(start_bss), 0, align_bss - start_bss); in zero_bss()
2500 target_mmap(align_bss, end_bss - align_bss, prot, in zero_bss()
2501 MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0) == -1) { in zero_bss()
2511 return exec->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC; in elf_is_fdpic()
2516 return exec->e_ident[EI_OSABI] == ELFOSABI_XTENSA_FDPIC; in elf_is_fdpic()
2529 struct elf32_fdpic_loadseg *loadsegs = info->loadsegs; in loader_build_fdpic_loadmap()
2532 n = info->nsegs; in loader_build_fdpic_loadmap()
2533 while (n--) { in loader_build_fdpic_loadmap()
2534 sp -= 12; in loader_build_fdpic_loadmap()
2541 sp -= 4; in loader_build_fdpic_loadmap()
2543 put_user_u16(info->nsegs, sp+2); /* nsegs */ in loader_build_fdpic_loadmap()
2545 info->personality = PER_LINUX_FDPIC; in loader_build_fdpic_loadmap()
2546 info->loadmap_addr = sp; in loader_build_fdpic_loadmap()
2574 info->other_info = interp_info; in create_elf_tables()
2576 interp_info->other_info = info; in create_elf_tables()
2578 info->interpreter_loadmap_addr = interp_info->loadmap_addr; in create_elf_tables()
2579 info->interpreter_pt_dynamic_addr = interp_info->pt_dynamic_addr; in create_elf_tables()
2581 info->interpreter_loadmap_addr = 0; in create_elf_tables()
2582 info->interpreter_pt_dynamic_addr = 0; in create_elf_tables()
2591 sp -= (len + n - 1) & ~(n - 1); in create_elf_tables()
2593 /* FIXME - check return value of memcpy_to_target() for failure */ in create_elf_tables()
2607 sp -= (len + n - 1) & ~(n - 1); in create_elf_tables()
2609 /* FIXME - check return value of memcpy_to_target() for failure */ in create_elf_tables()
2632 sp -= 16; in create_elf_tables()
2634 /* FIXME - check return value of memcpy_to_target() for failure */ in create_elf_tables()
2658 info->auxv_len = size * n; in create_elf_tables()
2666 u_argc = QEMU_ALIGN_DOWN(sp - size, STACK_ALIGNMENT); in create_elf_tables()
2676 info->saved_auxv = u_auxv; in create_elf_tables()
2677 info->argc = argc; in create_elf_tables()
2678 info->envc = envc; in create_elf_tables()
2679 info->argv = u_argv; in create_elf_tables()
2680 info->envp = u_envp; in create_elf_tables()
2698 * on info->auxv_len will trigger. in create_elf_tables()
2700 NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff)); in create_elf_tables()
2702 NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum)); in create_elf_tables()
2704 NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0)); in create_elf_tables()
2706 NEW_AUX_ENT(AT_ENTRY, info->entry); in create_elf_tables()
2715 NEW_AUX_ENT(AT_EXECFN, info->file_string); in create_elf_tables()
2728 NEW_AUX_ENT(AT_SYSINFO_EHDR, vdso_info->load_addr); in create_elf_tables()
2736 assert(info->auxv_len == u_auxv - info->saved_auxv); in create_elf_tables()
2740 p = info->arg_strings; in create_elf_tables()
2748 p = info->env_strings; in create_elf_tables()
2760 #define LO_COMMPAGE -1
2765 #define LO_COMMPAGE -1
2778 * return 0 if it is not available to map, and -1 on mmap error.
2783 size_t size = addr_last - addr + 1; in pgb_try_mmap()
2786 MAP_NORESERVE | MAP_FIXED_NOREPLACE, -1, 0); in pgb_try_mmap()
2790 return errno == EEXIST ? 0 : -1; in pgb_try_mmap()
2810 uintptr_t brk_last = brk + 16 * MiB - 1; in pgb_try_mmap_skip_brk()
2836 for (int i = ga->nbounds - 1; i >= 0; --i) { in pgb_try_mmap_set()
2837 if (pgb_try_mmap_skip_brk(ga->bounds[i][0] + base, in pgb_try_mmap_set()
2838 ga->bounds[i][1] + base, in pgb_try_mmap_set()
2865 if (LO_COMMPAGE != -1 && LO_COMMPAGE < mmap_min_addr) { in pgb_addr_set()
2877 ga->bounds[n][0] = try_identity ? mmap_min_addr : 0; in pgb_addr_set()
2878 ga->bounds[n][1] = reserved_va; in pgb_addr_set()
2883 if (LO_COMMPAGE != -1) { in pgb_addr_set()
2884 ga->bounds[n][0] = 0; in pgb_addr_set()
2885 ga->bounds[n][1] = LO_COMMPAGE + TARGET_PAGE_SIZE - 1; in pgb_addr_set()
2888 ga->bounds[n][0] = 0; in pgb_addr_set()
2889 ga->bounds[n][1] = TARGET_PAGE_SIZE - 1; in pgb_addr_set()
2895 ga->bounds[n][0] = guest_loaddr; in pgb_addr_set()
2896 ga->bounds[n][1] = guest_hiaddr; in pgb_addr_set()
2907 #pragma GCC diagnostic ignored "-Wtype-limits" in pgb_addr_set()
2911 ga->bounds[n][0] = HI_COMMPAGE & qemu_real_host_page_mask(); in pgb_addr_set()
2912 ga->bounds[n][1] = HI_COMMPAGE + TARGET_PAGE_SIZE - 1; in pgb_addr_set()
2918 ga->nbounds = n; in pgb_addr_set()
2925 "(omit the -B option or choose a different value)", in pgb_fail_in_use()
2968 if (base >= -skip) { in pgb_find_fallback()
2969 return -1; in pgb_find_fallback()
2977 for (int i = ga->nbounds - 1; i >= 0; --i) { in pgb_try_itree()
2978 uintptr_t s = base + ga->bounds[i][0]; in pgb_try_itree()
2979 uintptr_t l = base + ga->bounds[i][1]; in pgb_try_itree()
2984 return mmap_min_addr - s; in pgb_try_itree()
2990 return n->last - s + 1; in pgb_try_itree()
3005 return -1; in pgb_find_itree()
3015 return -1; in pgb_find_itree()
3025 return pgb_try_mmap_set(ga, base, brk) ? base : -1; in pgb_find_itree()
3045 * Rebuild the address set for non-identity map. in pgb_dynamic()
3063 b->start = brk; in pgb_dynamic()
3064 b->last = brk + 16 * MiB - 1; in pgb_dynamic()
3071 if (ret == -1) { in pgb_dynamic()
3078 error_printf(" %0*" PRIx64 "-%0*" PRIx64 "\n", in pgb_dynamic()
3148 datasz -= *off; in parse_elf_property()
3157 datasz -= 2 * sizeof(uint32_t); in parse_elf_property()
3182 error_setg(errp, "Ill-formed property in PT_GNU_PROPERTY"); in parse_elf_property()
3207 n = phdr->p_filesz; in parse_elf_properties()
3217 if (!imgsrc_read(¬e, phdr->p_offset, n, src, errp)) { in parse_elf_properties()
3303 phdr = imgsrc_read_alloc(ehdr->e_phoff, in load_elf_image()
3304 ehdr->e_phnum * sizeof(struct elf_phdr), in load_elf_image()
3309 bswap_phdr(phdr, ehdr->e_phnum); in load_elf_image()
3311 info->nsegs = 0; in load_elf_image()
3312 info->pt_dynamic_addr = 0; in load_elf_image()
3320 loaddr = -1, hiaddr = 0; in load_elf_image()
3322 info->exec_stack = EXSTACK_DEFAULT; in load_elf_image()
3323 for (i = 0; i < ehdr->e_phnum; ++i) { in load_elf_image()
3325 if (eppnt->p_type == PT_LOAD) { in load_elf_image()
3326 abi_ulong a = eppnt->p_vaddr & TARGET_PAGE_MASK; in load_elf_image()
3330 a = eppnt->p_vaddr + eppnt->p_memsz - 1; in load_elf_image()
3334 ++info->nsegs; in load_elf_image()
3335 align |= eppnt->p_align; in load_elf_image()
3336 } else if (eppnt->p_type == PT_INTERP && pinterp_name) { in load_elf_image()
3344 interp_name = imgsrc_read_alloc(eppnt->p_offset, eppnt->p_filesz, in load_elf_image()
3349 if (interp_name[eppnt->p_filesz - 1] != 0) { in load_elf_image()
3354 } else if (eppnt->p_type == PT_GNU_PROPERTY) { in load_elf_image()
3358 } else if (eppnt->p_type == PT_GNU_STACK) { in load_elf_image()
3359 info->exec_stack = eppnt->p_flags & PF_X; in load_elf_image()
3368 if (ehdr->e_type == ET_EXEC) { in load_elf_image()
3379 probe_guest_base(image_name, 0, hiaddr - loaddr); in load_elf_image()
3394 load_addr &= -align; in load_elf_image()
3410 * pre-linked, LOAD_ADDR will be non-zero, and the kernel should in load_elf_image()
3416 reserve_size = (size_t)hiaddr - loaddr + 1; in load_elf_image()
3419 if (ehdr->e_type != ET_EXEC && align > qemu_real_host_page_size()) { in load_elf_image()
3420 align_size += align - 1; in load_elf_image()
3425 (ehdr->e_type == ET_EXEC ? MAP_FIXED_NOREPLACE : 0), in load_elf_image()
3426 -1, 0); in load_elf_image()
3427 if (load_addr == -1) { in load_elf_image()
3437 target_munmap(load_addr, align_addr - load_addr); in load_elf_image()
3440 target_munmap(align_end, load_end - align_end); in load_elf_image()
3445 load_bias = load_addr - loaddr; in load_elf_image()
3448 struct elf32_fdpic_loadseg *loadsegs = info->loadsegs = in load_elf_image()
3449 g_malloc(sizeof(*loadsegs) * info->nsegs); in load_elf_image()
3451 for (i = 0; i < ehdr->e_phnum; ++i) { in load_elf_image()
3454 info->pt_dynamic_addr = phdr[i].p_vaddr + load_bias; in load_elf_image()
3457 loadsegs->addr = phdr[i].p_vaddr + load_bias; in load_elf_image()
3458 loadsegs->p_vaddr = phdr[i].p_vaddr; in load_elf_image()
3459 loadsegs->p_memsz = phdr[i].p_memsz; in load_elf_image()
3466 info->load_bias = load_bias; in load_elf_image()
3467 info->code_offset = load_bias; in load_elf_image()
3468 info->data_offset = load_bias; in load_elf_image()
3469 info->load_addr = load_addr; in load_elf_image()
3470 info->entry = ehdr->e_entry + load_bias; in load_elf_image()
3471 info->start_code = -1; in load_elf_image()
3472 info->end_code = 0; in load_elf_image()
3473 info->start_data = -1; in load_elf_image()
3474 info->end_data = 0; in load_elf_image()
3476 info->brk = TARGET_PAGE_ALIGN(hiaddr + load_bias); in load_elf_image()
3477 info->elf_flags = ehdr->e_flags; in load_elf_image()
3492 if ((info->note_flags & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) in load_elf_image()
3499 for (i = 0; i < ehdr->e_phnum; i++) { in load_elf_image()
3501 if (eppnt->p_type == PT_LOAD) { in load_elf_image()
3505 if (eppnt->p_flags & PF_R) { in load_elf_image()
3508 if (eppnt->p_flags & PF_W) { in load_elf_image()
3511 if (eppnt->p_flags & PF_X) { in load_elf_image()
3515 vaddr = load_bias + eppnt->p_vaddr; in load_elf_image()
3519 vaddr_ef = vaddr + eppnt->p_filesz; in load_elf_image()
3520 vaddr_em = vaddr + eppnt->p_memsz; in load_elf_image()
3523 * Some segments may be completely empty, with a non-zero p_memsz in load_elf_image()
3526 if (eppnt->p_filesz != 0) { in load_elf_image()
3527 error = imgsrc_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po, in load_elf_image()
3529 src, eppnt->p_offset - vaddr_po); in load_elf_image()
3530 if (error == -1) { in load_elf_image()
3543 if (vaddr < info->start_code) { in load_elf_image()
3544 info->start_code = vaddr; in load_elf_image()
3546 if (vaddr_ef > info->end_code) { in load_elf_image()
3547 info->end_code = vaddr_ef; in load_elf_image()
3551 if (vaddr < info->start_data) { in load_elf_image()
3552 info->start_data = vaddr; in load_elf_image()
3554 if (vaddr_ef > info->end_data) { in load_elf_image()
3555 info->end_data = vaddr_ef; in load_elf_image()
3559 } else if (eppnt->p_type == PT_MIPS_ABIFLAGS) { in load_elf_image()
3562 if (!imgsrc_read(&abiflags, eppnt->p_offset, sizeof(abiflags), in load_elf_image()
3567 info->fp_abi = abiflags.fp_abi; in load_elf_image()
3572 if (info->end_data == 0) { in load_elf_image()
3573 info->start_data = info->end_code; in load_elf_image()
3574 info->end_data = info->end_code; in load_elf_image()
3581 debuginfo_report_elf(image_name, src->fd, load_bias); in load_elf_image()
3585 close(src->fd); in load_elf_image()
3593 exit(-1); in load_elf_image()
3608 exit(-1); in load_elf_interp()
3615 exit(-1); in load_elf_interp()
3640 src.fd = -1; in load_elf_vdso()
3641 src.cache = vdso->image; in load_elf_vdso()
3642 src.cache_size = vdso->image_size; in load_elf_vdso()
3644 load_elf_image("<internal-vdso>", &src, info, &ehdr, NULL); in load_elf_vdso()
3645 load_addr = info->load_addr; in load_elf_vdso()
3646 load_bias = info->load_bias; in load_elf_vdso()
3652 * We pre-processed the image to locate all of the addresses that need in load_elf_vdso()
3655 for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) { in load_elf_vdso()
3656 abi_ulong *addr = g2h_untagged(load_addr + vdso->relocs[i]); in load_elf_vdso()
3661 if (vdso->sigreturn_ofs) { in load_elf_vdso()
3662 default_sigreturn = load_addr + vdso->sigreturn_ofs; in load_elf_vdso()
3664 if (vdso->rt_sigreturn_ofs) { in load_elf_vdso()
3665 default_rt_sigreturn = load_addr + vdso->rt_sigreturn_ofs; in load_elf_vdso()
3669 target_mprotect(info->start_data, info->end_data - info->start_data, in load_elf_vdso()
3676 __typeof(sym->st_value) addr = *(uint64_t *)s0; in symfind()
3679 if (addr < sym->st_value) { in symfind()
3680 result = -1; in symfind()
3681 } else if (addr >= sym->st_value + sym->st_size) { in symfind()
3690 struct elf_sym *syms = s->disas_symtab.elf32; in lookup_symbolxx()
3692 struct elf_sym *syms = s->disas_symtab.elf64; in lookup_symbolxx()
3698 sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind); in lookup_symbolxx()
3700 return s->disas_strtab + sym->st_name; in lookup_symbolxx()
3711 return (sym0->st_value < sym1->st_value) in symcmp()
3712 ? -1 in symcmp()
3713 : ((sym0->st_value > sym1->st_value) ? 1 : 0); in symcmp()
3727 shnum = hdr->e_shnum; in load_symbols()
3728 shdr = imgsrc_read_alloc(hdr->e_shoff, shnum * sizeof(struct elf_shdr), in load_symbols()
3781 if (i < --nsyms) { in load_symbols()
3816 s->disas_strtab = strings; in load_symbols()
3817 s->disas_num_syms = nsyms; in load_symbols()
3819 s->disas_symtab.elf32 = syms; in load_symbols()
3821 s->disas_symtab.elf64 = syms; in load_symbols()
3823 s->lookup_symbol = lookup_symbolxx; in load_symbols()
3824 s->next = syminfos; in load_symbols()
3842 if (offset == (off_t) -1) { in get_elf_eflags()
3850 if (offset == (off_t) -1) { in get_elf_eflags()
3873 * We will have overwritten the original when we re-use bprm->buf in load_elf_binary()
3887 load_elf_image(bprm->filename, &bprm->src, info, &ehdr, &elf_interpreter); in load_elf_binary()
3891 bprm->p = setup_arg_pages(bprm, info); in load_elf_binary()
3895 bprm->p = copy_elf_strings(1, &bprm->filename, scratch, in load_elf_binary()
3896 bprm->p, info->stack_limit); in load_elf_binary()
3897 info->file_string = bprm->p; in load_elf_binary()
3898 bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch, in load_elf_binary()
3899 bprm->p, info->stack_limit); in load_elf_binary()
3900 info->env_strings = bprm->p; in load_elf_binary()
3901 bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch, in load_elf_binary()
3902 bprm->p, info->stack_limit); in load_elf_binary()
3903 info->arg_strings = bprm->p; in load_elf_binary()
3905 info->arg_strings = bprm->p; in load_elf_binary()
3906 bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch, in load_elf_binary()
3907 bprm->p, info->stack_limit); in load_elf_binary()
3908 info->env_strings = bprm->p; in load_elf_binary()
3909 bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch, in load_elf_binary()
3910 bprm->p, info->stack_limit); in load_elf_binary()
3911 info->file_string = bprm->p; in load_elf_binary()
3912 bprm->p = copy_elf_strings(1, &bprm->filename, scratch, in load_elf_binary()
3913 bprm->p, info->stack_limit); in load_elf_binary()
3918 if (!bprm->p) { in load_elf_binary()
3919 fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG)); in load_elf_binary()
3920 exit(-1); in load_elf_binary()
3924 load_elf_interp(elf_interpreter, &interp_info, bprm->buf); in load_elf_binary()
3934 if (interp_info.brk > info->brk && in load_elf_binary()
3935 interp_info.load_bias - info->brk < 16 * MiB) { in load_elf_binary()
3936 info->brk = interp_info.brk; in load_elf_binary()
3944 info->personality = PER_SVR4; in load_elf_binary()
3946 /* Why this, you ask??? Well SVr4 maps page 0 as read-only, in load_elf_binary()
3952 -1, 0); in load_elf_binary()
3955 info->interp_fp_abi = interp_info.fp_abi; in load_elf_binary()
3963 const VdsoImageInfo *vdso = vdso_image_info(info->elf_flags); in load_elf_binary()
3966 info->vdso = vdso_info.load_bias; in load_elf_binary()
3970 MAP_PRIVATE | MAP_ANON, -1, 0); in load_elf_binary()
3971 if (tramp_page == -1) { in load_elf_binary()
3972 return -errno; in load_elf_binary()
3979 bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr, info, in load_elf_binary()
3982 info->start_stack = bprm->p; in load_elf_binary()
3989 info->load_bias = interp_info.load_bias; in load_elf_binary()
3990 info->entry = interp_info.entry; in load_elf_binary()
3995 bprm->core_dump = &elf_core_dump; in load_elf_binary()
4004 * Definitions to generate Intel SVR4-like core files.
4011 * Fields we don't dump (their contents is zero) in linux-user qemu
4036 * regs - copy register values into here (allocated and zeroed by caller)
4037 * env - copy registers from here
4087 prstatus->pr_info.si_signo = tswap32(prstatus->pr_info.si_signo); in bswap_prstatus()
4088 prstatus->pr_info.si_code = tswap32(prstatus->pr_info.si_code); in bswap_prstatus()
4089 prstatus->pr_info.si_errno = tswap32(prstatus->pr_info.si_errno); in bswap_prstatus()
4090 prstatus->pr_cursig = tswap16(prstatus->pr_cursig); in bswap_prstatus()
4091 prstatus->pr_sigpend = tswapal(prstatus->pr_sigpend); in bswap_prstatus()
4092 prstatus->pr_sighold = tswapal(prstatus->pr_sighold); in bswap_prstatus()
4093 prstatus->pr_pid = tswap32(prstatus->pr_pid); in bswap_prstatus()
4094 prstatus->pr_ppid = tswap32(prstatus->pr_ppid); in bswap_prstatus()
4095 prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp); in bswap_prstatus()
4096 prstatus->pr_sid = tswap32(prstatus->pr_sid); in bswap_prstatus()
4099 prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid); in bswap_prstatus()
4108 psinfo->pr_flag = tswapal(psinfo->pr_flag); in bswap_psinfo()
4109 psinfo->pr_uid = tswap16(psinfo->pr_uid); in bswap_psinfo()
4110 psinfo->pr_gid = tswap16(psinfo->pr_gid); in bswap_psinfo()
4111 psinfo->pr_pid = tswap32(psinfo->pr_pid); in bswap_psinfo()
4112 psinfo->pr_ppid = tswap32(psinfo->pr_ppid); in bswap_psinfo()
4113 psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp); in bswap_psinfo()
4114 psinfo->pr_sid = tswap32(psinfo->pr_sid); in bswap_psinfo()
4123 bswap32s(&en->n_namesz); in bswap_note()
4124 bswap32s(&en->n_descsz); in bswap_note()
4125 bswap32s(&en->n_type); in bswap_note()
4140 * non-writable code that debugger can read directly from in vma_dump_size()
4149 return end - start; in vma_dump_size()
4168 n->n_namesz = namesz; in fill_note()
4169 n->n_descsz = datasz; in fill_note()
4170 n->n_type = type; in fill_note()
4186 memcpy(elf->e_ident, ELFMAG, SELFMAG); in fill_elf_header()
4188 elf->e_ident[EI_CLASS] = ELF_CLASS; in fill_elf_header()
4189 elf->e_ident[EI_DATA] = ELF_DATA; in fill_elf_header()
4190 elf->e_ident[EI_VERSION] = EV_CURRENT; in fill_elf_header()
4191 elf->e_ident[EI_OSABI] = ELF_OSABI; in fill_elf_header()
4193 elf->e_type = ET_CORE; in fill_elf_header()
4194 elf->e_machine = machine; in fill_elf_header()
4195 elf->e_version = EV_CURRENT; in fill_elf_header()
4196 elf->e_phoff = sizeof(struct elfhdr); in fill_elf_header()
4197 elf->e_flags = flags; in fill_elf_header()
4198 elf->e_ehsize = sizeof(struct elfhdr); in fill_elf_header()
4199 elf->e_phentsize = sizeof(struct elf_phdr); in fill_elf_header()
4200 elf->e_phnum = segs; in fill_elf_header()
4207 phdr->p_type = PT_NOTE; in fill_elf_note_phdr()
4208 phdr->p_offset = offset; in fill_elf_note_phdr()
4209 phdr->p_filesz = sz; in fill_elf_note_phdr()
4224 .pr_pid = get_task_state(cpu)->ts_tid, in fill_prstatus_note()
4253 len = ts->info->env_strings - ts->info->arg_strings; in fill_prpsinfo_note()
4255 memcpy(&psinfo.pr_psargs, g2h_untagged(ts->info->arg_strings), len); in fill_prpsinfo_note()
4262 base_filename = g_path_get_basename(ts->bprm->filename); in fill_prpsinfo_note()
4264 * Using strncpy here is fine: at max-length, in fill_prpsinfo_note()
4265 * this field is not NUL-terminated. in fill_prpsinfo_note()
4276 memcpy(data, g2h_untagged(ts->info->saved_auxv), ts->info->auxv_len); in fill_auxv_note()
4282 * qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core
4289 g_autofree char *nowstr = g_date_time_format(now, "%Y%m%d-%H%M%S"); in core_dump_filename()
4290 g_autofree char *base_filename = g_path_get_basename(ts->bprm->filename); in core_dump_filename()
4313 return (-1); in dump_write()
4315 return (-1); in dump_write()
4318 bytes_left -= bytes_written; in dump_write()
4332 if (end - start <= step) { in wmr_page_unprotect_regions()
4351 css->count++; in wmr_count_and_size_regions()
4352 css->size += vma_dump_size(start, end, flags); in wmr_count_and_size_regions()
4365 struct elf_phdr *phdr = d->phdr; in wmr_fill_region_phdr()
4367 phdr->p_type = PT_LOAD; in wmr_fill_region_phdr()
4368 phdr->p_vaddr = start; in wmr_fill_region_phdr()
4369 phdr->p_paddr = 0; in wmr_fill_region_phdr()
4370 phdr->p_filesz = vma_dump_size(start, end, flags); in wmr_fill_region_phdr()
4371 phdr->p_offset = d->offset; in wmr_fill_region_phdr()
4372 d->offset += phdr->p_filesz; in wmr_fill_region_phdr()
4373 phdr->p_memsz = end - start; in wmr_fill_region_phdr()
4374 phdr->p_flags = (flags & PAGE_READ ? PF_R : 0) in wmr_fill_region_phdr()
4377 phdr->p_align = ELF_EXEC_PAGESIZE; in wmr_fill_region_phdr()
4380 d->phdr = phdr + 1; in wmr_fill_region_phdr()
4404 * 0 +----------------------+ \
4406 * +----------------------+ |
4407 * | ELF program headers | |--- headers
4408 * | - NOTE section | |
4409 * | - PT_LOAD sections | |
4410 * +----------------------+ /
4412 * | - NT_PRSTATUS |
4413 * | - NT_PRSINFO |
4414 * | - NT_AUXV |
4415 * +----------------------+ <-- aligned to target page
4421 * +----------------------+
4423 * NT_PRSTATUS -> struct elf_prstatus (per thread)
4424 * NT_PRSINFO -> struct elf_prpsinfo
4429 * - no floating point registers are dumped
4448 int fd = -1; in elf_core_dump()
4481 offset += size_note("CORE", ts->info->auxv_len); in elf_core_dump()
4484 note_size = offset - note_offset; in elf_core_dump()
4529 dptr = fill_note(&hptr, NT_AUXV, "CORE", ts->info->auxv_len); in elf_core_dump()
4556 ret = -errno; in elf_core_dump()