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