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