Statistics
| Branch: | Revision:

root / linux-user / elfload.c @ fdf9b3e8

History | View | Annotate | Download (40.1 kB)

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

    
13
#include "qemu.h"
14
#include "disas.h"
15

    
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

    
26
#ifdef TARGET_I386
27

    
28
#define ELF_PLATFORM get_elf_platform()
29

    
30
static const char *get_elf_platform(void)
31
{
32
    static char elf_platform[] = "i386";
33
    int family = (global_env->cpuid_version >> 8) & 0xff;
34
    if (family > 6)
35
        family = 6;
36
    if (family >= 3)
37
        elf_platform[1] = '0' + family;
38
    return elf_platform;
39
}
40

    
41
#define ELF_HWCAP get_elf_hwcap()
42

    
43
static uint32_t get_elf_hwcap(void)
44
{
45
  return global_env->cpuid_features;
46
}
47

    
48
#define ELF_START_MMAP 0x80000000
49

    
50
/*
51
 * This is used to ensure we don't load something for the wrong architecture.
52
 */
53
#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
54

    
55
/*
56
 * These are used to set parameters in the core dumps.
57
 */
58
#define ELF_CLASS        ELFCLASS32
59
#define ELF_DATA        ELFDATA2LSB
60
#define ELF_ARCH        EM_386
61

    
62
        /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
63
           starts %edx contains a pointer to a function which might be
