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()
983 # define VDSO_HEADER "vdso-be.c.inc"
985 # define VDSO_HEADER "vdso-le.c.inc"
1011 /* There are not many sparc32 hwcap bits -- we have all of them. */ in get_elf_hwcap()
1017 uint32_t features = env->def.features; in get_elf_hwcap()
1039 regs->pc = infop->entry; in init_thread()
1040 regs->npc = regs->pc + 4; in init_thread()
1041 regs->y = 0; in init_thread()
1042 regs->u_regs[14] = (infop->start_stack - 16 * sizeof(abi_ulong) in init_thread()
1043 - TARGET_STACK_BIAS); in init_thread()
1109 QEMU_PPC_FEATURE2_HAS_IEEE128 = 0x00400000, /* VSX IEEE Bin Float 128-bit */
1114 QEMU_PPC_FEATURE2_MMA = 0x00020000, /* Matrix-Multiply Assist */
1127 do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0) in get_elf_hwcap()
1130 if ((cpu->env.insns_flags2 & flags) == flags) { \ in get_elf_hwcap()
1161 do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0) in get_elf_hwcap2()
1163 do { if (cpu->env.insns_flags2 & flag) { features |= feature; } } while (0) in get_elf_hwcap2()
1183 * - keep the final alignment of sp (sp & 0xf)
1184 * - make sure the 32-bit value at the first 16 byte aligned position of
1187 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
1200 NEW_AUX_ENT(AT_DCACHEBSIZE, cpu->env.dcache_line_size); \
1201 NEW_AUX_ENT(AT_ICACHEBSIZE, cpu->env.icache_line_size); \
1207 _regs->gpr[1] = infop->start_stack; in init_thread()
1211 get_user_u64(val, infop->entry + 8); in init_thread()
1212 _regs->gpr[2] = val + infop->load_bias; in init_thread()
1213 get_user_u64(val, infop->entry); in init_thread()
1214 infop->entry = val + infop->load_bias; in init_thread()
1216 _regs->gpr[12] = infop->entry; /* r12 set to global entry address */ in init_thread()
1219 _regs->nip = infop->entry; in init_thread()
1231 for (i = 0; i < ARRAY_SIZE(env->gpr); i++) { in elf_core_copy_regs()
1232 (*regs)[i] = tswapreg(env->gpr[i]); in elf_core_copy_regs()
1235 (*regs)[32] = tswapreg(env->nip); in elf_core_copy_regs()
1236 (*regs)[33] = tswapreg(env->msr); in elf_core_copy_regs()
1237 (*regs)[35] = tswapreg(env->ctr); in elf_core_copy_regs()
1238 (*regs)[36] = tswapreg(env->lr); in elf_core_copy_regs()
1249 # define VDSO_HEADER "vdso-32.c.inc"
1251 # define VDSO_HEADER "vdso-64.c.inc"
1253 # define VDSO_HEADER "vdso-64le.c.inc"
1272 regs->csr.crmd = 2 << 3; in init_thread()
1273 regs->csr.era = infop->entry; in init_thread()
1274 regs->regs[3] = infop->start_stack; in init_thread()
1294 for (i = 1; i < ARRAY_SIZE(env->gpr); i++) { in elf_core_copy_regs()
1295 (*regs)[TARGET_EF_R0 + i] = tswapreg(env->gpr[i]); in elf_core_copy_regs()
1298 (*regs)[TARGET_EF_CSR_ERA] = tswapreg(env->pc); in elf_core_copy_regs()
1299 (*regs)[TARGET_EF_CSR_BADV] = tswapreg(env->CSR_BADV); in elf_core_copy_regs()
1331 if (FIELD_EX32(cpu->env.cpucfg[1], CPUCFG1, UAL)) { in get_elf_hwcap()
1335 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, FP)) { in get_elf_hwcap()
1339 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LAM)) { in get_elf_hwcap()
1343 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) { in get_elf_hwcap()
1347 if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LASX)) { in get_elf_hwcap()
1377 do { if ((cpu->env.insn_flags & (_flags)) == _flags) \
1408 regs->cp0_status = 2 << CP0St_KSU; in init_thread()
1409 regs->cp0_epc = infop->entry; in init_thread()
1410 regs->regs[29] = infop->start_stack; in init_thread()
1444 for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) { in elf_core_copy_regs()
1445 (*regs)[TARGET_EF_R0 + i] = tswapreg(env->active_tc.gpr[i]); in elf_core_copy_regs()
1450 (*regs)[TARGET_EF_LO] = tswapreg(env->active_tc.LO[0]); in elf_core_copy_regs()
1451 (*regs)[TARGET_EF_HI] = tswapreg(env->active_tc.HI[0]); in elf_core_copy_regs()
1452 (*regs)[TARGET_EF_CP0_EPC] = tswapreg(env->active_tc.PC); in elf_core_copy_regs()
1453 (*regs)[TARGET_EF_CP0_BADVADDR] = tswapreg(env->CP0_BadVAddr); in elf_core_copy_regs()
1454 (*regs)[TARGET_EF_CP0_STATUS] = tswapreg(env->CP0_Status); in elf_core_copy_regs()
1455 (*regs)[TARGET_EF_CP0_CAUSE] = tswapreg(env->CP0_Cause); in elf_core_copy_regs()
1483 do { if (cpu->env.insn_flags & (_flag)) { hwcaps |= _hwcap; } } while (0)
1486 do { if (cpu->env._reg & (_mask)) { hwcaps |= _hwcap; } } while (0)
1490 if (extract32(cpu->env._reg, (_start), (_length)) == (_val)) { \
1525 regs->pc = infop->entry; in init_thread()
1526 regs->r1 = infop->start_stack; in init_thread()
1542 (*regs)[pos++] = tswapreg(env->regs[i]); in elf_core_copy_regs()
1545 (*regs)[pos++] = tswapreg(env->pc); in elf_core_copy_regs()
1548 (*regs)[pos++] = tswapreg(env->ear); in elf_core_copy_regs()
1550 (*regs)[pos++] = tswapreg(env->esr); in elf_core_copy_regs()
1564 regs->pc = infop->entry; in init_thread()
1565 regs->gpr[1] = infop->start_stack; in init_thread()
1583 (*regs)[32] = tswapreg(env->pc); in elf_core_copy_regs()
1600 regs->pc = infop->entry; in init_thread()
1601 regs->regs[15] = infop->start_stack; in init_thread()
1625 (*regs)[i] = tswapreg(env->gregs[i]); in elf_core_copy_regs()
1628 (*regs)[TARGET_REG_PC] = tswapreg(env->pc); in elf_core_copy_regs()
1629 (*regs)[TARGET_REG_PR] = tswapreg(env->pr); in elf_core_copy_regs()
1630 (*regs)[TARGET_REG_SR] = tswapreg(env->sr); in elf_core_copy_regs()
1631 (*regs)[TARGET_REG_GBR] = tswapreg(env->gbr); in elf_core_copy_regs()
1632 (*regs)[TARGET_REG_MACH] = tswapreg(env->mach); in elf_core_copy_regs()
1633 (*regs)[TARGET_REG_MACL] = tswapreg(env->macl); in elf_core_copy_regs()
1644 SH_CPU_HAS_DSP = 0x0008, /* SH-DSP: DSP support */
1649 SH_CPU_HAS_OP32 = 0x0100, /* 32-bit instruction support */
1662 if (cpu->env.features & SH_FEATURE_SH4A) { in get_elf_hwcap()
1682 regs->usp = infop->start_stack; in init_thread()
1683 regs->sr = 0; in init_thread()
1684 regs->pc = infop->entry; in init_thread()
1693 (*regs)[0] = tswapreg(env->dregs[1]); in elf_core_copy_regs()
1694 (*regs)[1] = tswapreg(env->dregs[2]); in elf_core_copy_regs()
1695 (*regs)[2] = tswapreg(env->dregs[3]); in elf_core_copy_regs()
1696 (*regs)[3] = tswapreg(env->dregs[4]); in elf_core_copy_regs()
1697 (*regs)[4] = tswapreg(env->dregs[5]); in elf_core_copy_regs()
1698 (*regs)[5] = tswapreg(env->dregs[6]); in elf_core_copy_regs()
1699 (*regs)[6] = tswapreg(env->dregs[7]); in elf_core_copy_regs()
1700 (*regs)[7] = tswapreg(env->aregs[0]); in elf_core_copy_regs()
1701 (*regs)[8] = tswapreg(env->aregs[1]); in elf_core_copy_regs()
1702 (*regs)[9] = tswapreg(env->aregs[2]); in elf_core_copy_regs()
1703 (*regs)[10] = tswapreg(env->aregs[3]); in elf_core_copy_regs()
1704 (*regs)[11] = tswapreg(env->aregs[4]); in elf_core_copy_regs()
1705 (*regs)[12] = tswapreg(env->aregs[5]); in elf_core_copy_regs()
1706 (*regs)[13] = tswapreg(env->aregs[6]); in elf_core_copy_regs()
1707 (*regs)[14] = tswapreg(env->dregs[0]); in elf_core_copy_regs()
1708 (*regs)[15] = tswapreg(env->aregs[7]); in elf_core_copy_regs()
1709 (*regs)[16] = tswapreg(env->dregs[0]); /* FIXME: orig_d0 */ in elf_core_copy_regs()
1710 (*regs)[17] = tswapreg(env->sr); in elf_core_copy_regs()
1711 (*regs)[18] = tswapreg(env->pc); in elf_core_copy_regs()
1712 (*regs)[19] = 0; /* FIXME: regs->format | regs->vector */ in elf_core_copy_regs()
1728 regs->pc = infop->entry; in init_thread()
1729 regs->ps = 8; in init_thread()
1730 regs->usp = infop->start_stack; in init_thread()
1754 * 31-bit processes can use 64-bit registers (high gprs). in get_elf_hwcap()
1805 regs->psw.addr = infop->entry; in init_thread()
1806 regs->psw.mask = PSW_MASK_DAT | PSW_MASK_IO | PSW_MASK_EXT | \ in init_thread()
1809 regs->gprs[15] = infop->start_stack; in init_thread()
1830 (*regs)[TARGET_REG_PSWM] = tswapreg(env->psw.mask); in elf_core_copy_regs()
1831 (*regs)[TARGET_REG_PSWA] = tswapreg(env->psw.addr); in elf_core_copy_regs()
1833 (*regs)[TARGET_REG_GPRS + i] = tswapreg(env->regs[i]); in elf_core_copy_regs()
1837 aregs[i] = tswap32(env->aregs[i]); in elf_core_copy_regs()
1855 #define VDSO_HEADER "vdso-32.c.inc"
1858 #define VDSO_HEADER "vdso-64.c.inc"
1865 #define MISA_BIT(EXT) (1 << (EXT - 'A')) in get_elf_hwcap()
1871 return cpu->env.misa_ext & mask; in get_elf_hwcap()
1878 regs->sepc = infop->entry; in init_thread()
1879 regs->sp = infop->start_stack; in init_thread()
1899 regs->iaoq[0] = infop->entry | PRIV_USER; in init_thread()
1900 regs->iaoq[1] = regs->iaoq[0] + 4; in init_thread()
1901 regs->gr[23] = 0; in init_thread()
1902 regs->gr[24] = infop->argv; in init_thread()
1903 regs->gr[25] = infop->argc; in init_thread()
1904 /* The top-of-stack contains a linkage buffer. */ in init_thread()
1905 regs->gr[30] = infop->start_stack + 64; in init_thread()
1906 regs->gr[31] = infop->entry; in init_thread()
1919 MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED_NOREPLACE, -1, 0); in init_guest_commpage()
1951 regs->windowbase = 0; in init_thread()
1952 regs->windowstart = 1; in init_thread()
1953 regs->areg[1] = infop->start_stack; in init_thread()
1954 regs->pc = infop->entry; in init_thread()
1956 regs->areg[4] = infop->loadmap_addr; in init_thread()
1957 regs->areg[5] = infop->interpreter_loadmap_addr; in init_thread()
1958 if (infop->interpreter_loadmap_addr) { in init_thread()
1959 regs->areg[6] = infop->interpreter_pt_dynamic_addr; in init_thread()
1961 regs->areg[6] = infop->pt_dynamic_addr; in init_thread()
1988 (*regs)[TARGET_REG_PC] = tswapreg(env->pc); in elf_core_copy_regs()
1989 (*regs)[TARGET_REG_PS] = tswapreg(env->sregs[PS] & ~PS_EXCM); in elf_core_copy_regs()
1990 (*regs)[TARGET_REG_LBEG] = tswapreg(env->sregs[LBEG]); in elf_core_copy_regs()
1991 (*regs)[TARGET_REG_LEND] = tswapreg(env->sregs[LEND]); in elf_core_copy_regs()
1992 (*regs)[TARGET_REG_LCOUNT] = tswapreg(env->sregs[LCOUNT]); in elf_core_copy_regs()
1993 (*regs)[TARGET_REG_SAR] = tswapreg(env->sregs[SAR]); in elf_core_copy_regs()
1994 (*regs)[TARGET_REG_WINDOWSTART] = tswapreg(env->sregs[WINDOW_START]); in elf_core_copy_regs()
1995 (*regs)[TARGET_REG_WINDOWBASE] = tswapreg(env->sregs[WINDOW_BASE]); in elf_core_copy_regs()
1996 (*regs)[TARGET_REG_THREADPTR] = tswapreg(env->uregs[THREADPTR]); in elf_core_copy_regs()
1998 for (i = 0; i < env->config->nareg; ++i) { in elf_core_copy_regs()
1999 (*regs)[TARGET_REG_AR0 + i] = tswapreg(env->phys_regs[i]); in elf_core_copy_regs()
2016 regs->sepc = infop->entry; in init_thread()
2017 regs->sp = infop->start_stack; in init_thread()
2077 error_setg(errp, "Ill-formed GNU_PROPERTY_AARCH64_FEATURE_1_AND"); in arch_parse_elf_property()
2081 info->note_flags = *data; in arch_parse_elf_property()
2132 bswap16s(&ehdr->e_type); /* Object file type */ in bswap_ehdr()
2133 bswap16s(&ehdr->e_machine); /* Architecture */ in bswap_ehdr()
2134 bswap32s(&ehdr->e_version); /* Object file version */ in bswap_ehdr()
2135 bswaptls(&ehdr->e_entry); /* Entry point virtual address */ in bswap_ehdr()
2136 bswaptls(&ehdr->e_phoff); /* Program header table file offset */ in bswap_ehdr()
2137 bswaptls(&ehdr->e_shoff); /* Section header table file offset */ in bswap_ehdr()
2138 bswap32s(&ehdr->e_flags); /* Processor-specific flags */ in bswap_ehdr()
2139 bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */ in bswap_ehdr()
2140 bswap16s(&ehdr->e_phentsize); /* Program header table entry size */ in bswap_ehdr()
2141 bswap16s(&ehdr->e_phnum); /* Program header table entry count */ in bswap_ehdr()
2142 bswap16s(&ehdr->e_shentsize); /* Section header table entry size */ in bswap_ehdr()
2143 bswap16s(&ehdr->e_shnum); /* Section header table entry count */ in bswap_ehdr()
2144 bswap16s(&ehdr->e_shstrndx); /* Section header string table index */ in bswap_ehdr()
2154 bswap32s(&phdr->p_type); /* Segment type */ in bswap_phdr()
2155 bswap32s(&phdr->p_flags); /* Segment flags */ in bswap_phdr()
2156 bswaptls(&phdr->p_offset); /* Segment file offset */ in bswap_phdr()
2157 bswaptls(&phdr->p_vaddr); /* Segment virtual address */ in bswap_phdr()
2158 bswaptls(&phdr->p_paddr); /* Segment physical address */ in bswap_phdr()
2159 bswaptls(&phdr->p_filesz); /* Segment size in file */ in bswap_phdr()
2160 bswaptls(&phdr->p_memsz); /* Segment size in memory */ in bswap_phdr()
2161 bswaptls(&phdr->p_align); /* Segment alignment */ in bswap_phdr()
2172 bswap32s(&shdr->sh_name); in bswap_shdr()
2173 bswap32s(&shdr->sh_type); in bswap_shdr()
2174 bswaptls(&shdr->sh_flags); in bswap_shdr()
2175 bswaptls(&shdr->sh_addr); in bswap_shdr()
2176 bswaptls(&shdr->sh_offset); in bswap_shdr()
2177 bswaptls(&shdr->sh_size); in bswap_shdr()
2178 bswap32s(&shdr->sh_link); in bswap_shdr()
2179 bswap32s(&shdr->sh_info); in bswap_shdr()
2180 bswaptls(&shdr->sh_addralign); in bswap_shdr()
2181 bswaptls(&shdr->sh_entsize); in bswap_shdr()
2191 bswap32s(&sym->st_name); in bswap_sym()
2192 bswaptls(&sym->st_value); in bswap_sym()
2193 bswaptls(&sym->st_size); in bswap_sym()
2194 bswap16s(&sym->st_shndx); in bswap_sym()
2204 bswap16s(&abiflags->version); in bswap_mips_abiflags()
2205 bswap32s(&abiflags->ases); in bswap_mips_abiflags()
2206 bswap32s(&abiflags->isa_ext); in bswap_mips_abiflags()
2207 bswap32s(&abiflags->flags1); in bswap_mips_abiflags()
2208 bswap32s(&abiflags->flags2); in bswap_mips_abiflags()
2222 return (ehdr->e_ident[EI_MAG0] == ELFMAG0 in elf_check_ident()
2223 && ehdr->e_ident[EI_MAG1] == ELFMAG1 in elf_check_ident()
2224 && ehdr->e_ident[EI_MAG2] == ELFMAG2 in elf_check_ident()
2225 && ehdr->e_ident[EI_MAG3] == ELFMAG3 in elf_check_ident()
2226 && ehdr->e_ident[EI_CLASS] == ELF_CLASS in elf_check_ident()
2227 && ehdr->e_ident[EI_DATA] == ELF_DATA in elf_check_ident()
2228 && ehdr->e_ident[EI_VERSION] == EV_CURRENT); in elf_check_ident()
2235 return (elf_check_arch(ehdr->e_machine) in elf_check_ehdr()
2236 && elf_check_abi(ehdr->e_flags) in elf_check_ehdr()
2237 && ehdr->e_ehsize == sizeof(struct elfhdr) in elf_check_ehdr()
2238 && ehdr->e_phentsize == sizeof(struct elf_phdr) in elf_check_ehdr()
2239 && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)); in elf_check_ehdr()
2256 return 0; /* bullet-proofing */ in copy_elf_strings()
2260 int offset = ((p - 1) % TARGET_PAGE_SIZE) + 1; in copy_elf_strings()
2261 for (i = argc - 1; i >= 0; --i) { in copy_elf_strings()
2265 exit(-1); in copy_elf_strings()
2270 if (len > (p - stack_limit)) { in copy_elf_strings()
2275 tmp -= bytes_to_copy; in copy_elf_strings()
2276 p -= bytes_to_copy; in copy_elf_strings()
2277 offset -= bytes_to_copy; in copy_elf_strings()
2278 len -= bytes_to_copy; in copy_elf_strings()
2283 memcpy_to_target(p, scratch, top - p); in copy_elf_strings()
2290 memcpy_to_target(p, scratch + offset, top - p); in copy_elf_strings()
2293 int remaining = TARGET_PAGE_SIZE - (p % TARGET_PAGE_SIZE); in copy_elf_strings()
2298 exit(-1); in copy_elf_strings()
2301 if (len > (stack_limit - p)) { in copy_elf_strings()
2307 memcpy_fromfs(scratch + (p - top), tmp, bytes_to_copy); in copy_elf_strings()
2310 remaining -= bytes_to_copy; in copy_elf_strings()
2312 len -= bytes_to_copy; in copy_elf_strings()
2315 memcpy_to_target(top, scratch, p - top); in copy_elf_strings()
2322 memcpy_to_target(top, scratch, p - top); in copy_elf_strings()
2358 if (info->exec_stack) { in setup_arg_pages()
2362 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); in setup_arg_pages()
2363 if (error == -1) { in setup_arg_pages()
2365 exit(-1); in setup_arg_pages()
2371 info->stack_limit = error + guard; in setup_arg_pages()
2372 return info->stack_limit + size - sizeof(void *); in setup_arg_pages()
2374 info->stack_limit = error + size; in setup_arg_pages()
2392 error_setg(errp, "PT_LOAD with non-writable bss"); in zero_bss()
2411 align_bss -= TARGET_PAGE_SIZE; in zero_bss()
2421 "non-writable page"); in zero_bss()
2426 memset(g2h_untagged(start_bss), 0, align_bss - start_bss); in zero_bss()
2431 target_mmap(align_bss, end_bss - align_bss, prot, in zero_bss()
2432 MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0) == -1) { in zero_bss()
2442 return exec->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC; in elf_is_fdpic()
2447 return exec->e_ident[EI_OSABI] == ELFOSABI_XTENSA_FDPIC; in elf_is_fdpic()
2460 struct elf32_fdpic_loadseg *loadsegs = info->loadsegs; in loader_build_fdpic_loadmap()
2463 n = info->nsegs; in loader_build_fdpic_loadmap()
2464 while (n--) { in loader_build_fdpic_loadmap()
2465 sp -= 12; in loader_build_fdpic_loadmap()
2472 sp -= 4; in loader_build_fdpic_loadmap()
2474 put_user_u16(info->nsegs, sp+2); /* nsegs */ in loader_build_fdpic_loadmap()
2476 info->personality = PER_LINUX_FDPIC; in loader_build_fdpic_loadmap()
2477 info->loadmap_addr = sp; in loader_build_fdpic_loadmap()
2505 info->other_info = interp_info; in create_elf_tables()
2507 interp_info->other_info = info; in create_elf_tables()
2509 info->interpreter_loadmap_addr = interp_info->loadmap_addr; in create_elf_tables()
2510 info->interpreter_pt_dynamic_addr = interp_info->pt_dynamic_addr; in create_elf_tables()
2512 info->interpreter_loadmap_addr = 0; in create_elf_tables()
2513 info->interpreter_pt_dynamic_addr = 0; in create_elf_tables()
2522 sp -= (len + n - 1) & ~(n - 1); in create_elf_tables()
2524 /* FIXME - check return value of memcpy_to_target() for failure */ in create_elf_tables()
2538 sp -= (len + n - 1) & ~(n - 1); in create_elf_tables()
2540 /* FIXME - check return value of memcpy_to_target() for failure */ in create_elf_tables()
2563 sp -= 16; in create_elf_tables()
2565 /* FIXME - check return value of memcpy_to_target() for failure */ in create_elf_tables()
2589 info->auxv_len = size * n; in create_elf_tables()
2597 u_argc = QEMU_ALIGN_DOWN(sp - size, STACK_ALIGNMENT); in create_elf_tables()
2607 info->saved_auxv = u_auxv; in create_elf_tables()
2608 info->argc = argc; in create_elf_tables()
2609 info->envc = envc; in create_elf_tables()
2610 info->argv = u_argv; in create_elf_tables()
2611 info->envp = u_envp; in create_elf_tables()
2629 * on info->auxv_len will trigger. in create_elf_tables()
2631 NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff)); in create_elf_tables()
2633 NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum)); in create_elf_tables()
2635 NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0)); in create_elf_tables()
2637 NEW_AUX_ENT(AT_ENTRY, info->entry); in create_elf_tables()
2646 NEW_AUX_ENT(AT_EXECFN, info->file_string); in create_elf_tables()
2659 NEW_AUX_ENT(AT_SYSINFO_EHDR, vdso_info->load_addr); in create_elf_tables()
2667 assert(info->auxv_len == u_auxv - info->saved_auxv); in create_elf_tables()
2671 p = info->arg_strings; in create_elf_tables()
2679 p = info->env_strings; in create_elf_tables()
2691 #define LO_COMMPAGE -1
2696 #define LO_COMMPAGE -1
2709 * return 0 if it is not available to map, and -1 on mmap error.
2714 size_t size = addr_last - addr + 1; in pgb_try_mmap()
2717 MAP_NORESERVE | MAP_FIXED_NOREPLACE, -1, 0); in pgb_try_mmap()
2721 return errno == EEXIST ? 0 : -1; in pgb_try_mmap()
2741 uintptr_t brk_last = brk + 16 * MiB - 1; in pgb_try_mmap_skip_brk()
2767 for (int i = ga->nbounds - 1; i >= 0; --i) { in pgb_try_mmap_set()
2768 if (pgb_try_mmap_skip_brk(ga->bounds[i][0] + base, in pgb_try_mmap_set()
2769 ga->bounds[i][1] + base, in pgb_try_mmap_set()
2796 if (LO_COMMPAGE != -1 && LO_COMMPAGE < mmap_min_addr) { in pgb_addr_set()
2808 ga->bounds[n][0] = try_identity ? mmap_min_addr : 0; in pgb_addr_set()
2809 ga->bounds[n][1] = reserved_va; in pgb_addr_set()
2814 if (LO_COMMPAGE != -1) { in pgb_addr_set()
2815 ga->bounds[n][0] = 0; in pgb_addr_set()
2816 ga->bounds[n][1] = LO_COMMPAGE + TARGET_PAGE_SIZE - 1; in pgb_addr_set()
2819 ga->bounds[n][0] = 0; in pgb_addr_set()
2820 ga->bounds[n][1] = TARGET_PAGE_SIZE - 1; in pgb_addr_set()
2826 ga->bounds[n][0] = guest_loaddr; in pgb_addr_set()
2827 ga->bounds[n][1] = guest_hiaddr; in pgb_addr_set()
2838 #pragma GCC diagnostic ignored "-Wtype-limits" in pgb_addr_set()
2842 ga->bounds[n][0] = HI_COMMPAGE & qemu_real_host_page_mask(); in pgb_addr_set()
2843 ga->bounds[n][1] = HI_COMMPAGE + TARGET_PAGE_SIZE - 1; in pgb_addr_set()
2849 ga->nbounds = n; in pgb_addr_set()
2856 "(omit the -B option or choose a different value)", in pgb_fail_in_use()
2899 if (base >= -skip) { in pgb_find_fallback()
2900 return -1; in pgb_find_fallback()
2908 for (int i = ga->nbounds - 1; i >= 0; --i) { in pgb_try_itree()
2909 uintptr_t s = base + ga->bounds[i][0]; in pgb_try_itree()
2910 uintptr_t l = base + ga->bounds[i][1]; in pgb_try_itree()
2915 return mmap_min_addr - s; in pgb_try_itree()
2921 return n->last - s + 1; in pgb_try_itree()
2936 return -1; in pgb_find_itree()
2946 return -1; in pgb_find_itree()
2956 return pgb_try_mmap_set(ga, base, brk) ? base : -1; in pgb_find_itree()
2976 * Rebuild the address set for non-identity map. in pgb_dynamic()
2994 b->start = brk; in pgb_dynamic()
2995 b->last = brk + 16 * MiB - 1; in pgb_dynamic()
3002 if (ret == -1) { in pgb_dynamic()
3009 error_printf(" %0*" PRIx64 "-%0*" PRIx64 "\n", in pgb_dynamic()
3079 datasz -= *off; in parse_elf_property()
3088 datasz -= 2 * sizeof(uint32_t); in parse_elf_property()
3113 error_setg(errp, "Ill-formed property in PT_GNU_PROPERTY"); in parse_elf_property()
3138 n = phdr->p_filesz; in parse_elf_properties()
3148 if (!imgsrc_read(&note, phdr->p_offset, n, src, errp)) { in parse_elf_properties()
3234 phdr = imgsrc_read_alloc(ehdr->e_phoff, in load_elf_image()
3235 ehdr->e_phnum * sizeof(struct elf_phdr), in load_elf_image()
3240 bswap_phdr(phdr, ehdr->e_phnum); in load_elf_image()
3242 info->nsegs = 0; in load_elf_image()
3243 info->pt_dynamic_addr = 0; in load_elf_image()
3251 loaddr = -1, hiaddr = 0; in load_elf_image()
3253 info->exec_stack = EXSTACK_DEFAULT; in load_elf_image()
3254 for (i = 0; i < ehdr->e_phnum; ++i) { in load_elf_image()
3256 if (eppnt->p_type == PT_LOAD) { in load_elf_image()
3257 abi_ulong a = eppnt->p_vaddr & TARGET_PAGE_MASK; in load_elf_image()
3261 a = eppnt->p_vaddr + eppnt->p_memsz - 1; in load_elf_image()
3265 ++info->nsegs; in load_elf_image()
3266 align |= eppnt->p_align; in load_elf_image()
3267 } else if (eppnt->p_type == PT_INTERP && pinterp_name) { in load_elf_image()
3275 interp_name = imgsrc_read_alloc(eppnt->p_offset, eppnt->p_filesz, in load_elf_image()
3280 if (interp_name[eppnt->p_filesz - 1] != 0) { in load_elf_image()
3285 } else if (eppnt->p_type == PT_GNU_PROPERTY) { in load_elf_image()
3289 } else if (eppnt->p_type == PT_GNU_STACK) { in load_elf_image()
3290 info->exec_stack = eppnt->p_flags & PF_X; in load_elf_image()
3299 if (ehdr->e_type == ET_EXEC) { in load_elf_image()
3310 probe_guest_base(image_name, 0, hiaddr - loaddr); in load_elf_image()
3325 load_addr &= -align; in load_elf_image()
3341 * pre-linked, LOAD_ADDR will be non-zero, and the kernel should in load_elf_image()
3347 reserve_size = (size_t)hiaddr - loaddr + 1; in load_elf_image()
3350 if (ehdr->e_type != ET_EXEC && align > qemu_real_host_page_size()) { in load_elf_image()
3351 align_size += align - 1; in load_elf_image()
3356 (ehdr->e_type == ET_EXEC ? MAP_FIXED_NOREPLACE : 0), in load_elf_image()
3357 -1, 0); in load_elf_image()
3358 if (load_addr == -1) { in load_elf_image()
3368 target_munmap(load_addr, align_addr - load_addr); in load_elf_image()
3371 target_munmap(align_end, load_end - align_end); in load_elf_image()
3376 load_bias = load_addr - loaddr; in load_elf_image()
3379 struct elf32_fdpic_loadseg *loadsegs = info->loadsegs = in load_elf_image()
3380 g_malloc(sizeof(*loadsegs) * info->nsegs); in load_elf_image()
3382 for (i = 0; i < ehdr->e_phnum; ++i) { in load_elf_image()
3385 info->pt_dynamic_addr = phdr[i].p_vaddr + load_bias; in load_elf_image()
3388 loadsegs->addr = phdr[i].p_vaddr + load_bias; in load_elf_image()
3389 loadsegs->p_vaddr = phdr[i].p_vaddr; in load_elf_image()
3390 loadsegs->p_memsz = phdr[i].p_memsz; in load_elf_image()
3397 info->load_bias = load_bias; in load_elf_image()
3398 info->code_offset = load_bias; in load_elf_image()
3399 info->data_offset = load_bias; in load_elf_image()
3400 info->load_addr = load_addr; in load_elf_image()
3401 info->entry = ehdr->e_entry + load_bias; in load_elf_image()
3402 info->start_code = -1; in load_elf_image()
3403 info->end_code = 0; in load_elf_image()
3404 info->start_data = -1; in load_elf_image()
3405 info->end_data = 0; in load_elf_image()
3407 info->brk = TARGET_PAGE_ALIGN(hiaddr + load_bias); in load_elf_image()
3408 info->elf_flags = ehdr->e_flags; in load_elf_image()
3423 if ((info->note_flags & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) in load_elf_image()
3430 for (i = 0; i < ehdr->e_phnum; i++) { in load_elf_image()
3432 if (eppnt->p_type == PT_LOAD) { in load_elf_image()
3436 if (eppnt->p_flags & PF_R) { in load_elf_image()
3439 if (eppnt->p_flags & PF_W) { in load_elf_image()
3442 if (eppnt->p_flags & PF_X) { in load_elf_image()
3446 vaddr = load_bias + eppnt->p_vaddr; in load_elf_image()
3450 vaddr_ef = vaddr + eppnt->p_filesz; in load_elf_image()
3451 vaddr_em = vaddr + eppnt->p_memsz; in load_elf_image()
3454 * Some segments may be completely empty, with a non-zero p_memsz in load_elf_image()
3457 if (eppnt->p_filesz != 0) { in load_elf_image()
3458 error = imgsrc_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po, in load_elf_image()
3460 src, eppnt->p_offset - vaddr_po); in load_elf_image()
3461 if (error == -1) { in load_elf_image()
3474 if (vaddr < info->start_code) { in load_elf_image()
3475 info->start_code = vaddr; in load_elf_image()
3477 if (vaddr_ef > info->end_code) { in load_elf_image()
3478 info->end_code = vaddr_ef; in load_elf_image()
3482 if (vaddr < info->start_data) { in load_elf_image()
3483 info->start_data = vaddr; in load_elf_image()
3485 if (vaddr_ef > info->end_data) { in load_elf_image()
3486 info->end_data = vaddr_ef; in load_elf_image()
3490 } else if (eppnt->p_type == PT_MIPS_ABIFLAGS) { in load_elf_image()
3493 if (!imgsrc_read(&abiflags, eppnt->p_offset, sizeof(abiflags), in load_elf_image()
3498 info->fp_abi = abiflags.fp_abi; in load_elf_image()
3503 if (info->end_data == 0) { in load_elf_image()
3504 info->start_data = info->end_code; in load_elf_image()
3505 info->end_data = info->end_code; in load_elf_image()
3512 debuginfo_report_elf(image_name, src->fd, load_bias); in load_elf_image()
3516 close(src->fd); in load_elf_image()
3524 exit(-1); in load_elf_image()
3539 exit(-1); in load_elf_interp()
3546 exit(-1); in load_elf_interp()
3571 src.fd = -1; in load_elf_vdso()
3572 src.cache = vdso->image; in load_elf_vdso()
3573 src.cache_size = vdso->image_size; in load_elf_vdso()
3575 load_elf_image("<internal-vdso>", &src, info, &ehdr, NULL); in load_elf_vdso()
3576 load_addr = info->load_addr; in load_elf_vdso()
3577 load_bias = info->load_bias; in load_elf_vdso()
3583 * We pre-processed the image to locate all of the addresses that need in load_elf_vdso()
3586 for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) { in load_elf_vdso()
3587 abi_ulong *addr = g2h_untagged(load_addr + vdso->relocs[i]); in load_elf_vdso()
3592 if (vdso->sigreturn_ofs) { in load_elf_vdso()
3593 default_sigreturn = load_addr + vdso->sigreturn_ofs; in load_elf_vdso()
3595 if (vdso->rt_sigreturn_ofs) { in load_elf_vdso()
3596 default_rt_sigreturn = load_addr + vdso->rt_sigreturn_ofs; in load_elf_vdso()
3600 target_mprotect(info->start_data, info->end_data - info->start_data, in load_elf_vdso()
3607 __typeof(sym->st_value) addr = *(uint64_t *)s0; in symfind()
3610 if (addr < sym->st_value) { in symfind()
3611 result = -1; in symfind()
3612 } else if (addr >= sym->st_value + sym->st_size) { in symfind()
3621 struct elf_sym *syms = s->disas_symtab.elf32; in lookup_symbolxx()
3623 struct elf_sym *syms = s->disas_symtab.elf64; in lookup_symbolxx()
3629 sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind); in lookup_symbolxx()
3631 return s->disas_strtab + sym->st_name; in lookup_symbolxx()
3642 return (sym0->st_value < sym1->st_value) in symcmp()
3643 ? -1 in symcmp()
3644 : ((sym0->st_value > sym1->st_value) ? 1 : 0); in symcmp()
3658 shnum = hdr->e_shnum; in load_symbols()
3659 shdr = imgsrc_read_alloc(hdr->e_shoff, shnum * sizeof(struct elf_shdr), in load_symbols()
3712 if (i < --nsyms) { in load_symbols()
3747 s->disas_strtab = strings; in load_symbols()
3748 s->disas_num_syms = nsyms; in load_symbols()
3750 s->disas_symtab.elf32 = syms; in load_symbols()
3752 s->disas_symtab.elf64 = syms; in load_symbols()
3754 s->lookup_symbol = lookup_symbolxx; in load_symbols()
3755 s->next = syminfos; in load_symbols()
3773 if (offset == (off_t) -1) { in get_elf_eflags()
3781 if (offset == (off_t) -1) { in get_elf_eflags()
3804 * We will have overwritten the original when we re-use bprm->buf in load_elf_binary()
3818 load_elf_image(bprm->filename, &bprm->src, info, &ehdr, &elf_interpreter); in load_elf_binary()
3822 bprm->p = setup_arg_pages(bprm, info); in load_elf_binary()
3826 bprm->p = copy_elf_strings(1, &bprm->filename, scratch, in load_elf_binary()
3827 bprm->p, info->stack_limit); in load_elf_binary()
3828 info->file_string = bprm->p; in load_elf_binary()
3829 bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch, in load_elf_binary()
3830 bprm->p, info->stack_limit); in load_elf_binary()
3831 info->env_strings = bprm->p; in load_elf_binary()
3832 bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch, in load_elf_binary()
3833 bprm->p, info->stack_limit); in load_elf_binary()
3834 info->arg_strings = bprm->p; in load_elf_binary()
3836 info->arg_strings = bprm->p; in load_elf_binary()
3837 bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch, in load_elf_binary()
3838 bprm->p, info->stack_limit); in load_elf_binary()
3839 info->env_strings = bprm->p; in load_elf_binary()
3840 bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch, in load_elf_binary()
3841 bprm->p, info->stack_limit); in load_elf_binary()
3842 info->file_string = bprm->p; in load_elf_binary()
3843 bprm->p = copy_elf_strings(1, &bprm->filename, scratch, in load_elf_binary()
3844 bprm->p, info->stack_limit); in load_elf_binary()
3849 if (!bprm->p) { in load_elf_binary()
3850 fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG)); in load_elf_binary()
3851 exit(-1); in load_elf_binary()
3855 load_elf_interp(elf_interpreter, &interp_info, bprm->buf); in load_elf_binary()
3865 if (interp_info.brk > info->brk && in load_elf_binary()
3866 interp_info.load_bias - info->brk < 16 * MiB) { in load_elf_binary()
3867 info->brk = interp_info.brk; in load_elf_binary()
3875 info->personality = PER_SVR4; in load_elf_binary()
3877 /* Why this, you ask??? Well SVr4 maps page 0 as read-only, in load_elf_binary()
3883 -1, 0); in load_elf_binary()
3886 info->interp_fp_abi = interp_info.fp_abi; in load_elf_binary()
3894 const VdsoImageInfo *vdso = vdso_image_info(info->elf_flags); in load_elf_binary()
3897 info->vdso = vdso_info.load_bias; in load_elf_binary()
3901 MAP_PRIVATE | MAP_ANON, -1, 0); in load_elf_binary()
3902 if (tramp_page == -1) { in load_elf_binary()
3903 return -errno; in load_elf_binary()
3910 bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr, info, in load_elf_binary()
3913 info->start_stack = bprm->p; in load_elf_binary()
3920 info->load_bias = interp_info.load_bias; in load_elf_binary()
3921 info->entry = interp_info.entry; in load_elf_binary()
3926 bprm->core_dump = &elf_core_dump; in load_elf_binary()
3935 * Definitions to generate Intel SVR4-like core files.
3942 * Fields we don't dump (their contents is zero) in linux-user qemu
3967 * regs - copy register values into here (allocated and zeroed by caller)
3968 * env - copy registers from here
4018 prstatus->pr_info.si_signo = tswap32(prstatus->pr_info.si_signo); in bswap_prstatus()
4019 prstatus->pr_info.si_code = tswap32(prstatus->pr_info.si_code); in bswap_prstatus()
4020 prstatus->pr_info.si_errno = tswap32(prstatus->pr_info.si_errno); in bswap_prstatus()
4021 prstatus->pr_cursig = tswap16(prstatus->pr_cursig); in bswap_prstatus()
4022 prstatus->pr_sigpend = tswapal(prstatus->pr_sigpend); in bswap_prstatus()
4023 prstatus->pr_sighold = tswapal(prstatus->pr_sighold); in bswap_prstatus()
4024 prstatus->pr_pid = tswap32(prstatus->pr_pid); in bswap_prstatus()
4025 prstatus->pr_ppid = tswap32(prstatus->pr_ppid); in bswap_prstatus()
4026 prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp); in bswap_prstatus()
4027 prstatus->pr_sid = tswap32(prstatus->pr_sid); in bswap_prstatus()
4030 prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid); in bswap_prstatus()
4039 psinfo->pr_flag = tswapal(psinfo->pr_flag); in bswap_psinfo()
4040 psinfo->pr_uid = tswap16(psinfo->pr_uid); in bswap_psinfo()
4041 psinfo->pr_gid = tswap16(psinfo->pr_gid); in bswap_psinfo()
4042 psinfo->pr_pid = tswap32(psinfo->pr_pid); in bswap_psinfo()
4043 psinfo->pr_ppid = tswap32(psinfo->pr_ppid); in bswap_psinfo()
4044 psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp); in bswap_psinfo()
4045 psinfo->pr_sid = tswap32(psinfo->pr_sid); in bswap_psinfo()
4054 bswap32s(&en->n_namesz); in bswap_note()
4055 bswap32s(&en->n_descsz); in bswap_note()
4056 bswap32s(&en->n_type); in bswap_note()
4071 * non-writable code that debugger can read directly from in vma_dump_size()
4080 return end - start; in vma_dump_size()
4099 n->n_namesz = namesz; in fill_note()
4100 n->n_descsz = datasz; in fill_note()
4101 n->n_type = type; in fill_note()
4117 memcpy(elf->e_ident, ELFMAG, SELFMAG); in fill_elf_header()
4119 elf->e_ident[EI_CLASS] = ELF_CLASS; in fill_elf_header()
4120 elf->e_ident[EI_DATA] = ELF_DATA; in fill_elf_header()
4121 elf->e_ident[EI_VERSION] = EV_CURRENT; in fill_elf_header()
4122 elf->e_ident[EI_OSABI] = ELF_OSABI; in fill_elf_header()
4124 elf->e_type = ET_CORE; in fill_elf_header()
4125 elf->e_machine = machine; in fill_elf_header()
4126 elf->e_version = EV_CURRENT; in fill_elf_header()
4127 elf->e_phoff = sizeof(struct elfhdr); in fill_elf_header()
4128 elf->e_flags = flags; in fill_elf_header()
4129 elf->e_ehsize = sizeof(struct elfhdr); in fill_elf_header()
4130 elf->e_phentsize = sizeof(struct elf_phdr); in fill_elf_header()
4131 elf->e_phnum = segs; in fill_elf_header()
4138 phdr->p_type = PT_NOTE; in fill_elf_note_phdr()
4139 phdr->p_offset = offset; in fill_elf_note_phdr()
4140 phdr->p_filesz = sz; in fill_elf_note_phdr()
4155 .pr_pid = get_task_state(cpu)->ts_tid, in fill_prstatus_note()
4184 len = ts->info->env_strings - ts->info->arg_strings; in fill_prpsinfo_note()
4186 memcpy(&psinfo.pr_psargs, g2h_untagged(ts->info->arg_strings), len); in fill_prpsinfo_note()
4193 base_filename = g_path_get_basename(ts->bprm->filename); in fill_prpsinfo_note()
4195 * Using strncpy here is fine: at max-length, in fill_prpsinfo_note()
4196 * this field is not NUL-terminated. in fill_prpsinfo_note()
4207 memcpy(data, g2h_untagged(ts->info->saved_auxv), ts->info->auxv_len); in fill_auxv_note()
4213 * qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core
4220 g_autofree char *nowstr = g_date_time_format(now, "%Y%m%d-%H%M%S"); in core_dump_filename()
4221 g_autofree char *base_filename = g_path_get_basename(ts->bprm->filename); in core_dump_filename()
4244 return (-1); in dump_write()
4246 return (-1); in dump_write()
4249 bytes_left -= bytes_written; in dump_write()
4263 if (end - start <= step) { in wmr_page_unprotect_regions()
4282 css->count++; in wmr_count_and_size_regions()
4283 css->size += vma_dump_size(start, end, flags); in wmr_count_and_size_regions()
4296 struct elf_phdr *phdr = d->phdr; in wmr_fill_region_phdr()
4298 phdr->p_type = PT_LOAD; in wmr_fill_region_phdr()
4299 phdr->p_vaddr = start; in wmr_fill_region_phdr()
4300 phdr->p_paddr = 0; in wmr_fill_region_phdr()
4301 phdr->p_filesz = vma_dump_size(start, end, flags); in wmr_fill_region_phdr()
4302 phdr->p_offset = d->offset; in wmr_fill_region_phdr()
4303 d->offset += phdr->p_filesz; in wmr_fill_region_phdr()
4304 phdr->p_memsz = end - start; in wmr_fill_region_phdr()
4305 phdr->p_flags = (flags & PAGE_READ ? PF_R : 0) in wmr_fill_region_phdr()
4308 phdr->p_align = ELF_EXEC_PAGESIZE; in wmr_fill_region_phdr()
4311 d->phdr = phdr + 1; in wmr_fill_region_phdr()
4335 * 0 +----------------------+ \
4337 * +----------------------+ |
4338 * | ELF program headers | |--- headers
4339 * | - NOTE section | |
4340 * | - PT_LOAD sections | |
4341 * +----------------------+ /
4343 * | - NT_PRSTATUS |
4344 * | - NT_PRSINFO |
4345 * | - NT_AUXV |
4346 * +----------------------+ <-- aligned to target page
4352 * +----------------------+
4354 * NT_PRSTATUS -> struct elf_prstatus (per thread)
4355 * NT_PRSINFO -> struct elf_prpsinfo
4360 * - no floating point registers are dumped
4379 int fd = -1; in elf_core_dump()
4412 offset += size_note("CORE", ts->info->auxv_len); in elf_core_dump()
4415 note_size = offset - note_offset; in elf_core_dump()
4460 dptr = fill_note(&hptr, NT_AUXV, "CORE", ts->info->auxv_len); in elf_core_dump()
4487 ret = -errno; in elf_core_dump()