Statistics
| Branch: | Revision:

root / linux-user / elfload.c @ e5fe0c52

History | View | Annotate | Download (35 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 <errno.h>
7
#include <unistd.h>
8
#include <sys/mman.h>
9
#include <stdlib.h>
10
#include <string.h>
11

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

    
15
/* this flag is uneffective under linux too, should be deleted */
16
#ifndef MAP_DENYWRITE
17
#define MAP_DENYWRITE 0
18
#endif
19

    
20
/* should probably go in elf.h */
21
#ifndef ELIBBAD
22
#define ELIBBAD 80
23
#endif
24

    
25
#ifdef TARGET_I386
26

    
27
#define ELF_PLATFORM get_elf_platform()
28

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

    
40
#define ELF_HWCAP get_elf_hwcap()
41

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

    
47
#define ELF_START_MMAP 0x80000000
48

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

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

    
61
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
62
{
63
    regs->esp = infop->start_stack;
64
    regs->eip = infop->entry;
65

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

72
       A value of 0 tells we have no such handler.  */
73
    regs->edx = 0;
74
}
75

    
76
#define USE_ELF_CORE_DUMP
77
#define ELF_EXEC_PAGESIZE        4096
78

    
79
#endif
80

    
81
#ifdef TARGET_ARM
82

    
83
#define ELF_START_MMAP 0x80000000
84

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

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

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

    
112
#define USE_ELF_CORE_DUMP
113
#define ELF_EXEC_PAGESIZE        4096
114

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

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

    
131
#endif
132

    
133
#ifdef TARGET_SPARC
134
#ifdef TARGET_SPARC64
135

    
136
#define ELF_START_MMAP 0x80000000
137

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

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

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

    
153
#else
154
#define ELF_START_MMAP 0x80000000
155

    
156
#define elf_check_arch(x) ( (x) == EM_SPARC )
157

    
158
#define ELF_CLASS   ELFCLASS32
159
#define ELF_DATA    ELFDATA2MSB
160
#define ELF_ARCH    EM_SPARC
161

    
162
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
163
{
164
    regs->psr = 0;
165
    regs->pc = infop->entry;
166
    regs->npc = regs->pc + 4;
167
    regs->y = 0;
168
    regs->u_regs[14] = infop->start_stack - 16 * 4;
169
}
170

    
171
#endif
172
#endif
173

    
174
#ifdef TARGET_PPC
175

    
176
#define ELF_START_MMAP 0x80000000
177

    
178
#define elf_check_arch(x) ( (x) == EM_PPC )
179

    
180
#define ELF_CLASS        ELFCLASS32
181
#ifdef TARGET_WORDS_BIGENDIAN
182
#define ELF_DATA        ELFDATA2MSB
183
#else
184
#define ELF_DATA        ELFDATA2LSB
185
#endif
186
#define ELF_ARCH        EM_PPC
187

    
188
/*
189
 * We need to put in some extra aux table entries to tell glibc what
190
 * the cache block size is, so it can use the dcbz instruction safely.
191
 */
192
#define AT_DCACHEBSIZE          19
193
#define AT_ICACHEBSIZE          20
194
#define AT_UCACHEBSIZE          21
195
/* A special ignored type value for PPC, for glibc compatibility.  */
196
#define AT_IGNOREPPC            22
197
/*
198
 * The requirements here are:
199
 * - keep the final alignment of sp (sp & 0xf)
200
 * - make sure the 32-bit value at the first 16 byte aligned position of
201
 *   AUXV is greater than 16 for glibc compatibility.
202
 *   AT_IGNOREPPC is used for that.
203
 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
204
 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
205
 */
206
#define DLINFO_ARCH_ITEMS       5
207
#define ARCH_DLINFO                                                     \
208
do {                                                                    \
209
        NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);                              \
210
        NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);                              \
211
        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                                 \
212
        /*                                                              \
213
         * Now handle glibc compatibility.                              \
214
         */                                                             \
215
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
216
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
217
 } while (0)
