ETRAX: Removed unused struct entry and fixed Windows build.
[qemu] / bsd-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 extern unsigned long x86_stack_size;
549
550 static int load_aout_interp(void * exptr, int interp_fd);
551
552 #ifdef BSWAP_NEEDED
553 static void bswap_ehdr(struct elfhdr *ehdr)
554 {
555     bswap16s(&ehdr->e_type);                    /* Object file type */
556     bswap16s(&ehdr->e_machine);         /* Architecture */
557     bswap32s(&ehdr->e_version);         /* Object file version */
558     bswaptls(&ehdr->e_entry);           /* Entry point virtual address */
559     bswaptls(&ehdr->e_phoff);           /* Program header table file offset */
560     bswaptls(&ehdr->e_shoff);           /* Section header table file offset */
561     bswap32s(&ehdr->e_flags);           /* Processor-specific flags */
562     bswap16s(&ehdr->e_ehsize);          /* ELF header size in bytes */
563     bswap16s(&ehdr->e_phentsize);               /* Program header table entry size */
564     bswap16s(&ehdr->e_phnum);           /* Program header table entry count */
565     bswap16s(&ehdr->e_shentsize);               /* Section header table entry size */
566     bswap16s(&ehdr->e_shnum);           /* Section header table entry count */
567     bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
568 }
569
570 static void bswap_phdr(struct elf_phdr *phdr)
571 {
572     bswap32s(&phdr->p_type);                    /* Segment type */
573     bswaptls(&phdr->p_offset);          /* Segment file offset */
574     bswaptls(&phdr->p_vaddr);           /* Segment virtual address */
575     bswaptls(&phdr->p_paddr);           /* Segment physical address */
576     bswaptls(&phdr->p_filesz);          /* Segment size in file */
577     bswaptls(&phdr->p_memsz);           /* Segment size in memory */
578     bswap32s(&phdr->p_flags);           /* Segment flags */
579     bswaptls(&phdr->p_align);           /* Segment alignment */
580 }
581
582 static void bswap_shdr(struct elf_shdr *shdr)
583 {
584     bswap32s(&shdr->sh_name);
585     bswap32s(&shdr->sh_type);
586     bswaptls(&shdr->sh_flags);
587     bswaptls(&shdr->sh_addr);
588     bswaptls(&shdr->sh_offset);
589     bswaptls(&shdr->sh_size);
590     bswap32s(&shdr->sh_link);
591     bswap32s(&shdr->sh_info);
592     bswaptls(&shdr->sh_addralign);
593     bswaptls(&shdr->sh_entsize);
594 }
595
596 static void bswap_sym(struct elf_sym *sym)
597 {
598     bswap32s(&sym->st_name);
599     bswaptls(&sym->st_value);
600     bswaptls(&sym->st_size);
601     bswap16s(&sym->st_shndx);
602 }
603 #endif
604
605 /*
606  * 'copy_elf_strings()' copies argument/envelope strings from user
607  * memory to free pages in kernel mem. These are in a format ready
608  * to be put directly into the top of new user memory.
609  *
610  */
611 static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
612                                   abi_ulong p)
613 {
614     char *tmp, *tmp1, *pag = NULL;
615     int len, offset = 0;
616
617     if (!p) {
618         return 0;       /* bullet-proofing */
619     }
620     while (argc-- > 0) {
621         tmp = argv[argc];
622         if (!tmp) {
623             fprintf(stderr, "VFS: argc is wrong");
624             exit(-1);
625         }
626         tmp1 = tmp;
627         while (*tmp++);
628         len = tmp - tmp1;
629         if (p < len) {  /* this shouldn't happen - 128kB */
630                 return 0;
631         }
632         while (len) {
633             --p; --tmp; --len;
634             if (--offset < 0) {
635                 offset = p % TARGET_PAGE_SIZE;
636                 pag = (char *)page[p/TARGET_PAGE_SIZE];
637                 if (!pag) {
638                     pag = (char *)malloc(TARGET_PAGE_SIZE);
639                     memset(pag, 0, TARGET_PAGE_SIZE);
640                     page[p/TARGET_PAGE_SIZE] = pag;
641                     if (!pag)
642                         return 0;
643                 }
644             }
645             if (len == 0 || offset == 0) {
646                 *(pag + offset) = *tmp;
647             }
648             else {
649               int bytes_to_copy = (len > offset) ? offset : len;
650               tmp -= bytes_to_copy;
651               p -= bytes_to_copy;
652               offset -= bytes_to_copy;
653               len -= bytes_to_copy;
654               memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
655             }
656         }
657     }
658     return p;
659 }
660
661 static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
662                                  struct image_info *info)
663 {
664     abi_ulong stack_base, size, error;
665     int i;
666
667     /* Create enough stack to hold everything.  If we don't use
668      * it for args, we'll use it for something else...
669      */
670     size = x86_stack_size;
671     if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
672         size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
673     error = target_mmap(0,
674                         size + qemu_host_page_size,
675                         PROT_READ | PROT_WRITE,
676                         MAP_PRIVATE | MAP_ANON,
677                         -1, 0);
678     if (error == -1) {
679         perror("stk mmap");
680         exit(-1);
681     }
682     /* we reserve one extra page at the top of the stack as guard */
683     target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
684
685     stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
686     p += stack_base;
687
688     for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
689         if (bprm->page[i]) {
690             info->rss++;
691             /* FIXME - check return value of memcpy_to_target() for failure */
692             memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
693             free(bprm->page[i]);
694         }
695         stack_base += TARGET_PAGE_SIZE;
696     }
697     return p;
698 }
699
700 static void set_brk(abi_ulong start, abi_ulong end)
701 {
702         /* page-align the start and end addresses... */
703         start = HOST_PAGE_ALIGN(start);
704         end = HOST_PAGE_ALIGN(end);
705         if (end <= start)
706                 return;
707         if(target_mmap(start, end - start,
708                        PROT_READ | PROT_WRITE | PROT_EXEC,
709                        MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0) == -1) {
710             perror("cannot mmap brk");
711             exit(-1);
712         }
713 }
714
715
716 /* We need to explicitly zero any fractional pages after the data
717    section (i.e. bss).  This would contain the junk from the file that
718    should not be in memory. */
719 static void padzero(abi_ulong elf_bss, abi_ulong last_bss)
720 {
721         abi_ulong nbyte;
722
723         if (elf_bss >= last_bss)
724                 return;
725
726         /* XXX: this is really a hack : if the real host page size is
727            smaller than the target page size, some pages after the end
728            of the file may not be mapped. A better fix would be to
729            patch target_mmap(), but it is more complicated as the file
730            size must be known */
731         if (qemu_real_host_page_size < qemu_host_page_size) {
732             abi_ulong end_addr, end_addr1;
733             end_addr1 = (elf_bss + qemu_real_host_page_size - 1) &
734                 ~(qemu_real_host_page_size - 1);
735             end_addr = HOST_PAGE_ALIGN(elf_bss);
736             if (end_addr1 < end_addr) {
737                 mmap((void *)g2h(end_addr1), end_addr - end_addr1,
738                      PROT_READ|PROT_WRITE|PROT_EXEC,
739                      MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
740             }
741         }
742
743         nbyte = elf_bss & (qemu_host_page_size-1);
744         if (nbyte) {
745             nbyte = qemu_host_page_size - nbyte;
746             do {
747                 /* FIXME - what to do if put_user() fails? */
748                 put_user_u8(0, elf_bss);
749                 elf_bss++;
750             } while (--nbyte);
751         }
752 }
753
754
755 static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
756                                    struct elfhdr * exec,
757                                    abi_ulong load_addr,
758                                    abi_ulong load_bias,
759                                    abi_ulong interp_load_addr, int ibcs,
760                                    struct image_info *info)
761 {
762         abi_ulong sp;
763         int size;
764         abi_ulong u_platform;
765         const char *k_platform;
766         const int n = sizeof(elf_addr_t);
767
768         sp = p;
769         u_platform = 0;
770         k_platform = ELF_PLATFORM;
771         if (k_platform) {
772             size_t len = strlen(k_platform) + 1;
773             sp -= (len + n - 1) & ~(n - 1);
774             u_platform = sp;
775             /* FIXME - check return value of memcpy_to_target() for failure */
776             memcpy_to_target(sp, k_platform, len);
777         }
778         /*
779          * Force 16 byte _final_ alignment here for generality.
780          */
781         sp = sp &~ (abi_ulong)15;
782         size = (DLINFO_ITEMS + 1) * 2;
783         if (k_platform)
784           size += 2;
785 #ifdef DLINFO_ARCH_ITEMS
786         size += DLINFO_ARCH_ITEMS * 2;
787 #endif
788         size += envc + argc + 2;
789         size += (!ibcs ? 3 : 1);        /* argc itself */
790         size *= n;
791         if (size & 15)
792             sp -= 16 - (size & 15);
793
794         /* This is correct because Linux defines
795          * elf_addr_t as Elf32_Off / Elf64_Off
796          */
797 #define NEW_AUX_ENT(id, val) do {               \
798             sp -= n; put_user_ual(val, sp);     \
799             sp -= n; put_user_ual(id, sp);      \
800           } while(0)
801
802         NEW_AUX_ENT (AT_NULL, 0);
803
804         /* There must be exactly DLINFO_ITEMS entries here.  */
805         NEW_AUX_ENT(AT_PHDR, (abi_ulong)(load_addr + exec->e_phoff));
806         NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
807         NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
808         NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
809         NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_load_addr));
810         NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
811         NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
812         NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
813         NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
814         NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
815         NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
816         NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
817         NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
818         if (k_platform)
819             NEW_AUX_ENT(AT_PLATFORM, u_platform);
820 #ifdef ARCH_DLINFO
821         /*
822          * ARCH_DLINFO must come last so platform specific code can enforce
823          * special alignment requirements on the AUXV if necessary (eg. PPC).
824          */
825         ARCH_DLINFO;
826 #endif
827 #undef NEW_AUX_ENT
828
829         sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
830         return sp;
831 }
832
833
834 static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
835                                  int interpreter_fd,
836                                  abi_ulong *interp_load_addr)
837 {
838         struct elf_phdr *elf_phdata  =  NULL;
839         struct elf_phdr *eppnt;
840         abi_ulong load_addr = 0;
841         int load_addr_set = 0;
842         int retval;
843         abi_ulong last_bss, elf_bss;
844         abi_ulong error;
845         int i;
846
847         elf_bss = 0;
848         last_bss = 0;
849         error = 0;
850
851 #ifdef BSWAP_NEEDED
852         bswap_ehdr(interp_elf_ex);
853 #endif
854         /* First of all, some simple consistency checks */
855         if ((interp_elf_ex->e_type != ET_EXEC &&
856              interp_elf_ex->e_type != ET_DYN) ||
857            !elf_check_arch(interp_elf_ex->e_machine)) {
858                 return ~((abi_ulong)0UL);
859         }
860
861
862         /* Now read in all of the header information */
863
864         if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
865             return ~(abi_ulong)0UL;
866
867         elf_phdata =  (struct elf_phdr *)
868                 malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
869
870         if (!elf_phdata)
871           return ~((abi_ulong)0UL);
872
873         /*
874          * If the size of this structure has changed, then punt, since
875          * we will be doing the wrong thing.
876          */
877         if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
878             free(elf_phdata);
879             return ~((abi_ulong)0UL);
880         }
881
882         retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
883         if(retval >= 0) {
884             retval = read(interpreter_fd,
885                            (char *) elf_phdata,
886                            sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
887         }
888         if (retval < 0) {
889                 perror("load_elf_interp");
890                 exit(-1);
891                 free (elf_phdata);
892                 return retval;
893         }
894 #ifdef BSWAP_NEEDED
895         eppnt = elf_phdata;
896         for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
897             bswap_phdr(eppnt);
898         }
899 #endif
900
901         if (interp_elf_ex->e_type == ET_DYN) {
902             /* in order to avoid hardcoding the interpreter load
903                address in qemu, we allocate a big enough memory zone */
904             error = target_mmap(0, INTERP_MAP_SIZE,
905                                 PROT_NONE, MAP_PRIVATE | MAP_ANON,
906                                 -1, 0);
907             if (error == -1) {
908                 perror("mmap");
909                 exit(-1);
910             }
911             load_addr = error;
912             load_addr_set = 1;
913         }
914
915         eppnt = elf_phdata;
916         for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
917           if (eppnt->p_type == PT_LOAD) {
918             int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
919             int elf_prot = 0;
920             abi_ulong vaddr = 0;
921             abi_ulong k;
922
923             if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
924             if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
925             if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
926             if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
927                 elf_type |= MAP_FIXED;
928                 vaddr = eppnt->p_vaddr;
929             }
930             error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
931                  eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
932                  elf_prot,
933                  elf_type,
934                  interpreter_fd,
935                  eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
936
937             if (error == -1) {
938               /* Real error */
939               close(interpreter_fd);
940               free(elf_phdata);
941               return ~((abi_ulong)0UL);
942             }
943
944             if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
945               load_addr = error;
946               load_addr_set = 1;
947             }
948
949             /*
950              * Find the end of the file  mapping for this phdr, and keep
951              * track of the largest address we see for this.
952              */
953             k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
954             if (k > elf_bss) elf_bss = k;
955
956             /*
957              * Do the same thing for the memory mapping - between
958              * elf_bss and last_bss is the bss section.
959              */
960             k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
961             if (k > last_bss) last_bss = k;
962           }
963
964         /* Now use mmap to map the library into memory. */
965
966         close(interpreter_fd);
967
968         /*
969          * Now fill out the bss section.  First pad the last page up
970          * to the page boundary, and then perform a mmap to make sure
971          * that there are zeromapped pages up to and including the last
972          * bss page.
973          */
974         padzero(elf_bss, last_bss);
975         elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
976
977         /* Map the last of the bss segment */
978         if (last_bss > elf_bss) {
979             target_mmap(elf_bss, last_bss-elf_bss,
980                         PROT_READ|PROT_WRITE|PROT_EXEC,
981                         MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
982         }
983         free(elf_phdata);
984
985         *interp_load_addr = load_addr;
986         return ((abi_ulong) interp_elf_ex->e_entry) + load_addr;
987 }
988
989 static int symfind(const void *s0, const void *s1)
990 {
991     struct elf_sym *key = (struct elf_sym *)s0;
992     struct elf_sym *sym = (struct elf_sym *)s1;
993     int result = 0;
994     if (key->st_value < sym->st_value) {
995         result = -1;
996     } else if (key->st_value > sym->st_value + sym->st_size) {
997         result = 1;
998     }
999     return result;
1000 }
1001
1002 static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
1003 {
1004 #if ELF_CLASS == ELFCLASS32
1005     struct elf_sym *syms = s->disas_symtab.elf32;
1006 #else
1007     struct elf_sym *syms = s->disas_symtab.elf64;
1008 #endif
1009
1010     // binary search
1011     struct elf_sym key;
1012     struct elf_sym *sym;
1013
1014     key.st_value = orig_addr;
1015
1016     sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
1017     if (sym != 0) {
1018         return s->disas_strtab + sym->st_name;
1019     }
1020
1021     return "";
1022 }
1023
1024 /* FIXME: This should use elf_ops.h  */
1025 static int symcmp(const void *s0, const void *s1)
1026 {
1027     struct elf_sym *sym0 = (struct elf_sym *)s0;
1028     struct elf_sym *sym1 = (struct elf_sym *)s1;
1029     return (sym0->st_value < sym1->st_value)
1030         ? -1
1031         : ((sym0->st_value > sym1->st_value) ? 1 : 0);
1032 }
1033
1034 /* Best attempt to load symbols from this ELF object. */
1035 static void load_symbols(struct elfhdr *hdr, int fd)
1036 {
1037     unsigned int i, nsyms;
1038     struct elf_shdr sechdr, symtab, strtab;
1039     char *strings;
1040     struct syminfo *s;
1041     struct elf_sym *syms;
1042
1043     lseek(fd, hdr->e_shoff, SEEK_SET);
1044     for (i = 0; i < hdr->e_shnum; i++) {
1045         if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
1046             return;
1047 #ifdef BSWAP_NEEDED
1048         bswap_shdr(&sechdr);
1049 #endif
1050         if (sechdr.sh_type == SHT_SYMTAB) {
1051             symtab = sechdr;
1052             lseek(fd, hdr->e_shoff
1053                   + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
1054             if (read(fd, &strtab, sizeof(strtab))
1055                 != sizeof(strtab))
1056                 return;
1057 #ifdef BSWAP_NEEDED
1058             bswap_shdr(&strtab);
1059 #endif
1060             goto found;
1061         }
1062     }
1063     return; /* Shouldn't happen... */
1064
1065  found:
1066     /* Now know where the strtab and symtab are.  Snarf them. */
1067     s = malloc(sizeof(*s));
1068     syms = malloc(symtab.sh_size);
1069     if (!syms)
1070         return;
1071     s->disas_strtab = strings = malloc(strtab.sh_size);
1072     if (!s->disas_strtab)
1073         return;
1074
1075     lseek(fd, symtab.sh_offset, SEEK_SET);
1076     if (read(fd, syms, symtab.sh_size) != symtab.sh_size)
1077         return;
1078
1079     nsyms = symtab.sh_size / sizeof(struct elf_sym);
1080
1081     i = 0;
1082     while (i < nsyms) {
1083 #ifdef BSWAP_NEEDED
1084         bswap_sym(syms + i);
1085 #endif
1086         // Throw away entries which we do not need.
1087         if (syms[i].st_shndx == SHN_UNDEF ||
1088                 syms[i].st_shndx >= SHN_LORESERVE ||
1089                 ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
1090             nsyms--;
1091             if (i < nsyms) {
1092                 syms[i] = syms[nsyms];
1093             }
1094             continue;
1095         }
1096 #if defined(TARGET_ARM) || defined (TARGET_MIPS)
1097         /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
1098         syms[i].st_value &= ~(target_ulong)1;
1099 #endif
1100         i++;
1101     }
1102     syms = realloc(syms, nsyms * sizeof(*syms));
1103
1104     qsort(syms, nsyms, sizeof(*syms), symcmp);
1105
1106     lseek(fd, strtab.sh_offset, SEEK_SET);
1107     if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
1108         return;
1109     s->disas_num_syms = nsyms;
1110 #if ELF_CLASS == ELFCLASS32
1111     s->disas_symtab.elf32 = syms;
1112     s->lookup_symbol = lookup_symbolxx;
1113 #else
1114     s->disas_symtab.elf64 = syms;
1115     s->lookup_symbol = lookup_symbolxx;
1116 #endif
1117     s->next = syminfos;
1118     syminfos = s;
1119 }
1120
1121 int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1122                     struct image_info * info)
1123 {
1124     struct elfhdr elf_ex;
1125     struct elfhdr interp_elf_ex;
1126     struct exec interp_ex;
1127     int interpreter_fd = -1; /* avoid warning */
1128     abi_ulong load_addr, load_bias;
1129     int load_addr_set = 0;
1130     unsigned int interpreter_type = INTERPRETER_NONE;
1131     unsigned char ibcs2_interpreter;
1132     int i;
1133     abi_ulong mapped_addr;
1134     struct elf_phdr * elf_ppnt;
1135     struct elf_phdr *elf_phdata;
1136     abi_ulong elf_bss, k, elf_brk;
1137     int retval;
1138     char * elf_interpreter;
1139     abi_ulong elf_entry, interp_load_addr = 0;
1140     int status;
1141     abi_ulong start_code, end_code, start_data, end_data;
1142     abi_ulong reloc_func_desc = 0;
1143     abi_ulong elf_stack;
1144     char passed_fileno[6];
1145
1146     ibcs2_interpreter = 0;
1147     status = 0;
1148     load_addr = 0;
1149     load_bias = 0;
1150     elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
1151 #ifdef BSWAP_NEEDED
1152     bswap_ehdr(&elf_ex);
1153 #endif
1154
1155     /* First of all, some simple consistency checks */
1156     if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
1157                                 (! elf_check_arch(elf_ex.e_machine))) {
1158             return -ENOEXEC;
1159     }
1160
1161     bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1162     bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1163     bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1164     if (!bprm->p) {
1165         retval = -E2BIG;
1166     }
1167
1168     /* Now read in all of the header information */
1169     elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
1170     if (elf_phdata == NULL) {
1171         return -ENOMEM;
1172     }
1173
1174     retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
1175     if(retval > 0) {
1176         retval = read(bprm->fd, (char *) elf_phdata,
1177                                 elf_ex.e_phentsize * elf_ex.e_phnum);
1178     }
1179
1180     if (retval < 0) {
1181         perror("load_elf_binary");
1182         exit(-1);
1183         free (elf_phdata);
1184         return -errno;
1185     }
1186
1187 #ifdef BSWAP_NEEDED
1188     elf_ppnt = elf_phdata;
1189     for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
1190         bswap_phdr(elf_ppnt);
1191     }
1192 #endif
1193     elf_ppnt = elf_phdata;
1194
1195     elf_bss = 0;
1196     elf_brk = 0;
1197
1198
1199     elf_stack = ~((abi_ulong)0UL);
1200     elf_interpreter = NULL;
1201     start_code = ~((abi_ulong)0UL);
1202     end_code = 0;
1203     start_data = 0;
1204     end_data = 0;
1205     interp_ex.a_info = 0;
1206
1207     for(i=0;i < elf_ex.e_phnum; i++) {
1208         if (elf_ppnt->p_type == PT_INTERP) {
1209             if ( elf_interpreter != NULL )
1210             {
1211                 free (elf_phdata);
1212                 free(elf_interpreter);
1213                 close(bprm->fd);
1214                 return -EINVAL;
1215             }
1216
1217             /* This is the program interpreter used for
1218              * shared libraries - for now assume that this
1219              * is an a.out format binary
1220              */
1221
1222             elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
1223
1224             if (elf_interpreter == NULL) {
1225                 free (elf_phdata);
1226                 close(bprm->fd);
1227                 return -ENOMEM;
1228             }
1229
1230             retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
1231             if(retval >= 0) {
1232                 retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
1233             }
1234             if(retval < 0) {
1235                 perror("load_elf_binary2");
1236                 exit(-1);
1237             }
1238
1239             /* If the program interpreter is one of these two,
1240                then assume an iBCS2 image. Otherwise assume
1241                a native linux image. */
1242
1243             /* JRP - Need to add X86 lib dir stuff here... */
1244
1245             if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
1246                 strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
1247               ibcs2_interpreter = 1;
1248             }
1249
1250 #if 0
1251             printf("Using ELF interpreter %s\n", elf_interpreter);
1252 #endif
1253             if (retval >= 0) {
1254                 retval = open(path(elf_interpreter), O_RDONLY);
1255                 if(retval >= 0) {
1256                     interpreter_fd = retval;
1257                 }
1258                 else {
1259                     perror(elf_interpreter);
1260                     exit(-1);
1261                     /* retval = -errno; */
1262                 }
1263             }
1264
1265             if (retval >= 0) {
1266                 retval = lseek(interpreter_fd, 0, SEEK_SET);
1267                 if(retval >= 0) {
1268                     retval = read(interpreter_fd,bprm->buf,128);
1269                 }
1270             }
1271             if (retval >= 0) {
1272                 interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1273                 interp_elf_ex=*((struct elfhdr *) bprm->buf); /* elf exec-header */
1274             }
1275             if (retval < 0) {
1276                 perror("load_elf_binary3");
1277                 exit(-1);
1278                 free (elf_phdata);
1279                 free(elf_interpreter);
1280                 close(bprm->fd);
1281                 return retval;
1282             }
1283         }
1284         elf_ppnt++;
1285     }
1286
1287     /* Some simple consistency checks for the interpreter */
1288     if (elf_interpreter){
1289         interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1290
1291         /* Now figure out which format our binary is */
1292         if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1293                 (N_MAGIC(interp_ex) != QMAGIC)) {
1294           interpreter_type = INTERPRETER_ELF;
1295         }
1296
1297         if (interp_elf_ex.e_ident[0] != 0x7f ||
1298                 strncmp(&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1299             interpreter_type &= ~INTERPRETER_ELF;
1300         }
1301
1302         if (!interpreter_type) {
1303             free(elf_interpreter);
1304             free(elf_phdata);
1305             close(bprm->fd);
1306             return -ELIBBAD;
1307         }
1308     }
1309
1310     /* OK, we are done with that, now set up the arg stuff,
1311        and then start this sucker up */
1312
1313     {
1314         char * passed_p;
1315
1316         if (interpreter_type == INTERPRETER_AOUT) {
1317             snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1318             passed_p = passed_fileno;
1319
1320             if (elf_interpreter) {
1321                 bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
1322                 bprm->argc++;
1323             }
1324         }
1325         if (!bprm->p) {
1326             if (elf_interpreter) {
1327                 free(elf_interpreter);
1328             }
1329             free (elf_phdata);
1330             close(bprm->fd);
1331             return -E2BIG;
1332         }
1333     }
1334
1335     /* OK, This is the point of no return */
1336     info->end_data = 0;
1337     info->end_code = 0;
1338     info->start_mmap = (abi_ulong)ELF_START_MMAP;
1339     info->mmap = 0;
1340     elf_entry = (abi_ulong) elf_ex.e_entry;
1341
1342     /* Do this so that we can load the interpreter, if need be.  We will
1343        change some of these later */
1344     info->rss = 0;
1345     bprm->p = setup_arg_pages(bprm->p, bprm, info);
1346     info->start_stack = bprm->p;
1347
1348     /* Now we do a little grungy work by mmaping the ELF image into
1349      * the correct location in memory.  At this point, we assume that
1350      * the image should be loaded at fixed address, not at a variable
1351      * address.
1352      */
1353
1354     for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1355         int elf_prot = 0;
1356         int elf_flags = 0;
1357         abi_ulong error;
1358
1359         if (elf_ppnt->p_type != PT_LOAD)
1360             continue;
1361
1362         if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1363         if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1364         if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1365         elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1366         if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1367             elf_flags |= MAP_FIXED;
1368         } else if (elf_ex.e_type == ET_DYN) {
1369             /* Try and get dynamic programs out of the way of the default mmap
1370                base, as well as whatever program they might try to exec.  This
1371                is because the brk will follow the loader, and is not movable.  */
1372             /* NOTE: for qemu, we do a big mmap to get enough space
1373                without hardcoding any address */
1374             error = target_mmap(0, ET_DYN_MAP_SIZE,
1375                                 PROT_NONE, MAP_PRIVATE | MAP_ANON,
1376                                 -1, 0);
1377             if (error == -1) {
1378                 perror("mmap");
1379                 exit(-1);
1380             }
1381             load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1382         }
1383
1384         error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1385                             (elf_ppnt->p_filesz +
1386                              TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1387                             elf_prot,
1388                             (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1389                             bprm->fd,
1390                             (elf_ppnt->p_offset -
1391                              TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1392         if (error == -1) {
1393             perror("mmap");
1394             exit(-1);
1395         }
1396
1397 #ifdef LOW_ELF_STACK
1398         if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1399             elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1400 #endif
1401
1402         if (!load_addr_set) {
1403             load_addr_set = 1;
1404             load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1405             if (elf_ex.e_type == ET_DYN) {
1406                 load_bias += error -
1407                     TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1408                 load_addr += load_bias;
1409                 reloc_func_desc = load_bias;
1410             }
1411         }
1412         k = elf_ppnt->p_vaddr;
1413         if (k < start_code)
1414             start_code = k;
1415         if (start_data < k)
1416             start_data = k;
1417         k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1418         if (k > elf_bss)
1419             elf_bss = k;
1420         if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1421             end_code = k;
1422         if (end_data < k)
1423             end_data = k;
1424         k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1425         if (k > elf_brk) elf_brk = k;
1426     }
1427
1428     elf_entry += load_bias;
1429     elf_bss += load_bias;
1430     elf_brk += load_bias;
1431     start_code += load_bias;
1432     end_code += load_bias;
1433     start_data += load_bias;
1434     end_data += load_bias;
1435
1436     if (elf_interpreter) {
1437         if (interpreter_type & 1) {
1438             elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1439         }
1440         else if (interpreter_type & 2) {
1441             elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1442                                             &interp_load_addr);
1443         }
1444         reloc_func_desc = interp_load_addr;
1445
1446         close(interpreter_fd);
1447         free(elf_interpreter);
1448
1449         if (elf_entry == ~((abi_ulong)0UL)) {
1450             printf("Unable to load interpreter\n");
1451             free(elf_phdata);
1452             exit(-1);
1453             return 0;
1454         }
1455     }
1456
1457     free(elf_phdata);
1458
1459     if (qemu_log_enabled())
1460         load_symbols(&elf_ex, bprm->fd);
1461
1462     if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1463     info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1464
1465 #ifdef LOW_ELF_STACK
1466     info->start_stack = bprm->p = elf_stack - 4;
1467 #endif
1468     bprm->p = create_elf_tables(bprm->p,
1469                     bprm->argc,
1470                     bprm->envc,
1471                     &elf_ex,
1472                     load_addr, load_bias,
1473                     interp_load_addr,
1474                     (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1475                     info);
1476     info->load_addr = reloc_func_desc;
1477     info->start_brk = info->brk = elf_brk;
1478     info->end_code = end_code;
1479     info->start_code = start_code;
1480     info->start_data = start_data;
1481     info->end_data = end_data;
1482     info->start_stack = bprm->p;
1483
1484     /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1485        sections */
1486     set_brk(elf_bss, elf_brk);
1487
1488     padzero(elf_bss, elf_brk);
1489
1490 #if 0
1491     printf("(start_brk) %x\n" , info->start_brk);
1492     printf("(end_code) %x\n" , info->end_code);
1493     printf("(start_code) %x\n" , info->start_code);
1494     printf("(end_data) %x\n" , info->end_data);
1495     printf("(start_stack) %x\n" , info->start_stack);
1496     printf("(brk) %x\n" , info->brk);
1497 #endif
1498
1499     if ( info->personality == PER_SVR4 )
1500     {
1501             /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1502                and some applications "depend" upon this behavior.
1503                Since we do not have the power to recompile these, we
1504                emulate the SVr4 behavior.  Sigh.  */
1505             mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1506                                       MAP_FIXED | MAP_PRIVATE, -1, 0);
1507     }
1508
1509     info->entry = elf_entry;
1510
1511     return 0;
1512 }
1513
1514 static int load_aout_interp(void * exptr, int interp_fd)
1515 {
1516     printf("a.out interpreter not yet supported\n");
1517     return(0);
1518 }
1519
1520 void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
1521 {
1522     init_thread(regs, infop);
1523 }