Convert references to logfile/loglevel to use qemu_log*() macros
[qemu] / linux-user / elfload.c
1 /* This is the Linux kernel elf-loading code, ported into user space */
2
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <fcntl.h>
6 #include <errno.h>
7 #include <unistd.h>
8 #include <sys/mman.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include "qemu.h"
13 #include "disas.h"
14
15 #ifdef _ARCH_PPC64
16 #undef ARCH_DLINFO
17 #undef ELF_PLATFORM
18 #undef ELF_HWCAP
19 #undef ELF_CLASS
20 #undef ELF_DATA
21 #undef ELF_ARCH
22 #endif
23
24 /* from personality.h */
25
26 /*
27  * Flags for bug emulation.
28  *
29  * These occupy the top three bytes.
30  */
31 enum {
32         ADDR_NO_RANDOMIZE =     0x0040000,      /* disable randomization of VA space */
33         FDPIC_FUNCPTRS =        0x0080000,      /* userspace function ptrs point to descriptors
34                                                  * (signal handling)
35                                                  */
36         MMAP_PAGE_ZERO =        0x0100000,
37         ADDR_COMPAT_LAYOUT =    0x0200000,
38         READ_IMPLIES_EXEC =     0x0400000,
39         ADDR_LIMIT_32BIT =      0x0800000,
40         SHORT_INODE =           0x1000000,
41         WHOLE_SECONDS =         0x2000000,
42         STICKY_TIMEOUTS =       0x4000000,
43         ADDR_LIMIT_3GB =        0x8000000,
44 };
45
46 /*
47  * Personality types.
48  *
49  * These go in the low byte.  Avoid using the top bit, it will
50  * conflict with error returns.
51  */
52 enum {
53         PER_LINUX =             0x0000,
54         PER_LINUX_32BIT =       0x0000 | ADDR_LIMIT_32BIT,
55         PER_LINUX_FDPIC =       0x0000 | FDPIC_FUNCPTRS,
56         PER_SVR4 =              0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
57         PER_SVR3 =              0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
58         PER_SCOSVR3 =           0x0003 | STICKY_TIMEOUTS |
59                                          WHOLE_SECONDS | SHORT_INODE,
60         PER_OSR5 =              0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS,
61         PER_WYSEV386 =          0x0004 | STICKY_TIMEOUTS | SHORT_INODE,
62         PER_ISCR4 =             0x0005 | STICKY_TIMEOUTS,
63         PER_BSD =               0x0006,
64         PER_SUNOS =             0x0006 | STICKY_TIMEOUTS,
65         PER_XENIX =             0x0007 | STICKY_TIMEOUTS | SHORT_INODE,
66         PER_LINUX32 =           0x0008,
67         PER_LINUX32_3GB =       0x0008 | ADDR_LIMIT_3GB,
68         PER_IRIX32 =            0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */
69         PER_IRIXN32 =           0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */
70         PER_IRIX64 =            0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */
71         PER_RISCOS =            0x000c,
72         PER_SOLARIS =           0x000d | STICKY_TIMEOUTS,
73         PER_UW7 =               0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
74         PER_OSF4 =              0x000f,                  /* OSF/1 v4 */
75         PER_HPUX =              0x0010,
76         PER_MASK =              0x00ff,
77 };
78
79 /*
80  * Return the base personality without flags.
81  */
82 #define personality(pers)       (pers & PER_MASK)
83
84 /* this flag is uneffective under linux too, should be deleted */
85 #ifndef MAP_DENYWRITE
86 #define MAP_DENYWRITE 0
87 #endif
88
89 /* should probably go in elf.h */
90 #ifndef ELIBBAD
91 #define ELIBBAD 80
92 #endif
93
94 #ifdef TARGET_I386
95
96 #define ELF_PLATFORM get_elf_platform()
97
98 static const char *get_elf_platform(void)
99 {
100     static char elf_platform[] = "i386";
101     int family = (thread_env->cpuid_version >> 8) & 0xff;
102     if (family > 6)
103         family = 6;
104     if (family >= 3)
105         elf_platform[1] = '0' + family;
106     return elf_platform;
107 }
108
109 #define ELF_HWCAP get_elf_hwcap()
110
111 static uint32_t get_elf_hwcap(void)
112 {
113   return thread_env->cpuid_features;
114 }
115
116 #ifdef TARGET_X86_64
117 #define ELF_START_MMAP 0x2aaaaab000ULL
118 #define elf_check_arch(x) ( ((x) == ELF_ARCH) )
119
120 #define ELF_CLASS      ELFCLASS64
121 #define ELF_DATA       ELFDATA2LSB
122 #define ELF_ARCH       EM_X86_64
123
124 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
125 {
126     regs->rax = 0;
127     regs->rsp = infop->start_stack;
128     regs->rip = infop->entry;
129 }
130
131 #else
132
133 #define ELF_START_MMAP 0x80000000
134
135 /*
136  * This is used to ensure we don't load something for the wrong architecture.
137  */
138 #define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
139
140 /*
141  * These are used to set parameters in the core dumps.
142  */
143 #define ELF_CLASS       ELFCLASS32
144 #define ELF_DATA        ELFDATA2LSB
145 #define ELF_ARCH        EM_386
146
147 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
148 {
149     regs->esp = infop->start_stack;
150     regs->eip = infop->entry;
151
152     /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
153        starts %edx contains a pointer to a function which might be
154        registered using `atexit'.  This provides a mean for the
155        dynamic linker to call DT_FINI functions for shared libraries
156        that have been loaded before the code runs.
157
158        A value of 0 tells we have no such handler.  */
159     regs->edx = 0;
160 }
161 #endif
162
163 #define USE_ELF_CORE_DUMP
164 #define ELF_EXEC_PAGESIZE       4096
165
166 #endif
167
168 #ifdef TARGET_ARM
169
170 #define ELF_START_MMAP 0x80000000
171
172 #define elf_check_arch(x) ( (x) == EM_ARM )
173
174 #define ELF_CLASS       ELFCLASS32
175 #ifdef TARGET_WORDS_BIGENDIAN
176 #define ELF_DATA        ELFDATA2MSB
177 #else
178 #define ELF_DATA        ELFDATA2LSB
179 #endif
180 #define ELF_ARCH        EM_ARM
181
182 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
183 {
184     abi_long stack = infop->start_stack;
185     memset(regs, 0, sizeof(*regs));
186     regs->ARM_cpsr = 0x10;
187     if (infop->entry & 1)
188       regs->ARM_cpsr |= CPSR_T;
189     regs->ARM_pc = infop->entry & 0xfffffffe;
190     regs->ARM_sp = infop->start_stack;
191     /* FIXME - what to for failure of get_user()? */
192     get_user_ual(regs->ARM_r2, stack + 8); /* envp */
193     get_user_ual(regs->ARM_r1, stack + 4); /* envp */
194     /* XXX: it seems that r0 is zeroed after ! */
195     regs->ARM_r0 = 0;
196     /* For uClinux PIC binaries.  */
197     /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
198     regs->ARM_r10 = infop->start_data;
199 }
200
201 #define USE_ELF_CORE_DUMP
202 #define ELF_EXEC_PAGESIZE       4096
203
204 enum
205 {
206   ARM_HWCAP_ARM_SWP       = 1 << 0,
207   ARM_HWCAP_ARM_HALF      = 1 << 1,
208   ARM_HWCAP_ARM_THUMB     = 1 << 2,
209   ARM_HWCAP_ARM_26BIT     = 1 << 3,
210   ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
211   ARM_HWCAP_ARM_FPA       = 1 << 5,
212   ARM_HWCAP_ARM_VFP       = 1 << 6,
213   ARM_HWCAP_ARM_EDSP      = 1 << 7,
214 };
215
216 #define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF              \
217                     | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT     \
218                     | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP)
219
220 #endif
221
222 #ifdef TARGET_SPARC
223 #ifdef TARGET_SPARC64
224
225 #define ELF_START_MMAP 0x80000000
226
227 #ifndef TARGET_ABI32
228 #define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
229 #else
230 #define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
231 #endif
232
233 #define ELF_CLASS   ELFCLASS64
234 #define ELF_DATA    ELFDATA2MSB
235 #define ELF_ARCH    EM_SPARCV9
236
237 #define STACK_BIAS              2047
238
239 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
240 {
241 #ifndef TARGET_ABI32
242     regs->tstate = 0;
243 #endif
244     regs->pc = infop->entry;
245     regs->npc = regs->pc + 4;
246     regs->y = 0;
247 #ifdef TARGET_ABI32
248     regs->u_regs[14] = infop->start_stack - 16 * 4;
249 #else
250     if (personality(infop->personality) == PER_LINUX32)
251         regs->u_regs[14] = infop->start_stack - 16 * 4;
252     else
253         regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
254 #endif
255 }
256
257 #else
258 #define ELF_START_MMAP 0x80000000
259
260 #define elf_check_arch(x) ( (x) == EM_SPARC )
261
262 #define ELF_CLASS   ELFCLASS32
263 #define ELF_DATA    ELFDATA2MSB
264 #define ELF_ARCH    EM_SPARC
265
266 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
267 {
268     regs->psr = 0;
269     regs->pc = infop->entry;
270     regs->npc = regs->pc + 4;
271     regs->y = 0;
272     regs->u_regs[14] = infop->start_stack - 16 * 4;
273 }
274
275 #endif
276 #endif
277
278 #ifdef TARGET_PPC
279
280 #define ELF_START_MMAP 0x80000000
281
282 #if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
283
284 #define elf_check_arch(x) ( (x) == EM_PPC64 )
285
286 #define ELF_CLASS       ELFCLASS64
287
288 #else
289
290 #define elf_check_arch(x) ( (x) == EM_PPC )
291
292 #define ELF_CLASS       ELFCLASS32
293
294 #endif
295
296 #ifdef TARGET_WORDS_BIGENDIAN
297 #define ELF_DATA        ELFDATA2MSB
298 #else
299 #define ELF_DATA        ELFDATA2LSB
300 #endif
301 #define ELF_ARCH        EM_PPC
302
303 /*
304  * We need to put in some extra aux table entries to tell glibc what
305  * the cache block size is, so it can use the dcbz instruction safely.
306  */
307 #define AT_DCACHEBSIZE          19
308 #define AT_ICACHEBSIZE          20
309 #define AT_UCACHEBSIZE          21
310 /* A special ignored type value for PPC, for glibc compatibility.  */
311 #define AT_IGNOREPPC            22
312 /*
313  * The requirements here are:
314  * - keep the final alignment of sp (sp & 0xf)
315  * - make sure the 32-bit value at the first 16 byte aligned position of
316  *   AUXV is greater than 16 for glibc compatibility.
317  *   AT_IGNOREPPC is used for that.
318  * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
319  *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
320  */
321 #define DLINFO_ARCH_ITEMS       5
322 #define ARCH_DLINFO                                                     \
323 do {                                                                    \
324         NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);                              \
325         NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);                              \
326         NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                                 \
327         /*                                                              \
328          * Now handle glibc compatibility.                              \
329          */                                                             \
330         NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
331         NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
332  } while (0)
333
334 static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
335 {
336     abi_ulong pos = infop->start_stack;
337     abi_ulong tmp;
338 #if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
339     abi_ulong entry, toc;
340 #endif
341
342     _regs->gpr[1] = infop->start_stack;
343 #if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
344     entry = ldq_raw(infop->entry) + infop->load_addr;
345     toc = ldq_raw(infop->entry + 8) + infop->load_addr;
346     _regs->gpr[2] = toc;
347     infop->entry = entry;
348 #endif
349     _regs->nip = infop->entry;
350     /* Note that isn't exactly what regular kernel does
351      * but this is what the ABI wants and is needed to allow
352      * execution of PPC BSD programs.
353      */
354     /* FIXME - what to for failure of get_user()? */
355     get_user_ual(_regs->gpr[3], pos);
356     pos += sizeof(abi_ulong);
357     _regs->gpr[4] = pos;
358     for (tmp = 1; tmp != 0; pos += sizeof(abi_ulong))
359         tmp = ldl(pos);
360     _regs->gpr[5] = pos;
361 }
362
363 #define USE_ELF_CORE_DUMP
364 #define ELF_EXEC_PAGESIZE       4096
365
366 #endif
367
368 #ifdef TARGET_MIPS
369
370 #define ELF_START_MMAP 0x80000000
371
372 #define elf_check_arch(x) ( (x) == EM_MIPS )
373
374 #ifdef TARGET_MIPS64
375 #define ELF_CLASS   ELFCLASS64
376 #else
377 #define ELF_CLASS   ELFCLASS32
378 #endif
379 #ifdef TARGET_WORDS_BIGENDIAN
380 #define ELF_DATA        ELFDATA2MSB
381 #else
382 #define ELF_DATA        ELFDATA2LSB
383 #endif
384 #define ELF_ARCH    EM_MIPS
385
386 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
387 {
388     regs->cp0_status = 2 << CP0St_KSU;
389     regs->cp0_epc = infop->entry;
390     regs->regs[29] = infop->start_stack;
391 }
392
393 #define USE_ELF_CORE_DUMP
394 #define ELF_EXEC_PAGESIZE        4096
395
396 #endif /* TARGET_MIPS */
397
398 #ifdef TARGET_SH4
399
400 #define ELF_START_MMAP 0x80000000
401
402 #define elf_check_arch(x) ( (x) == EM_SH )
403
404 #define ELF_CLASS ELFCLASS32
405 #define ELF_DATA  ELFDATA2LSB
406 #define ELF_ARCH  EM_SH
407
408 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
409 {
410   /* Check other registers XXXXX */
411   regs->pc = infop->entry;
412   regs->regs[15] = infop->start_stack;
413 }
414
415 #define USE_ELF_CORE_DUMP
416 #define ELF_EXEC_PAGESIZE        4096
417
418 #endif
419
420 #ifdef TARGET_CRIS
421
422 #define ELF_START_MMAP 0x80000000
423
424 #define elf_check_arch(x) ( (x) == EM_CRIS )
425
426 #define ELF_CLASS ELFCLASS32
427 #define ELF_DATA  ELFDATA2LSB
428 #define ELF_ARCH  EM_CRIS
429
430 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
431 {
432   regs->erp = infop->entry;
433 }
434
435 #define USE_ELF_CORE_DUMP
436 #define ELF_EXEC_PAGESIZE        8192
437
438 #endif
439
440 #ifdef TARGET_M68K
441
442 #define ELF_START_MMAP 0x80000000
443
444 #define elf_check_arch(x) ( (x) == EM_68K )
445
446 #define ELF_CLASS       ELFCLASS32
447 #define ELF_DATA        ELFDATA2MSB
448 #define ELF_ARCH        EM_68K
449
450 /* ??? Does this need to do anything?
451 #define ELF_PLAT_INIT(_r) */
452
453 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
454 {
455     regs->usp = infop->start_stack;
456     regs->sr = 0;
457     regs->pc = infop->entry;
458 }
459
460 #define USE_ELF_CORE_DUMP
461 #define ELF_EXEC_PAGESIZE       8192
462
463 #endif
464
465 #ifdef TARGET_ALPHA
466
467 #define ELF_START_MMAP (0x30000000000ULL)
468
469 #define elf_check_arch(x) ( (x) == ELF_ARCH )
470
471 #define ELF_CLASS      ELFCLASS64
472 #define ELF_DATA       ELFDATA2MSB
473 #define ELF_ARCH       EM_ALPHA
474
475 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
476 {
477     regs->pc = infop->entry;
478     regs->ps = 8;
479     regs->usp = infop->start_stack;
480     regs->unique = infop->start_data; /* ? */
481     printf("Set unique value to " TARGET_FMT_lx " (" TARGET_FMT_lx ")\n",
482            regs->unique, infop->start_data);
483 }
484
485 #define USE_ELF_CORE_DUMP
486 #define ELF_EXEC_PAGESIZE        8192
487
488 #endif /* TARGET_ALPHA */
489
490 #ifndef ELF_PLATFORM
491 #define ELF_PLATFORM (NULL)
492 #endif
493
494 #ifndef ELF_HWCAP
495 #define ELF_HWCAP 0
496 #endif
497
498 #ifdef TARGET_ABI32
499 #undef ELF_CLASS
500 #define ELF_CLASS ELFCLASS32
501 #undef bswaptls
502 #define bswaptls(ptr) bswap32s(ptr)
503 #endif
504
505 #include "elf.h"
506
507 struct exec
508 {
509   unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
510   unsigned int a_text;   /* length of text, in bytes */
511   unsigned int a_data;   /* length of data, in bytes */
512   unsigned int a_bss;    /* length of uninitialized data area, in bytes */
513   unsigned int a_syms;   /* length of symbol table data in file, in bytes */
514   unsigned int a_entry;  /* start address */
515   unsigned int a_trsize; /* length of relocation info for text, in bytes */
516   unsigned int a_drsize; /* length of relocation info for data, in bytes */
517 };
518
519
520 #define N_MAGIC(exec) ((exec).a_info & 0xffff)
521 #define OMAGIC 0407
522 #define NMAGIC 0410
523 #define ZMAGIC 0413
524 #define QMAGIC 0314
525
526 /* max code+data+bss space allocated to elf interpreter */
527 #define INTERP_MAP_SIZE (32 * 1024 * 1024)
528
529 /* max code+data+bss+brk space allocated to ET_DYN executables */
530 #define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
531
532 /* Necessary parameters */
533 #define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
534 #define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
535 #define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
536
537 #define INTERPRETER_NONE 0
538 #define INTERPRETER_AOUT 1
539 #define INTERPRETER_ELF 2
540
541 #define DLINFO_ITEMS 12
542
543 static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
544 {
545         memcpy(to, from, n);
546 }
547
548 static int load_aout_interp(void * exptr, int interp_fd);
549
550 #ifdef BSWAP_NEEDED
551 static void bswap_ehdr(struct elfhdr *ehdr)
552 {
553     bswap16s(&ehdr->e_type);                    /* Object file type */
554     bswap16s(&ehdr->e_machine);         /* Architecture */
555     bswap32s(&ehdr->e_version);         /* Object file version */
556     bswaptls(&ehdr->e_entry);           /* Entry point virtual address */
557     bswaptls(&ehdr->e_phoff);           /* Program header table file offset */
558     bswaptls(&ehdr->e_shoff);           /* Section header table file offset */
559     bswap32s(&ehdr->e_flags);           /* Processor-specific flags */
560     bswap16s(&ehdr->e_ehsize);          /* ELF header size in bytes */
561     bswap16s(&ehdr->e_phentsize);               /* Program header table entry size */
562     bswap16s(&ehdr->e_phnum);           /* Program header table entry count */
563     bswap16s(&ehdr->e_shentsize);               /* Section header table entry size */
564     bswap16s(&ehdr->e_shnum);           /* Section header table entry count */
565     bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
566 }
567
568 static void bswap_phdr(struct elf_phdr *phdr)
569 {
570     bswap32s(&phdr->p_type);                    /* Segment type */
571     bswaptls(&phdr->p_offset);          /* Segment file offset */
572     bswaptls(&phdr->p_vaddr);           /* Segment virtual address */
573     bswaptls(&phdr->p_paddr);           /* Segment physical address */
574     bswaptls(&phdr->p_filesz);          /* Segment size in file */
575     bswaptls(&phdr->p_memsz);           /* Segment size in memory */
576     bswap32s(&phdr->p_flags);           /* Segment flags */
577     bswaptls(&phdr->p_align);           /* Segment alignment */
578 }
579
580 static void bswap_shdr(struct elf_shdr *shdr)
581 {
582     bswap32s(&shdr->sh_name);
583     bswap32s(&shdr->sh_type);
584     bswaptls(&shdr->sh_flags);
585     bswaptls(&shdr->sh_addr);
586     bswaptls(&shdr->sh_offset);
587     bswaptls(&shdr->sh_size);
588     bswap32s(&shdr->sh_link);
589     bswap32s(&shdr->sh_info);
590     bswaptls(&shdr->sh_addralign);
591     bswaptls(&shdr->sh_entsize);
592 }
593
594 static void bswap_sym(struct elf_sym *sym)
595 {
596     bswap32s(&sym->st_name);
597     bswaptls(&sym->st_value);
598     bswaptls(&sym->st_size);
599     bswap16s(&sym->st_shndx);
600 }
601 #endif
602
603 /*
604  * 'copy_elf_strings()' copies argument/envelope strings from user
605  * memory to free pages in kernel mem. These are in a format ready
606  * to be put directly into the top of new user memory.
607  *
608  */
609 static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
610                                   abi_ulong p)
611 {
612     char *tmp, *tmp1, *pag = NULL;
613     int len, offset = 0;
614
615     if (!p) {
616         return 0;       /* bullet-proofing */
617     }
618     while (argc-- > 0) {
619         tmp = argv[argc];
620         if (!tmp) {
621             fprintf(stderr, "VFS: argc is wrong");
622             exit(-1);
623         }
624         tmp1 = tmp;
625         while (*tmp++);
626         len = tmp - tmp1;
627         if (p < len) {  /* this shouldn't happen - 128kB */
628                 return 0;
629         }
630         while (len) {
631             --p; --tmp; --len;
632             if (--offset < 0) {
633                 offset = p % TARGET_PAGE_SIZE;
634                 pag = (char *)page[p/TARGET_PAGE_SIZE];
635                 if (!pag) {
636                     pag = (char *)malloc(TARGET_PAGE_SIZE);
637                     memset(pag, 0, TARGET_PAGE_SIZE);
638                     page[p/TARGET_PAGE_SIZE] = pag;
639                     if (!pag)
640                         return 0;
641                 }
642             }
643             if (len == 0 || offset == 0) {
644                 *(pag + offset) = *tmp;
645             }
646             else {
647               int bytes_to_copy = (len > offset) ? offset : len;
648               tmp -= bytes_to_copy;
649               p -= bytes_to_copy;
650               offset -= bytes_to_copy;
651               len -= bytes_to_copy;
652               memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
653             }
654         }
655     }
656     return p;
657 }
658
659 static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
660                                  struct image_info *info)
661 {
662     abi_ulong stack_base, size, error;
663     int i;
664
665     /* Create enough stack to hold everything.  If we don't use
666      * it for args, we'll use it for something else...
667      */
668     size = x86_stack_size;
669     if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
670         size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
671     error = target_mmap(0,
672                         size + qemu_host_page_size,
673                         PROT_READ | PROT_WRITE,
674                         MAP_PRIVATE | MAP_ANONYMOUS,
675                         -1, 0);
676     if (error == -1) {
677         perror("stk mmap");
678         exit(-1);
679     }
680     /* we reserve one extra page at the top of the stack as guard */
681     target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
682
683     stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
684     p += stack_base;
685
686     for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
687         if (bprm->page[i]) {
688             info->rss++;
689             /* FIXME - check return value of memcpy_to_target() for failure */
690             memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
691             free(bprm->page[i]);
692         }
693         stack_base += TARGET_PAGE_SIZE;
694     }
695     return p;
696 }
697
698 static void set_brk(abi_ulong start, abi_ulong end)
699 {
700         /* page-align the start and end addresses... */
701         start = HOST_PAGE_ALIGN(start);
702         end = HOST_PAGE_ALIGN(end);
703         if (end <= start)
704                 return;
705         if(target_mmap(start, end - start,
706                        PROT_READ | PROT_WRITE | PROT_EXEC,
707                        MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == -1) {
708             perror("cannot mmap brk");
709             exit(-1);
710         }
711 }
712
713
714 /* We need to explicitly zero any fractional pages after the data
715    section (i.e. bss).  This would contain the junk from the file that
716    should not be in memory. */
717 static void padzero(abi_ulong elf_bss, abi_ulong last_bss)
718 {
719         abi_ulong nbyte;
720
721         if (elf_bss >= last_bss)
722                 return;
723
724         /* XXX: this is really a hack : if the real host page size is
725            smaller than the target page size, some pages after the end
726            of the file may not be mapped. A better fix would be to
727            patch target_mmap(), but it is more complicated as the file
728            size must be known */
729         if (qemu_real_host_page_size < qemu_host_page_size) {
730             abi_ulong end_addr, end_addr1;
731             end_addr1 = (elf_bss + qemu_real_host_page_size - 1) &
732                 ~(qemu_real_host_page_size - 1);
733             end_addr = HOST_PAGE_ALIGN(elf_bss);
734             if (end_addr1 < end_addr) {
735                 mmap((void *)g2h(end_addr1), end_addr - end_addr1,
736                      PROT_READ|PROT_WRITE|PROT_EXEC,
737                      MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
738             }
739         }
740
741         nbyte = elf_bss & (qemu_host_page_size-1);
742         if (nbyte) {
743             nbyte = qemu_host_page_size - nbyte;
744             do {
745                 /* FIXME - what to do if put_user() fails? */
746                 put_user_u8(0, elf_bss);
747                 elf_bss++;
748             } while (--nbyte);
749         }
750 }
751
752
753 static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
754                                    struct elfhdr * exec,
755                                    abi_ulong load_addr,
756                                    abi_ulong load_bias,
757                                    abi_ulong interp_load_addr, int ibcs,
758                                    struct image_info *info)
759 {
760         abi_ulong sp;
761         int size;
762         abi_ulong u_platform;
763         const char *k_platform;
764         const int n = sizeof(elf_addr_t);
765
766         sp = p;
767         u_platform = 0;
768         k_platform = ELF_PLATFORM;
769         if (k_platform) {
770             size_t len = strlen(k_platform) + 1;
771             sp -= (len + n - 1) & ~(n - 1);
772             u_platform = sp;
773             /* FIXME - check return value of memcpy_to_target() for failure */
774             memcpy_to_target(sp, k_platform, len);
775         }
776         /*
777          * Force 16 byte _final_ alignment here for generality.
778          */
779         sp = sp &~ (abi_ulong)15;
780         size = (DLINFO_ITEMS + 1) * 2;
781         if (k_platform)
782           size += 2;
783 #ifdef DLINFO_ARCH_ITEMS
784         size += DLINFO_ARCH_ITEMS * 2;
785 #endif
786         size += envc + argc + 2;
787         size += (!ibcs ? 3 : 1);        /* argc itself */
788         size *= n;
789         if (size & 15)
790             sp -= 16 - (size & 15);
791
792         /* This is correct because Linux defines
793          * elf_addr_t as Elf32_Off / Elf64_Off
794          */
795 #define NEW_AUX_ENT(id, val) do {               \
796             sp -= n; put_user_ual(val, sp);     \
797             sp -= n; put_user_ual(id, sp);      \
798           } while(0)
799
800         NEW_AUX_ENT (AT_NULL, 0);
801
802         /* There must be exactly DLINFO_ITEMS entries here.  */
803         NEW_AUX_ENT(AT_PHDR, (abi_ulong)(load_addr + exec->e_phoff));
804         NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
805         NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
806         NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
807         NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_load_addr));
808         NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
809         NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
810         NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
811         NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
812         NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
813         NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
814         NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
815         NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
816         if (k_platform)
817             NEW_AUX_ENT(AT_PLATFORM, u_platform);
818 #ifdef ARCH_DLINFO
819         /*
820          * ARCH_DLINFO must come last so platform specific code can enforce
821          * special alignment requirements on the AUXV if necessary (eg. PPC).
822          */
823         ARCH_DLINFO;
824 #endif
825 #undef NEW_AUX_ENT
826
827         sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
828         return sp;
829 }
830
831
832 static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
833                                  int interpreter_fd,
834                                  abi_ulong *interp_load_addr)
835 {
836         struct elf_phdr *elf_phdata  =  NULL;
837         struct elf_phdr *eppnt;
838         abi_ulong load_addr = 0;
839         int load_addr_set = 0;
840         int retval;
841         abi_ulong last_bss, elf_bss;
842         abi_ulong error;
843         int i;
844
845         elf_bss = 0;
846         last_bss = 0;
847         error = 0;
848
849 #ifdef BSWAP_NEEDED
850         bswap_ehdr(interp_elf_ex);
851 #endif
852         /* First of all, some simple consistency checks */
853         if ((interp_elf_ex->e_type != ET_EXEC &&
854              interp_elf_ex->e_type != ET_DYN) ||
855            !elf_check_arch(interp_elf_ex->e_machine)) {
856                 return ~((abi_ulong)0UL);
857         }
858
859
860         /* Now read in all of the header information */
861
862         if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
863             return ~(abi_ulong)0UL;
864
865         elf_phdata =  (struct elf_phdr *)
866                 malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
867
868         if (!elf_phdata)
869           return ~((abi_ulong)0UL);
870
871         /*
872          * If the size of this structure has changed, then punt, since
873          * we will be doing the wrong thing.
874          */
875         if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
876             free(elf_phdata);
877             return ~((abi_ulong)0UL);
878         }
879
880         retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
881         if(retval >= 0) {
882             retval = read(interpreter_fd,
883                            (char *) elf_phdata,
884                            sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
885         }
886         if (retval < 0) {
887                 perror("load_elf_interp");
888                 exit(-1);
889                 free (elf_phdata);
890                 return retval;
891         }
892 #ifdef BSWAP_NEEDED
893         eppnt = elf_phdata;
894         for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
895             bswap_phdr(eppnt);
896         }
897 #endif
898
899         if (interp_elf_ex->e_type == ET_DYN) {
900             /* in order to avoid hardcoding the interpreter load
901                address in qemu, we allocate a big enough memory zone */
902             error = target_mmap(0, INTERP_MAP_SIZE,
903                                 PROT_NONE, MAP_PRIVATE | MAP_ANON,
904                                 -1, 0);
905             if (error == -1) {
906                 perror("mmap");
907                 exit(-1);
908             }
909             load_addr = error;
910             load_addr_set = 1;
911         }
912
913         eppnt = elf_phdata;
914         for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
915           if (eppnt->p_type == PT_LOAD) {
916             int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
917             int elf_prot = 0;
918             abi_ulong vaddr = 0;
919             abi_ulong k;
920
921             if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
922             if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
923             if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
924             if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
925                 elf_type |= MAP_FIXED;
926                 vaddr = eppnt->p_vaddr;
927             }
928             error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
929                  eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
930                  elf_prot,
931                  elf_type,
932                  interpreter_fd,
933                  eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
934
935             if (error == -1) {
936               /* Real error */
937               close(interpreter_fd);
938               free(elf_phdata);
939               return ~((abi_ulong)0UL);
940             }
941
942             if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
943               load_addr = error;
944               load_addr_set = 1;
945             }
946
947             /*
948              * Find the end of the file  mapping for this phdr, and keep
949              * track of the largest address we see for this.
950              */
951             k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
952             if (k > elf_bss) elf_bss = k;
953
954             /*
955              * Do the same thing for the memory mapping - between
956              * elf_bss and last_bss is the bss section.
957              */
958             k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
959             if (k > last_bss) last_bss = k;
960           }
961
962         /* Now use mmap to map the library into memory. */
963
964         close(interpreter_fd);
965
966         /*
967          * Now fill out the bss section.  First pad the last page up
968          * to the page boundary, and then perform a mmap to make sure
969          * that there are zeromapped pages up to and including the last
970          * bss page.
971          */
972         padzero(elf_bss, last_bss);
973         elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
974
975         /* Map the last of the bss segment */
976         if (last_bss > elf_bss) {
977             target_mmap(elf_bss, last_bss-elf_bss,
978                         PROT_READ|PROT_WRITE|PROT_EXEC,
979                         MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
980         }
981         free(elf_phdata);
982
983         *interp_load_addr = load_addr;
984         return ((abi_ulong) interp_elf_ex->e_entry) + load_addr;
985 }
986
987 static int symfind(const void *s0, const void *s1)
988 {
989     struct elf_sym *key = (struct elf_sym *)s0;
990     struct elf_sym *sym = (struct elf_sym *)s1;
991     int result = 0;
992     if (key->st_value < sym->st_value) {
993         result = -1;
994     } else if (key->st_value > sym->st_value + sym->st_size) {
995         result = 1;
996     }
997     return result;
998 }
999
1000 static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
1001 {
1002 #if ELF_CLASS == ELFCLASS32
1003     struct elf_sym *syms = s->disas_symtab.elf32;
1004 #else
1005     struct elf_sym *syms = s->disas_symtab.elf64;
1006 #endif
1007
1008     // binary search
1009     struct elf_sym key;
1010     struct elf_sym *sym;
1011
1012     key.st_value = orig_addr;
1013
1014     sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
1015     if (sym != 0) {
1016         return s->disas_strtab + sym->st_name;
1017     }
1018
1019     return "";
1020 }
1021
1022 /* FIXME: This should use elf_ops.h  */
1023 static int symcmp(const void *s0, const void *s1)
1024 {
1025     struct elf_sym *sym0 = (struct elf_sym *)s0;
1026     struct elf_sym *sym1 = (struct elf_sym *)s1;
1027     return (sym0->st_value < sym1->st_value)
1028         ? -1
1029         : ((sym0->st_value > sym1->st_value) ? 1 : 0);
1030 }
1031
1032 /* Best attempt to load symbols from this ELF object. */
1033 static void load_symbols(struct elfhdr *hdr, int fd)
1034 {
1035     unsigned int i, nsyms;
1036     struct elf_shdr sechdr, symtab, strtab;
1037     char *strings;
1038     struct syminfo *s;
1039     struct elf_sym *syms;
1040
1041     lseek(fd, hdr->e_shoff, SEEK_SET);
1042     for (i = 0; i < hdr->e_shnum; i++) {
1043         if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
1044             return;
1045 #ifdef BSWAP_NEEDED
1046         bswap_shdr(&sechdr);
1047 #endif
1048         if (sechdr.sh_type == SHT_SYMTAB) {
1049             symtab = sechdr;
1050             lseek(fd, hdr->e_shoff
1051                   + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
1052             if (read(fd, &strtab, sizeof(strtab))
1053                 != sizeof(strtab))
1054                 return;
1055 #ifdef BSWAP_NEEDED
1056             bswap_shdr(&strtab);
1057 #endif
1058             goto found;
1059         }
1060     }
1061     return; /* Shouldn't happen... */
1062
1063  found:
1064     /* Now know where the strtab and symtab are.  Snarf them. */
1065     s = malloc(sizeof(*s));
1066     syms = malloc(symtab.sh_size);
1067     if (!syms)
1068         return;
1069     s->disas_strtab = strings = malloc(strtab.sh_size);
1070     if (!s->disas_strtab)
1071         return;
1072
1073     lseek(fd, symtab.sh_offset, SEEK_SET);
1074     if (read(fd, syms, symtab.sh_size) != symtab.sh_size)
1075         return;
1076
1077     nsyms = symtab.sh_size / sizeof(struct elf_sym);
1078
1079     i = 0;
1080     while (i < nsyms) {
1081 #ifdef BSWAP_NEEDED
1082         bswap_sym(syms + i);
1083 #endif
1084         // Throw away entries which we do not need.
1085         if (syms[i].st_shndx == SHN_UNDEF ||
1086                 syms[i].st_shndx >= SHN_LORESERVE ||
1087                 ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
1088             nsyms--;
1089             if (i < nsyms) {
1090                 syms[i] = syms[nsyms];
1091             }
1092             continue;
1093         }
1094 #if defined(TARGET_ARM) || defined (TARGET_MIPS)
1095         /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
1096         syms[i].st_value &= ~(target_ulong)1;
1097 #endif
1098         i++;
1099     }
1100     syms = realloc(syms, nsyms * sizeof(*syms));
1101
1102     qsort(syms, nsyms, sizeof(*syms), symcmp);
1103
1104     lseek(fd, strtab.sh_offset, SEEK_SET);
1105     if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
1106         return;
1107     s->disas_num_syms = nsyms;
1108 #if ELF_CLASS == ELFCLASS32
1109     s->disas_symtab.elf32 = syms;
1110     s->lookup_symbol = lookup_symbolxx;
1111 #else
1112     s->disas_symtab.elf64 = syms;
1113     s->lookup_symbol = lookup_symbolxx;
1114 #endif
1115     s->next = syminfos;
1116     syminfos = s;
1117 }
1118
1119 int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1120                     struct image_info * info)
1121 {
1122     struct elfhdr elf_ex;
1123     struct elfhdr interp_elf_ex;
1124     struct exec interp_ex;
1125     int interpreter_fd = -1; /* avoid warning */
1126     abi_ulong load_addr, load_bias;
1127     int load_addr_set = 0;
1128     unsigned int interpreter_type = INTERPRETER_NONE;
1129     unsigned char ibcs2_interpreter;
1130     int i;
1131     abi_ulong mapped_addr;
1132     struct elf_phdr * elf_ppnt;
1133     struct elf_phdr *elf_phdata;
1134     abi_ulong elf_bss, k, elf_brk;
1135     int retval;
1136     char * elf_interpreter;
1137     abi_ulong elf_entry, interp_load_addr = 0;
1138     int status;
1139     abi_ulong start_code, end_code, start_data, end_data;
1140     abi_ulong reloc_func_desc = 0;
1141     abi_ulong elf_stack;
1142     char passed_fileno[6];
1143
1144     ibcs2_interpreter = 0;
1145     status = 0;
1146     load_addr = 0;
1147     load_bias = 0;
1148     elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
1149 #ifdef BSWAP_NEEDED
1150     bswap_ehdr(&elf_ex);
1151 #endif
1152
1153     /* First of all, some simple consistency checks */
1154     if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
1155                                 (! elf_check_arch(elf_ex.e_machine))) {
1156             return -ENOEXEC;
1157     }
1158
1159     bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1160     bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1161     bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1162     if (!bprm->p) {
1163         retval = -E2BIG;
1164     }
1165
1166     /* Now read in all of the header information */
1167     elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
1168     if (elf_phdata == NULL) {
1169         return -ENOMEM;
1170     }
1171
1172     retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
1173     if(retval > 0) {
1174         retval = read(bprm->fd, (char *) elf_phdata,
1175                                 elf_ex.e_phentsize * elf_ex.e_phnum);
1176     }
1177
1178     if (retval < 0) {
1179         perror("load_elf_binary");
1180         exit(-1);
1181         free (elf_phdata);
1182         return -errno;
1183     }
1184
1185 #ifdef BSWAP_NEEDED
1186     elf_ppnt = elf_phdata;
1187     for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
1188         bswap_phdr(elf_ppnt);
1189     }
1190 #endif
1191     elf_ppnt = elf_phdata;
1192
1193     elf_bss = 0;
1194     elf_brk = 0;
1195
1196
1197     elf_stack = ~((abi_ulong)0UL);
1198     elf_interpreter = NULL;
1199     start_code = ~((abi_ulong)0UL);
1200     end_code = 0;
1201     start_data = 0;
1202     end_data = 0;
1203     interp_ex.a_info = 0;
1204
1205     for(i=0;i < elf_ex.e_phnum; i++) {
1206         if (elf_ppnt->p_type == PT_INTERP) {
1207             if ( elf_interpreter != NULL )
1208             {
1209                 free (elf_phdata);
1210                 free(elf_interpreter);
1211                 close(bprm->fd);
1212                 return -EINVAL;
1213             }
1214
1215             /* This is the program interpreter used for
1216              * shared libraries - for now assume that this
1217              * is an a.out format binary
1218              */
1219
1220             elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
1221
1222             if (elf_interpreter == NULL) {
1223                 free (elf_phdata);
1224                 close(bprm->fd);
1225                 return -ENOMEM;
1226             }
1227
1228             retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
1229             if(retval >= 0) {
1230                 retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
1231             }
1232             if(retval < 0) {
1233                 perror("load_elf_binary2");
1234                 exit(-1);
1235             }
1236
1237             /* If the program interpreter is one of these two,
1238                then assume an iBCS2 image. Otherwise assume
1239                a native linux image. */
1240
1241             /* JRP - Need to add X86 lib dir stuff here... */
1242
1243             if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
1244                 strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
1245               ibcs2_interpreter = 1;
1246             }
1247
1248 #if 0
1249             printf("Using ELF interpreter %s\n", elf_interpreter);
1250 #endif
1251             if (retval >= 0) {
1252                 retval = open(path(elf_interpreter), O_RDONLY);
1253                 if(retval >= 0) {
1254                     interpreter_fd = retval;
1255                 }
1256                 else {
1257                     perror(elf_interpreter);
1258                     exit(-1);
1259                     /* retval = -errno; */
1260                 }
1261             }
1262
1263             if (retval >= 0) {
1264                 retval = lseek(interpreter_fd, 0, SEEK_SET);
1265                 if(retval >= 0) {
1266                     retval = read(interpreter_fd,bprm->buf,128);
1267                 }
1268             }
1269             if (retval >= 0) {
1270                 interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1271                 interp_elf_ex=*((struct elfhdr *) bprm->buf); /* elf exec-header */
1272             }
1273             if (retval < 0) {
1274                 perror("load_elf_binary3");
1275                 exit(-1);
1276                 free (elf_phdata);
1277                 free(elf_interpreter);
1278                 close(bprm->fd);
1279                 return retval;
1280             }
1281         }
1282         elf_ppnt++;
1283     }
1284
1285     /* Some simple consistency checks for the interpreter */
1286     if (elf_interpreter){
1287         interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1288
1289         /* Now figure out which format our binary is */
1290         if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1291                 (N_MAGIC(interp_ex) != QMAGIC)) {
1292           interpreter_type = INTERPRETER_ELF;
1293         }
1294
1295         if (interp_elf_ex.e_ident[0] != 0x7f ||
1296             strncmp((char *)&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1297             interpreter_type &= ~INTERPRETER_ELF;
1298         }
1299
1300         if (!interpreter_type) {
1301             free(elf_interpreter);
1302             free(elf_phdata);
1303             close(bprm->fd);
1304             return -ELIBBAD;
1305         }
1306     }
1307
1308     /* OK, we are done with that, now set up the arg stuff,
1309        and then start this sucker up */
1310
1311     {
1312         char * passed_p;
1313
1314         if (interpreter_type == INTERPRETER_AOUT) {
1315             snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1316             passed_p = passed_fileno;
1317
1318             if (elf_interpreter) {
1319                 bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
1320                 bprm->argc++;
1321             }
1322         }
1323         if (!bprm->p) {
1324             if (elf_interpreter) {
1325                 free(elf_interpreter);
1326             }
1327             free (elf_phdata);
1328             close(bprm->fd);
1329             return -E2BIG;
1330         }
1331     }
1332
1333     /* OK, This is the point of no return */
1334     info->end_data = 0;
1335     info->end_code = 0;
1336     info->start_mmap = (abi_ulong)ELF_START_MMAP;
1337     info->mmap = 0;
1338     elf_entry = (abi_ulong) elf_ex.e_entry;
1339
1340     /* Do this so that we can load the interpreter, if need be.  We will
1341        change some of these later */
1342     info->rss = 0;
1343     bprm->p = setup_arg_pages(bprm->p, bprm, info);
1344     info->start_stack = bprm->p;
1345
1346     /* Now we do a little grungy work by mmaping the ELF image into
1347      * the correct location in memory.  At this point, we assume that
1348      * the image should be loaded at fixed address, not at a variable
1349      * address.
1350      */
1351
1352     for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1353         int elf_prot = 0;
1354         int elf_flags = 0;
1355         abi_ulong error;
1356
1357         if (elf_ppnt->p_type != PT_LOAD)
1358             continue;
1359
1360         if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1361         if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1362         if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1363         elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1364         if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1365             elf_flags |= MAP_FIXED;
1366         } else if (elf_ex.e_type == ET_DYN) {
1367             /* Try and get dynamic programs out of the way of the default mmap
1368                base, as well as whatever program they might try to exec.  This
1369                is because the brk will follow the loader, and is not movable.  */
1370             /* NOTE: for qemu, we do a big mmap to get enough space
1371                without hardcoding any address */
1372             error = target_mmap(0, ET_DYN_MAP_SIZE,
1373                                 PROT_NONE, MAP_PRIVATE | MAP_ANON,
1374                                 -1, 0);
1375             if (error == -1) {
1376                 perror("mmap");
1377                 exit(-1);
1378             }
1379             load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1380         }
1381
1382         error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1383                             (elf_ppnt->p_filesz +
1384                              TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1385                             elf_prot,
1386                             (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1387                             bprm->fd,
1388                             (elf_ppnt->p_offset -
1389                              TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1390         if (error == -1) {
1391             perror("mmap");
1392             exit(-1);
1393         }
1394
1395 #ifdef LOW_ELF_STACK
1396         if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1397             elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1398 #endif
1399
1400         if (!load_addr_set) {
1401             load_addr_set = 1;
1402             load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1403             if (elf_ex.e_type == ET_DYN) {
1404                 load_bias += error -
1405                     TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1406                 load_addr += load_bias;
1407                 reloc_func_desc = load_bias;
1408             }
1409         }
1410         k = elf_ppnt->p_vaddr;
1411         if (k < start_code)
1412             start_code = k;
1413         if (start_data < k)
1414             start_data = k;
1415         k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1416         if (k > elf_bss)
1417             elf_bss = k;
1418         if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1419             end_code = k;
1420         if (end_data < k)
1421             end_data = k;
1422         k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1423         if (k > elf_brk) elf_brk = k;
1424     }
1425
1426     elf_entry += load_bias;
1427     elf_bss += load_bias;
1428     elf_brk += load_bias;
1429     start_code += load_bias;
1430     end_code += load_bias;
1431     start_data += load_bias;
1432     end_data += load_bias;
1433
1434     if (elf_interpreter) {
1435         if (interpreter_type & 1) {
1436             elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1437         }
1438         else if (interpreter_type & 2) {
1439             elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1440                                             &interp_load_addr);
1441         }
1442         reloc_func_desc = interp_load_addr;
1443
1444         close(interpreter_fd);
1445         free(elf_interpreter);
1446
1447         if (elf_entry == ~((abi_ulong)0UL)) {
1448             printf("Unable to load interpreter\n");
1449             free(elf_phdata);
1450             exit(-1);
1451             return 0;
1452         }
1453     }
1454
1455     free(elf_phdata);
1456
1457     if (qemu_log_enabled())
1458         load_symbols(&elf_ex, bprm->fd);
1459
1460     if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1461     info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1462
1463 #ifdef LOW_ELF_STACK
1464     info->start_stack = bprm->p = elf_stack - 4;
1465 #endif
1466     bprm->p = create_elf_tables(bprm->p,
1467                     bprm->argc,
1468                     bprm->envc,
1469                     &elf_ex,
1470                     load_addr, load_bias,
1471                     interp_load_addr,
1472                     (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1473                     info);
1474     info->load_addr = reloc_func_desc;
1475     info->start_brk = info->brk = elf_brk;
1476     info->end_code = end_code;
1477     info->start_code = start_code;
1478     info->start_data = start_data;
1479     info->end_data = end_data;
1480     info->start_stack = bprm->p;
1481
1482     /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1483        sections */
1484     set_brk(elf_bss, elf_brk);
1485
1486     padzero(elf_bss, elf_brk);
1487
1488 #if 0
1489     printf("(start_brk) %x\n" , info->start_brk);
1490     printf("(end_code) %x\n" , info->end_code);
1491     printf("(start_code) %x\n" , info->start_code);
1492     printf("(end_data) %x\n" , info->end_data);
1493     printf("(start_stack) %x\n" , info->start_stack);
1494     printf("(brk) %x\n" , info->brk);
1495 #endif
1496
1497     if ( info->personality == PER_SVR4 )
1498     {
1499             /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1500                and some applications "depend" upon this behavior.
1501                Since we do not have the power to recompile these, we
1502                emulate the SVr4 behavior.  Sigh.  */
1503             mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1504                                       MAP_FIXED | MAP_PRIVATE, -1, 0);
1505     }
1506
1507     info->entry = elf_entry;
1508
1509     return 0;
1510 }
1511
1512 static int load_aout_interp(void * exptr, int interp_fd)
1513 {
1514     printf("a.out interpreter not yet supported\n");
1515     return(0);
1516 }
1517
1518 void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
1519 {
1520     init_thread(regs, infop);
1521 }