218

    
219
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
220
{
221
    target_ulong pos = infop->start_stack;
222
    target_ulong tmp;
223

    
224
    _regs->msr = 1 << MSR_PR; /* Set user mode */
225
    _regs->gpr[1] = infop->start_stack;
226
    _regs->nip = infop->entry;
227
    /* Note that isn't exactly what regular kernel does
228
     * but this is what the ABI wants and is needed to allow
229
     * execution of PPC BSD programs.
230
     */
231
    _regs->gpr[3] = tgetl(pos);
232
    pos += sizeof(target_ulong);
233
    _regs->gpr[4] = pos;
234
    for (tmp = 1; tmp != 0; pos += sizeof(target_ulong))
235
        tmp = ldl(pos);
236
    _regs->gpr[5] = pos;
237
}
238

    
239
#define USE_ELF_CORE_DUMP
240
#define ELF_EXEC_PAGESIZE        4096
241

    
242
#endif
243

    
244
#ifdef TARGET_MIPS
245

    
246
#define ELF_START_MMAP 0x80000000
247

    
248
#define elf_check_arch(x) ( (x) == EM_MIPS )
249

    
250
#define ELF_CLASS   ELFCLASS32
251
#ifdef TARGET_WORDS_BIGENDIAN
252
#define ELF_DATA        ELFDATA2MSB
253
#else
254
#define ELF_DATA        ELFDATA2LSB
255
#endif
256
#define ELF_ARCH    EM_MIPS
257

    
258
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
259
{
260
    regs->cp0_status = CP0St_UM;
261
    regs->cp0_epc = infop->entry;
262
    regs->regs[29] = infop->start_stack;
263
}
264

    
265
#endif /* TARGET_MIPS */
266

    
267
#ifdef TARGET_SH4
268

    
269
#define ELF_START_MMAP 0x80000000
270

    
271
#define elf_check_arch(x) ( (x) == EM_SH )
272

    
273
#define ELF_CLASS ELFCLASS32
274
#define ELF_DATA  ELFDATA2LSB
275
#define ELF_ARCH  EM_SH
276

    
277
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
278
{
279
  /* Check other registers XXXXX */
280
  regs->pc = infop->entry;
281
  regs->regs[15] = infop->start_stack - 16 * 4;
282
}
283

    
284
#define USE_ELF_CORE_DUMP
285
#define ELF_EXEC_PAGESIZE        4096
286

    
287
#endif
288

    
289
#ifndef ELF_PLATFORM
290
#define ELF_PLATFORM (NULL)
291
#endif
292

    
293
#ifndef ELF_HWCAP
294
#define ELF_HWCAP 0
295
#endif
296

    
297
#include "elf.h"
298

    
299
struct exec
300
{
301
  unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
302
  unsigned int a_text;   /* length of text, in bytes */
303
  unsigned int a_data;   /* length of data, in bytes */
304
  unsigned int a_bss;    /* length of uninitialized data area, in bytes */
305
  unsigned int a_syms;   /* length of symbol table data in file, in bytes */
306
  unsigned int a_entry;  /* start address */
307
  unsigned int a_trsize; /* length of relocation info for text, in bytes */
308
  unsigned int a_drsize; /* length of relocation info for data, in bytes */
309
};
310

    
311

    
312
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
313
#define OMAGIC 0407
314
#define NMAGIC 0410
315
#define ZMAGIC 0413
316
#define QMAGIC 0314
317

    
318
/* max code+data+bss space allocated to elf interpreter */
319
#define INTERP_MAP_SIZE (32 * 1024 * 1024)
320

    
321
/* max code+data+bss+brk space allocated to ET_DYN executables */
322
#define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
323

    
324
/* from personality.h */
325

    
326
/* Flags for bug emulation. These occupy the top three bytes. */
327
#define STICKY_TIMEOUTS                0x4000000
328
#define WHOLE_SECONDS                0x2000000
329

    
330
/* Personality types. These go in the low byte. Avoid using the top bit,
331
 * it will conflict with error returns.
332
 */
