1
2#include <sys/time.h>
3#include <sys/param.h>
4
5#include <stdio.h>
6#include <sys/types.h>
7#include <fcntl.h>
8#include <errno.h>
9#include <unistd.h>
10#include <sys/mman.h>
11#include <sys/resource.h>
12#include <stdlib.h>
13#include <string.h>
14#include <time.h>
15
16#include "qemu.h"
17#include "disas.h"
18
19#ifdef _ARCH_PPC64
20#undef ARCH_DLINFO
21#undef ELF_PLATFORM
22#undef ELF_HWCAP
23#undef ELF_CLASS
24#undef ELF_DATA
25#undef ELF_ARCH
26#endif
27
28#define ELF_OSABI ELFOSABI_SYSV
29
30
31
32
33
34
35
36
37enum {
38 ADDR_NO_RANDOMIZE = 0x0040000,
39 FDPIC_FUNCPTRS = 0x0080000,
40
41 MMAP_PAGE_ZERO = 0x0100000,
42 ADDR_COMPAT_LAYOUT = 0x0200000,
43 READ_IMPLIES_EXEC = 0x0400000,
44 ADDR_LIMIT_32BIT = 0x0800000,
45 SHORT_INODE = 0x1000000,
46 WHOLE_SECONDS = 0x2000000,
47 STICKY_TIMEOUTS = 0x4000000,
48 ADDR_LIMIT_3GB = 0x8000000,
49};
50
51
52
53
54
55
56
57enum {
58 PER_LINUX = 0x0000,
59 PER_LINUX_32BIT = 0x0000 | ADDR_LIMIT_32BIT,
60 PER_LINUX_FDPIC = 0x0000 | FDPIC_FUNCPTRS,
61 PER_SVR4 = 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
62 PER_SVR3 = 0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
63 PER_SCOSVR3 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE,
64 PER_OSR5 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS,
65 PER_WYSEV386 = 0x0004 | STICKY_TIMEOUTS | SHORT_INODE,
66 PER_ISCR4 = 0x0005 | STICKY_TIMEOUTS,
67 PER_BSD = 0x0006,
68 PER_SUNOS = 0x0006 | STICKY_TIMEOUTS,
69 PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE,
70 PER_LINUX32 = 0x0008,
71 PER_LINUX32_3GB = 0x0008 | ADDR_LIMIT_3GB,
72 PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,
73 PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,
74 PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,
75 PER_RISCOS = 0x000c,
76 PER_SOLARIS = 0x000d | STICKY_TIMEOUTS,
77 PER_UW7 = 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
78 PER_OSF4 = 0x000f,
79 PER_HPUX = 0x0010,
80 PER_MASK = 0x00ff,
81};
82
83
84
85
86#define personality(pers) (pers & PER_MASK)
87
88
89#ifndef MAP_DENYWRITE
90#define MAP_DENYWRITE 0
91#endif
92
93
94#ifndef ELIBBAD
95#define ELIBBAD 80
96#endif
97
98#ifdef TARGET_WORDS_BIGENDIAN
99#define ELF_DATA ELFDATA2MSB
100#else
101#define ELF_DATA ELFDATA2LSB
102#endif
103
104typedef target_ulong target_elf_greg_t;
105#ifdef USE_UID16
106typedef target_ushort target_uid_t;
107typedef target_ushort target_gid_t;
108#else
109typedef target_uint target_uid_t;
110typedef target_uint target_gid_t;
111#endif
112typedef target_int target_pid_t;
113
114#ifdef TARGET_I386
115
116#define ELF_PLATFORM get_elf_platform()
117
118static const char *get_elf_platform(void)
119{
120 static char elf_platform[] = "i386";
121 int family = (thread_env->cpuid_version >> 8) & 0xff;
122 if (family > 6)
123 family = 6;
124 if (family >= 3)
125 elf_platform[1] = '0' + family;
126 return elf_platform;
127}
128
129#define ELF_HWCAP get_elf_hwcap()
130
131static uint32_t get_elf_hwcap(void)
132{
133 return thread_env->cpuid_features;
134}
135
136#ifdef TARGET_X86_64
137#define ELF_START_MMAP 0x2aaaaab000ULL
138#define elf_check_arch(x) ( ((x) == ELF_ARCH) )
139
140#define ELF_CLASS ELFCLASS64
141#define ELF_ARCH EM_X86_64
142
143static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
144{
145 regs->rax = 0;
146 regs->rsp = infop->start_stack;
147 regs->rip = infop->entry;
148}
149
150#define ELF_NREG 27
151typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
152
153
154
155
156
157
158
159
160static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
161{
162 (*regs)[0] = env->regs[15];
163 (*regs)[1] = env->regs[14];
164 (*regs)[2] = env->regs[13];
165 (*regs)[3] = env->regs[12];
166 (*regs)[4] = env->regs[R_EBP];
167 (*regs)[5] = env->regs[R_EBX];
168 (*regs)[6] = env->regs[11];
169 (*regs)[7] = env->regs[10];
170 (*regs)[8] = env->regs[9];
171 (*regs)[9] = env->regs[8];
172 (*regs)[10] = env->regs[R_EAX];
173 (*regs)[11] = env->regs[R_ECX];
174 (*regs)[12] = env->regs[R_EDX];
175 (*regs)[13] = env->regs[R_ESI];
176 (*regs)[14] = env->regs[R_EDI];
177 (*regs)[15] = env->regs[R_EAX];
178 (*regs)[16] = env->eip;
179 (*regs)[17] = env->segs[R_CS].selector & 0xffff;
180 (*regs)[18] = env->eflags;
181 (*regs)[19] = env->regs[R_ESP];
182 (*regs)[20] = env->segs[R_SS].selector & 0xffff;
183 (*regs)[21] = env->segs[R_FS].selector & 0xffff;
184 (*regs)[22] = env->segs[R_GS].selector & 0xffff;
185 (*regs)[23] = env->segs[R_DS].selector & 0xffff;
186 (*regs)[24] = env->segs[R_ES].selector & 0xffff;
187 (*regs)[25] = env->segs[R_FS].selector & 0xffff;
188 (*regs)[26] = env->segs[R_GS].selector & 0xffff;
189}
190
191#else
192
193#define ELF_START_MMAP 0x80000000
194
195
196
197
198#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
199
200
201
202
203#define ELF_CLASS ELFCLASS32
204#define ELF_ARCH EM_386
205
206static inline void init_thread(struct target_pt_regs *regs,
207 struct image_info *infop)
208{
209 regs->esp = infop->start_stack;
210 regs->eip = infop->entry;
211
212
213
214
215
216
217
218
219 regs->edx = 0;
220}
221
222#define ELF_NREG 17
223typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
224
225
226
227
228
229
230
231
232static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
233{
234 (*regs)[0] = env->regs[R_EBX];
235 (*regs)[1] = env->regs[R_ECX];
236 (*regs)[2] = env->regs[R_EDX];
237 (*regs)[3] = env->regs[R_ESI];
238 (*regs)[4] = env->regs[R_EDI];
239 (*regs)[5] = env->regs[R_EBP];
240 (*regs)[6] = env->regs[R_EAX];
241 (*regs)[7] = env->segs[R_DS].selector & 0xffff;
242 (*regs)[8] = env->segs[R_ES].selector & 0xffff;
243 (*regs)[9] = env->segs[R_FS].selector & 0xffff;
244 (*regs)[10] = env->segs[R_GS].selector & 0xffff;
245 (*regs)[11] = env->regs[R_EAX];
246 (*regs)[12] = env->eip;
247 (*regs)[13] = env->segs[R_CS].selector & 0xffff;
248 (*regs)[14] = env->eflags;
249 (*regs)[15] = env->regs[R_ESP];
250 (*regs)[16] = env->segs[R_SS].selector & 0xffff;
251}
252#endif
253
254#define USE_ELF_CORE_DUMP
255#define ELF_EXEC_PAGESIZE 4096
256
257#endif
258
259#ifdef TARGET_ARM
260
261#define ELF_START_MMAP 0x80000000
262
263#define elf_check_arch(x) ( (x) == EM_ARM )
264
265#define ELF_CLASS ELFCLASS32
266#define ELF_ARCH EM_ARM
267
268static inline void init_thread(struct target_pt_regs *regs,
269 struct image_info *infop)
270{
271 abi_long stack = infop->start_stack;
272 memset(regs, 0, sizeof(*regs));
273 regs->ARM_cpsr = 0x10;
274 if (infop->entry & 1)
275 regs->ARM_cpsr |= CPSR_T;
276 regs->ARM_pc = infop->entry & 0xfffffffe;
277 regs->ARM_sp = infop->start_stack;
278
279 get_user_ual(regs->ARM_r2, stack + 8);
280 get_user_ual(regs->ARM_r1, stack + 4);
281
282 regs->ARM_r0 = 0;
283
284
285 regs->ARM_r10 = infop->start_data;
286}
287
288#define ELF_NREG 18
289typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
290
291static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
292{
293 (*regs)[0] = tswapl(env->regs[0]);
294 (*regs)[1] = tswapl(env->regs[1]);
295 (*regs)[2] = tswapl(env->regs[2]);
296 (*regs)[3] = tswapl(env->regs[3]);
297 (*regs)[4] = tswapl(env->regs[4]);
298 (*regs)[5] = tswapl(env->regs[5]);
299 (*regs)[6] = tswapl(env->regs[6]);
300 (*regs)[7] = tswapl(env->regs[7]);
301 (*regs)[8] = tswapl(env->regs[8]);
302 (*regs)[9] = tswapl(env->regs[9]);
303 (*regs)[10] = tswapl(env->regs[10]);
304 (*regs)[11] = tswapl(env->regs[11]);
305 (*regs)[12] = tswapl(env->regs[12]);
306 (*regs)[13] = tswapl(env->regs[13]);
307 (*regs)[14] = tswapl(env->regs[14]);
308 (*regs)[15] = tswapl(env->regs[15]);
309
310 (*regs)[16] = tswapl(cpsr_read((CPUState *)env));
311 (*regs)[17] = tswapl(env->regs[0]);
312}
313
314#define USE_ELF_CORE_DUMP
315#define ELF_EXEC_PAGESIZE 4096
316
317enum
318{
319 ARM_HWCAP_ARM_SWP = 1 << 0,
320 ARM_HWCAP_ARM_HALF = 1 << 1,
321 ARM_HWCAP_ARM_THUMB = 1 << 2,
322 ARM_HWCAP_ARM_26BIT = 1 << 3,
323 ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
324 ARM_HWCAP_ARM_FPA = 1 << 5,
325 ARM_HWCAP_ARM_VFP = 1 << 6,
326 ARM_HWCAP_ARM_EDSP = 1 << 7,
327 ARM_HWCAP_ARM_JAVA = 1 << 8,
328 ARM_HWCAP_ARM_IWMMXT = 1 << 9,
329 ARM_HWCAP_ARM_THUMBEE = 1 << 10,
330 ARM_HWCAP_ARM_NEON = 1 << 11,
331 ARM_HWCAP_ARM_VFPv3 = 1 << 12,
332 ARM_HWCAP_ARM_VFPv3D16 = 1 << 13,
333};
334
335#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF \
336 | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT \
337 | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP \
338 | ARM_HWCAP_ARM_NEON | ARM_HWCAP_ARM_VFPv3 )
339
340#endif
341
342#ifdef TARGET_UNICORE32
343
344#define ELF_START_MMAP 0x80000000
345
346#define elf_check_arch(x) ((x) == EM_UNICORE32)
347
348#define ELF_CLASS ELFCLASS32
349#define ELF_DATA ELFDATA2LSB
350#define ELF_ARCH EM_UNICORE32
351
352static inline void init_thread(struct target_pt_regs *regs,
353 struct image_info *infop)
354{
355 abi_long stack = infop->start_stack;
356 memset(regs, 0, sizeof(*regs));
357 regs->UC32_REG_asr = 0x10;
358 regs->UC32_REG_pc = infop->entry & 0xfffffffe;
359 regs->UC32_REG_sp = infop->start_stack;
360
361 get_user_ual(regs->UC32_REG_02, stack + 8);
362 get_user_ual(regs->UC32_REG_01, stack + 4);
363
364 regs->UC32_REG_00 = 0;
365}
366
367#define ELF_NREG 34
368typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
369
370static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
371{
372 (*regs)[0] = env->regs[0];
373 (*regs)[1] = env->regs[1];
374 (*regs)[2] = env->regs[2];
375 (*regs)[3] = env->regs[3];
376 (*regs)[4] = env->regs[4];
377 (*regs)[5] = env->regs[5];
378 (*regs)[6] = env->regs[6];
379 (*regs)[7] = env->regs[7];
380 (*regs)[8] = env->regs[8];
381 (*regs)[9] = env->regs[9];
382 (*regs)[10] = env->regs[10];
383 (*regs)[11] = env->regs[11];
384 (*regs)[12] = env->regs[12];
385 (*regs)[13] = env->regs[13];
386 (*regs)[14] = env->regs[14];
387 (*regs)[15] = env->regs[15];
388 (*regs)[16] = env->regs[16];
389 (*regs)[17] = env->regs[17];
390 (*regs)[18] = env->regs[18];
391 (*regs)[19] = env->regs[19];
392 (*regs)[20] = env->regs[20];
393 (*regs)[21] = env->regs[21];
394 (*regs)[22] = env->regs[22];
395 (*regs)[23] = env->regs[23];
396 (*regs)[24] = env->regs[24];
397 (*regs)[25] = env->regs[25];
398 (*regs)[26] = env->regs[26];
399 (*regs)[27] = env->regs[27];
400 (*regs)[28] = env->regs[28];
401 (*regs)[29] = env->regs[29];
402 (*regs)[30] = env->regs[30];
403 (*regs)[31] = env->regs[31];
404
405 (*regs)[32] = cpu_asr_read((CPUState *)env);
406 (*regs)[33] = env->regs[0];
407}
408
409#define USE_ELF_CORE_DUMP
410#define ELF_EXEC_PAGESIZE 4096
411
412#define ELF_HWCAP (UC32_HWCAP_CMOV | UC32_HWCAP_UCF64)
413
414#endif
415
416#ifdef TARGET_SPARC
417#ifdef TARGET_SPARC64
418
419#define ELF_START_MMAP 0x80000000
420#define ELF_HWCAP (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
421 | HWCAP_SPARC_MULDIV | HWCAP_SPARC_V9)
422#ifndef TARGET_ABI32
423#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
424#else
425#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
426#endif
427
428#define ELF_CLASS ELFCLASS64
429#define ELF_ARCH EM_SPARCV9
430
431#define STACK_BIAS 2047
432
433static inline void init_thread(struct target_pt_regs *regs,
434 struct image_info *infop)
435{
436#ifndef TARGET_ABI32
437 regs->tstate = 0;
438#endif
439 regs->pc = infop->entry;
440 regs->npc = regs->pc + 4;
441 regs->y = 0;
442#ifdef TARGET_ABI32
443 regs->u_regs[14] = infop->start_stack - 16 * 4;
444#else
445 if (personality(infop->personality) == PER_LINUX32)
446 regs->u_regs[14] = infop->start_stack - 16 * 4;
447 else
448 regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
449#endif
450}
451
452#else
453#define ELF_START_MMAP 0x80000000
454#define ELF_HWCAP (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
455 | HWCAP_SPARC_MULDIV)
456#define elf_check_arch(x) ( (x) == EM_SPARC )
457
458#define ELF_CLASS ELFCLASS32
459#define ELF_ARCH EM_SPARC
460
461static inline void init_thread(struct target_pt_regs *regs,
462 struct image_info *infop)
463{
464 regs->psr = 0;
465 regs->pc = infop->entry;
466 regs->npc = regs->pc + 4;
467 regs->y = 0;
468 regs->u_regs[14] = infop->start_stack - 16 * 4;
469}
470
471#endif
472#endif
473
474#ifdef TARGET_PPC
475
476#define ELF_START_MMAP 0x80000000
477
478#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
479
480#define elf_check_arch(x) ( (x) == EM_PPC64 )
481
482#define ELF_CLASS ELFCLASS64
483
484#else
485
486#define elf_check_arch(x) ( (x) == EM_PPC )
487
488#define ELF_CLASS ELFCLASS32
489
490#endif
491
492#define ELF_ARCH EM_PPC
493
494
495
496enum {
497 QEMU_PPC_FEATURE_32 = 0x80000000,
498 QEMU_PPC_FEATURE_64 = 0x40000000,
499 QEMU_PPC_FEATURE_601_INSTR = 0x20000000,
500 QEMU_PPC_FEATURE_HAS_ALTIVEC = 0x10000000,
501 QEMU_PPC_FEATURE_HAS_FPU = 0x08000000,
502 QEMU_PPC_FEATURE_HAS_MMU = 0x04000000,
503 QEMU_PPC_FEATURE_HAS_4xxMAC = 0x02000000,
504 QEMU_PPC_FEATURE_UNIFIED_CACHE = 0x01000000,
505 QEMU_PPC_FEATURE_HAS_SPE = 0x00800000,
506 QEMU_PPC_FEATURE_HAS_EFP_SINGLE = 0x00400000,
507 QEMU_PPC_FEATURE_HAS_EFP_DOUBLE = 0x00200000,
508 QEMU_PPC_FEATURE_NO_TB = 0x00100000,
509 QEMU_PPC_FEATURE_POWER4 = 0x00080000,
510 QEMU_PPC_FEATURE_POWER5 = 0x00040000,
511 QEMU_PPC_FEATURE_POWER5_PLUS = 0x00020000,
512 QEMU_PPC_FEATURE_CELL = 0x00010000,
513 QEMU_PPC_FEATURE_BOOKE = 0x00008000,
514 QEMU_PPC_FEATURE_SMT = 0x00004000,
515 QEMU_PPC_FEATURE_ICACHE_SNOOP = 0x00002000,
516 QEMU_PPC_FEATURE_ARCH_2_05 = 0x00001000,
517 QEMU_PPC_FEATURE_PA6T = 0x00000800,
518 QEMU_PPC_FEATURE_HAS_DFP = 0x00000400,
519 QEMU_PPC_FEATURE_POWER6_EXT = 0x00000200,
520 QEMU_PPC_FEATURE_ARCH_2_06 = 0x00000100,
521 QEMU_PPC_FEATURE_HAS_VSX = 0x00000080,
522 QEMU_PPC_FEATURE_PSERIES_PERFMON_COMPAT = 0x00000040,
523
524 QEMU_PPC_FEATURE_TRUE_LE = 0x00000002,
525 QEMU_PPC_FEATURE_PPC_LE = 0x00000001,
526};
527
528#define ELF_HWCAP get_elf_hwcap()
529
530static uint32_t get_elf_hwcap(void)
531{
532 CPUState *e = thread_env;
533 uint32_t features = 0;
534
535
536
537#define GET_FEATURE(flag, feature) \
538 do {if (e->insns_flags & flag) features |= feature; } while(0)
539 GET_FEATURE(PPC_64B, QEMU_PPC_FEATURE_64);
540 GET_FEATURE(PPC_FLOAT, QEMU_PPC_FEATURE_HAS_FPU);
541 GET_FEATURE(PPC_ALTIVEC, QEMU_PPC_FEATURE_HAS_ALTIVEC);
542 GET_FEATURE(PPC_SPE, QEMU_PPC_FEATURE_HAS_SPE);
543 GET_FEATURE(PPC_SPE_SINGLE, QEMU_PPC_FEATURE_HAS_EFP_SINGLE);
544 GET_FEATURE(PPC_SPE_DOUBLE, QEMU_PPC_FEATURE_HAS_EFP_DOUBLE);
545 GET_FEATURE(PPC_BOOKE, QEMU_PPC_FEATURE_BOOKE);
546 GET_FEATURE(PPC_405_MAC, QEMU_PPC_FEATURE_HAS_4xxMAC);
547#undef GET_FEATURE
548
549 return features;
550}
551
552
553
554
555
556
557
558
559
560
561#define DLINFO_ARCH_ITEMS 5
562#define ARCH_DLINFO \
563 do { \
564 NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20); \
565 NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20); \
566 NEW_AUX_ENT(AT_UCACHEBSIZE, 0); \
567
568
569 \
570 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
571 NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
572 } while (0)
573
574static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
575{
576 _regs->gpr[1] = infop->start_stack;
577#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
578 _regs->gpr[2] = ldq_raw(infop->entry + 8) + infop->load_addr;
579 infop->entry = ldq_raw(infop->entry) + infop->load_addr;
580#endif
581 _regs->nip = infop->entry;
582}
583
584
585#define ELF_NREG 48
586typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
587
588static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
589{
590 int i;
591 target_ulong ccr = 0;
592
593 for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
594 (*regs)[i] = tswapl(env->gpr[i]);
595 }
596
597 (*regs)[32] = tswapl(env->nip);
598 (*regs)[33] = tswapl(env->msr);
599 (*regs)[35] = tswapl(env->ctr);
600 (*regs)[36] = tswapl(env->lr);
601 (*regs)[37] = tswapl(env->xer);
602
603 for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
604 ccr |= env->crf[i] << (32 - ((i + 1) * 4));
605 }
606 (*regs)[38] = tswapl(ccr);
607}
608
609#define USE_ELF_CORE_DUMP
610#define ELF_EXEC_PAGESIZE 4096
611
612#endif
613
614#ifdef TARGET_MIPS
615
616#define ELF_START_MMAP 0x80000000
617
618#define elf_check_arch(x) ( (x) == EM_MIPS )
619
620#ifdef TARGET_MIPS64
621#define ELF_CLASS ELFCLASS64
622#else
623#define ELF_CLASS ELFCLASS32
624#endif
625#define ELF_ARCH EM_MIPS
626
627static inline void init_thread(struct target_pt_regs *regs,
628 struct image_info *infop)
629{
630 regs->cp0_status = 2 << CP0St_KSU;
631 regs->cp0_epc = infop->entry;
632 regs->regs[29] = infop->start_stack;
633}
634
635
636#define ELF_NREG 45
637typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
638
639
640enum {
641#ifdef TARGET_MIPS64
642 TARGET_EF_R0 = 0,
643#else
644 TARGET_EF_R0 = 6,
645#endif
646 TARGET_EF_R26 = TARGET_EF_R0 + 26,
647 TARGET_EF_R27 = TARGET_EF_R0 + 27,
648 TARGET_EF_LO = TARGET_EF_R0 + 32,
649 TARGET_EF_HI = TARGET_EF_R0 + 33,
650 TARGET_EF_CP0_EPC = TARGET_EF_R0 + 34,
651 TARGET_EF_CP0_BADVADDR = TARGET_EF_R0 + 35,
652 TARGET_EF_CP0_STATUS = TARGET_EF_R0 + 36,
653 TARGET_EF_CP0_CAUSE = TARGET_EF_R0 + 37
654};
655
656
657static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
658{
659 int i;
660
661 for (i = 0; i < TARGET_EF_R0; i++) {
662 (*regs)[i] = 0;
663 }
664 (*regs)[TARGET_EF_R0] = 0;
665
666 for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) {
667 (*regs)[TARGET_EF_R0 + i] = tswapl(env->active_tc.gpr[i]);
668 }
669
670 (*regs)[TARGET_EF_R26] = 0;
671 (*regs)[TARGET_EF_R27] = 0;
672 (*regs)[TARGET_EF_LO] = tswapl(env->active_tc.LO[0]);
673 (*regs)[TARGET_EF_HI] = tswapl(env->active_tc.HI[0]);
674 (*regs)[TARGET_EF_CP0_EPC] = tswapl(env->active_tc.PC);
675 (*regs)[TARGET_EF_CP0_BADVADDR] = tswapl(env->CP0_BadVAddr);
676 (*regs)[TARGET_EF_CP0_STATUS] = tswapl(env->CP0_Status);
677 (*regs)[TARGET_EF_CP0_CAUSE] = tswapl(env->CP0_Cause);
678}
679
680#define USE_ELF_CORE_DUMP
681#define ELF_EXEC_PAGESIZE 4096
682
683#endif
684
685#ifdef TARGET_MICROBLAZE
686
687#define ELF_START_MMAP 0x80000000
688
689#define elf_check_arch(x) ( (x) == EM_MICROBLAZE || (x) == EM_MICROBLAZE_OLD)
690
691#define ELF_CLASS ELFCLASS32
692#define ELF_ARCH EM_MICROBLAZE
693
694static inline void init_thread(struct target_pt_regs *regs,
695 struct image_info *infop)
696{
697 regs->pc = infop->entry;
698 regs->r1 = infop->start_stack;
699
700}
701
702#define ELF_EXEC_PAGESIZE 4096
703
704#define USE_ELF_CORE_DUMP
705#define ELF_NREG 38
706typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
707
708
709static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
710{
711 int i, pos = 0;
712
713 for (i = 0; i < 32; i++) {
714 (*regs)[pos++] = tswapl(env->regs[i]);
715 }
716
717 for (i = 0; i < 6; i++) {
718 (*regs)[pos++] = tswapl(env->sregs[i]);
719 }
720}
721
722#endif
723
724#ifdef TARGET_SH4
725
726#define ELF_START_MMAP 0x80000000
727
728#define elf_check_arch(x) ( (x) == EM_SH )
729
730#define ELF_CLASS ELFCLASS32
731#define ELF_ARCH EM_SH
732
733static inline void init_thread(struct target_pt_regs *regs,
734 struct image_info *infop)
735{
736
737 regs->pc = infop->entry;
738 regs->regs[15] = infop->start_stack;
739}
740
741
742#define ELF_NREG 23
743typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
744
745
746enum {
747 TARGET_REG_PC = 16,
748 TARGET_REG_PR = 17,
749 TARGET_REG_SR = 18,
750 TARGET_REG_GBR = 19,
751 TARGET_REG_MACH = 20,
752 TARGET_REG_MACL = 21,
753 TARGET_REG_SYSCALL = 22
754};
755
756static inline void elf_core_copy_regs(target_elf_gregset_t *regs,
757 const CPUState *env)
758{
759 int i;
760
761 for (i = 0; i < 16; i++) {
762 (*regs[i]) = tswapl(env->gregs[i]);
763 }
764
765 (*regs)[TARGET_REG_PC] = tswapl(env->pc);
766 (*regs)[TARGET_REG_PR] = tswapl(env->pr);
767 (*regs)[TARGET_REG_SR] = tswapl(env->sr);
768 (*regs)[TARGET_REG_GBR] = tswapl(env->gbr);
769 (*regs)[TARGET_REG_MACH] = tswapl(env->mach);
770 (*regs)[TARGET_REG_MACL] = tswapl(env->macl);
771 (*regs)[TARGET_REG_SYSCALL] = 0;
772}
773
774#define USE_ELF_CORE_DUMP
775#define ELF_EXEC_PAGESIZE 4096
776
777#endif
778
779#ifdef TARGET_CRIS
780
781#define ELF_START_MMAP 0x80000000
782
783#define elf_check_arch(x) ( (x) == EM_CRIS )
784
785#define ELF_CLASS ELFCLASS32
786#define ELF_ARCH EM_CRIS
787
788static inline void init_thread(struct target_pt_regs *regs,
789 struct image_info *infop)
790{
791 regs->erp = infop->entry;
792}
793
794#define ELF_EXEC_PAGESIZE 8192
795
796#endif
797
798#ifdef TARGET_M68K
799
800#define ELF_START_MMAP 0x80000000
801
802#define elf_check_arch(x) ( (x) == EM_68K )
803
804#define ELF_CLASS ELFCLASS32
805#define ELF_ARCH EM_68K
806
807
808
809
810static inline void init_thread(struct target_pt_regs *regs,
811 struct image_info *infop)
812{
813 regs->usp = infop->start_stack;
814 regs->sr = 0;
815 regs->pc = infop->entry;
816}
817
818
819#define ELF_NREG 20
820typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
821
822static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
823{
824 (*regs)[0] = tswapl(env->dregs[1]);
825 (*regs)[1] = tswapl(env->dregs[2]);
826 (*regs)[2] = tswapl(env->dregs[3]);
827 (*regs)[3] = tswapl(env->dregs[4]);
828 (*regs)[4] = tswapl(env->dregs[5]);
829 (*regs)[5] = tswapl(env->dregs[6]);
830 (*regs)[6] = tswapl(env->dregs[7]);
831 (*regs)[7] = tswapl(env->aregs[0]);
832 (*regs)[8] = tswapl(env->aregs[1]);
833 (*regs)[9] = tswapl(env->aregs[2]);
834 (*regs)[10] = tswapl(env->aregs[3]);
835 (*regs)[11] = tswapl(env->aregs[4]);
836 (*regs)[12] = tswapl(env->aregs[5]);
837 (*regs)[13] = tswapl(env->aregs[6]);
838 (*regs)[14] = tswapl(env->dregs[0]);
839 (*regs)[15] = tswapl(env->aregs[7]);
840 (*regs)[16] = tswapl(env->dregs[0]);
841 (*regs)[17] = tswapl(env->sr);
842 (*regs)[18] = tswapl(env->pc);
843 (*regs)[19] = 0;
844}
845
846#define USE_ELF_CORE_DUMP
847#define ELF_EXEC_PAGESIZE 8192
848
849#endif
850
851#ifdef TARGET_ALPHA
852
853#define ELF_START_MMAP (0x30000000000ULL)
854
855#define elf_check_arch(x) ( (x) == ELF_ARCH )
856
857#define ELF_CLASS ELFCLASS64
858#define ELF_ARCH EM_ALPHA
859
860static inline void init_thread(struct target_pt_regs *regs,
861 struct image_info *infop)
862{
863 regs->pc = infop->entry;
864 regs->ps = 8;
865 regs->usp = infop->start_stack;
866}
867
868#define ELF_EXEC_PAGESIZE 8192
869
870#endif
871
872#ifdef TARGET_S390X
873
874#define ELF_START_MMAP (0x20000000000ULL)
875
876#define elf_check_arch(x) ( (x) == ELF_ARCH )
877
878#define ELF_CLASS ELFCLASS64
879#define ELF_DATA ELFDATA2MSB
880#define ELF_ARCH EM_S390
881
882static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
883{
884 regs->psw.addr = infop->entry;
885 regs->psw.mask = PSW_MASK_64 | PSW_MASK_32;
886 regs->gprs[15] = infop->start_stack;
887}
888
889#endif
890
891#ifndef ELF_PLATFORM
892#define ELF_PLATFORM (NULL)
893#endif
894
895#ifndef ELF_HWCAP
896#define ELF_HWCAP 0
897#endif
898
899#ifdef TARGET_ABI32
900#undef ELF_CLASS
901#define ELF_CLASS ELFCLASS32
902#undef bswaptls
903#define bswaptls(ptr) bswap32s(ptr)
904#endif
905
906#include "elf.h"
907
908struct exec
909{
910 unsigned int a_info;
911 unsigned int a_text;
912 unsigned int a_data;
913 unsigned int a_bss;
914 unsigned int a_syms;
915 unsigned int a_entry;
916 unsigned int a_trsize;
917 unsigned int a_drsize;
918};
919
920
921#define N_MAGIC(exec) ((exec).a_info & 0xffff)
922#define OMAGIC 0407
923#define NMAGIC 0410
924#define ZMAGIC 0413
925#define QMAGIC 0314
926
927
928#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
929#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
930#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
931
932#define DLINFO_ITEMS 13
933
934static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
935{
936 memcpy(to, from, n);
937}
938
939#ifdef BSWAP_NEEDED
940static void bswap_ehdr(struct elfhdr *ehdr)
941{
942 bswap16s(&ehdr->e_type);
943 bswap16s(&ehdr->e_machine);
944 bswap32s(&ehdr->e_version);
945 bswaptls(&ehdr->e_entry);
946 bswaptls(&ehdr->e_phoff);
947 bswaptls(&ehdr->e_shoff);
948 bswap32s(&ehdr->e_flags);
949 bswap16s(&ehdr->e_ehsize);
950 bswap16s(&ehdr->e_phentsize);
951 bswap16s(&ehdr->e_phnum);
952 bswap16s(&ehdr->e_shentsize);
953 bswap16s(&ehdr->e_shnum);
954 bswap16s(&ehdr->e_shstrndx);
955}
956
957static void bswap_phdr(struct elf_phdr *phdr, int phnum)
958{
959 int i;
960 for (i = 0; i < phnum; ++i, ++phdr) {
961 bswap32s(&phdr->p_type);
962 bswap32s(&phdr->p_flags);
963 bswaptls(&phdr->p_offset);
964 bswaptls(&phdr->p_vaddr);
965 bswaptls(&phdr->p_paddr);
966 bswaptls(&phdr->p_filesz);
967 bswaptls(&phdr->p_memsz);
968 bswaptls(&phdr->p_align);
969 }
970}
971
972static void bswap_shdr(struct elf_shdr *shdr, int shnum)
973{
974 int i;
975 for (i = 0; i < shnum; ++i, ++shdr) {
976 bswap32s(&shdr->sh_name);
977 bswap32s(&shdr->sh_type);
978 bswaptls(&shdr->sh_flags);
979 bswaptls(&shdr->sh_addr);
980 bswaptls(&shdr->sh_offset);
981 bswaptls(&shdr->sh_size);
982 bswap32s(&shdr->sh_link);
983 bswap32s(&shdr->sh_info);
984 bswaptls(&shdr->sh_addralign);
985 bswaptls(&shdr->sh_entsize);
986 }
987}
988
989static void bswap_sym(struct elf_sym *sym)
990{
991 bswap32s(&sym->st_name);
992 bswaptls(&sym->st_value);
993 bswaptls(&sym->st_size);
994 bswap16s(&sym->st_shndx);
995}
996#else
997static inline void bswap_ehdr(struct elfhdr *ehdr) { }
998static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { }
999static inline void bswap_shdr(struct elf_shdr *shdr, int shnum) { }
1000static inline void bswap_sym(struct elf_sym *sym) { }
1001#endif
1002
1003#ifdef USE_ELF_CORE_DUMP
1004static int elf_core_dump(int, const CPUState *);
1005#endif
1006static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias);
1007
1008
1009
1010static bool elf_check_ident(struct elfhdr *ehdr)
1011{
1012 return (ehdr->e_ident[EI_MAG0] == ELFMAG0
1013 && ehdr->e_ident[EI_MAG1] == ELFMAG1
1014 && ehdr->e_ident[EI_MAG2] == ELFMAG2
1015 && ehdr->e_ident[EI_MAG3] == ELFMAG3
1016 && ehdr->e_ident[EI_CLASS] == ELF_CLASS
1017 && ehdr->e_ident[EI_DATA] == ELF_DATA
1018 && ehdr->e_ident[EI_VERSION] == EV_CURRENT);
1019}
1020
1021
1022
1023static bool elf_check_ehdr(struct elfhdr *ehdr)
1024{
1025 return (elf_check_arch(ehdr->e_machine)
1026 && ehdr->e_ehsize == sizeof(struct elfhdr)
1027 && ehdr->e_phentsize == sizeof(struct elf_phdr)
1028 && ehdr->e_shentsize == sizeof(struct elf_shdr)
1029 && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));
1030}
1031
1032
1033
1034
1035
1036
1037
1038static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
1039 abi_ulong p)
1040{
1041 char *tmp, *tmp1, *pag = NULL;
1042 int len, offset = 0;
1043
1044 if (!p) {
1045 return 0;
1046 }
1047 while (argc-- > 0) {
1048 tmp = argv[argc];
1049 if (!tmp) {
1050 fprintf(stderr, "VFS: argc is wrong");
1051 exit(-1);
1052 }
1053 tmp1 = tmp;
1054 while (*tmp++);
1055 len = tmp - tmp1;
1056 if (p < len) {
1057 return 0;
1058 }
1059 while (len) {
1060 --p; --tmp; --len;
1061 if (--offset < 0) {
1062 offset = p % TARGET_PAGE_SIZE;
1063 pag = (char *)page[p/TARGET_PAGE_SIZE];
1064 if (!pag) {
1065 pag = (char *)malloc(TARGET_PAGE_SIZE);
1066 memset(pag, 0, TARGET_PAGE_SIZE);
1067 page[p/TARGET_PAGE_SIZE] = pag;
1068 if (!pag)
1069 return 0;
1070 }
1071 }
1072 if (len == 0 || offset == 0) {
1073 *(pag + offset) = *tmp;
1074 }
1075 else {
1076 int bytes_to_copy = (len > offset) ? offset : len;
1077 tmp -= bytes_to_copy;
1078 p -= bytes_to_copy;
1079 offset -= bytes_to_copy;
1080 len -= bytes_to_copy;
1081 memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
1082 }
1083 }
1084 }
1085 return p;
1086}
1087
1088static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
1089 struct image_info *info)
1090{
1091 abi_ulong stack_base, size, error, guard;
1092 int i;
1093
1094
1095
1096 size = guest_stack_size;
1097 if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE) {
1098 size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
1099 }
1100 guard = TARGET_PAGE_SIZE;
1101 if (guard < qemu_real_host_page_size) {
1102 guard = qemu_real_host_page_size;
1103 }
1104
1105 error = target_mmap(0, size + guard, PROT_READ | PROT_WRITE,
1106 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1107 if (error == -1) {
1108 perror("mmap stack");
1109 exit(-1);
1110 }
1111
1112
1113 target_mprotect(error, guard, PROT_NONE);
1114
1115 info->stack_limit = error + guard;
1116 stack_base = info->stack_limit + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
1117 p += stack_base;
1118
1119 for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
1120 if (bprm->page[i]) {
1121 info->rss++;
1122
1123 memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
1124 free(bprm->page[i]);
1125 }
1126 stack_base += TARGET_PAGE_SIZE;
1127 }
1128 return p;
1129}
1130
1131
1132
1133static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot)
1134{
1135 uintptr_t host_start, host_map_start, host_end;
1136
1137 last_bss = TARGET_PAGE_ALIGN(last_bss);
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150 host_start = (uintptr_t) g2h(elf_bss);
1151 host_end = (uintptr_t) g2h(last_bss);
1152 host_map_start = (host_start + qemu_real_host_page_size - 1);
1153 host_map_start &= -qemu_real_host_page_size;
1154
1155 if (host_map_start < host_end) {
1156 void *p = mmap((void *)host_map_start, host_end - host_map_start,
1157 prot, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1158 if (p == MAP_FAILED) {
1159 perror("cannot mmap brk");
1160 exit(-1);
1161 }
1162
1163
1164
1165 page_set_flags(elf_bss & TARGET_PAGE_MASK, last_bss, prot|PAGE_VALID);
1166 }
1167
1168 if (host_start < host_map_start) {
1169 memset((void *)host_start, 0, host_map_start - host_start);
1170 }
1171}
1172
1173#ifdef CONFIG_USE_FDPIC
1174static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong sp)
1175{
1176 uint16_t n;
1177 struct elf32_fdpic_loadseg *loadsegs = info->loadsegs;
1178
1179
1180 n = info->nsegs;
1181 while (n--) {
1182 sp -= 12;
1183 put_user_u32(loadsegs[n].addr, sp+0);
1184 put_user_u32(loadsegs[n].p_vaddr, sp+4);
1185 put_user_u32(loadsegs[n].p_memsz, sp+8);
1186 }
1187
1188
1189 sp -= 4;
1190 put_user_u16(0, sp+0);
1191 put_user_u16(info->nsegs, sp+2);
1192
1193 info->personality = PER_LINUX_FDPIC;
1194 info->loadmap_addr = sp;
1195
1196 return sp;
1197}
1198#endif
1199
1200static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
1201 struct elfhdr *exec,
1202 struct image_info *info,
1203 struct image_info *interp_info)
1204{
1205 abi_ulong sp;
1206 int size;
1207 int i;
1208 abi_ulong u_rand_bytes;
1209 uint8_t k_rand_bytes[16];
1210 abi_ulong u_platform;
1211 const char *k_platform;
1212 const int n = sizeof(elf_addr_t);
1213
1214 sp = p;
1215
1216#ifdef CONFIG_USE_FDPIC
1217
1218 if (elf_is_fdpic(exec)) {
1219
1220 sp &= ~3;
1221 sp = loader_build_fdpic_loadmap(info, sp);
1222 info->other_info = interp_info;
1223 if (interp_info) {
1224 interp_info->other_info = info;
1225 sp = loader_build_fdpic_loadmap(interp_info, sp);
1226 }
1227 }
1228#endif
1229
1230 u_platform = 0;
1231 k_platform = ELF_PLATFORM;
1232 if (k_platform) {
1233 size_t len = strlen(k_platform) + 1;
1234 sp -= (len + n - 1) & ~(n - 1);
1235 u_platform = sp;
1236
1237 memcpy_to_target(sp, k_platform, len);
1238 }
1239
1240
1241
1242
1243
1244 srand((unsigned int) time(NULL));
1245 for (i = 0; i < 16; i++) {
1246 k_rand_bytes[i] = rand();
1247 }
1248 sp -= 16;
1249 u_rand_bytes = sp;
1250
1251 memcpy_to_target(sp, k_rand_bytes, 16);
1252
1253
1254
1255
1256 sp = sp &~ (abi_ulong)15;
1257 size = (DLINFO_ITEMS + 1) * 2;
1258 if (k_platform)
1259 size += 2;
1260#ifdef DLINFO_ARCH_ITEMS
1261 size += DLINFO_ARCH_ITEMS * 2;
1262#endif
1263 size += envc + argc + 2;
1264 size += 1;
1265 size *= n;
1266 if (size & 15)
1267 sp -= 16 - (size & 15);
1268
1269
1270
1271
1272#define NEW_AUX_ENT(id, val) do { \
1273 sp -= n; put_user_ual(val, sp); \
1274 sp -= n; put_user_ual(id, sp); \
1275 } while(0)
1276
1277 NEW_AUX_ENT (AT_NULL, 0);
1278
1279
1280 NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff));
1281 NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
1282 NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
1283 NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
1284 NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0));
1285 NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
1286 NEW_AUX_ENT(AT_ENTRY, info->entry);
1287 NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
1288 NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
1289 NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
1290 NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
1291 NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
1292 NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
1293 NEW_AUX_ENT(AT_RANDOM, (abi_ulong) u_rand_bytes);
1294
1295 if (k_platform)
1296 NEW_AUX_ENT(AT_PLATFORM, u_platform);
1297#ifdef ARCH_DLINFO
1298
1299
1300
1301
1302 ARCH_DLINFO;
1303#endif
1304#undef NEW_AUX_ENT
1305
1306 info->saved_auxv = sp;
1307
1308 sp = loader_build_argptr(envc, argc, sp, p, 0);
1309 return sp;
1310}
1311
1312static void probe_guest_base(const char *image_name,
1313 abi_ulong loaddr, abi_ulong hiaddr)
1314{
1315
1316
1317
1318
1319#if defined(CONFIG_USE_GUEST_BASE)
1320 const char *errmsg;
1321 if (!have_guest_base && !reserved_va) {
1322 unsigned long host_start, real_start, host_size;
1323
1324
1325 loaddr &= qemu_host_page_mask;
1326 hiaddr = HOST_PAGE_ALIGN(hiaddr);
1327
1328 if (loaddr < mmap_min_addr) {
1329 host_start = HOST_PAGE_ALIGN(mmap_min_addr);
1330 } else {
1331 host_start = loaddr;
1332 if (host_start != loaddr) {
1333 errmsg = "Address overflow loading ELF binary";
1334 goto exit_errmsg;
1335 }
1336 }
1337 host_size = hiaddr - loaddr;
1338 while (1) {
1339
1340
1341
1342 real_start = (unsigned long)
1343 mmap((void *)host_start, host_size, PROT_NONE,
1344 MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0);
1345 if (real_start == (unsigned long)-1) {
1346 goto exit_perror;
1347 }
1348 if (real_start == host_start) {
1349 break;
1350 }
1351
1352
1353
1354
1355
1356
1357
1358
1359 munmap((void *)real_start, host_size);
1360 host_start += qemu_host_page_size;
1361 if (host_start == loaddr) {
1362
1363
1364 errmsg = "Unable to find space for application";
1365 goto exit_errmsg;
1366 }
1367 }
1368 qemu_log("Relocating guest address space from 0x"
1369 TARGET_ABI_FMT_lx " to 0x%lx\n",
1370 loaddr, real_start);
1371 guest_base = real_start - loaddr;
1372 }
1373 return;
1374
1375exit_perror:
1376 errmsg = strerror(errno);
1377exit_errmsg:
1378 fprintf(stderr, "%s: %s\n", image_name, errmsg);
1379 exit(-1);
1380#endif
1381}
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396static void load_elf_image(const char *image_name, int image_fd,
1397 struct image_info *info, char **pinterp_name,
1398 char bprm_buf[BPRM_BUF_SIZE])
1399{
1400 struct elfhdr *ehdr = (struct elfhdr *)bprm_buf;
1401 struct elf_phdr *phdr;
1402 abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
1403 int i, retval;
1404 const char *errmsg;
1405
1406
1407 errmsg = "Invalid ELF image for this architecture";
1408 if (!elf_check_ident(ehdr)) {
1409 goto exit_errmsg;
1410 }
1411 bswap_ehdr(ehdr);
1412 if (!elf_check_ehdr(ehdr)) {
1413 goto exit_errmsg;
1414 }
1415
1416 i = ehdr->e_phnum * sizeof(struct elf_phdr);
1417 if (ehdr->e_phoff + i <= BPRM_BUF_SIZE) {
1418 phdr = (struct elf_phdr *)(bprm_buf + ehdr->e_phoff);
1419 } else {
1420 phdr = (struct elf_phdr *) alloca(i);
1421 retval = pread(image_fd, phdr, i, ehdr->e_phoff);
1422 if (retval != i) {
1423 goto exit_read;
1424 }
1425 }
1426 bswap_phdr(phdr, ehdr->e_phnum);
1427
1428#ifdef CONFIG_USE_FDPIC
1429 info->nsegs = 0;
1430 info->pt_dynamic_addr = 0;
1431#endif
1432
1433
1434
1435 loaddr = -1, hiaddr = 0;
1436 for (i = 0; i < ehdr->e_phnum; ++i) {
1437 if (phdr[i].p_type == PT_LOAD) {
1438 abi_ulong a = phdr[i].p_vaddr;
1439 if (a < loaddr) {
1440 loaddr = a;
1441 }
1442 a += phdr[i].p_memsz;
1443 if (a > hiaddr) {
1444 hiaddr = a;
1445 }
1446#ifdef CONFIG_USE_FDPIC
1447 ++info->nsegs;
1448#endif
1449 }
1450 }
1451
1452 load_addr = loaddr;
1453 if (ehdr->e_type == ET_DYN) {
1454
1455
1456
1457
1458
1459 load_addr = target_mmap(loaddr, hiaddr - loaddr, PROT_NONE,
1460 MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
1461 -1, 0);
1462 if (load_addr == -1) {
1463 goto exit_perror;
1464 }
1465 } else if (pinterp_name != NULL) {
1466
1467
1468
1469 probe_guest_base(image_name, loaddr, hiaddr);
1470 }
1471 load_bias = load_addr - loaddr;
1472
1473#ifdef CONFIG_USE_FDPIC
1474 {
1475 struct elf32_fdpic_loadseg *loadsegs = info->loadsegs =
1476 qemu_malloc(sizeof(*loadsegs) * info->nsegs);
1477
1478 for (i = 0; i < ehdr->e_phnum; ++i) {
1479 switch (phdr[i].p_type) {
1480 case PT_DYNAMIC:
1481 info->pt_dynamic_addr = phdr[i].p_vaddr + load_bias;
1482 break;
1483 case PT_LOAD:
1484 loadsegs->addr = phdr[i].p_vaddr + load_bias;
1485 loadsegs->p_vaddr = phdr[i].p_vaddr;
1486 loadsegs->p_memsz = phdr[i].p_memsz;
1487 ++loadsegs;
1488 break;
1489 }
1490 }
1491 }
1492#endif
1493
1494 info->load_bias = load_bias;
1495 info->load_addr = load_addr;
1496 info->entry = ehdr->e_entry + load_bias;
1497 info->start_code = -1;
1498 info->end_code = 0;
1499 info->start_data = -1;
1500 info->end_data = 0;
1501 info->brk = 0;
1502
1503 for (i = 0; i < ehdr->e_phnum; i++) {
1504 struct elf_phdr *eppnt = phdr + i;
1505 if (eppnt->p_type == PT_LOAD) {
1506 abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em;
1507 int elf_prot = 0;
1508
1509 if (eppnt->p_flags & PF_R) elf_prot = PROT_READ;
1510 if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1511 if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1512
1513 vaddr = load_bias + eppnt->p_vaddr;
1514 vaddr_po = TARGET_ELF_PAGEOFFSET(vaddr);
1515 vaddr_ps = TARGET_ELF_PAGESTART(vaddr);
1516
1517 error = target_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po,
1518 elf_prot, MAP_PRIVATE | MAP_FIXED,
1519 image_fd, eppnt->p_offset - vaddr_po);
1520 if (error == -1) {
1521 goto exit_perror;
1522 }
1523
1524 vaddr_ef = vaddr + eppnt->p_filesz;
1525 vaddr_em = vaddr + eppnt->p_memsz;
1526
1527
1528 if (vaddr_ef < vaddr_em) {
1529 zero_bss(vaddr_ef, vaddr_em, elf_prot);
1530 }
1531
1532
1533 if (elf_prot & PROT_EXEC) {
1534 if (vaddr < info->start_code) {
1535 info->start_code = vaddr;
1536 }
1537 if (vaddr_ef > info->end_code) {
1538 info->end_code = vaddr_ef;
1539 }
1540 }
1541 if (elf_prot & PROT_WRITE) {
1542 if (vaddr < info->start_data) {
1543 info->start_data = vaddr;
1544 }
1545 if (vaddr_ef > info->end_data) {
1546 info->end_data = vaddr_ef;
1547 }
1548 if (vaddr_em > info->brk) {
1549 info->brk = vaddr_em;
1550 }
1551 }
1552 } else if (eppnt->p_type == PT_INTERP && pinterp_name) {
1553 char *interp_name;
1554
1555 if (*pinterp_name) {
1556 errmsg = "Multiple PT_INTERP entries";
1557 goto exit_errmsg;
1558 }
1559 interp_name = malloc(eppnt->p_filesz);
1560 if (!interp_name) {
1561 goto exit_perror;
1562 }
1563
1564 if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
1565 memcpy(interp_name, bprm_buf + eppnt->p_offset,
1566 eppnt->p_filesz);
1567 } else {
1568 retval = pread(image_fd, interp_name, eppnt->p_filesz,
1569 eppnt->p_offset);
1570 if (retval != eppnt->p_filesz) {
1571 goto exit_perror;
1572 }
1573 }
1574 if (interp_name[eppnt->p_filesz - 1] != 0) {
1575 errmsg = "Invalid PT_INTERP entry";
1576 goto exit_errmsg;
1577 }
1578 *pinterp_name = interp_name;
1579 }
1580 }
1581
1582 if (info->end_data == 0) {
1583 info->start_data = info->end_code;
1584 info->end_data = info->end_code;
1585 info->brk = info->end_code;
1586 }
1587
1588 if (qemu_log_enabled()) {
1589 load_symbols(ehdr, image_fd, load_bias);
1590 }
1591
1592 close(image_fd);
1593 return;
1594
1595 exit_read:
1596 if (retval >= 0) {
1597 errmsg = "Incomplete read of file header";
1598 goto exit_errmsg;
1599 }
1600 exit_perror:
1601 errmsg = strerror(errno);
1602 exit_errmsg:
1603 fprintf(stderr, "%s: %s\n", image_name, errmsg);
1604 exit(-1);
1605}
1606
1607static void load_elf_interp(const char *filename, struct image_info *info,
1608 char bprm_buf[BPRM_BUF_SIZE])
1609{
1610 int fd, retval;
1611
1612 fd = open(path(filename), O_RDONLY);
1613 if (fd < 0) {
1614 goto exit_perror;
1615 }
1616
1617 retval = read(fd, bprm_buf, BPRM_BUF_SIZE);
1618 if (retval < 0) {
1619 goto exit_perror;
1620 }
1621 if (retval < BPRM_BUF_SIZE) {
1622 memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval);
1623 }
1624
1625 load_elf_image(filename, fd, info, NULL, bprm_buf);
1626 return;
1627
1628 exit_perror:
1629 fprintf(stderr, "%s: %s\n", filename, strerror(errno));
1630 exit(-1);
1631}
1632
1633static int symfind(const void *s0, const void *s1)
1634{
1635 struct elf_sym *key = (struct elf_sym *)s0;
1636 struct elf_sym *sym = (struct elf_sym *)s1;
1637 int result = 0;
1638 if (key->st_value < sym->st_value) {
1639 result = -1;
1640 } else if (key->st_value >= sym->st_value + sym->st_size) {
1641 result = 1;
1642 }
1643 return result;
1644}
1645
1646static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
1647{
1648#if ELF_CLASS == ELFCLASS32
1649 struct elf_sym *syms = s->disas_symtab.elf32;
1650#else
1651 struct elf_sym *syms = s->disas_symtab.elf64;
1652#endif
1653
1654
1655 struct elf_sym key;
1656 struct elf_sym *sym;
1657
1658 key.st_value = orig_addr;
1659
1660 sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
1661 if (sym != NULL) {
1662 return s->disas_strtab + sym->st_name;
1663 }
1664
1665 return "";
1666}
1667
1668
1669static int symcmp(const void *s0, const void *s1)
1670{
1671 struct elf_sym *sym0 = (struct elf_sym *)s0;
1672 struct elf_sym *sym1 = (struct elf_sym *)s1;
1673 return (sym0->st_value < sym1->st_value)
1674 ? -1
1675 : ((sym0->st_value > sym1->st_value) ? 1 : 0);
1676}
1677
1678
1679static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
1680{
1681 int i, shnum, nsyms, sym_idx = 0, str_idx = 0;
1682 struct elf_shdr *shdr;
1683 char *strings = NULL;
1684 struct syminfo *s = NULL;
1685 struct elf_sym *new_syms, *syms = NULL;
1686
1687 shnum = hdr->e_shnum;
1688 i = shnum * sizeof(struct elf_shdr);
1689 shdr = (struct elf_shdr *)alloca(i);
1690 if (pread(fd, shdr, i, hdr->e_shoff) != i) {
1691 return;
1692 }
1693
1694 bswap_shdr(shdr, shnum);
1695 for (i = 0; i < shnum; ++i) {
1696 if (shdr[i].sh_type == SHT_SYMTAB) {
1697 sym_idx = i;
1698 str_idx = shdr[i].sh_link;
1699 goto found;
1700 }
1701 }
1702
1703
1704 return;
1705
1706 found:
1707
1708 s = malloc(sizeof(*s));
1709 if (!s) {
1710 goto give_up;
1711 }
1712
1713 i = shdr[str_idx].sh_size;
1714 s->disas_strtab = strings = malloc(i);
1715 if (!strings || pread(fd, strings, i, shdr[str_idx].sh_offset) != i) {
1716 goto give_up;
1717 }
1718
1719 i = shdr[sym_idx].sh_size;
1720 syms = malloc(i);
1721 if (!syms || pread(fd, syms, i, shdr[sym_idx].sh_offset) != i) {
1722 goto give_up;
1723 }
1724
1725 nsyms = i / sizeof(struct elf_sym);
1726 for (i = 0; i < nsyms; ) {
1727 bswap_sym(syms + i);
1728
1729 if (syms[i].st_shndx == SHN_UNDEF
1730 || syms[i].st_shndx >= SHN_LORESERVE
1731 || ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
1732 if (i < --nsyms) {
1733 syms[i] = syms[nsyms];
1734 }
1735 } else {
1736#if defined(TARGET_ARM) || defined (TARGET_MIPS)
1737
1738 syms[i].st_value &= ~(target_ulong)1;
1739#endif
1740 syms[i].st_value += load_bias;
1741 i++;
1742 }
1743 }
1744
1745
1746 if (nsyms == 0) {
1747 goto give_up;
1748 }
1749
1750
1751
1752
1753
1754 new_syms = realloc(syms, nsyms * sizeof(*syms));
1755 if (new_syms == NULL) {
1756 goto give_up;
1757 }
1758 syms = new_syms;
1759
1760 qsort(syms, nsyms, sizeof(*syms), symcmp);
1761
1762 s->disas_num_syms = nsyms;
1763#if ELF_CLASS == ELFCLASS32
1764 s->disas_symtab.elf32 = syms;
1765#else
1766 s->disas_symtab.elf64 = syms;
1767#endif
1768 s->lookup_symbol = lookup_symbolxx;
1769 s->next = syminfos;
1770 syminfos = s;
1771
1772 return;
1773
1774give_up:
1775 free(s);
1776 free(strings);
1777 free(syms);
1778}
1779
1780int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1781 struct image_info * info)
1782{
1783 struct image_info interp_info;
1784 struct elfhdr elf_ex;
1785 char *elf_interpreter = NULL;
1786
1787 info->start_mmap = (abi_ulong)ELF_START_MMAP;
1788 info->mmap = 0;
1789 info->rss = 0;
1790
1791 load_elf_image(bprm->filename, bprm->fd, info,
1792 &elf_interpreter, bprm->buf);
1793
1794
1795
1796
1797 elf_ex = *(struct elfhdr *)bprm->buf;
1798
1799 bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1800 bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1801 bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1802 if (!bprm->p) {
1803 fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG));
1804 exit(-1);
1805 }
1806
1807
1808
1809 bprm->p = setup_arg_pages(bprm->p, bprm, info);
1810
1811 if (elf_interpreter) {
1812 load_elf_interp(elf_interpreter, &interp_info, bprm->buf);
1813
1814
1815
1816
1817 if (strcmp(elf_interpreter, "/usr/lib/libc.so.1") == 0
1818 || strcmp(elf_interpreter, "/usr/lib/ld.so.1") == 0) {
1819 info->personality = PER_SVR4;
1820
1821
1822
1823
1824
1825 target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1826 MAP_FIXED | MAP_PRIVATE, -1, 0);
1827 }
1828 }
1829
1830 bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex,
1831 info, (elf_interpreter ? &interp_info : NULL));
1832 info->start_stack = bprm->p;
1833
1834
1835
1836
1837
1838 if (elf_interpreter) {
1839 info->load_addr = interp_info.load_addr;
1840 info->entry = interp_info.entry;
1841 free(elf_interpreter);
1842 }
1843
1844#ifdef USE_ELF_CORE_DUMP
1845 bprm->core_dump = &elf_core_dump;
1846#endif
1847
1848 return 0;
1849}
1850
1851#ifdef USE_ELF_CORE_DUMP
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892struct memelfnote {
1893 const char *name;
1894 size_t namesz;
1895 size_t namesz_rounded;
1896 int type;
1897 size_t datasz;
1898 size_t datasz_rounded;
1899 void *data;
1900 size_t notesz;
1901};
1902
1903struct target_elf_siginfo {
1904 target_int si_signo;
1905 target_int si_code;
1906 target_int si_errno;
1907};
1908
1909struct target_elf_prstatus {
1910 struct target_elf_siginfo pr_info;
1911 target_short pr_cursig;
1912 target_ulong pr_sigpend;
1913 target_ulong pr_sighold;
1914 target_pid_t pr_pid;
1915 target_pid_t pr_ppid;
1916 target_pid_t pr_pgrp;
1917 target_pid_t pr_sid;
1918 struct target_timeval pr_utime;
1919 struct target_timeval pr_stime;
1920 struct target_timeval pr_cutime;
1921 struct target_timeval pr_cstime;
1922 target_elf_gregset_t pr_reg;
1923 target_int pr_fpvalid;
1924};
1925
1926#define ELF_PRARGSZ (80)
1927
1928struct target_elf_prpsinfo {
1929 char pr_state;
1930 char pr_sname;
1931 char pr_zomb;
1932 char pr_nice;
1933 target_ulong pr_flag;
1934 target_uid_t pr_uid;
1935 target_gid_t pr_gid;
1936 target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
1937
1938 char pr_fname[16];
1939 char pr_psargs[ELF_PRARGSZ];
1940};
1941
1942
1943struct elf_thread_status {
1944 QTAILQ_ENTRY(elf_thread_status) ets_link;
1945 struct target_elf_prstatus prstatus;
1946#if 0
1947 elf_fpregset_t fpu;
1948 struct task_struct *thread;
1949 elf_fpxregset_t xfpu;
1950#endif
1951 struct memelfnote notes[1];
1952 int num_notes;
1953};
1954
1955struct elf_note_info {
1956 struct memelfnote *notes;
1957 struct target_elf_prstatus *prstatus;
1958 struct target_elf_prpsinfo *psinfo;
1959
1960 QTAILQ_HEAD(thread_list_head, elf_thread_status) thread_list;
1961#if 0
1962
1963
1964
1965
1966 elf_fpregset_t *fpu;
1967 elf_fpxregset_t *xfpu;
1968 int thread_status_size;
1969#endif
1970 int notes_size;
1971 int numnote;
1972};
1973
1974struct vm_area_struct {
1975 abi_ulong vma_start;
1976 abi_ulong vma_end;
1977 abi_ulong vma_flags;
1978 QTAILQ_ENTRY(vm_area_struct) vma_link;
1979};
1980
1981struct mm_struct {
1982 QTAILQ_HEAD(, vm_area_struct) mm_mmap;
1983 int mm_count;
1984};
1985
1986static struct mm_struct *vma_init(void);
1987static void vma_delete(struct mm_struct *);
1988static int vma_add_mapping(struct mm_struct *, abi_ulong,
1989 abi_ulong, abi_ulong);
1990static int vma_get_mapping_count(const struct mm_struct *);
1991static struct vm_area_struct *vma_first(const struct mm_struct *);
1992static struct vm_area_struct *vma_next(struct vm_area_struct *);
1993static abi_ulong vma_dump_size(const struct vm_area_struct *);
1994static int vma_walker(void *priv, abi_ulong start, abi_ulong end,
1995 unsigned long flags);
1996
1997static void fill_elf_header(struct elfhdr *, int, uint16_t, uint32_t);
1998static void fill_note(struct memelfnote *, const char *, int,
1999 unsigned int, void *);
2000static void fill_prstatus(struct target_elf_prstatus *, const TaskState *, int);
2001static int fill_psinfo(struct target_elf_prpsinfo *, const TaskState *);
2002static void fill_auxv_note(struct memelfnote *, const TaskState *);
2003static void fill_elf_note_phdr(struct elf_phdr *, int, off_t);
2004static size_t note_size(const struct memelfnote *);
2005static void free_note_info(struct elf_note_info *);
2006static int fill_note_info(struct elf_note_info *, long, const CPUState *);
2007static void fill_thread_info(struct elf_note_info *, const CPUState *);
2008static int core_dump_filename(const TaskState *, char *, size_t);
2009
2010static int dump_write(int, const void *, size_t);
2011static int write_note(struct memelfnote *, int);
2012static int write_note_info(struct elf_note_info *, int);
2013
2014#ifdef BSWAP_NEEDED
2015static void bswap_prstatus(struct target_elf_prstatus *prstatus)
2016{
2017 prstatus->pr_info.si_signo = tswapl(prstatus->pr_info.si_signo);
2018 prstatus->pr_info.si_code = tswapl(prstatus->pr_info.si_code);
2019 prstatus->pr_info.si_errno = tswapl(prstatus->pr_info.si_errno);
2020 prstatus->pr_cursig = tswap16(prstatus->pr_cursig);
2021 prstatus->pr_sigpend = tswapl(prstatus->pr_sigpend);
2022 prstatus->pr_sighold = tswapl(prstatus->pr_sighold);
2023 prstatus->pr_pid = tswap32(prstatus->pr_pid);
2024 prstatus->pr_ppid = tswap32(prstatus->pr_ppid);
2025 prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp);
2026 prstatus->pr_sid = tswap32(prstatus->pr_sid);
2027
2028
2029 prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid);
2030}
2031
2032static void bswap_psinfo(struct target_elf_prpsinfo *psinfo)
2033{
2034 psinfo->pr_flag = tswapl(psinfo->pr_flag);
2035 psinfo->pr_uid = tswap16(psinfo->pr_uid);
2036 psinfo->pr_gid = tswap16(psinfo->pr_gid);
2037 psinfo->pr_pid = tswap32(psinfo->pr_pid);
2038 psinfo->pr_ppid = tswap32(psinfo->pr_ppid);
2039 psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp);
2040 psinfo->pr_sid = tswap32(psinfo->pr_sid);
2041}
2042
2043static void bswap_note(struct elf_note *en)
2044{
2045 bswap32s(&en->n_namesz);
2046 bswap32s(&en->n_descsz);
2047 bswap32s(&en->n_type);
2048}
2049#else
2050static inline void bswap_prstatus(struct target_elf_prstatus *p) { }
2051static inline void bswap_psinfo(struct target_elf_prpsinfo *p) {}
2052static inline void bswap_note(struct elf_note *en) { }
2053#endif
2054
2055
2056
2057
2058
2059
2060
2061
2062static struct mm_struct *vma_init(void)
2063{
2064 struct mm_struct *mm;
2065
2066 if ((mm = qemu_malloc(sizeof (*mm))) == NULL)
2067 return (NULL);
2068
2069 mm->mm_count = 0;
2070 QTAILQ_INIT(&mm->mm_mmap);
2071
2072 return (mm);
2073}
2074
2075static void vma_delete(struct mm_struct *mm)
2076{
2077 struct vm_area_struct *vma;
2078
2079 while ((vma = vma_first(mm)) != NULL) {
2080 QTAILQ_REMOVE(&mm->mm_mmap, vma, vma_link);
2081 qemu_free(vma);
2082 }
2083 qemu_free(mm);
2084}
2085
2086static int vma_add_mapping(struct mm_struct *mm, abi_ulong start,
2087 abi_ulong end, abi_ulong flags)
2088{
2089 struct vm_area_struct *vma;
2090
2091 if ((vma = qemu_mallocz(sizeof (*vma))) == NULL)
2092 return (-1);
2093
2094 vma->vma_start = start;
2095 vma->vma_end = end;
2096 vma->vma_flags = flags;
2097
2098 QTAILQ_INSERT_TAIL(&mm->mm_mmap, vma, vma_link);
2099 mm->mm_count++;
2100
2101 return (0);
2102}
2103
2104static struct vm_area_struct *vma_first(const struct mm_struct *mm)
2105{
2106 return (QTAILQ_FIRST(&mm->mm_mmap));
2107}
2108
2109static struct vm_area_struct *vma_next(struct vm_area_struct *vma)
2110{
2111 return (QTAILQ_NEXT(vma, vma_link));
2112}
2113
2114static int vma_get_mapping_count(const struct mm_struct *mm)
2115{
2116 return (mm->mm_count);
2117}
2118
2119
2120
2121
2122static abi_ulong vma_dump_size(const struct vm_area_struct *vma)
2123{
2124
2125 if (!access_ok(VERIFY_READ, vma->vma_start, TARGET_PAGE_SIZE))
2126 return (0);
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136 if (vma->vma_flags & PROT_EXEC) {
2137 char page[TARGET_PAGE_SIZE];
2138
2139 copy_from_user(page, vma->vma_start, sizeof (page));
2140 if ((page[EI_MAG0] == ELFMAG0) &&
2141 (page[EI_MAG1] == ELFMAG1) &&
2142 (page[EI_MAG2] == ELFMAG2) &&
2143 (page[EI_MAG3] == ELFMAG3)) {
2144
2145
2146
2147
2148 return (0);
2149 }
2150 }
2151
2152 return (vma->vma_end - vma->vma_start);
2153}
2154
2155static int vma_walker(void *priv, abi_ulong start, abi_ulong end,
2156 unsigned long flags)
2157{
2158 struct mm_struct *mm = (struct mm_struct *)priv;
2159
2160 vma_add_mapping(mm, start, end, flags);
2161 return (0);
2162}
2163
2164static void fill_note(struct memelfnote *note, const char *name, int type,
2165 unsigned int sz, void *data)
2166{
2167 unsigned int namesz;
2168
2169 namesz = strlen(name) + 1;
2170 note->name = name;
2171 note->namesz = namesz;
2172 note->namesz_rounded = roundup(namesz, sizeof (int32_t));
2173 note->type = type;
2174 note->datasz = sz;
2175 note->datasz_rounded = roundup(sz, sizeof (int32_t));
2176
2177 note->data = data;
2178
2179
2180
2181
2182
2183 note->notesz = sizeof (struct elf_note) +
2184 note->namesz_rounded + note->datasz_rounded;
2185}
2186
2187static void fill_elf_header(struct elfhdr *elf, int segs, uint16_t machine,
2188 uint32_t flags)
2189{
2190 (void) memset(elf, 0, sizeof(*elf));
2191
2192 (void) memcpy(elf->e_ident, ELFMAG, SELFMAG);
2193 elf->e_ident[EI_CLASS] = ELF_CLASS;
2194 elf->e_ident[EI_DATA] = ELF_DATA;
2195 elf->e_ident[EI_VERSION] = EV_CURRENT;
2196 elf->e_ident[EI_OSABI] = ELF_OSABI;
2197
2198 elf->e_type = ET_CORE;
2199 elf->e_machine = machine;
2200 elf->e_version = EV_CURRENT;
2201 elf->e_phoff = sizeof(struct elfhdr);
2202 elf->e_flags = flags;
2203 elf->e_ehsize = sizeof(struct elfhdr);
2204 elf->e_phentsize = sizeof(struct elf_phdr);
2205 elf->e_phnum = segs;
2206
2207 bswap_ehdr(elf);
2208}
2209
2210static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset)
2211{
2212 phdr->p_type = PT_NOTE;
2213 phdr->p_offset = offset;
2214 phdr->p_vaddr = 0;
2215 phdr->p_paddr = 0;
2216 phdr->p_filesz = sz;
2217 phdr->p_memsz = 0;
2218 phdr->p_flags = 0;
2219 phdr->p_align = 0;
2220
2221 bswap_phdr(phdr, 1);
2222}
2223
2224static size_t note_size(const struct memelfnote *note)
2225{
2226 return (note->notesz);
2227}
2228
2229static void fill_prstatus(struct target_elf_prstatus *prstatus,
2230 const TaskState *ts, int signr)
2231{
2232 (void) memset(prstatus, 0, sizeof (*prstatus));
2233 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
2234 prstatus->pr_pid = ts->ts_tid;
2235 prstatus->pr_ppid = getppid();
2236 prstatus->pr_pgrp = getpgrp();
2237 prstatus->pr_sid = getsid(0);
2238
2239 bswap_prstatus(prstatus);
2240}
2241
2242static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
2243{
2244 char *filename, *base_filename;
2245 unsigned int i, len;
2246
2247 (void) memset(psinfo, 0, sizeof (*psinfo));
2248
2249 len = ts->info->arg_end - ts->info->arg_start;
2250 if (len >= ELF_PRARGSZ)
2251 len = ELF_PRARGSZ - 1;
2252 if (copy_from_user(&psinfo->pr_psargs, ts->info->arg_start, len))
2253 return -EFAULT;
2254 for (i = 0; i < len; i++)
2255 if (psinfo->pr_psargs[i] == 0)
2256 psinfo->pr_psargs[i] = ' ';
2257 psinfo->pr_psargs[len] = 0;
2258
2259 psinfo->pr_pid = getpid();
2260 psinfo->pr_ppid = getppid();
2261 psinfo->pr_pgrp = getpgrp();
2262 psinfo->pr_sid = getsid(0);
2263 psinfo->pr_uid = getuid();
2264 psinfo->pr_gid = getgid();
2265
2266 filename = strdup(ts->bprm->filename);
2267 base_filename = strdup(basename(filename));
2268 (void) strncpy(psinfo->pr_fname, base_filename,
2269 sizeof(psinfo->pr_fname));
2270 free(base_filename);
2271 free(filename);
2272
2273 bswap_psinfo(psinfo);
2274 return (0);
2275}
2276
2277static void fill_auxv_note(struct memelfnote *note, const TaskState *ts)
2278{
2279 elf_addr_t auxv = (elf_addr_t)ts->info->saved_auxv;
2280 elf_addr_t orig_auxv = auxv;
2281 abi_ulong val;
2282 void *ptr;
2283 int i, len;
2284
2285
2286
2287
2288
2289
2290
2291
2292 i = len = 0;
2293 do {
2294 get_user_ual(val, auxv);
2295 i += 2;
2296 auxv += 2 * sizeof (elf_addr_t);
2297 } while (val != AT_NULL);
2298 len = i * sizeof (elf_addr_t);
2299
2300
2301 ptr = lock_user(VERIFY_READ, orig_auxv, len, 0);
2302 if (ptr != NULL) {
2303 fill_note(note, "CORE", NT_AUXV, len, ptr);
2304 unlock_user(ptr, auxv, len);
2305 }
2306}
2307
2308
2309
2310
2311
2312
2313
2314
2315static int core_dump_filename(const TaskState *ts, char *buf,
2316 size_t bufsize)
2317{
2318 char timestamp[64];
2319 char *filename = NULL;
2320 char *base_filename = NULL;
2321 struct timeval tv;
2322 struct tm tm;
2323
2324 assert(bufsize >= PATH_MAX);
2325
2326 if (gettimeofday(&tv, NULL) < 0) {
2327 (void) fprintf(stderr, "unable to get current timestamp: %s",
2328 strerror(errno));
2329 return (-1);
2330 }
2331
2332 filename = strdup(ts->bprm->filename);
2333 base_filename = strdup(basename(filename));
2334 (void) strftime(timestamp, sizeof (timestamp), "%Y%m%d-%H%M%S",
2335 localtime_r(&tv.tv_sec, &tm));
2336 (void) snprintf(buf, bufsize, "qemu_%s_%s_%d.core",
2337 base_filename, timestamp, (int)getpid());
2338 free(base_filename);
2339 free(filename);
2340
2341 return (0);
2342}
2343
2344static int dump_write(int fd, const void *ptr, size_t size)
2345{
2346 const char *bufp = (const char *)ptr;
2347 ssize_t bytes_written, bytes_left;
2348 struct rlimit dumpsize;
2349 off_t pos;
2350
2351 bytes_written = 0;
2352 getrlimit(RLIMIT_CORE, &dumpsize);
2353 if ((pos = lseek(fd, 0, SEEK_CUR))==-1) {
2354 if (errno == ESPIPE) {
2355 bytes_left = size;
2356 } else {
2357 return pos;
2358 }
2359 } else {
2360 if (dumpsize.rlim_cur <= pos) {
2361 return -1;
2362 } else if (dumpsize.rlim_cur == RLIM_INFINITY) {
2363 bytes_left = size;
2364 } else {
2365 size_t limit_left=dumpsize.rlim_cur - pos;
2366 bytes_left = limit_left >= size ? size : limit_left ;
2367 }
2368 }
2369
2370
2371
2372
2373
2374 do {
2375 bytes_written = write(fd, bufp, bytes_left);
2376 if (bytes_written < 0) {
2377 if (errno == EINTR)
2378 continue;
2379 return (-1);
2380 } else if (bytes_written == 0) {
2381 return (-1);
2382 }
2383 bufp += bytes_written;
2384 bytes_left -= bytes_written;
2385 } while (bytes_left > 0);
2386
2387 return (0);
2388}
2389
2390static int write_note(struct memelfnote *men, int fd)
2391{
2392 struct elf_note en;
2393
2394 en.n_namesz = men->namesz;
2395 en.n_type = men->type;
2396 en.n_descsz = men->datasz;
2397
2398 bswap_note(&en);
2399
2400 if (dump_write(fd, &en, sizeof(en)) != 0)
2401 return (-1);
2402 if (dump_write(fd, men->name, men->namesz_rounded) != 0)
2403 return (-1);
2404 if (dump_write(fd, men->data, men->datasz_rounded) != 0)
2405 return (-1);
2406
2407 return (0);
2408}
2409
2410static void fill_thread_info(struct elf_note_info *info, const CPUState *env)
2411{
2412 TaskState *ts = (TaskState *)env->opaque;
2413 struct elf_thread_status *ets;
2414
2415 ets = qemu_mallocz(sizeof (*ets));
2416 ets->num_notes = 1;
2417 fill_prstatus(&ets->prstatus, ts, 0);
2418 elf_core_copy_regs(&ets->prstatus.pr_reg, env);
2419 fill_note(&ets->notes[0], "CORE", NT_PRSTATUS, sizeof (ets->prstatus),
2420 &ets->prstatus);
2421
2422 QTAILQ_INSERT_TAIL(&info->thread_list, ets, ets_link);
2423
2424 info->notes_size += note_size(&ets->notes[0]);
2425}
2426
2427static int fill_note_info(struct elf_note_info *info,
2428 long signr, const CPUState *env)
2429{
2430#define NUMNOTES 3
2431 CPUState *cpu = NULL;
2432 TaskState *ts = (TaskState *)env->opaque;
2433 int i;
2434
2435 (void) memset(info, 0, sizeof (*info));
2436
2437 QTAILQ_INIT(&info->thread_list);
2438
2439 info->notes = qemu_mallocz(NUMNOTES * sizeof (struct memelfnote));
2440 if (info->notes == NULL)
2441 return (-ENOMEM);
2442 info->prstatus = qemu_mallocz(sizeof (*info->prstatus));
2443 if (info->prstatus == NULL)
2444 return (-ENOMEM);
2445 info->psinfo = qemu_mallocz(sizeof (*info->psinfo));
2446 if (info->prstatus == NULL)
2447 return (-ENOMEM);
2448
2449
2450
2451
2452
2453 fill_prstatus(info->prstatus, ts, signr);
2454 elf_core_copy_regs(&info->prstatus->pr_reg, env);
2455 fill_note(&info->notes[0], "CORE", NT_PRSTATUS,
2456 sizeof (*info->prstatus), info->prstatus);
2457 fill_psinfo(info->psinfo, ts);
2458 fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
2459 sizeof (*info->psinfo), info->psinfo);
2460 fill_auxv_note(&info->notes[2], ts);
2461 info->numnote = 3;
2462
2463 info->notes_size = 0;
2464 for (i = 0; i < info->numnote; i++)
2465 info->notes_size += note_size(&info->notes[i]);
2466
2467
2468 cpu_list_lock();
2469 for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2470 if (cpu == thread_env)
2471 continue;
2472 fill_thread_info(info, cpu);
2473 }
2474 cpu_list_unlock();
2475
2476 return (0);
2477}
2478
2479static void free_note_info(struct elf_note_info *info)
2480{
2481 struct elf_thread_status *ets;
2482
2483 while (!QTAILQ_EMPTY(&info->thread_list)) {
2484 ets = QTAILQ_FIRST(&info->thread_list);
2485 QTAILQ_REMOVE(&info->thread_list, ets, ets_link);
2486 qemu_free(ets);
2487 }
2488
2489 qemu_free(info->prstatus);
2490 qemu_free(info->psinfo);
2491 qemu_free(info->notes);
2492}
2493
2494static int write_note_info(struct elf_note_info *info, int fd)
2495{
2496 struct elf_thread_status *ets;
2497 int i, error = 0;
2498
2499
2500 for (i = 0; i < info->numnote; i++)
2501 if ((error = write_note(&info->notes[i], fd)) != 0)
2502 return (error);
2503
2504
2505 for (ets = info->thread_list.tqh_first; ets != NULL;
2506 ets = ets->ets_link.tqe_next) {
2507 if ((error = write_note(&ets->notes[0], fd)) != 0)
2508 return (error);
2509 }
2510
2511 return (0);
2512}
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557static int elf_core_dump(int signr, const CPUState *env)
2558{
2559 const TaskState *ts = (const TaskState *)env->opaque;
2560 struct vm_area_struct *vma = NULL;
2561 char corefile[PATH_MAX];
2562 struct elf_note_info info;
2563 struct elfhdr elf;
2564 struct elf_phdr phdr;
2565 struct rlimit dumpsize;
2566 struct mm_struct *mm = NULL;
2567 off_t offset = 0, data_offset = 0;
2568 int segs = 0;
2569 int fd = -1;
2570
2571 errno = 0;
2572 getrlimit(RLIMIT_CORE, &dumpsize);
2573 if (dumpsize.rlim_cur == 0)
2574 return 0;
2575
2576 if (core_dump_filename(ts, corefile, sizeof (corefile)) < 0)
2577 return (-errno);
2578
2579 if ((fd = open(corefile, O_WRONLY | O_CREAT,
2580 S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
2581 return (-errno);
2582
2583
2584
2585
2586
2587
2588 if ((mm = vma_init()) == NULL)
2589 goto out;
2590
2591 walk_memory_regions(mm, vma_walker);
2592 segs = vma_get_mapping_count(mm);
2593
2594
2595
2596
2597
2598 fill_elf_header(&elf, segs + 1, ELF_MACHINE, 0);
2599 if (dump_write(fd, &elf, sizeof (elf)) != 0)
2600 goto out;
2601
2602
2603 if (fill_note_info(&info, signr, env) < 0)
2604 goto out;
2605
2606 offset += sizeof (elf);
2607 offset += (segs + 1) * sizeof (struct elf_phdr);
2608
2609
2610 fill_elf_note_phdr(&phdr, info.notes_size, offset);
2611
2612 offset += info.notes_size;
2613 if (dump_write(fd, &phdr, sizeof (phdr)) != 0)
2614 goto out;
2615
2616
2617
2618
2619
2620 data_offset = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2621
2622
2623
2624
2625
2626 for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
2627 (void) memset(&phdr, 0, sizeof (phdr));
2628
2629 phdr.p_type = PT_LOAD;
2630 phdr.p_offset = offset;
2631 phdr.p_vaddr = vma->vma_start;
2632 phdr.p_paddr = 0;
2633 phdr.p_filesz = vma_dump_size(vma);
2634 offset += phdr.p_filesz;
2635 phdr.p_memsz = vma->vma_end - vma->vma_start;
2636 phdr.p_flags = vma->vma_flags & PROT_READ ? PF_R : 0;
2637 if (vma->vma_flags & PROT_WRITE)
2638 phdr.p_flags |= PF_W;
2639 if (vma->vma_flags & PROT_EXEC)
2640 phdr.p_flags |= PF_X;
2641 phdr.p_align = ELF_EXEC_PAGESIZE;
2642
2643 bswap_phdr(&phdr, 1);
2644 dump_write(fd, &phdr, sizeof (phdr));
2645 }
2646
2647
2648
2649
2650
2651 if (write_note_info(&info, fd) < 0)
2652 goto out;
2653
2654
2655 if (lseek(fd, data_offset, SEEK_SET) != data_offset)
2656 goto out;
2657
2658
2659
2660
2661 for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
2662 abi_ulong addr;
2663 abi_ulong end;
2664
2665 end = vma->vma_start + vma_dump_size(vma);
2666
2667 for (addr = vma->vma_start; addr < end;
2668 addr += TARGET_PAGE_SIZE) {
2669 char page[TARGET_PAGE_SIZE];
2670 int error;
2671
2672
2673
2674
2675
2676 error = copy_from_user(page, addr, sizeof (page));
2677 if (error != 0) {
2678 (void) fprintf(stderr, "unable to dump " TARGET_ABI_FMT_lx "\n",
2679 addr);
2680 errno = -error;
2681 goto out;
2682 }
2683 if (dump_write(fd, page, TARGET_PAGE_SIZE) < 0)
2684 goto out;
2685 }
2686 }
2687
2688 out:
2689 free_note_info(&info);
2690 if (mm != NULL)
2691 vma_delete(mm);
2692 (void) close(fd);
2693
2694 if (errno != 0)
2695 return (-errno);
2696 return (0);
2697}
2698#endif
2699
2700void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
2701{
2702 init_thread(regs, infop);
2703}
2704