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