333
#define PER_MASK                (0x00ff)
334
#define PER_LINUX                (0x0000)
335
#define PER_SVR4                (0x0001 | STICKY_TIMEOUTS)
336
#define PER_SVR3                (0x0002 | STICKY_TIMEOUTS)
337
#define PER_SCOSVR3                (0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS)
338
#define PER_WYSEV386                (0x0004 | STICKY_TIMEOUTS)
339
#define PER_ISCR4                (0x0005 | STICKY_TIMEOUTS)
340
#define PER_BSD                        (0x0006)
341
#define PER_XENIX                (0x0007 | STICKY_TIMEOUTS)
342

    
343
/* Necessary parameters */
344
#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
345
#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
346
#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
347

    
348
#define INTERPRETER_NONE 0
349
#define INTERPRETER_AOUT 1
350
#define INTERPRETER_ELF 2
351

    
352
#define DLINFO_ITEMS 12
353

    
354
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
355
{
356
        memcpy(to, from, n);
357
}
358

    
359
extern unsigned long x86_stack_size;
360

    
361
static int load_aout_interp(void * exptr, int interp_fd);
362

    
363
#ifdef BSWAP_NEEDED
364
static void bswap_ehdr(struct elfhdr *ehdr)
365
{
366
    bswap16s(&ehdr->e_type);                        /* Object file type */
367
    bswap16s(&ehdr->e_machine);                /* Architecture */
368
    bswap32s(&ehdr->e_version);                /* Object file version */
369
    bswaptls(&ehdr->e_entry);                /* Entry point virtual address */
370
    bswaptls(&ehdr->e_phoff);                /* Program header table file offset */
371
    bswaptls(&ehdr->e_shoff);                /* Section header table file offset */
372
    bswap32s(&ehdr->e_flags);                /* Processor-specific flags */
373
    bswap16s(&ehdr->e_ehsize);                /* ELF header size in bytes */
374
    bswap16s(&ehdr->e_phentsize);                /* Program header table entry size */
375
    bswap16s(&ehdr->e_phnum);                /* Program header table entry count */
376
    bswap16s(&ehdr->e_shentsize);                /* Section header table entry size */
377
    bswap16s(&ehdr->e_shnum);                /* Section header table entry count */
378
    bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
379
}
380

    
381
static void bswap_phdr(struct elf_phdr *phdr)
382
{
383
    bswap32s(&phdr->p_type);                        /* Segment type */
384
    bswaptls(&phdr->p_offset);                /* Segment file offset */
385
    bswaptls(&phdr->p_vaddr);                /* Segment virtual address */
386
    bswaptls(&phdr->p_paddr);                /* Segment physical address */
387
    bswaptls(&phdr->p_filesz);                /* Segment size in file */
388
    bswaptls(&phdr->p_memsz);                /* Segment size in memory */
389
    bswap32s(&phdr->p_flags);                /* Segment flags */
390
    bswaptls(&phdr->p_align);                /* Segment alignment */
391
}
392

    
393
static void bswap_shdr(struct elf_shdr *shdr)
394
{
395
    bswap32s(&shdr->sh_name);
396
    bswap32s(&shdr->sh_type);
397
    bswaptls(&shdr->sh_flags);
398
    bswaptls(&shdr->sh_addr);
399
    bswaptls(&shdr->sh_offset);
400
    bswaptls(&shdr->sh_size);
401
    bswap32s(&shdr->sh_link);
402
    bswap32s(&shdr->sh_info);
403
    bswaptls(&shdr->sh_addralign);
404
    bswaptls(&shdr->sh_entsize);
405
}
406

    
407
static void bswap_sym(Elf32_Sym *sym)
408
{
409
    bswap32s(&sym->st_name);
410
    bswap32s(&sym->st_value);
411
    bswap32s(&sym->st_size);
412
    bswap16s(&sym->st_shndx);
413
}
414
#endif
415

    
416
/*
417
 * 'copy_elf_strings()' copies argument/envelope strings from user
418
 * memory to free pages in kernel mem. These are in a format ready
419
 * to be put directly into the top of new user memory.
420
 *
421
 */
422
static unsigned long copy_elf_strings(int argc,char ** argv, void **page,
423
                                      unsigned long p)
424
{
425
    char *tmp, *tmp1, *pag = NULL;
426
    int len, offset = 0;
427

    
428
    if (!p) {
429
        return 0;       /* bullet-proofing */
430
    }
431
    while (argc-- > 0) {
432
        tmp = argv[argc];
433
        if (!tmp) {
434
            fprintf(stderr, "VFS: argc is wrong");
435
            exit(-1);
436
        }
437
        tmp1 = tmp;
438
        while (*tmp++);
439
        len = tmp - tmp1;
440
        if (p < len) {  /* this shouldn't happen - 128kB */
441
                return 0;
442
        }
443
        while (len) {
444
            --p; --tmp; --len;
445
            if (--offset < 0) {
446
                offset = p % TARGET_PAGE_SIZE;
447
                pag = (char *)page[p/TARGET_PAGE_SIZE];
448
                if (!pag) {
449
                    pag = (char *)malloc(TARGET_PAGE_SIZE);
450
                    page[p/TARGET_PAGE_SIZE] = pag;
451
                    if (!pag)
452
                        return 0;
453
                }
454
            }
455
            if (len == 0 || offset == 0) {
456
                *(pag + offset) = *tmp;
457
            }
458
            else {
459
              int bytes_to_copy = (len > offset) ? offset : len;
460
              tmp -= bytes_to_copy;
461
              p -= bytes_to_copy;
462
              offset -= bytes_to_copy;
463
              len -= bytes_to_copy;
464
              memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
465
            }
466
        }
467
    }
468
    return p;
469
}
470

    
471
unsigned long setup_arg_pages(target_ulong p, struct linux_binprm * bprm,
472
                                              struct image_info * info)
473
{
474
    target_ulong stack_base, size, error;
475
    int i;
476

    
477
    /* Create enough stack to hold everything.  If we don't use
478
     * it for args, we'll use it for something else...
479
     */
480
    size = x86_stack_size;
481
    if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
482
        size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
483
    error = target_mmap(0, 
484
                        size + qemu_host_page_size,
485
                        PROT_READ | PROT_WRITE,
486
                        MAP_PRIVATE | MAP_ANONYMOUS,
487
                        -1, 0);
488
    if (error == -1) {
489
        perror("stk mmap");
490
        exit(-1);
491
    }
492
    /* we reserve one extra page at the top of the stack as guard */
493
    target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
494

    
495
    stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
496
    p += stack_base;
497

    
498
    for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
499
        if (bprm->page[i]) {
500
            info->rss++;
501

    
502
            memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
503
            free(bprm->page[i]);
504
        }
505
        stack_base += TARGET_PAGE_SIZE;
506
    }