64
           registered using `atexit'.  This provides a mean for the
65
           dynamic linker to call DT_FINI functions for shared libraries
66
           that have been loaded before the code runs.
67

68
           A value of 0 tells we have no such handler.  */
69
#define ELF_PLAT_INIT(_r)        _r->edx = 0
70

    
71
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
72
{
73
    regs->esp = infop->start_stack;
74
    regs->eip = infop->entry;
75
}
76

    
77
#define USE_ELF_CORE_DUMP
78
#define ELF_EXEC_PAGESIZE        4096
79

    
80
#endif
81

    
82
#ifdef TARGET_ARM
83

    
84
#define ELF_START_MMAP 0x80000000
85

    
86
#define elf_check_arch(x) ( (x) == EM_ARM )
87

    
88
#define ELF_CLASS        ELFCLASS32
89
#ifdef TARGET_WORDS_BIGENDIAN
90
#define ELF_DATA        ELFDATA2MSB
91
#else
92
#define ELF_DATA        ELFDATA2LSB
93
#endif
94
#define ELF_ARCH        EM_ARM
95

    
96
#define ELF_PLAT_INIT(_r)        _r->ARM_r0 = 0
97

    
98
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
99
{
100
    target_long stack = infop->start_stack;
101
    memset(regs, 0, sizeof(*regs));
102
    regs->ARM_cpsr = 0x10;
103
    if (infop->entry & 1)
104
      regs->ARM_cpsr |= CPSR_T;
105
    regs->ARM_pc = infop->entry & 0xfffffffe;
106
    regs->ARM_sp = infop->start_stack;
107
    regs->ARM_r2 = tgetl(stack + 8); /* envp */
108
    regs->ARM_r1 = tgetl(stack + 4); /* envp */
109
    /* XXX: it seems that r0 is zeroed after ! */
110
    //    regs->ARM_r0 = tgetl(stack); /* argc */
111
}
112

    
113
#define USE_ELF_CORE_DUMP
114
#define ELF_EXEC_PAGESIZE        4096
115

    
116
enum
117
{
118
  ARM_HWCAP_ARM_SWP       = 1 << 0,
119
  ARM_HWCAP_ARM_HALF      = 1 << 1,
120
  ARM_HWCAP_ARM_THUMB     = 1 << 2,
121
  ARM_HWCAP_ARM_26BIT     = 1 << 3,
122
  ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
123
  ARM_HWCAP_ARM_FPA       = 1 << 5,
124
  ARM_HWCAP_ARM_VFP       = 1 << 6,
125
  ARM_HWCAP_ARM_EDSP      = 1 << 7,
126
};
127

    
128
#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF              \
129
                    | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT     \
130
                    | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP)
131

    
132
#endif
133

    
134
#ifdef TARGET_SPARC
135
#ifdef TARGET_SPARC64
136

    
137
#define ELF_START_MMAP 0x80000000
138

    
139
#define elf_check_arch(x) ( (x) == EM_SPARC )
140

    
141
#define ELF_CLASS   ELFCLASS64
142
#define ELF_DATA    ELFDATA2MSB
143
#define ELF_ARCH    EM_SPARC
144

    
145
/*XXX*/
146
#define ELF_PLAT_INIT(_r)
147

    
148
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
149
{
150
    regs->tstate = 0;
151
    regs->pc = infop->entry;
152
    regs->npc = regs->pc + 4;
153
    regs->y = 0;
154
    regs->u_regs[14] = infop->start_stack - 16 * 4;
155
}
156

    
157
#else
158
#define ELF_START_MMAP 0x80000000
159

    
160
#define elf_check_arch(x) ( (x) == EM_SPARC )
161

    
162
#define ELF_CLASS   ELFCLASS32
163
#define ELF_DATA    ELFDATA2MSB
164
#define ELF_ARCH    EM_SPARC
165

    
166
/*XXX*/
167
#define ELF_PLAT_INIT(_r)
168

    
169
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
170
{
171
    regs->psr = 0;
172
    regs->pc = infop->entry;
173
    regs->npc = regs->pc + 4;
174
    regs->y = 0;
175
    regs->u_regs[14] = infop->start_stack - 16 * 4;
176
}
177

    
178
#endif
179
#endif
180

    
181
#ifdef TARGET_PPC
182

    
183
#define ELF_START_MMAP 0x80000000
184

    
185
#define elf_check_arch(x) ( (x) == EM_PPC )
186

    
187
#define ELF_CLASS        ELFCLASS32
188
#ifdef TARGET_WORDS_BIGENDIAN
189
#define ELF_DATA        ELFDATA2MSB
190
#else
191
#define ELF_DATA        ELFDATA2LSB
192
#endif
193
#define ELF_ARCH        EM_PPC
194

    
195
/* Note that isn't exactly what regular kernel does
196
 * but this is what the ABI wants and is needed to allow
197
 * execution of PPC BSD programs.
198
 */
199
#define ELF_PLAT_INIT(_r)                                  \
200
do {                                                       \
201
    target_ulong *pos = (target_ulong *)bprm->p, tmp = 1;  \
202
    _r->gpr[3] = bprm->argc;                               \
203
    _r->gpr[4] = (unsigned long)++pos;                     \
204
    for (; tmp != 0; pos++)                                \
205
        tmp = ldl(pos);                                    \
206
    _r->gpr[5] = (unsigned long)pos;                       \
207
} while (0)
208

    
209
/*
210
 * We need to put in some extra aux table entries to tell glibc what
211
 * the cache block size is, so it can use the dcbz instruction safely.
212
 */
213
#define AT_DCACHEBSIZE          19
214
#define AT_ICACHEBSIZE          20
215
#define AT_UCACHEBSIZE          21
216
/* A special ignored type value for PPC, for glibc compatibility.  */
217
#define AT_IGNOREPPC            22
218
/*
219
 * The requirements here are:
220
 * - keep the final alignment of sp (sp & 0xf)
221
 * - make sure the 32-bit value at the first 16 byte aligned position of
222
 *   AUXV is greater than 16 for glibc compatibility.
223
 *   AT_IGNOREPPC is used for that.
224
 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
225
 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
226
 */
227
#define DLINFO_ARCH_ITEMS       5
228
#define ARCH_DLINFO                                                     \
229
do {                                                                    \
230
        NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);                              \
231
        NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);                              \
232
        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                                 \
233
        /*                                                              \
234
         * Now handle glibc compatibility.                              \
235
         */                                                             \
236
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
237
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
238
 } while (0)
239

    
240
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
241
{
242
    _regs->msr = 1 << MSR_PR; /* Set user mode */
243
    _regs->gpr[1] = infop->start_stack;
244
    _regs->nip = infop->entry;
245
}
246

    
247
#define USE_ELF_CORE_DUMP
248
#define ELF_EXEC_PAGESIZE        4096
249

    
250
#endif
251

    
252
#ifdef TARGET_MIPS
253

    
254
#define ELF_START_MMAP 0x80000000
255

    
256
#define elf_check_arch(x) ( (x) == EM_MIPS )
257

    
258
#define ELF_CLASS   ELFCLASS32
259
#ifdef TARGET_WORDS_BIGENDIAN
260
#define ELF_DATA        ELFDATA2MSB
261
#else
262
#define ELF_DATA        ELFDATA2LSB
263
#endif
264
#define ELF_ARCH    EM_MIPS
265

    
266
#define ELF_PLAT_INIT(_r) 
267

    
268
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
269
{
270
    regs->cp0_status = CP0St_UM;
271
    regs->cp0_epc = infop->entry;
272
    regs->regs[29] = infop->start_stack;
273
}
274

    
275
#endif /* TARGET_MIPS */
276

    
277
#ifdef TARGET_SH4
278

    
279
#define ELF_START_MMAP 0x80000000
280

    
281
#define elf_check_arch(x) ( (x) == EM_SH )
282

    
283
#define ELF_CLASS ELFCLASS32
284
#define ELF_DATA  ELFDATA2LSB
285
#define ELF_ARCH  EM_SH
286

    
287
#define ELF_PLAT_INIT(_r) /* XXXXX */
288

    
289
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
290
{
291
  /* Check other registers XXXXX */
292
  regs->pc = infop->entry;
293
  regs->regs[15] = infop->start_stack - 16 * 4;
294
}
295

    
296
#define USE_ELF_CORE_DUMP
297
#define ELF_EXEC_PAGESIZE        4096
298

    
299
#endif
300

    
301
#ifndef ELF_PLATFORM
302
#define ELF_PLATFORM (NULL)
303
#endif
304

    
305
#ifndef ELF_HWCAP
306
#define ELF_HWCAP 0
307
#endif
308

    
309
#include "elf.h"
310

    
311
/*
312
 * MAX_ARG_PAGES defines the number of pages allocated for arguments
313
 * and envelope for the new program. 32 should suffice, this gives
314
 * a maximum env+arg of 128kB w/4KB pages!
315
 */
316
#define MAX_ARG_PAGES 32
317

    
318
/*
319
 * This structure is used to hold the arguments that are 
320
 * used when loading binaries.
321
 */
322
struct linux_binprm {
323
        char buf[128];
324
        void *page[MAX_ARG_PAGES];
325
        unsigned long p;
326
        int sh_bang;
327
        int fd;
328
        int e_uid, e_gid;
329
        int argc, envc;
330
        char * filename;        /* Name of binary */
331
        unsigned long loader, exec;
332
        int dont_iput;          /* binfmt handler has put inode */
333
};
334

    
335
struct exec
336
{
337
  unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
338
  unsigned int a_text;   /* length of text, in bytes */
339
  unsigned int a_data;   /* length of data, in bytes */
340
  unsigned int a_bss;    /* length of uninitialized data area, in bytes */
341
  unsigned int a_syms;   /* length of symbol table data in file, in bytes */
342
  unsigned int a_entry;  /* start address */
343
  unsigned int a_trsize; /* length of relocation info for text, in bytes */
344
  unsigned int a_drsize; /* length of relocation info for data, in bytes */
345
};
346

    
347

    
348
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
349
#define OMAGIC 0407
350
#define NMAGIC 0410
351
#define ZMAGIC 0413
352
#define QMAGIC 0314
353

    
354
/* max code+data+bss space allocated to elf interpreter */
355
#define INTERP_MAP_SIZE (32 * 1024 * 1024)
356

    
357
/* max code+data+bss+brk space allocated to ET_DYN executables */
358
#define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
359

    
360
/* from personality.h */
361

    
362
/* Flags for bug emulation. These occupy the top three bytes. */
363
#define STICKY_TIMEOUTS                0x4000000
364
#define WHOLE_SECONDS                0x2000000
365

    
366
/* Personality types. These go in the low byte. Avoid using the top bit,
367
 * it will conflict with error returns.
368
 */
369
#define PER_MASK                (0x00ff)
370
#define PER_LINUX                (0x0000)
371
#define PER_SVR4                (0x0001 | STICKY_TIMEOUTS)
372
#define PER_SVR3                (0x0002 | STICKY_TIMEOUTS)
373
#define PER_SCOSVR3                (0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS)
374
#define PER_WYSEV386                (0x0004 | STICKY_TIMEOUTS)
375
#define PER_ISCR4                (0x0005 | STICKY_TIMEOUTS)
376
#define PER_BSD                        (0x0006)
377
#define PER_XENIX                (0x0007 | STICKY_TIMEOUTS)
378

    
379
/* Necessary parameters */
380
#define NGROUPS 32
381

    
382
#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
383
#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
384
#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
385

    
386
#define INTERPRETER_NONE 0
387
#define INTERPRETER_AOUT 1
388
#define INTERPRETER_ELF 2
389

    
390
#define DLINFO_ITEMS 12
391

    
392
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
393
{
394
        memcpy(to, from, n);
395
}
396

    
397
extern unsigned long x86_stack_size;
398

    
399
static int load_aout_interp(void * exptr, int interp_fd);
400

    
401
#ifdef BSWAP_NEEDED
402
static void bswap_ehdr(struct elfhdr *ehdr)
403
{
404
    bswap16s(&ehdr->e_type);                        /* Object file type */
405
    bswap16s(&ehdr->e_machine);                /* Architecture */
406
    bswap32s(&ehdr->e_version);                /* Object file version */
407
    bswaptls(&ehdr->e_entry);                /* Entry point virtual address */
408
    bswaptls(&ehdr->e_phoff);                /* Program header table file offset */
409
    bswaptls(&ehdr->e_shoff);                /* Section header table file offset */
410
    bswap32s(&ehdr->e_flags);                /* Processor-specific flags */
411
    bswap16s(&ehdr->e_ehsize);                /* ELF header size in bytes */
412
    bswap16s(&ehdr->e_phentsize);                /* Program header table entry size */
413
    bswap16s(&ehdr->e_phnum);                /* Program header table entry count */
414
    bswap16s(&ehdr->e_shentsize);                /* Section header table entry size */
415
    bswap16s(&ehdr->e_shnum);                /* Section header table entry count */
416
    bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
417
}
418

    
419
static void bswap_phdr(struct elf_phdr *phdr)
420
{
421
    bswap32s(&phdr->p_type);                        /* Segment type */
422
    bswaptls(&phdr->p_offset);                /* Segment file offset */
423
    bswaptls(&phdr->p_vaddr);                /* Segment virtual address */
424
    bswaptls(&phdr->p_paddr);                /* Segment physical address */
425
    bswaptls(&phdr->p_filesz);                /* Segment size in file */
426
    bswaptls(&phdr->p_memsz);                /* Segment size in memory */
427
    bswap32s(&phdr->p_flags);                /* Segment flags */
428
    bswaptls(&phdr->p_align);                /* Segment alignment */
429
}
430

    
431
static void bswap_shdr(struct elf_shdr *shdr)
432
{
433
    bswap32s(&shdr->sh_name);
434
    bswap32s(&shdr->sh_type);
435
    bswaptls(&shdr->sh_flags);
436
    bswaptls(&shdr->sh_addr);
437
    bswaptls(&shdr->sh_offset);
438
    bswaptls(&shdr->sh_size);
439
    bswap32s(&shdr->sh_link);
440
    bswap32s(&shdr->sh_info);
441
    bswaptls(&shdr->sh_addralign);
442
    bswaptls(&shdr->sh_entsize);
443
}
444

    
445
static void bswap_sym(Elf32_Sym *sym)
446
{
447
    bswap32s(&sym->st_name);
448
    bswap32s(&sym->st_value);
449
    bswap32s(&sym->st_size);
450
    bswap16s(&sym->st_shndx);
451
}
452
#endif
453

    
454
/*
455
 * 'copy_string()' copies argument/envelope strings from user
456
 * memory to free pages in kernel mem. These are in a format ready
457
 * to be put directly into the top of new user memory.
458
 *
459
 */
460
static unsigned long copy_strings(int argc,char ** argv, void **page,
461
                unsigned long p)
462
{
463
    char *tmp, *tmp1, *pag = NULL;
464
    int len, offset = 0;
465

    
466
    if (!p) {
467
        return 0;       /* bullet-proofing */
468
    }
469
    while (argc-- > 0) {
470
        tmp = argv[argc];
471
        if (!tmp) {
472
            fprintf(stderr, "VFS: argc is wrong");
473
            exit(-1);
474
        }
475
        tmp1 = tmp;
476
        while (*tmp++);
477
        len = tmp - tmp1;
478
        if (p < len) {  /* this shouldn't happen - 128kB */
479
                return 0;
480
        }
481
        while (len) {
482
            --p; --tmp; --len;
483
            if (--offset < 0) {
484
                offset = p % TARGET_PAGE_SIZE;
485
                pag = (char *)page[p/TARGET_PAGE_SIZE];
486
                if (!pag) {
487
                    pag = (char *)malloc(TARGET_PAGE_SIZE);
488
                    page[p/TARGET_PAGE_SIZE] = pag;
489
                    if (!pag)
490
                        return 0;
491
                }
492
            }
493
            if (len == 0 || offset == 0) {
494
                *(pag + offset) = *tmp;
495
            }
496
            else {
497
              int bytes_to_copy = (len > offset) ? offset : len;
498
              tmp -= bytes_to_copy;
499
              p -= bytes_to_copy;
500
              offset -= bytes_to_copy;
501
              len -= bytes_to_copy;
502
              memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
503
            }
504
        }
505
    }
506
    return p;
507
}
508

    
509
static int in_group_p(gid_t g)
510
{
511
    /* return TRUE if we're in the specified group, FALSE otherwise */
512
    int                ngroup;
513
    int                i;
514
    gid_t        grouplist[NGROUPS];
515

    
516
    ngroup = getgroups(NGROUPS, grouplist);
517
    for(i = 0; i < ngroup; i++) {
518
        if(grouplist[i] == g) {
519
            return 1;
520
        }
521
    }
522
    return 0;
523
}
524

    
525
static int count(char ** vec)
526
{
527
    int                i;
528

    
529
    for(i = 0; *vec; i++) {
530
        vec++;
531
    }
532

    
533
    return(i);
534
}
535

    
536
static int prepare_binprm(struct linux_binprm *bprm)
537
{
538
    struct stat                st;
539
    int mode;
540
    int retval, id_change;
541

    
542
    if(fstat(bprm->fd, &st) < 0) {
543
        return(-errno);
544
    }
545

    
546
    mode = st.st_mode;
547
    if(!S_ISREG(mode)) {        /* Must be regular file */
548
        return(-EACCES);
549
    }
550
    if(!(mode & 0111)) {        /* Must have at least one execute bit set */
551
        return(-EACCES);
552
    }
553

    
554
    bprm->e_uid = geteuid();
555
    bprm->e_gid = getegid();
556
    id_change = 0;
557

    
558
    /* Set-uid? */
559
    if(mode & S_ISUID) {
560
            bprm->e_uid = st.st_uid;
561
        if(bprm->e_uid != geteuid()) {
562
            id_change = 1;
563
        }
564
    }
565

    
566
    /* Set-gid? */
567
    /*
568
     * If setgid is set but no group execute bit then this
569
     * is a candidate for mandatory locking, not a setgid
570
     * executable.
571
     */
572
    if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
573
        bprm->e_gid = st.st_gid;
574
        if (!in_group_p(bprm->e_gid)) {
575
                id_change = 1;
576
        }
577
    }
578

    
579
    memset(bprm->buf, 0, sizeof(bprm->buf));
580
    retval = lseek(bprm->fd, 0L, SEEK_SET);
581
    if(retval >= 0) {
582
        retval = read(bprm->fd, bprm->buf, 128);
583
    }
584
    if(retval < 0) {
585
        perror("prepare_binprm");
586
        exit(-1);
587
        /* return(-errno); */
588
    }
589
    else {
590
        return(retval);
591
    }
592
}
593

    
594
static inline void memcpy_to_target(target_ulong dest, const void *src,
595
                                    unsigned long len)
596
{
597
    void *host_ptr;
598

    
599
    host_ptr = lock_user(dest, len, 0);
600
    memcpy(host_ptr, src, len);
601
    unlock_user(host_ptr, dest, 1);
602
}
603

    
604
unsigned long setup_arg_pages(target_ulong p, struct linux_binprm * bprm,
605
                                              struct image_info * info)
606
{
607
    target_ulong stack_base, size, error;
608
    int i;
609

    
610
    /* Create enough stack to hold everything.  If we don't use
611
     * it for args, we'll use it for something else...
612
     */
613
    size = x86_stack_size;
614
    if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
615
        size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
616
    error = target_mmap(0, 
617
                        size + qemu_host_page_size,
618
                        PROT_READ | PROT_WRITE,
619
                        MAP_PRIVATE | MAP_ANONYMOUS,
620
                        -1, 0);
621
    if (error == -1) {
622
        perror("stk mmap");
623
        exit(-1);
624
    }
625
    /* we reserve one extra page at the top of the stack as guard */
626
    target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
627

    
628
    stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
629
    p += stack_base;
630

    
631
    if (bprm->loader) {
632
        bprm->loader += stack_base;
633
    }
634
    bprm->exec += stack_base;
635

    
636
    for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
637
        if (bprm->page[i]) {
638
            info->rss++;
639

    
640
            memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
641
            free(bprm->page[i]);
642
        }
643
        stack_base += TARGET_PAGE_SIZE;
644
    }
645
    return p;
646
}
647

    
648
static void set_brk(unsigned long start, unsigned long end)
649
{
650
        /* page-align the start and end addresses... */
651
        start = HOST_PAGE_ALIGN(start);
652
        end = HOST_PAGE_ALIGN(end);
653
        if (end <= start)
654
                return;
655
        if(target_mmap(start, end - start,
656
                       PROT_READ | PROT_WRITE | PROT_EXEC,
657
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == -1) {
658
            perror("cannot mmap brk");
659
            exit(-1);
660
        }
661
}
662

    
663

    
664
/* We need to explicitly zero any fractional pages after the data
665
   section (i.e. bss).  This would contain the junk from the file that
666
   should not be in memory. */
667
static void padzero(unsigned long elf_bss)
668
{
669
        unsigned long nbyte;
670

    
671
        /* XXX: this is really a hack : if the real host page size is
672
           smaller than the target page size, some pages after the end
673
           of the file may not be mapped. A better fix would be to
674
           patch target_mmap(), but it is more complicated as the file
675
           size must be known */
676
        if (qemu_real_host_page_size < qemu_host_page_size) {
677
            unsigned long end_addr, end_addr1;
678
            end_addr1 = (elf_bss + qemu_real_host_page_size - 1) & 
679
                ~(qemu_real_host_page_size - 1);
680
            end_addr = HOST_PAGE_ALIGN(elf_bss);
681
            if (end_addr1 < end_addr) {
682
                mmap((void *)end_addr1, end_addr - end_addr1,
683
                     PROT_READ|PROT_WRITE|PROT_EXEC,
684
                     MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
685
            }
686
        }
687

    
688
        nbyte = elf_bss & (qemu_host_page_size-1);
689
        if (nbyte) {
690
            nbyte = qemu_host_page_size - nbyte;
691
            do {
692
                tput8(elf_bss, 0);
693
                elf_bss++;
694
            } while (--nbyte);
695
        }
696
}
697

    
698

    
699
static unsigned long create_elf_tables(target_ulong p, int argc, int envc,
700
                                       struct elfhdr * exec,
701
                                       unsigned long load_addr,
702
                                       unsigned long load_bias,
703
                                       unsigned long interp_load_addr, int ibcs,
704
                                       struct image_info *info)
705
{
706
        target_ulong argv, envp;
707
        target_ulong sp;
708
        int size;
709
        target_ulong u_platform;
710
        const char *k_platform;
711
        const int n = sizeof(target_ulong);
712

    
713
        sp = p;
714
        u_platform = 0;
715
        k_platform = ELF_PLATFORM;
716
        if (k_platform) {
717
            size_t len = strlen(k_platform) + 1;
718
            sp -= (len + n - 1) & ~(n - 1);
719
            u_platform = sp;
720
            memcpy_to_target(sp, k_platform, len);
721
        }
722
        /*
723
         * Force 16 byte _final_ alignment here for generality.
724
         */
725
        sp = sp &~ (target_ulong)15;
726
        size = (DLINFO_ITEMS + 1) * 2;
727
        if (k_platform)
728
          size += 2;
729
#ifdef DLINFO_ARCH_ITEMS
730
        size += DLINFO_ARCH_ITEMS * 2;
731
#endif
732
        size += envc + argc + 2;
733
        size += (!ibcs ? 3 : 1);        /* argc itself */
734
        size *= n;
735
        if (size & 15)
736
            sp -= 16 - (size & 15);
737
        
738
#define NEW_AUX_ENT(id, val) do { \
739
            sp -= n; tputl(sp, val); \
740
            sp -= n; tputl(sp, id); \
741
          } while(0)
742
        NEW_AUX_ENT (AT_NULL, 0);
743

    
744
        /* There must be exactly DLINFO_ITEMS entries here.  */
745
        NEW_AUX_ENT(AT_PHDR, (target_ulong)(load_addr + exec->e_phoff));
746
        NEW_AUX_ENT(AT_PHENT, (target_ulong)(sizeof (struct elf_phdr)));
747
        NEW_AUX_ENT(AT_PHNUM, (target_ulong)(exec->e_phnum));
748
        NEW_AUX_ENT(AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE));
749
        NEW_AUX_ENT(AT_BASE, (target_ulong)(interp_load_addr));
750
        NEW_AUX_ENT(AT_FLAGS, (target_ulong)0);
751
        NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
752
        NEW_AUX_ENT(AT_UID, (target_ulong) getuid());
753
        NEW_AUX_ENT(AT_EUID, (target_ulong) geteuid());
754
        NEW_AUX_ENT(AT_GID, (target_ulong) getgid());
755
        NEW_AUX_ENT(AT_EGID, (target_ulong) getegid());
756
        NEW_AUX_ENT(AT_HWCAP, (target_ulong) ELF_HWCAP);
757
        if (k_platform)
758
            NEW_AUX_ENT(AT_PLATFORM, u_platform);
759
#ifdef ARCH_DLINFO
760
        /* 
761
         * ARCH_DLINFO must come last so platform specific code can enforce
762
         * special alignment requirements on the AUXV if necessary (eg. PPC).
763
         */
764
        ARCH_DLINFO;
765
#endif
766
#undef NEW_AUX_ENT
767

    
768
        sp -= (envc + 1) * n;
769
        envp = sp;
770
        sp -= (argc + 1) * n;
771
        argv = sp;
772
        if (!ibcs) {
773
            sp -= n; tputl(sp, envp);
774
            sp -= n; tputl(sp, argv);
775
        }
776
        sp -= n; tputl(sp, argc);
777
        info->arg_start = p;
778
        while (argc-->0) {
779
            tputl(argv, p); argv += n;
780
            p += target_strlen(p) + 1;
781
        }
782
        tputl(argv, 0);
783
        info->arg_end = info->env_start = p;
784
        while (envc-->0) {
785
            tputl(envp, p); envp += n;
786
            p += target_strlen(p) + 1;
787
        }
788
        tputl(envp, 0);
789
        info->env_end = p;
790
        return sp;
791
}
792

    
793

    
794
static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
795
                                     int interpreter_fd,
796
                                     unsigned long *interp_load_addr)
797
{
798
        struct elf_phdr *elf_phdata  =  NULL;
799
        struct elf_phdr *eppnt;
800
        unsigned long load_addr = 0;
801
        int load_addr_set = 0;
802
        int retval;
803
        unsigned long last_bss, elf_bss;
804
        unsigned long error;
805
        int i;
806
        
807
        elf_bss = 0;
808
        last_bss = 0;
809
        error = 0;
810

    
811
#ifdef BSWAP_NEEDED
812
        bswap_ehdr(interp_elf_ex);
813
#endif
814
        /* First of all, some simple consistency checks */
815
        if ((interp_elf_ex->e_type != ET_EXEC && 
816
             interp_elf_ex->e_type != ET_DYN) || 
817
           !elf_check_arch(interp_elf_ex->e_machine)) {
818
                return ~0UL;
819
        }
820
        
821

    
822
        /* Now read in all of the header information */
823
        
824
        if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
825
            return ~0UL;
826
        
827
        elf_phdata =  (struct elf_phdr *) 
828
                malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
829

    
830
        if (!elf_phdata)
831
          return ~0UL;
832
        
833
        /*
834
         * If the size of this structure has changed, then punt, since
835
         * we will be doing the wrong thing.
836
         */
837
        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
838
            free(elf_phdata);
839
            return ~0UL;
840
        }
841

    
842
        retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
843
        if(retval >= 0) {
844
            retval = read(interpreter_fd,
845
                           (char *) elf_phdata,
846
                           sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
847
        }
848
        if (retval < 0) {
849
                perror("load_elf_interp");
850
                exit(-1);
851
                free (elf_phdata);
852
                return retval;
853
         }
854
#ifdef BSWAP_NEEDED
855
        eppnt = elf_phdata;
856
        for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
857
            bswap_phdr(eppnt);
858
        }
859
#endif
860

    
861
        if (interp_elf_ex->e_type == ET_DYN) {
862
            /* in order to avoid harcoding the interpreter load
863
               address in qemu, we allocate a big enough memory zone */
864
            error = target_mmap(0, INTERP_MAP_SIZE,
865
                                PROT_NONE, MAP_PRIVATE | MAP_ANON, 
866
                                -1, 0);
867
            if (error == -1) {
868
                perror("mmap");
869
                exit(-1);
870
            }
871
            load_addr = error;
872
            load_addr_set = 1;
873
        }
874

    
875
        eppnt = elf_phdata;
876
        for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
877
          if (eppnt->p_type == PT_LOAD) {
878
            int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
879
            int elf_prot = 0;
880
            unsigned long vaddr = 0;
881
            unsigned long k;
882

    
883
            if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
884
            if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
885
            if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
886
            if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
887
                    elf_type |= MAP_FIXED;
888
                    vaddr = eppnt->p_vaddr;
889
            }
890
            error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
891
                 eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
892
                 elf_prot,
893
                 elf_type,
894
                 interpreter_fd,
895
                 eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
896
            
897
            if (error == -1) {
898
              /* Real error */
899
              close(interpreter_fd);
900
              free(elf_phdata);
901
              return ~0UL;
902
            }
903

    
904
            if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
905
              load_addr = error;
906
              load_addr_set = 1;
907
            }
908

    
909
            /*
910
             * Find the end of the file  mapping for this phdr, and keep
911
             * track of the largest address we see for this.
912
             */
913
            k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
914
            if (k > elf_bss) elf_bss = k;
915

    
916
            /*
917
             * Do the same thing for the memory mapping - between
918
             * elf_bss and last_bss is the bss section.
919
             */
920
            k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
921
            if (k > last_bss) last_bss = k;
922
          }
923
        
924
        /* Now use mmap to map the library into memory. */
925

    
926
        close(interpreter_fd);
927

    
928
        /*
929
         * Now fill out the bss section.  First pad the last page up
930
         * to the page boundary, and then perform a mmap to make sure
931
         * that there are zeromapped pages up to and including the last
932
         * bss page.
933
         */
934
        padzero(elf_bss);
935
        elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
936

    
937
        /* Map the last of the bss segment */
938
        if (last_bss > elf_bss) {
939
            target_mmap(elf_bss, last_bss-elf_bss,
940
                        PROT_READ|PROT_WRITE|PROT_EXEC,
941
                        MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
942
        }
943
        free(elf_phdata);
944

    
945
        *interp_load_addr = load_addr;
946
        return ((unsigned long) interp_elf_ex->e_entry) + load_addr;
947
}
948

    
949
/* Best attempt to load symbols from this ELF object. */
950
static void load_symbols(struct elfhdr *hdr, int fd)
951
{
952
    unsigned int i;
953
    struct elf_shdr sechdr, symtab, strtab;
954
    char *strings;
955
    struct syminfo *s;
956

    
957
    lseek(fd, hdr->e_shoff, SEEK_SET);
958
    for (i = 0; i < hdr->e_shnum; i++) {
959
        if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
960
            return;
961
#ifdef BSWAP_NEEDED
962
        bswap_shdr(&sechdr);
963
#endif
964
        if (sechdr.sh_type == SHT_SYMTAB) {
965
            symtab = sechdr;
966
            lseek(fd, hdr->e_shoff
967
                  + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
968
            if (read(fd, &strtab, sizeof(strtab))
969
                != sizeof(strtab))
970
                return;
971
#ifdef BSWAP_NEEDED
972
            bswap_shdr(&strtab);
973
#endif
974
            goto found;
975
        }
976
    }
977
    return; /* Shouldn't happen... */
978

    
979
 found:
980
    /* Now know where the strtab and symtab are.  Snarf them. */
981
    s = malloc(sizeof(*s));
982
    s->disas_symtab = malloc(symtab.sh_size);
983
    s->disas_strtab = strings = malloc(strtab.sh_size);
984
    if (!s->disas_symtab || !s->disas_strtab)
985
        return;
986
        
987
    lseek(fd, symtab.sh_offset, SEEK_SET);
988
    if (read(fd, s->disas_symtab, symtab.sh_size) != symtab.sh_size)
989
        return;
990

    
991
#ifdef BSWAP_NEEDED
992
    for (i = 0; i < symtab.sh_size / sizeof(struct elf_sym); i++)
993
        bswap_sym(s->disas_symtab + sizeof(struct elf_sym)*i);
994
#endif
995

    
996
    lseek(fd, strtab.sh_offset, SEEK_SET);
997
    if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
998
        return;
999
    s->disas_num_syms = symtab.sh_size / sizeof(struct elf_sym);
1000
    s->next = syminfos;
1001
    syminfos = s;
1002
}
1003

    
1004
static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1005
                           struct image_info * info)
1006
{
1007
    struct elfhdr elf_ex;
1008
    struct elfhdr interp_elf_ex;
1009
    struct exec interp_ex;
1010
    int interpreter_fd = -1; /* avoid warning */
1011
    unsigned long load_addr, load_bias;
1012
    int load_addr_set = 0;
1013
    unsigned int interpreter_type = INTERPRETER_NONE;
1014
    unsigned char ibcs2_interpreter;
1015
    int i;
1016
    unsigned long mapped_addr;
1017
    struct elf_phdr * elf_ppnt;
1018
    struct elf_phdr *elf_phdata;
1019
    unsigned long elf_bss, k, elf_brk;
1020
    int retval;
1021
    char * elf_interpreter;
1022
    unsigned long elf_entry, interp_load_addr = 0;
1023
    int status;
1024
    unsigned long start_code, end_code, end_data;
1025
    unsigned long elf_stack;
1026
    char passed_fileno[6];
1027

    
1028
    ibcs2_interpreter = 0;
1029
    status = 0;
1030
    load_addr = 0;
1031
    load_bias = 0;
1032
    elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
1033
#ifdef BSWAP_NEEDED
1034
    bswap_ehdr(&elf_ex);
1035
#endif
1036

    
1037
    if (elf_ex.e_ident[0] != 0x7f ||
1038
        strncmp(&elf_ex.e_ident[1], "ELF",3) != 0) {
1039
            return  -ENOEXEC;
1040
    }
1041

    
1042
    /* First of all, some simple consistency checks */
1043
    if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
1044
                                       (! elf_check_arch(elf_ex.e_machine))) {
1045
            return -ENOEXEC;
1046
    }
1047

    
1048
    /* Now read in all of the header information */
1049
    elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
1050
    if (elf_phdata == NULL) {
1051
        return -ENOMEM;
1052
    }
1053

    
1054
    retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
1055
    if(retval > 0) {
1056
        retval = read(bprm->fd, (char *) elf_phdata, 
1057
                                elf_ex.e_phentsize * elf_ex.e_phnum);
1058
    }
1059

    
1060
    if (retval < 0) {
1061
        perror("load_elf_binary");
1062
        exit(-1);
1063
        free (elf_phdata);
1064
        return -errno;
1065
    }
1066

    
1067
#ifdef BSWAP_NEEDED
1068
    elf_ppnt = elf_phdata;
1069
    for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
1070
        bswap_phdr(elf_ppnt);
1071
    }
1072
#endif
1073
    elf_ppnt = elf_phdata;
1074

    
1075
    elf_bss = 0;
1076
    elf_brk = 0;
1077

    
1078

    
1079
    elf_stack = ~0UL;
1080
    elf_interpreter = NULL;
1081
    start_code = ~0UL;
1082
    end_code = 0;
1083
    end_data = 0;
1084

    
1085
    for(i=0;i < elf_ex.e_phnum; i++) {
1086
        if (elf_ppnt->p_type == PT_INTERP) {
1087
            if ( elf_interpreter != NULL )
1088
            {
1089
                free (elf_phdata);
1090
                free(elf_interpreter);
1091
                close(bprm->fd);
1092
                return -EINVAL;
1093
            }
1094

    
1095
            /* This is the program interpreter used for
1096
             * shared libraries - for now assume that this
1097
             * is an a.out format binary
1098
             */
1099

    
1100
            elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
1101

    
1102
            if (elf_interpreter == NULL) {
1103
                free (elf_phdata);
1104
                close(bprm->fd);
1105
                return -ENOMEM;
1106
            }
1107

    
1108
            retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
1109
            if(retval >= 0) {
1110
                retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
1111
            }
1112
            if(retval < 0) {
1113
                 perror("load_elf_binary2");
1114
                exit(-1);
1115
            }        
1116

    
1117
            /* If the program interpreter is one of these two,
1118
               then assume an iBCS2 image. Otherwise assume
1119
               a native linux image. */
1120

    
1121
            /* JRP - Need to add X86 lib dir stuff here... */
1122

    
1123
            if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
1124
                strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
1125
              ibcs2_interpreter = 1;
1126
            }
1127

    
1128
#if 0
1129
            printf("Using ELF interpreter %s\n", elf_interpreter);
1130
#endif
1131
            if (retval >= 0) {
1132
                retval = open(path(elf_interpreter), O_RDONLY);
1133
                if(retval >= 0) {
1134
                    interpreter_fd = retval;
1135
                }
1136
                else {
1137
                    perror(elf_interpreter);
1138
                    exit(-1);
1139
                    /* retval = -errno; */
1140
                }
1141
            }
1142

    
1143
            if (retval >= 0) {
1144
                retval = lseek(interpreter_fd, 0, SEEK_SET);
1145
                if(retval >= 0) {
1146
                    retval = read(interpreter_fd,bprm->buf,128);
1147
                }
1148
            }
1149
            if (retval >= 0) {
1150
                interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1151
                interp_elf_ex=*((struct elfhdr *) bprm->buf); /* elf exec-header */
1152
            }
1153
            if (retval < 0) {
1154
                perror("load_elf_binary3");
1155
                exit(-1);
1156
                free (elf_phdata);
1157
                free(elf_interpreter);
1158
                close(bprm->fd);
1159
                return retval;
1160
            }
1161
        }
1162
        elf_ppnt++;
1163
    }
1164

    
1165
    /* Some simple consistency checks for the interpreter */
1166
    if (elf_interpreter){
1167
        interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1168

    
1169
        /* Now figure out which format our binary is */
1170
        if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1171
                    (N_MAGIC(interp_ex) != QMAGIC)) {
1172
          interpreter_type = INTERPRETER_ELF;
1173
        }
1174

    
1175
        if (interp_elf_ex.e_ident[0] != 0x7f ||
1176
                    strncmp(&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1177
            interpreter_type &= ~INTERPRETER_ELF;
1178
        }
1179

    
1180
        if (!interpreter_type) {
1181
            free(elf_interpreter);
1182
            free(elf_phdata);
1183
            close(bprm->fd);
1184
            return -ELIBBAD;
1185
        }
1186
    }
1187

    
1188
    /* OK, we are done with that, now set up the arg stuff,
1189
       and then start this sucker up */
1190

    
1191
    if (!bprm->sh_bang) {
1192
        char * passed_p;
1193

    
1194
        if (interpreter_type == INTERPRETER_AOUT) {
1195
            snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1196
            passed_p = passed_fileno;
1197

    
1198
            if (elf_interpreter) {
1199
                bprm->p = copy_strings(1,&passed_p,bprm->page,bprm->p);
1200
                bprm->argc++;
1201
            }
1202
        }
1203
        if (!bprm->p) {
1204
            if (elf_interpreter) {
1205
                free(elf_interpreter);
1206
            }
1207
            free (elf_phdata);
1208
            close(bprm->fd);
1209
            return -E2BIG;
1210
        }
1211
    }
1212

    
1213
    /* OK, This is the point of no return */
1214
    info->end_data = 0;
1215
    info->end_code = 0;
1216
    info->start_mmap = (unsigned long)ELF_START_MMAP;
1217
    info->mmap = 0;
1218
    elf_entry = (unsigned long) elf_ex.e_entry;
1219

    
1220
    /* Do this so that we can load the interpreter, if need be.  We will
1221
       change some of these later */
1222
    info->rss = 0;
1223
    bprm->p = setup_arg_pages(bprm->p, bprm, info);
1224
    info->start_stack = bprm->p;
1225

    
1226
    /* Now we do a little grungy work by mmaping the ELF image into
1227
     * the correct location in memory.  At this point, we assume that
1228
     * the image should be loaded at fixed address, not at a variable
1229
     * address.
1230
     */
1231

    
1232
    for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1233
        int elf_prot = 0;
1234
        int elf_flags = 0;
1235
        unsigned long error;
1236
        
1237
        if (elf_ppnt->p_type != PT_LOAD)
1238
            continue;
1239
        
1240
        if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1241
        if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1242
        if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1243
        elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1244
        if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1245
            elf_flags |= MAP_FIXED;
1246
        } else if (elf_ex.e_type == ET_DYN) {
1247
            /* Try and get dynamic programs out of the way of the default mmap
1248
               base, as well as whatever program they might try to exec.  This
1249
               is because the brk will follow the loader, and is not movable.  */
1250
            /* NOTE: for qemu, we do a big mmap to get enough space
1251
               without harcoding any address */
1252
            error = target_mmap(0, ET_DYN_MAP_SIZE,
1253
                                PROT_NONE, MAP_PRIVATE | MAP_ANON, 
1254
                                -1, 0);
1255
            if (error == -1) {
1256
                perror("mmap");
1257
                exit(-1);
1258
            }
1259
            load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1260
        }
1261
        
1262
        error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1263
                            (elf_ppnt->p_filesz +
1264
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1265
                            elf_prot,
1266
                            (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1267
                            bprm->fd,
1268
                            (elf_ppnt->p_offset - 
1269
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1270
        if (error == -1) {
1271
            perror("mmap");
1272
            exit(-1);
1273
        }
1274

    
1275
#ifdef LOW_ELF_STACK
1276
        if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1277
            elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1278
#endif
1279
        
1280
        if (!load_addr_set) {
1281
            load_addr_set = 1;
1282
            load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1283
            if (elf_ex.e_type == ET_DYN) {
1284
                load_bias += error -
1285
                    TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1286
                load_addr += load_bias;
1287
            }
1288
        }
1289
        k = elf_ppnt->p_vaddr;
1290
        if (k < start_code) 
1291
            start_code = k;
1292
        k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1293
        if (k > elf_bss) 
1294
            elf_bss = k;
1295
        if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1296
            end_code = k;
1297
        if (end_data < k) 
1298
            end_data = k;
1299
        k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1300
        if (k > elf_brk) elf_brk = k;
1301
    }
1302

    
1303
    elf_entry += load_bias;
1304
    elf_bss += load_bias;
1305
    elf_brk += load_bias;
1306
    start_code += load_bias;
1307
    end_code += load_bias;
1308
    //    start_data += load_bias;
1309
    end_data += load_bias;
1310

    
1311
    if (elf_interpreter) {
1312
        if (interpreter_type & 1) {
1313
            elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1314
        }
1315
        else if (interpreter_type & 2) {
1316
            elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1317
                                            &interp_load_addr);
1318
        }
1319

    
1320
        close(interpreter_fd);
1321
        free(elf_interpreter);
1322

    
1323
        if (elf_entry == ~0UL) {
1324
            printf("Unable to load interpreter\n");
1325
            free(elf_phdata);
1326
            exit(-1);
1327
            return 0;
1328
        }
1329
    }
1330

    
1331
    free(elf_phdata);
1332

    
1333
    if (loglevel)
1334
        load_symbols(&elf_ex, bprm->fd);
1335

    
1336
    if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1337
    info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1338

    
1339
#ifdef LOW_ELF_STACK
1340
    info->start_stack = bprm->p = elf_stack - 4;
1341
#endif
1342
    bprm->p = create_elf_tables(bprm->p,
1343
                    bprm->argc,
1344
                    bprm->envc,
1345
                    &elf_ex,
1346
                    load_addr, load_bias,
1347
                    interp_load_addr,
1348
                    (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1349
                    info);
1350
    if (interpreter_type == INTERPRETER_AOUT)
1351
      info->arg_start += strlen(passed_fileno) + 1;
1352
    info->start_brk = info->brk = elf_brk;
1353
    info->end_code = end_code;
1354
    info->start_code = start_code;
1355
    info->end_data = end_data;
1356
    info->start_stack = bprm->p;
1357

    
1358
    /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1359
       sections */
1360
    set_brk(elf_bss, elf_brk);
1361

    
1362
    padzero(elf_bss);
1363

    
1364
#if 0
1365
    printf("(start_brk) %x\n" , info->start_brk);
1366
    printf("(end_code) %x\n" , info->end_code);
1367
    printf("(start_code) %x\n" , info->start_code);
1368
    printf("(end_data) %x\n" , info->end_data);
1369
    printf("(start_stack) %x\n" , info->start_stack);
1370
    printf("(brk) %x\n" , info->brk);
1371
#endif
1372

    
1373
    if ( info->personality == PER_SVR4 )
1374
    {
1375
            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1376
               and some applications "depend" upon this behavior.
1377
               Since we do not have the power to recompile these, we
1378
               emulate the SVr4 behavior.  Sigh.  */
1379
            mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1380
                                      MAP_FIXED | MAP_PRIVATE, -1, 0);
1381
    }
1382

    
1383
#ifdef ELF_PLAT_INIT
1384
    /*
1385
     * The ABI may specify that certain registers be set up in special
1386
     * ways (on i386 %edx is the address of a DT_FINI function, for
1387
     * example.  This macro performs whatever initialization to
1388
     * the regs structure is required.
1389
     */
1390
    ELF_PLAT_INIT(regs);
1391
#endif
1392

    
1393

    
1394
    info->entry = elf_entry;
1395

    
1396
    return 0;
1397
}
1398

    
1399

    
1400

    
1401
int elf_exec(const char * filename, char ** argv, char ** envp, 
1402
             struct target_pt_regs * regs, struct image_info *infop)
1403
{
1404
        struct linux_binprm bprm;
1405
        int retval;
1406
        int i;
1407

    
1408
        bprm.p = TARGET_PAGE_SIZE*MAX_ARG_PAGES-sizeof(unsigned int);
1409
        for (i=0 ; i<MAX_ARG_PAGES ; i++)       /* clear page-table */
1410
                bprm.page[i] = 0;
1411
        retval = open(filename, O_RDONLY);
1412
        if (retval < 0)
1413
            return retval;
1414
        bprm.fd = retval;
1415
        bprm.filename = (char *)filename;
1416
        bprm.sh_bang = 0;
1417
        bprm.loader = 0;
1418
        bprm.exec = 0;
1419
        bprm.dont_iput = 0;
1420
        bprm.argc = count(argv);
1421
        bprm.envc = count(envp);
1422

    
1423
        retval = prepare_binprm(&bprm);
1424

    
1425
        if(retval>=0) {
1426
            bprm.p = copy_strings(1, &bprm.filename, bprm.page, bprm.p);
1427
            bprm.exec = bprm.p;
1428
            bprm.p = copy_strings(bprm.envc,envp,bprm.page,bprm.p);
1429
            bprm.p = copy_strings(bprm.argc,argv,bprm.page,bprm.p);
1430
            if (!bprm.p) {
1431
                retval = -E2BIG;
1432
            }
1433
        }
1434

    
1435
        if(retval>=0) {
1436
            retval = load_elf_binary(&bprm,regs,infop);
1437
        }
1438
        
1439
        if(retval>=0) {
1440
            /* success.  Initialize important registers */
1441
            init_thread(regs, infop);
1442
            return retval;
1443
        }
1444

    
1445
        /* Something went wrong, return the inode and free the argument pages*/
1446
        for (i=0 ; i<MAX_ARG_PAGES ; i++) {
1447
            free(bprm.page[i]);
1448
        }
1449
        return(retval);
1450
}
1451

    
1452

    
1453
static int load_aout_interp(void * exptr, int interp_fd)
1454
{
1455
    printf("a.out interpreter not yet supported\n");
1456
    return(0);
1457
}
1458