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