507
    return p;
508
}
509

    
510
static void set_brk(unsigned long start, unsigned long end)
511
{
512
        /* page-align the start and end addresses... */
513
        start = HOST_PAGE_ALIGN(start);
514
        end = HOST_PAGE_ALIGN(end);
515
        if (end <= start)
516
                return;
517
        if(target_mmap(start, end - start,
518
                       PROT_READ | PROT_WRITE | PROT_EXEC,
519
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == -1) {
520
            perror("cannot mmap brk");
521
            exit(-1);
522
        }
523
}
524

    
525

    
526
/* We need to explicitly zero any fractional pages after the data
527
   section (i.e. bss).  This would contain the junk from the file that
528
   should not be in memory. */
529
static void padzero(unsigned long elf_bss)
530
{
531
        unsigned long nbyte;
532

    
533
        /* XXX: this is really a hack : if the real host page size is
534
           smaller than the target page size, some pages after the end
535
           of the file may not be mapped. A better fix would be to
536
           patch target_mmap(), but it is more complicated as the file
537
           size must be known */
538
        if (qemu_real_host_page_size < qemu_host_page_size) {
539
            unsigned long end_addr, end_addr1;
540
            end_addr1 = (elf_bss + qemu_real_host_page_size - 1) & 
541
                ~(qemu_real_host_page_size - 1);
542
            end_addr = HOST_PAGE_ALIGN(elf_bss);
543
            if (end_addr1 < end_addr) {
544
                mmap((void *)end_addr1, end_addr - end_addr1,
545
                     PROT_READ|PROT_WRITE|PROT_EXEC,
546
                     MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
547
            }
548
        }
549

    
550
        nbyte = elf_bss & (qemu_host_page_size-1);
551
        if (nbyte) {
552
            nbyte = qemu_host_page_size - nbyte;
553
            do {
554
                tput8(elf_bss, 0);
555
                elf_bss++;
556
            } while (--nbyte);
557
        }
558
}
559

    
560

    
561
static unsigned long create_elf_tables(target_ulong p, int argc, int envc,
562
                                       struct elfhdr * exec,
563
                                       unsigned long load_addr,
564
                                       unsigned long load_bias,
565
                                       unsigned long interp_load_addr, int ibcs,
566
                                       struct image_info *info)
567
{
568
        target_ulong sp;
569
        int size;
570
        target_ulong u_platform;
571
        const char *k_platform;
572
        const int n = sizeof(target_ulong);
573

    
574
        sp = p;
575
        u_platform = 0;
576
        k_platform = ELF_PLATFORM;
577
        if (k_platform) {
578
            size_t len = strlen(k_platform) + 1;
579
            sp -= (len + n - 1) & ~(n - 1);
580
            u_platform = sp;
581
            memcpy_to_target(sp, k_platform, len);
582
        }
583
        /*
584
         * Force 16 byte _final_ alignment here for generality.
585
         */
586
        sp = sp &~ (target_ulong)15;
587
        size = (DLINFO_ITEMS + 1) * 2;
588
        if (k_platform)
589
          size += 2;
590
#ifdef DLINFO_ARCH_ITEMS
591
        size += DLINFO_ARCH_ITEMS * 2;
592
#endif
593
        size += envc + argc + 2;
594
        size += (!ibcs ? 3 : 1);        /* argc itself */
595
        size *= n;
596
        if (size & 15)
597
            sp -= 16 - (size & 15);
598
        
599
#define NEW_AUX_ENT(id, val) do { \
600
            sp -= n; tputl(sp, val); \
601
            sp -= n; tputl(sp, id); \
602
          } while(0)
603
        NEW_AUX_ENT (AT_NULL, 0);
604

    
605
        /* There must be exactly DLINFO_ITEMS entries here.  */
606
        NEW_AUX_ENT(AT_PHDR, (target_ulong)(load_addr + exec->e_phoff));
607
        NEW_AUX_ENT(AT_PHENT, (target_ulong)(sizeof (struct elf_phdr)));
608
        NEW_AUX_ENT(AT_PHNUM, (target_ulong)(exec->e_phnum));
609
        NEW_AUX_ENT(AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE));
610
        NEW_AUX_ENT(AT_BASE, (target_ulong)(interp_load_addr));
611
        NEW_AUX_ENT(AT_FLAGS, (target_ulong)0);
612
        NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
613
        NEW_AUX_ENT(AT_UID, (target_ulong) getuid());
614
        NEW_AUX_ENT(AT_EUID, (target_ulong) geteuid());
615
        NEW_AUX_ENT(AT_GID, (target_ulong) getgid());
616
        NEW_AUX_ENT(AT_EGID, (target_ulong) getegid());
617
        NEW_AUX_ENT(AT_HWCAP, (target_ulong) ELF_HWCAP);
618
        if (k_platform)
619
            NEW_AUX_ENT(AT_PLATFORM, u_platform);
620
#ifdef ARCH_DLINFO
621
        /* 
622
         * ARCH_DLINFO must come last so platform specific code can enforce
623
         * special alignment requirements on the AUXV if necessary (eg. PPC).
624
         */
625
        ARCH_DLINFO;
626
#endif
627
#undef NEW_AUX_ENT
628

    
629
        sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
630
        return sp;
631
}
632

    
633

    
634
static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
635
                                     int interpreter_fd,
636
                                     unsigned long *interp_load_addr)
637
{
638
        struct elf_phdr *elf_phdata  =  NULL;
639
        struct elf_phdr *eppnt;
640
        unsigned long load_addr = 0;
641
        int load_addr_set = 0;
642
        int retval;
643
        unsigned long last_bss, elf_bss;
644
        unsigned long error;
645
        int i;
646
        
647
        elf_bss = 0;
648
        last_bss = 0;
649
        error = 0;
650

    
651
#ifdef BSWAP_NEEDED
652
        bswap_ehdr(interp_elf_ex);
653
#endif
654
        /* First of all, some simple consistency checks */
655
        if ((interp_elf_ex->e_type != ET_EXEC && 
656
             interp_elf_ex->e_type != ET_DYN) || 
657
           !elf_check_arch(interp_elf_ex->e_machine)) {
658
                return ~0UL;
659
        }
660
        
661

    
662
        /* Now read in all of the header information */
663
        
664
        if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
665
            return ~0UL;
666
        
667
        elf_phdata =  (struct elf_phdr *) 
668
                malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
669

    
670
        if (!elf_phdata)
671
          return ~0UL;
672
        
673
        /*
674
         * If the size of this structure has changed, then punt, since
675
         * we will be doing the wrong thing.
676
         */
677
        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
678
            free(elf_phdata);
679
            return ~0UL;
680
        }
681

    
682
        retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
683
        if(retval >= 0) {
684
            retval = read(interpreter_fd,
685
                           (char *) elf_phdata,
686
                           sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
687
        }
688
        if (retval < 0) {
689
                perror("load_elf_interp");
690
                exit(-1);
691
                free (elf_phdata);
692
                return retval;
693
         }
694
#ifdef BSWAP_NEEDED
695
        eppnt = elf_phdata;
696
        for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
697
            bswap_phdr(eppnt);
698
        }
699
#endif
700

    
701
        if (interp_elf_ex->e_type == ET_DYN) {
702
            /* in order to avoid harcoding the interpreter load
703
               address in qemu, we allocate a big enough memory zone */
704
            error = target_mmap(0, INTERP_MAP_SIZE,
705
                                PROT_NONE, MAP_PRIVATE | MAP_ANON, 
706
                                -1, 0);
707
            if (error == -1) {
708
                perror("mmap");
709
                exit(-1);
710
            }
711
            load_addr = error;
712
            load_addr_set = 1;
713
        }
714

    
715
        eppnt = elf_phdata;
716
        for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
717
          if (eppnt->p_type == PT_LOAD) {
718
            int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
719
            int elf_prot = 0;
720
            unsigned long vaddr = 0;
721
            unsigned long k;
722

    
723
            if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
724
            if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
725
            if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
726
            if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
727
                    elf_type |= MAP_FIXED;
728
                    vaddr = eppnt->p_vaddr;
729
            }
730
            error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
731
                 eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
732
                 elf_prot,
733
                 elf_type,
734
                 interpreter_fd,
735
                 eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
736
            
737
            if (error == -1) {
738
              /* Real error */
739
              close(interpreter_fd);
740
              free(elf_phdata);
741
              return ~0UL;
742
            }
743

    
744
            if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
745
              load_addr = error;
746
              load_addr_set = 1;
747
            }
748

    
749
            /*
750
             * Find the end of the file  mapping for this phdr, and keep
751
             * track of the largest address we see for this.
752
             */
753
            k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
754
            if (k > elf_bss) elf_bss = k;
755

    
756
            /*
757
             * Do the same thing for the memory mapping - between
758
             * elf_bss and last_bss is the bss section.
759
             */
760
            k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
761
            if (k > last_bss) last_bss = k;
762
          }
763
        
764
        /* Now use mmap to map the library into memory. */
765

    
766
        close(interpreter_fd);
767

    
768
        /*
769
         * Now fill out the bss section.  First pad the last page up
770
         * to the page boundary, and then perform a mmap to make sure
771
         * that there are zeromapped pages up to and including the last
772
         * bss page.
773
         */
774
        padzero(elf_bss);
775
        elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
776

    
777
        /* Map the last of the bss segment */
778
        if (last_bss > elf_bss) {
779
            target_mmap(elf_bss, last_bss-elf_bss,
780
                        PROT_READ|PROT_WRITE|PROT_EXEC,
781
                        MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
782
        }
783
        free(elf_phdata);
784

    
785
        *interp_load_addr = load_addr;
786
        return ((unsigned long) interp_elf_ex->e_entry) + load_addr;
787
}
788

    
789
/* Best attempt to load symbols from this ELF object. */
790
static void load_symbols(struct elfhdr *hdr, int fd)
791
{
792
    unsigned int i;
793
    struct elf_shdr sechdr, symtab, strtab;
794
    char *strings;
795
    struct syminfo *s;
796

    
797
    lseek(fd, hdr->e_shoff, SEEK_SET);
798
    for (i = 0; i < hdr->e_shnum; i++) {
799
        if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
800
            return;
801
#ifdef BSWAP_NEEDED
802
        bswap_shdr(&sechdr);
803
#endif
804
        if (sechdr.sh_type == SHT_SYMTAB) {
805
            symtab = sechdr;
806
            lseek(fd, hdr->e_shoff
807
                  + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
808
            if (read(fd, &strtab, sizeof(strtab))
809
                != sizeof(strtab))
810
                return;
811
#ifdef BSWAP_NEEDED
812
            bswap_shdr(&strtab);
813
#endif
814
            goto found;
815
        }
816
    }
817
    return; /* Shouldn't happen... */
818

    
819
 found:
820
    /* Now know where the strtab and symtab are.  Snarf them. */
821
    s = malloc(sizeof(*s));
822
    s->disas_symtab = malloc(symtab.sh_size);
823
    s->disas_strtab = strings = malloc(strtab.sh_size);
824
    if (!s->disas_symtab || !s->disas_strtab)
825
        return;
826
        
827
    lseek(fd, symtab.sh_offset, SEEK_SET);
828
    if (read(fd, s->disas_symtab, symtab.sh_size) != symtab.sh_size)
829
        return;
830

    
831
#ifdef BSWAP_NEEDED
832
    for (i = 0; i < symtab.sh_size / sizeof(struct elf_sym); i++)
833
        bswap_sym(s->disas_symtab + sizeof(struct elf_sym)*i);
834
#endif
835

    
836
    lseek(fd, strtab.sh_offset, SEEK_SET);
837
    if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
838
        return;
839
    s->disas_num_syms = symtab.sh_size / sizeof(struct elf_sym);
840
    s->next = syminfos;
841
    syminfos = s;
842
}
843

    
844
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
845
                    struct image_info * info)
846
{
847
    struct elfhdr elf_ex;
848
    struct elfhdr interp_elf_ex;
849
    struct exec interp_ex;
850
    int interpreter_fd = -1; /* avoid warning */
851
    unsigned long load_addr, load_bias;
852
    int load_addr_set = 0;
853
    unsigned int interpreter_type = INTERPRETER_NONE;
854
    unsigned char ibcs2_interpreter;
855
    int i;
856
    unsigned long mapped_addr;
857
    struct elf_phdr * elf_ppnt;
858
    struct elf_phdr *elf_phdata;
859
    unsigned long elf_bss, k, elf_brk;
860
    int retval;
861
    char * elf_interpreter;
862
    unsigned long elf_entry, interp_load_addr = 0;
863
    int status;
864
    unsigned long start_code, end_code, end_data;
865
    unsigned long elf_stack;
866
    char passed_fileno[6];
867

    
868
    ibcs2_interpreter = 0;
869
    status = 0;
870
    load_addr = 0;
871
    load_bias = 0;
872
    elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
873
#ifdef BSWAP_NEEDED
874
    bswap_ehdr(&elf_ex);
875
#endif
876

    
877
    /* First of all, some simple consistency checks */
878
    if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
879
                                       (! elf_check_arch(elf_ex.e_machine))) {
880
            return -ENOEXEC;
881
    }
882

    
883
    bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
884
    bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
885
    bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
886
    if (!bprm->p) {
887
        retval = -E2BIG;
888
    }
889

    
890
    /* Now read in all of the header information */
891
    elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
892
    if (elf_phdata == NULL) {
893
        return -ENOMEM;
894
    }
895

    
896
    retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
897
    if(retval > 0) {
898
        retval = read(bprm->fd, (char *) elf_phdata, 
899
                                elf_ex.e_phentsize * elf_ex.e_phnum);
900
    }
901

    
902
    if (retval < 0) {
903
        perror("load_elf_binary");
904
        exit(-1);
905
        free (elf_phdata);
906
        return -errno;
907
    }
908

    
909
#ifdef BSWAP_NEEDED
910
    elf_ppnt = elf_phdata;
911
    for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
912
        bswap_phdr(elf_ppnt);
913
    }
914
#endif
915
    elf_ppnt = elf_phdata;
916

    
917
    elf_bss = 0;
918
    elf_brk = 0;
919

    
920

    
921
    elf_stack = ~0UL;
922
    elf_interpreter = NULL;
923
    start_code = ~0UL;
924
    end_code = 0;
925
    end_data = 0;
926

    
927
    for(i=0;i < elf_ex.e_phnum; i++) {
928
        if (elf_ppnt->p_type == PT_INTERP) {
929
            if ( elf_interpreter != NULL )
930
            {
931
                free (elf_phdata);
932
                free(elf_interpreter);
933
                close(bprm->fd);
934
                return -EINVAL;
935
            }
936

    
937
            /* This is the program interpreter used for
938
             * shared libraries - for now assume that this
939
             * is an a.out format binary
940
             */
941

    
942
            elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
943

    
944
            if (elf_interpreter == NULL) {
945
                free (elf_phdata);
946
                close(bprm->fd);
947
                return -ENOMEM;
948
            }
949

    
950
            retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
951
            if(retval >= 0) {
952
                retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
953
            }
954
            if(retval < 0) {
955
                 perror("load_elf_binary2");
956
                exit(-1);
957
            }        
958

    
959
            /* If the program interpreter is one of these two,
960
               then assume an iBCS2 image. Otherwise assume
961
               a native linux image. */
962

    
963
            /* JRP - Need to add X86 lib dir stuff here... */
964

    
965
            if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
966
                strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
967
              ibcs2_interpreter = 1;
968
            }
969

    
970
#if 0
971
            printf("Using ELF interpreter %s\n", elf_interpreter);
972
#endif
973
            if (retval >= 0) {
974
                retval = open(path(elf_interpreter), O_RDONLY);
975
                if(retval >= 0) {
976
                    interpreter_fd = retval;
977
                }
978
                else {
979
                    perror(elf_interpreter);
980
                    exit(-1);
981
                    /* retval = -errno; */
982
                }
983
            }
984

    
985
            if (retval >= 0) {
986
                retval = lseek(interpreter_fd, 0, SEEK_SET);
987
                if(retval >= 0) {
988
                    retval = read(interpreter_fd,bprm->buf,128);
989
                }
990
            }
991
            if (retval >= 0) {
992
                interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
993
                interp_elf_ex=*((struct elfhdr *) bprm->buf); /* elf exec-header */
994
            }
995
            if (retval < 0) {
996
                perror("load_elf_binary3");
997
                exit(-1);
998
                free (elf_phdata);
999
                free(elf_interpreter);
1000
                close(bprm->fd);
1001
                return retval;
1002
            }
1003
        }
1004
        elf_ppnt++;
1005
    }
1006

    
1007
    /* Some simple consistency checks for the interpreter */
1008
    if (elf_interpreter){
1009
        interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1010

    
1011
        /* Now figure out which format our binary is */
1012
        if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1013
                    (N_MAGIC(interp_ex) != QMAGIC)) {
1014
          interpreter_type = INTERPRETER_ELF;
1015
        }
1016

    
1017
        if (interp_elf_ex.e_ident[0] != 0x7f ||
1018
                    strncmp(&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1019
            interpreter_type &= ~INTERPRETER_ELF;
1020
        }
1021

    
1022
        if (!interpreter_type) {
1023
            free(elf_interpreter);
1024
            free(elf_phdata);
1025
            close(bprm->fd);
1026
            return -ELIBBAD;
1027
        }
1028
    }
1029

    
1030
    /* OK, we are done with that, now set up the arg stuff,
1031
       and then start this sucker up */
1032

    
1033
    {
1034
        char * passed_p;
1035

    
1036
        if (interpreter_type == INTERPRETER_AOUT) {
1037
            snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1038
            passed_p = passed_fileno;
1039

    
1040
            if (elf_interpreter) {
1041
                bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
1042
                bprm->argc++;
1043
            }
1044
        }
1045
        if (!bprm->p) {
1046
            if (elf_interpreter) {
1047
                free(elf_interpreter);
1048
            }
1049
            free (elf_phdata);
1050
            close(bprm->fd);
1051
            return -E2BIG;
1052
        }
1053
    }
1054

    
1055
    /* OK, This is the point of no return */
1056
    info->end_data = 0;
1057
    info->end_code = 0;
1058
    info->start_mmap = (unsigned long)ELF_START_MMAP;
1059
    info->mmap = 0;
1060
    elf_entry = (unsigned long) elf_ex.e_entry;
1061

    
1062
    /* Do this so that we can load the interpreter, if need be.  We will
1063
       change some of these later */
1064
    info->rss = 0;
1065
    bprm->p = setup_arg_pages(bprm->p, bprm, info);
1066
    info->start_stack = bprm->p;
1067

    
1068
    /* Now we do a little grungy work by mmaping the ELF image into
1069
     * the correct location in memory.  At this point, we assume that
1070
     * the image should be loaded at fixed address, not at a variable
1071
     * address.
1072
     */
1073

    
1074
    for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1075
        int elf_prot = 0;
1076
        int elf_flags = 0;
1077
        unsigned long error;
1078
        
1079
        if (elf_ppnt->p_type != PT_LOAD)
1080
            continue;
1081
        
1082
        if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1083
        if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1084
        if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1085
        elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1086
        if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1087
            elf_flags |= MAP_FIXED;
1088
        } else if (elf_ex.e_type == ET_DYN) {
1089
            /* Try and get dynamic programs out of the way of the default mmap
1090
               base, as well as whatever program they might try to exec.  This
1091
               is because the brk will follow the loader, and is not movable.  */
1092
            /* NOTE: for qemu, we do a big mmap to get enough space
1093
               without harcoding any address */
1094
            error = target_mmap(0, ET_DYN_MAP_SIZE,
1095
                                PROT_NONE, MAP_PRIVATE | MAP_ANON, 
1096
                                -1, 0);
1097
            if (error == -1) {
1098
                perror("mmap");
1099
                exit(-1);
1100
            }
1101
            load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1102
        }
1103
        
1104
        error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1105
                            (elf_ppnt->p_filesz +
1106
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1107
                            elf_prot,
1108
                            (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1109
                            bprm->fd,
1110
                            (elf_ppnt->p_offset - 
1111
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1112
        if (error == -1) {
1113
            perror("mmap");
1114
            exit(-1);
1115
        }
1116

    
1117
#ifdef LOW_ELF_STACK
1118
        if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1119
            elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1120
#endif
1121
        
1122
        if (!load_addr_set) {
1123
            load_addr_set = 1;
1124
            load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1125
            if (elf_ex.e_type == ET_DYN) {
1126
                load_bias += error -
1127
                    TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1128
                load_addr += load_bias;
1129
            }
1130
        }
1131
        k = elf_ppnt->p_vaddr;
1132
        if (k < start_code) 
1133
            start_code = k;
1134
        k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1135
        if (k > elf_bss) 
1136
            elf_bss = k;
1137
        if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1138
            end_code = k;
1139
        if (end_data < k) 
1140
            end_data = k;
1141
        k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1142
        if (k > elf_brk) elf_brk = k;
1143
    }
1144

    
1145
    elf_entry += load_bias;
1146
    elf_bss += load_bias;
1147
    elf_brk += load_bias;
1148
    start_code += load_bias;
1149
    end_code += load_bias;
1150
    //    start_data += load_bias;
1151
    end_data += load_bias;
1152

    
1153
    if (elf_interpreter) {
1154
        if (interpreter_type & 1) {
1155
            elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1156
        }
1157
        else if (interpreter_type & 2) {
1158
            elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1159
                                            &interp_load_addr);
1160
        }
1161

    
1162
        close(interpreter_fd);
1163
        free(elf_interpreter);
1164

    
1165
        if (elf_entry == ~0UL) {
1166
            printf("Unable to load interpreter\n");
1167
            free(elf_phdata);
1168
            exit(-1);
1169
            return 0;
1170
        }
1171
    }
1172

    
1173
    free(elf_phdata);
1174

    
1175
    if (loglevel)
1176
        load_symbols(&elf_ex, bprm->fd);
1177

    
1178
    if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1179
    info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1180

    
1181
#ifdef LOW_ELF_STACK
1182
    info->start_stack = bprm->p = elf_stack - 4;
1183
#endif
1184
    bprm->p = create_elf_tables(bprm->p,
1185
                    bprm->argc,
1186
                    bprm->envc,
1187
                    &elf_ex,
1188
                    load_addr, load_bias,
1189
                    interp_load_addr,
1190
                    (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1191
                    info);
1192
    info->start_brk = info->brk = elf_brk;
1193
    info->end_code = end_code;
1194
    info->start_code = start_code;
1195
    info->start_data = end_code;
1196
    info->end_data = end_data;
1197
    info->start_stack = bprm->p;
1198

    
1199
    /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1200
       sections */
1201
    set_brk(elf_bss, elf_brk);
1202

    
1203
    padzero(elf_bss);
1204

    
1205
#if 0
1206
    printf("(start_brk) %x\n" , info->start_brk);
1207
    printf("(end_code) %x\n" , info->end_code);
1208
    printf("(start_code) %x\n" , info->start_code);
1209
    printf("(end_data) %x\n" , info->end_data);
1210
    printf("(start_stack) %x\n" , info->start_stack);
1211
    printf("(brk) %x\n" , info->brk);
1212
#endif
1213

    
1214
    if ( info->personality == PER_SVR4 )
1215
    {
1216
            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1217
               and some applications "depend" upon this behavior.
1218
               Since we do not have the power to recompile these, we
1219
               emulate the SVr4 behavior.  Sigh.  */
1220
            mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1221
                                      MAP_FIXED | MAP_PRIVATE, -1, 0);
1222
    }
1223

    
1224
    info->entry = elf_entry;
1225

    
1226
    return 0;
1227
}
1228

    
1229
static int load_aout_interp(void * exptr, int interp_fd)
1230
{
1231
    printf("a.out interpreter not yet supported\n");
1232
    return(0);
1233
}
1234

    
1235
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
1236
{
1237
    init_thread(regs, infop);
1238
}