Statistics
| Branch: | Revision:

root / linux-user / elfload.c @ 2f619698

History | View | Annotate | Download (40.6 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
/* from personality.h */
16

    
17
/*
18
 * Flags for bug emulation.
19
 *
20
 * These occupy the top three bytes.
21
 */
22
enum {
23
        ADDR_NO_RANDOMIZE =         0x0040000,        /* disable randomization of VA space */
24
        FDPIC_FUNCPTRS =        0x0080000,        /* userspace function ptrs point to descriptors
25
                                                 * (signal handling)
26
                                                 */
27
        MMAP_PAGE_ZERO =        0x0100000,
28
        ADDR_COMPAT_LAYOUT =        0x0200000,
29
        READ_IMPLIES_EXEC =        0x0400000,
30
        ADDR_LIMIT_32BIT =        0x0800000,
31
        SHORT_INODE =                0x1000000,
32
        WHOLE_SECONDS =                0x2000000,
33
        STICKY_TIMEOUTS        =        0x4000000,
34
        ADDR_LIMIT_3GB =         0x8000000,
35
};
36

    
37
/*
38
 * Personality types.
39
 *
40
 * These go in the low byte.  Avoid using the top bit, it will
41
 * conflict with error returns.
42
 */
43
enum {
44
        PER_LINUX =                0x0000,
45
        PER_LINUX_32BIT =        0x0000 | ADDR_LIMIT_32BIT,
46
        PER_LINUX_FDPIC =        0x0000 | FDPIC_FUNCPTRS,
47
        PER_SVR4 =                0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
48
        PER_SVR3 =                0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
49
        PER_SCOSVR3 =                0x0003 | STICKY_TIMEOUTS |
50
                                         WHOLE_SECONDS | SHORT_INODE,
51
        PER_OSR5 =                0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS,
52
        PER_WYSEV386 =                0x0004 | STICKY_TIMEOUTS | SHORT_INODE,
53
        PER_ISCR4 =                0x0005 | STICKY_TIMEOUTS,
54
        PER_BSD =                0x0006,
55
        PER_SUNOS =                0x0006 | STICKY_TIMEOUTS,
56
        PER_XENIX =                0x0007 | STICKY_TIMEOUTS | SHORT_INODE,
57
        PER_LINUX32 =                0x0008,
58
        PER_LINUX32_3GB =        0x0008 | ADDR_LIMIT_3GB,
59
        PER_IRIX32 =                0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */
60
        PER_IRIXN32 =                0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */
61
        PER_IRIX64 =                0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */
62
        PER_RISCOS =                0x000c,
63
        PER_SOLARIS =                0x000d | STICKY_TIMEOUTS,
64
        PER_UW7 =                0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
65
        PER_OSF4 =                0x000f,                         /* OSF/1 v4 */
66
        PER_HPUX =                0x0010,
67
        PER_MASK =                0x00ff,
68
};
69

    
70
/*
71
 * Return the base personality without flags.
72
 */
73
#define personality(pers)        (pers & PER_MASK)
74

    
75
/* this flag is uneffective under linux too, should be deleted */
76
#ifndef MAP_DENYWRITE
77
#define MAP_DENYWRITE 0
78
#endif
79

    
80
/* should probably go in elf.h */
81
#ifndef ELIBBAD
82
#define ELIBBAD 80
83
#endif
84

    
85
#ifdef TARGET_I386
86

    
87
#define ELF_PLATFORM get_elf_platform()
88

    
89
static const char *get_elf_platform(void)
90
{
91
    static char elf_platform[] = "i386";
92
    int family = (global_env->cpuid_version >> 8) & 0xff;
93
    if (family > 6)
94
        family = 6;
95
    if (family >= 3)
96
        elf_platform[1] = '0' + family;
97
    return elf_platform;
98
}
99

    
100
#define ELF_HWCAP get_elf_hwcap()
101

    
102
static uint32_t get_elf_hwcap(void)
103
{
104
  return global_env->cpuid_features;
105
}
106

    
107
#ifdef TARGET_X86_64
108
#define ELF_START_MMAP 0x2aaaaab000ULL
109
#define elf_check_arch(x) ( ((x) == ELF_ARCH) )
110

    
111
#define ELF_CLASS      ELFCLASS64
112
#define ELF_DATA       ELFDATA2LSB
113
#define ELF_ARCH       EM_X86_64
114

    
115
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
116
{
117
    regs->rax = 0;
118
    regs->rsp = infop->start_stack;
119
    regs->rip = infop->entry;
120
}
121

    
122
#else
123

    
124
#define ELF_START_MMAP 0x80000000
125

    
126
/*
127
 * This is used to ensure we don't load something for the wrong architecture.
128
 */
129
#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
130

    
131
/*
132
 * These are used to set parameters in the core dumps.
133
 */
134
#define ELF_CLASS        ELFCLASS32
135
#define ELF_DATA        ELFDATA2LSB
136
#define ELF_ARCH        EM_386
137

    
138
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
139
{
140
    regs->esp = infop->start_stack;
141
    regs->eip = infop->entry;
142

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

149
       A value of 0 tells we have no such handler.  */
150
    regs->edx = 0;
151
}
152
#endif
153

    
154
#define USE_ELF_CORE_DUMP
155
#define ELF_EXEC_PAGESIZE        4096
156

    
157
#endif
158

    
159
#ifdef TARGET_ARM
160

    
161
#define ELF_START_MMAP 0x80000000
162

    
163
#define elf_check_arch(x) ( (x) == EM_ARM )
164

    
165
#define ELF_CLASS        ELFCLASS32
166
#ifdef TARGET_WORDS_BIGENDIAN
167
#define ELF_DATA        ELFDATA2MSB
168
#else
169
#define ELF_DATA        ELFDATA2LSB
170
#endif
171
#define ELF_ARCH        EM_ARM
172

    
173
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
174
{
175
    abi_long stack = infop->start_stack;
176
    memset(regs, 0, sizeof(*regs));
177
    regs->ARM_cpsr = 0x10;
178
    if (infop->entry & 1)
179
      regs->ARM_cpsr |= CPSR_T;
180
    regs->ARM_pc = infop->entry & 0xfffffffe;
181
    regs->ARM_sp = infop->start_stack;
182
    /* FIXME - what to for failure of get_user()? */
183
    get_user_ual(regs->ARM_r2, stack + 8); /* envp */
184
    get_user_ual(regs->ARM_r1, stack + 4); /* envp */
185
    /* XXX: it seems that r0 is zeroed after ! */
186
    regs->ARM_r0 = 0;
187
    /* For uClinux PIC binaries.  */
188
    /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
189
    regs->ARM_r10 = infop->start_data;
190
}
191

    
192
#define USE_ELF_CORE_DUMP
193
#define ELF_EXEC_PAGESIZE        4096
194

    
195
enum
196
{
197
  ARM_HWCAP_ARM_SWP       = 1 << 0,
198
  ARM_HWCAP_ARM_HALF      = 1 << 1,
199
  ARM_HWCAP_ARM_THUMB     = 1 << 2,
200
  ARM_HWCAP_ARM_26BIT     = 1 << 3,
201
  ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
202
  ARM_HWCAP_ARM_FPA       = 1 << 5,
203
  ARM_HWCAP_ARM_VFP       = 1 << 6,
204
  ARM_HWCAP_ARM_EDSP      = 1 << 7,
205
};
206

    
207
#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF              \
208
                    | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT     \
209
                    | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP)
210

    
211
#endif
212

    
213
#ifdef TARGET_SPARC
214
#ifdef TARGET_SPARC64
215

    
216
#define ELF_START_MMAP 0x80000000
217

    
218
#ifndef TARGET_ABI32
219
#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
220
#else
221
#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
222
#endif
223

    
224
#define ELF_CLASS   ELFCLASS64
225
#define ELF_DATA    ELFDATA2MSB
226
#define ELF_ARCH    EM_SPARCV9
227

    
228
#define STACK_BIAS                2047
229

    
230
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
231
{
232
#ifndef TARGET_ABI32
233
    regs->tstate = 0;
234
#endif
235
    regs->pc = infop->entry;
236
    regs->npc = regs->pc + 4;
237
    regs->y = 0;
238
#ifdef TARGET_ABI32
239
    regs->u_regs[14] = infop->start_stack - 16 * 4;
240
#else
241
    if (personality(infop->personality) == PER_LINUX32)
242
        regs->u_regs[14] = infop->start_stack - 16 * 4;
243
    else
244
        regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
245
#endif
246
}
247

    
248
#else
249
#define ELF_START_MMAP 0x80000000
250

    
251
#define elf_check_arch(x) ( (x) == EM_SPARC )
252

    
253
#define ELF_CLASS   ELFCLASS32
254
#define ELF_DATA    ELFDATA2MSB
255
#define ELF_ARCH    EM_SPARC
256

    
257
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
258
{
259
    regs->psr = 0;
260
    regs->pc = infop->entry;
261
    regs->npc = regs->pc + 4;
262
    regs->y = 0;
263
    regs->u_regs[14] = infop->start_stack - 16 * 4;
264
}
265

    
266
#endif
267
#endif
268

    
269
#ifdef TARGET_PPC
270

    
271
#define ELF_START_MMAP 0x80000000
272

    
273
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
274

    
275
#define elf_check_arch(x) ( (x) == EM_PPC64 )
276

    
277
#define ELF_CLASS        ELFCLASS64
278

    
279
#else
280

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

    
283
#define ELF_CLASS        ELFCLASS32
284

    
285
#endif
286

    
287
#ifdef TARGET_WORDS_BIGENDIAN
288
#define ELF_DATA        ELFDATA2MSB
289
#else
290
#define ELF_DATA        ELFDATA2LSB
291
#endif
292
#define ELF_ARCH        EM_PPC
293

    
294
/*
295
 * We need to put in some extra aux table entries to tell glibc what
296
 * the cache block size is, so it can use the dcbz instruction safely.
297
 */
298
#define AT_DCACHEBSIZE          19
299
#define AT_ICACHEBSIZE          20
300
#define AT_UCACHEBSIZE          21
301
/* A special ignored type value for PPC, for glibc compatibility.  */
302
#define AT_IGNOREPPC            22
303
/*
304
 * The requirements here are:
305
 * - keep the final alignment of sp (sp & 0xf)
306
 * - make sure the 32-bit value at the first 16 byte aligned position of
307
 *   AUXV is greater than 16 for glibc compatibility.
308
 *   AT_IGNOREPPC is used for that.
309
 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
310
 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
311
 */
312
#define DLINFO_ARCH_ITEMS       5
313
#define ARCH_DLINFO                                                     \
314
do {                                                                    \
315
        NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);                              \
316
        NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);                              \
317
        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                                 \
318
        /*                                                              \
319
         * Now handle glibc compatibility.                              \
320
         */                                                             \
321
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
322
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
323
 } while (0)
324

    
325
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
326
{
327
    abi_ulong pos = infop->start_stack;
328
    abi_ulong tmp;
329
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
330
    abi_ulong entry, toc;
331
#endif
332

    
333
    _regs->gpr[1] = infop->start_stack;
334
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
335
    entry = ldq_raw(infop->entry) + infop->load_addr;
336
    toc = ldq_raw(infop->entry + 8) + infop->load_addr;
337
    _regs->gpr[2] = toc;
338
    infop->entry = entry;
339
#endif
340
    _regs->nip = infop->entry;
341
    /* Note that isn't exactly what regular kernel does
342
     * but this is what the ABI wants and is needed to allow
343
     * execution of PPC BSD programs.
344
     */
345
    /* FIXME - what to for failure of get_user()? */
346
    get_user_ual(_regs->gpr[3], pos);
347
    pos += sizeof(abi_ulong);
348
    _regs->gpr[4] = pos;
349
    for (tmp = 1; tmp != 0; pos += sizeof(abi_ulong))
350
        tmp = ldl(pos);
351
    _regs->gpr[5] = pos;
352
}
353

    
354
#define USE_ELF_CORE_DUMP
355
#define ELF_EXEC_PAGESIZE        4096
356

    
357
#endif
358

    
359
#ifdef TARGET_MIPS
360

    
361
#define ELF_START_MMAP 0x80000000
362

    
363
#define elf_check_arch(x) ( (x) == EM_MIPS )
364

    
365
#ifdef TARGET_MIPS64
366
#define ELF_CLASS   ELFCLASS64
367
#else
368
#define ELF_CLASS   ELFCLASS32
369
#endif
370
#ifdef TARGET_WORDS_BIGENDIAN
371
#define ELF_DATA        ELFDATA2MSB
372
#else
373
#define ELF_DATA        ELFDATA2LSB
374
#endif
375
#define ELF_ARCH    EM_MIPS
376

    
377
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
378
{
379
    regs->cp0_status = 2 << CP0St_KSU;
380
    regs->cp0_epc = infop->entry;
381
    regs->regs[29] = infop->start_stack;
382
}
383

    
384
#define USE_ELF_CORE_DUMP
385
#define ELF_EXEC_PAGESIZE        4096
386

    
387
#endif /* TARGET_MIPS */
388

    
389
#ifdef TARGET_SH4
390

    
391
#define ELF_START_MMAP 0x80000000
392

    
393
#define elf_check_arch(x) ( (x) == EM_SH )
394

    
395
#define ELF_CLASS ELFCLASS32
396
#define ELF_DATA  ELFDATA2LSB
397
#define ELF_ARCH  EM_SH
398

    
399
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
400
{
401
  /* Check other registers XXXXX */
402
  regs->pc = infop->entry;
403
  regs->regs[15] = infop->start_stack;
404
}
405

    
406
#define USE_ELF_CORE_DUMP
407
#define ELF_EXEC_PAGESIZE        4096
408

    
409
#endif
410

    
411
#ifdef TARGET_CRIS
412

    
413
#define ELF_START_MMAP 0x80000000
414

    
415
#define elf_check_arch(x) ( (x) == EM_CRIS )
416

    
417
#define ELF_CLASS ELFCLASS32
418
#define ELF_DATA  ELFDATA2LSB
419
#define ELF_ARCH  EM_CRIS
420

    
421
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
422
{
423
  regs->erp = infop->entry;
424
}
425

    
426
#define USE_ELF_CORE_DUMP
427
#define ELF_EXEC_PAGESIZE        8192
428

    
429
#endif
430

    
431
#ifdef TARGET_M68K
432

    
433
#define ELF_START_MMAP 0x80000000
434

    
435
#define elf_check_arch(x) ( (x) == EM_68K )
436

    
437
#define ELF_CLASS        ELFCLASS32
438
#define ELF_DATA        ELFDATA2MSB
439
#define ELF_ARCH        EM_68K
440

    
441
/* ??? Does this need to do anything?
442
#define ELF_PLAT_INIT(_r) */
443

    
444
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
445
{
446
    regs->usp = infop->start_stack;
447
    regs->sr = 0;
448
    regs->pc = infop->entry;
449
}
450

    
451
#define USE_ELF_CORE_DUMP
452
#define ELF_EXEC_PAGESIZE        8192
453

    
454
#endif
455

    
456
#ifdef TARGET_ALPHA
457

    
458
#define ELF_START_MMAP (0x30000000000ULL)
459

    
460
#define elf_check_arch(x) ( (x) == ELF_ARCH )
461

    
462
#define ELF_CLASS      ELFCLASS64
463
#define ELF_DATA       ELFDATA2MSB
464
#define ELF_ARCH       EM_ALPHA
465

    
466
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
467
{
468
    regs->pc = infop->entry;
469
    regs->ps = 8;
470
    regs->usp = infop->start_stack;
471
    regs->unique = infop->start_data; /* ? */
472
    printf("Set unique value to " TARGET_FMT_lx " (" TARGET_FMT_lx ")\n",
473
           regs->unique, infop->start_data);
474
}
475

    
476
#define USE_ELF_CORE_DUMP
477
#define ELF_EXEC_PAGESIZE        8192
478

    
479
#endif /* TARGET_ALPHA */
480

    
481
#ifndef ELF_PLATFORM
482
#define ELF_PLATFORM (NULL)
483
#endif
484

    
485
#ifndef ELF_HWCAP
486
#define ELF_HWCAP 0
487
#endif
488

    
489
#ifdef TARGET_ABI32
490
#undef ELF_CLASS
491
#define ELF_CLASS ELFCLASS32
492
#undef bswaptls
493
#define bswaptls(ptr) bswap32s(ptr)
494
#endif
495

    
496
#include "elf.h"
497

    
498
struct exec
499
{
500
  unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
501
  unsigned int a_text;   /* length of text, in bytes */
502
  unsigned int a_data;   /* length of data, in bytes */
503
  unsigned int a_bss;    /* length of uninitialized data area, in bytes */
504
  unsigned int a_syms;   /* length of symbol table data in file, in bytes */
505
  unsigned int a_entry;  /* start address */
506
  unsigned int a_trsize; /* length of relocation info for text, in bytes */
507
  unsigned int a_drsize; /* length of relocation info for data, in bytes */
508
};
509

    
510

    
511
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
512
#define OMAGIC 0407
513
#define NMAGIC 0410
514
#define ZMAGIC 0413
515
#define QMAGIC 0314
516

    
517
/* max code+data+bss space allocated to elf interpreter */
518
#define INTERP_MAP_SIZE (32 * 1024 * 1024)
519

    
520
/* max code+data+bss+brk space allocated to ET_DYN executables */
521
#define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
522

    
523
/* Necessary parameters */
524
#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
525
#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
526
#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
527

    
528
#define INTERPRETER_NONE 0
529
#define INTERPRETER_AOUT 1
530
#define INTERPRETER_ELF 2
531

    
532
#define DLINFO_ITEMS 12
533

    
534
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
535
{
536
        memcpy(to, from, n);
537
}
538

    
539
extern unsigned long x86_stack_size;
540

    
541
static int load_aout_interp(void * exptr, int interp_fd);
542

    
543
#ifdef BSWAP_NEEDED
544
static void bswap_ehdr(struct elfhdr *ehdr)
545
{
546
    bswap16s(&ehdr->e_type);                        /* Object file type */
547
    bswap16s(&ehdr->e_machine);                /* Architecture */
548
    bswap32s(&ehdr->e_version);                /* Object file version */
549
    bswaptls(&ehdr->e_entry);                /* Entry point virtual address */
550
    bswaptls(&ehdr->e_phoff);                /* Program header table file offset */
551
    bswaptls(&ehdr->e_shoff);                /* Section header table file offset */
552
    bswap32s(&ehdr->e_flags);                /* Processor-specific flags */
553
    bswap16s(&ehdr->e_ehsize);                /* ELF header size in bytes */
554
    bswap16s(&ehdr->e_phentsize);                /* Program header table entry size */
555
    bswap16s(&ehdr->e_phnum);                /* Program header table entry count */
556
    bswap16s(&ehdr->e_shentsize);                /* Section header table entry size */
557
    bswap16s(&ehdr->e_shnum);                /* Section header table entry count */
558
    bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
559
}
560

    
561
static void bswap_phdr(struct elf_phdr *phdr)
562
{
563
    bswap32s(&phdr->p_type);                        /* Segment type */
564
    bswaptls(&phdr->p_offset);                /* Segment file offset */
565
    bswaptls(&phdr->p_vaddr);                /* Segment virtual address */
566
    bswaptls(&phdr->p_paddr);                /* Segment physical address */
567
    bswaptls(&phdr->p_filesz);                /* Segment size in file */
568
    bswaptls(&phdr->p_memsz);                /* Segment size in memory */
569
    bswap32s(&phdr->p_flags);                /* Segment flags */
570
    bswaptls(&phdr->p_align);                /* Segment alignment */
571
}
572

    
573
static void bswap_shdr(struct elf_shdr *shdr)
574
{
575
    bswap32s(&shdr->sh_name);
576
    bswap32s(&shdr->sh_type);
577
    bswaptls(&shdr->sh_flags);
578
    bswaptls(&shdr->sh_addr);
579
    bswaptls(&shdr->sh_offset);
580
    bswaptls(&shdr->sh_size);
581
    bswap32s(&shdr->sh_link);
582
    bswap32s(&shdr->sh_info);
583
    bswaptls(&shdr->sh_addralign);
584
    bswaptls(&shdr->sh_entsize);
585
}
586

    
587
static void bswap_sym(struct elf_sym *sym)
588
{
589
    bswap32s(&sym->st_name);
590
    bswaptls(&sym->st_value);
591
    bswaptls(&sym->st_size);
592
    bswap16s(&sym->st_shndx);
593
}
594
#endif
595

    
596
/*
597
 * 'copy_elf_strings()' copies argument/envelope strings from user
598
 * memory to free pages in kernel mem. These are in a format ready
599
 * to be put directly into the top of new user memory.
600
 *
601
 */
602
static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
603
                                  abi_ulong p)
604
{
605
    char *tmp, *tmp1, *pag = NULL;
606
    int len, offset = 0;
607

    
608
    if (!p) {
609
        return 0;       /* bullet-proofing */
610
    }
611
    while (argc-- > 0) {
612
        tmp = argv[argc];
613
        if (!tmp) {
614
            fprintf(stderr, "VFS: argc is wrong");
615
            exit(-1);
616
        }
617
        tmp1 = tmp;
618
        while (*tmp++);
619
        len = tmp - tmp1;
620
        if (p < len) {  /* this shouldn't happen - 128kB */
621
                return 0;
622
        }
623
        while (len) {
624
            --p; --tmp; --len;
625
            if (--offset < 0) {
626
                offset = p % TARGET_PAGE_SIZE;
627
                pag = (char *)page[p/TARGET_PAGE_SIZE];
628
                if (!pag) {
629
                    pag = (char *)malloc(TARGET_PAGE_SIZE);
630
                    memset(pag, 0, TARGET_PAGE_SIZE);
631
                    page[p/TARGET_PAGE_SIZE] = pag;
632
                    if (!pag)
633
                        return 0;
634
                }
635
            }
636
            if (len == 0 || offset == 0) {
637
                *(pag + offset) = *tmp;
638
            }
639
            else {
640
              int bytes_to_copy = (len > offset) ? offset : len;
641
              tmp -= bytes_to_copy;
642
              p -= bytes_to_copy;
643
              offset -= bytes_to_copy;
644
              len -= bytes_to_copy;
645
              memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
646
            }
647
        }
648
    }
649
    return p;
650
}
651

    
652
static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
653
                                 struct image_info *info)
654
{
655
    abi_ulong stack_base, size, error;
656
    int i;
657

    
658
    /* Create enough stack to hold everything.  If we don't use
659
     * it for args, we'll use it for something else...
660
     */
661
    size = x86_stack_size;
662
    if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
663
        size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
664
    error = target_mmap(0,
665
                        size + qemu_host_page_size,
666
                        PROT_READ | PROT_WRITE,
667
                        MAP_PRIVATE | MAP_ANONYMOUS,
668
                        -1, 0);
669
    if (error == -1) {
670
        perror("stk mmap");
671
        exit(-1);
672
    }
673
    /* we reserve one extra page at the top of the stack as guard */
674
    target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
675

    
676
    stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
677
    p += stack_base;
678

    
679
    for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
680
        if (bprm->page[i]) {
681
            info->rss++;
682
            /* FIXME - check return value of memcpy_to_target() for failure */
683
            memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
684
            free(bprm->page[i]);
685
        }
686
        stack_base += TARGET_PAGE_SIZE;
687
    }
688
    return p;
689
}
690

    
691
static void set_brk(abi_ulong start, abi_ulong end)
692
{
693
        /* page-align the start and end addresses... */
694
        start = HOST_PAGE_ALIGN(start);
695
        end = HOST_PAGE_ALIGN(end);
696
        if (end <= start)
697
                return;
698
        if(target_mmap(start, end - start,
699
                       PROT_READ | PROT_WRITE | PROT_EXEC,
700
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == -1) {
701
            perror("cannot mmap brk");
702
            exit(-1);
703
        }
704
}
705

    
706

    
707
/* We need to explicitly zero any fractional pages after the data
708
   section (i.e. bss).  This would contain the junk from the file that
709
   should not be in memory. */
710
static void padzero(abi_ulong elf_bss, abi_ulong last_bss)
711
{
712
        abi_ulong nbyte;
713

    
714
        if (elf_bss >= last_bss)
715
                return;
716

    
717
        /* XXX: this is really a hack : if the real host page size is
718
           smaller than the target page size, some pages after the end
719
           of the file may not be mapped. A better fix would be to
720
           patch target_mmap(), but it is more complicated as the file
721
           size must be known */
722
        if (qemu_real_host_page_size < qemu_host_page_size) {
723
            abi_ulong end_addr, end_addr1;
724
            end_addr1 = (elf_bss + qemu_real_host_page_size - 1) &
725
                ~(qemu_real_host_page_size - 1);
726
            end_addr = HOST_PAGE_ALIGN(elf_bss);
727
            if (end_addr1 < end_addr) {
728
                mmap((void *)g2h(end_addr1), end_addr - end_addr1,
729
                     PROT_READ|PROT_WRITE|PROT_EXEC,
730
                     MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
731
            }
732
        }
733

    
734
        nbyte = elf_bss & (qemu_host_page_size-1);
735
        if (nbyte) {
736
            nbyte = qemu_host_page_size - nbyte;
737
            do {
738
                /* FIXME - what to do if put_user() fails? */
739
                put_user_u8(0, elf_bss);
740
                elf_bss++;
741
            } while (--nbyte);
742
        }
743
}
744

    
745

    
746
static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
747
                                   struct elfhdr * exec,
748
                                   abi_ulong load_addr,
749
                                   abi_ulong load_bias,
750
                                   abi_ulong interp_load_addr, int ibcs,
751
                                   struct image_info *info)
752
{
753
        abi_ulong sp;
754
        int size;
755
        abi_ulong u_platform;
756
        const char *k_platform;
757
        const int n = sizeof(elf_addr_t);
758

    
759
        sp = p;
760
        u_platform = 0;
761
        k_platform = ELF_PLATFORM;
762
        if (k_platform) {
763
            size_t len = strlen(k_platform) + 1;
764
            sp -= (len + n - 1) & ~(n - 1);
765
            u_platform = sp;
766
            /* FIXME - check return value of memcpy_to_target() for failure */
767
            memcpy_to_target(sp, k_platform, len);
768
        }
769
        /*
770
         * Force 16 byte _final_ alignment here for generality.
771
         */
772
        sp = sp &~ (abi_ulong)15;
773
        size = (DLINFO_ITEMS + 1) * 2;
774
        if (k_platform)
775
          size += 2;
776
#ifdef DLINFO_ARCH_ITEMS
777
        size += DLINFO_ARCH_ITEMS * 2;
778
#endif
779
        size += envc + argc + 2;
780
        size += (!ibcs ? 3 : 1);        /* argc itself */
781
        size *= n;
782
        if (size & 15)
783
            sp -= 16 - (size & 15);
784

    
785
        /* This is correct because Linux defines
786
         * elf_addr_t as Elf32_Off / Elf64_Off
787
         */
788
#define NEW_AUX_ENT(id, val) do {                \
789
            sp -= n; put_user_ual(val, sp);        \
790
            sp -= n; put_user_ual(id, sp);        \
791
          } while(0)
792

    
793
        NEW_AUX_ENT (AT_NULL, 0);
794

    
795
        /* There must be exactly DLINFO_ITEMS entries here.  */
796
        NEW_AUX_ENT(AT_PHDR, (abi_ulong)(load_addr + exec->e_phoff));
797
        NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
798
        NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
799
        NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
800
        NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_load_addr));
801
        NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
802
        NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
803
        NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
804
        NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
805
        NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
806
        NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
807
        NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
808
        if (k_platform)
809
            NEW_AUX_ENT(AT_PLATFORM, u_platform);
810
#ifdef ARCH_DLINFO
811
        /*
812
         * ARCH_DLINFO must come last so platform specific code can enforce
813
         * special alignment requirements on the AUXV if necessary (eg. PPC).
814
         */
815
        ARCH_DLINFO;
816
#endif
817
#undef NEW_AUX_ENT
818

    
819
        sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
820
        return sp;
821
}
822

    
823

    
824
static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
825
                                 int interpreter_fd,
826
                                 abi_ulong *interp_load_addr)
827
{
828
        struct elf_phdr *elf_phdata  =  NULL;
829
        struct elf_phdr *eppnt;
830
        abi_ulong load_addr = 0;
831
        int load_addr_set = 0;
832
        int retval;
833
        abi_ulong last_bss, elf_bss;
834
        abi_ulong error;
835
        int i;
836

    
837
        elf_bss = 0;
838
        last_bss = 0;
839
        error = 0;
840

    
841
#ifdef BSWAP_NEEDED
842
        bswap_ehdr(interp_elf_ex);
843
#endif
844
        /* First of all, some simple consistency checks */
845
        if ((interp_elf_ex->e_type != ET_EXEC &&
846
             interp_elf_ex->e_type != ET_DYN) ||
847
           !elf_check_arch(interp_elf_ex->e_machine)) {
848
                return ~((abi_ulong)0UL);
849
        }
850

    
851

    
852
        /* Now read in all of the header information */
853

    
854
        if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
855
            return ~(abi_ulong)0UL;
856

    
857
        elf_phdata =  (struct elf_phdr *)
858
                malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
859

    
860
        if (!elf_phdata)
861
          return ~((abi_ulong)0UL);
862

    
863
        /*
864
         * If the size of this structure has changed, then punt, since
865
         * we will be doing the wrong thing.
866
         */
867
        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
868
            free(elf_phdata);
869
            return ~((abi_ulong)0UL);
870
        }
871

    
872
        retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
873
        if(retval >= 0) {
874
            retval = read(interpreter_fd,
875
                           (char *) elf_phdata,
876
                           sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
877
        }
878
        if (retval < 0) {
879
                perror("load_elf_interp");
880
                exit(-1);
881
                free (elf_phdata);
882
                return retval;
883
         }
884
#ifdef BSWAP_NEEDED
885
        eppnt = elf_phdata;
886
        for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
887
            bswap_phdr(eppnt);
888
        }
889
#endif
890

    
891
        if (interp_elf_ex->e_type == ET_DYN) {
892
            /* in order to avoid hardcoding the interpreter load
893
               address in qemu, we allocate a big enough memory zone */
894
            error = target_mmap(0, INTERP_MAP_SIZE,
895
                                PROT_NONE, MAP_PRIVATE | MAP_ANON,
896
                                -1, 0);
897
            if (error == -1) {
898
                perror("mmap");
899
                exit(-1);
900
            }
901
            load_addr = error;
902
            load_addr_set = 1;
903
        }
904

    
905
        eppnt = elf_phdata;
906
        for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
907
          if (eppnt->p_type == PT_LOAD) {
908
            int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
909
            int elf_prot = 0;
910
            abi_ulong vaddr = 0;
911
            abi_ulong k;
912

    
913
            if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
914
            if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
915
            if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
916
            if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
917
                    elf_type |= MAP_FIXED;
918
                    vaddr = eppnt->p_vaddr;
919
            }
920
            error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
921
                 eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
922
                 elf_prot,
923
                 elf_type,
924
                 interpreter_fd,
925
                 eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
926

    
927
            if (error == -1) {
928
              /* Real error */
929
              close(interpreter_fd);
930
              free(elf_phdata);
931
              return ~((abi_ulong)0UL);
932
            }
933

    
934
            if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
935
              load_addr = error;
936
              load_addr_set = 1;
937
            }
938

    
939
            /*
940
             * Find the end of the file  mapping for this phdr, and keep
941
             * track of the largest address we see for this.
942
             */
943
            k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
944
            if (k > elf_bss) elf_bss = k;
945

    
946
            /*
947
             * Do the same thing for the memory mapping - between
948
             * elf_bss and last_bss is the bss section.
949
             */
950
            k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
951
            if (k > last_bss) last_bss = k;
952
          }
953

    
954
        /* Now use mmap to map the library into memory. */
955

    
956
        close(interpreter_fd);
957

    
958
        /*
959
         * Now fill out the bss section.  First pad the last page up
960
         * to the page boundary, and then perform a mmap to make sure
961
         * that there are zeromapped pages up to and including the last
962
         * bss page.
963
         */
964
        padzero(elf_bss, last_bss);
965
        elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
966

    
967
        /* Map the last of the bss segment */
968
        if (last_bss > elf_bss) {
969
            target_mmap(elf_bss, last_bss-elf_bss,
970
                        PROT_READ|PROT_WRITE|PROT_EXEC,
971
                        MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
972
        }
973
        free(elf_phdata);
974

    
975
        *interp_load_addr = load_addr;
976
        return ((abi_ulong) interp_elf_ex->e_entry) + load_addr;
977
}
978

    
979
/* Best attempt to load symbols from this ELF object. */
980
static void load_symbols(struct elfhdr *hdr, int fd)
981
{
982
    unsigned int i;
983
    struct elf_shdr sechdr, symtab, strtab;
984
    char *strings;
985
    struct syminfo *s;
986
#if (ELF_CLASS == ELFCLASS64)
987
    // Disas uses 32 bit symbols
988
    struct elf32_sym *syms32 = NULL;
989
    struct elf_sym *sym;
990
#endif
991

    
992
    lseek(fd, hdr->e_shoff, SEEK_SET);
993
    for (i = 0; i < hdr->e_shnum; i++) {
994
        if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
995
            return;
996
#ifdef BSWAP_NEEDED
997
        bswap_shdr(&sechdr);
998
#endif
999
        if (sechdr.sh_type == SHT_SYMTAB) {
1000
            symtab = sechdr;
1001
            lseek(fd, hdr->e_shoff
1002
                  + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
1003
            if (read(fd, &strtab, sizeof(strtab))
1004
                != sizeof(strtab))
1005
                return;
1006
#ifdef BSWAP_NEEDED
1007
            bswap_shdr(&strtab);
1008
#endif
1009
            goto found;
1010
        }
1011
    }
1012
    return; /* Shouldn't happen... */
1013

    
1014
 found:
1015
    /* Now know where the strtab and symtab are.  Snarf them. */
1016
    s = malloc(sizeof(*s));
1017
    s->disas_symtab = malloc(symtab.sh_size);
1018
#if (ELF_CLASS == ELFCLASS64)
1019
    syms32 = malloc(symtab.sh_size / sizeof(struct elf_sym)
1020
                    * sizeof(struct elf32_sym));
1021
#endif
1022
    s->disas_strtab = strings = malloc(strtab.sh_size);
1023
    if (!s->disas_symtab || !s->disas_strtab)
1024
        return;
1025

    
1026
    lseek(fd, symtab.sh_offset, SEEK_SET);
1027
    if (read(fd, s->disas_symtab, symtab.sh_size) != symtab.sh_size)
1028
        return;
1029

    
1030
    for (i = 0; i < symtab.sh_size / sizeof(struct elf_sym); i++) {
1031
#ifdef BSWAP_NEEDED
1032
        bswap_sym(s->disas_symtab + sizeof(struct elf_sym)*i);
1033
#endif
1034
#if (ELF_CLASS == ELFCLASS64)
1035
        sym = s->disas_symtab + sizeof(struct elf_sym)*i;
1036
        syms32[i].st_name = sym->st_name;
1037
        syms32[i].st_info = sym->st_info;
1038
        syms32[i].st_other = sym->st_other;
1039
        syms32[i].st_shndx = sym->st_shndx;
1040
        syms32[i].st_value = sym->st_value & 0xffffffff;
1041
        syms32[i].st_size = sym->st_size & 0xffffffff;
1042
#endif
1043
    }
1044

    
1045
#if (ELF_CLASS == ELFCLASS64)
1046
    free(s->disas_symtab);
1047
    s->disas_symtab = syms32;
1048
#endif
1049
    lseek(fd, strtab.sh_offset, SEEK_SET);
1050
    if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
1051
        return;
1052
    s->disas_num_syms = symtab.sh_size / sizeof(struct elf_sym);
1053
    s->next = syminfos;
1054
    syminfos = s;
1055
}
1056

    
1057
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1058
                    struct image_info * info)
1059
{
1060
    struct elfhdr elf_ex;
1061
    struct elfhdr interp_elf_ex;
1062
    struct exec interp_ex;
1063
    int interpreter_fd = -1; /* avoid warning */
1064
    abi_ulong load_addr, load_bias;
1065
    int load_addr_set = 0;
1066
    unsigned int interpreter_type = INTERPRETER_NONE;
1067
    unsigned char ibcs2_interpreter;
1068
    int i;
1069
    abi_ulong mapped_addr;
1070
    struct elf_phdr * elf_ppnt;
1071
    struct elf_phdr *elf_phdata;
1072
    abi_ulong elf_bss, k, elf_brk;
1073
    int retval;
1074
    char * elf_interpreter;
1075
    abi_ulong elf_entry, interp_load_addr = 0;
1076
    int status;
1077
    abi_ulong start_code, end_code, start_data, end_data;
1078
    abi_ulong reloc_func_desc = 0;
1079
    abi_ulong elf_stack;
1080
    char passed_fileno[6];
1081

    
1082
    ibcs2_interpreter = 0;
1083
    status = 0;
1084
    load_addr = 0;
1085
    load_bias = 0;
1086
    elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
1087
#ifdef BSWAP_NEEDED
1088
    bswap_ehdr(&elf_ex);
1089
#endif
1090

    
1091
    /* First of all, some simple consistency checks */
1092
    if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
1093
                                       (! elf_check_arch(elf_ex.e_machine))) {
1094
            return -ENOEXEC;
1095
    }
1096

    
1097
    bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1098
    bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1099
    bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1100
    if (!bprm->p) {
1101
        retval = -E2BIG;
1102
    }
1103

    
1104
    /* Now read in all of the header information */
1105
    elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
1106
    if (elf_phdata == NULL) {
1107
        return -ENOMEM;
1108
    }
1109

    
1110
    retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
1111
    if(retval > 0) {
1112
        retval = read(bprm->fd, (char *) elf_phdata,
1113
                                elf_ex.e_phentsize * elf_ex.e_phnum);
1114
    }
1115

    
1116
    if (retval < 0) {
1117
        perror("load_elf_binary");
1118
        exit(-1);
1119
        free (elf_phdata);
1120
        return -errno;
1121
    }
1122

    
1123
#ifdef BSWAP_NEEDED
1124
    elf_ppnt = elf_phdata;
1125
    for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
1126
        bswap_phdr(elf_ppnt);
1127
    }
1128
#endif
1129
    elf_ppnt = elf_phdata;
1130

    
1131
    elf_bss = 0;
1132
    elf_brk = 0;
1133

    
1134

    
1135
    elf_stack = ~((abi_ulong)0UL);
1136
    elf_interpreter = NULL;
1137
    start_code = ~((abi_ulong)0UL);
1138
    end_code = 0;
1139
    start_data = 0;
1140
    end_data = 0;
1141

    
1142
    for(i=0;i < elf_ex.e_phnum; i++) {
1143
        if (elf_ppnt->p_type == PT_INTERP) {
1144
            if ( elf_interpreter != NULL )
1145
            {
1146
                free (elf_phdata);
1147
                free(elf_interpreter);
1148
                close(bprm->fd);
1149
                return -EINVAL;
1150
            }
1151

    
1152
            /* This is the program interpreter used for
1153
             * shared libraries - for now assume that this
1154
             * is an a.out format binary
1155
             */
1156

    
1157
            elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
1158

    
1159
            if (elf_interpreter == NULL) {
1160
                free (elf_phdata);
1161
                close(bprm->fd);
1162
                return -ENOMEM;
1163
            }
1164

    
1165
            retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
1166
            if(retval >= 0) {
1167
                retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
1168
            }
1169
            if(retval < 0) {
1170
                 perror("load_elf_binary2");
1171
                exit(-1);
1172
            }
1173

    
1174
            /* If the program interpreter is one of these two,
1175
               then assume an iBCS2 image. Otherwise assume
1176
               a native linux image. */
1177

    
1178
            /* JRP - Need to add X86 lib dir stuff here... */
1179

    
1180
            if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
1181
                strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
1182
              ibcs2_interpreter = 1;
1183
            }
1184

    
1185
#if 0
1186
            printf("Using ELF interpreter %s\n", elf_interpreter);
1187
#endif
1188
            if (retval >= 0) {
1189
                retval = open(path(elf_interpreter), O_RDONLY);
1190
                if(retval >= 0) {
1191
                    interpreter_fd = retval;
1192
                }
1193
                else {
1194
                    perror(elf_interpreter);
1195
                    exit(-1);
1196
                    /* retval = -errno; */
1197
                }
1198
            }
1199

    
1200
            if (retval >= 0) {
1201
                retval = lseek(interpreter_fd, 0, SEEK_SET);
1202
                if(retval >= 0) {
1203
                    retval = read(interpreter_fd,bprm->buf,128);
1204
                }
1205
            }
1206
            if (retval >= 0) {
1207
                interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1208
                interp_elf_ex=*((struct elfhdr *) bprm->buf); /* elf exec-header */
1209
            }
1210
            if (retval < 0) {
1211
                perror("load_elf_binary3");
1212
                exit(-1);
1213
                free (elf_phdata);
1214
                free(elf_interpreter);
1215
                close(bprm->fd);
1216
                return retval;
1217
            }
1218
        }
1219
        elf_ppnt++;
1220
    }
1221

    
1222
    /* Some simple consistency checks for the interpreter */
1223
    if (elf_interpreter){
1224
        interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1225

    
1226
        /* Now figure out which format our binary is */
1227
        if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1228
                    (N_MAGIC(interp_ex) != QMAGIC)) {
1229
          interpreter_type = INTERPRETER_ELF;
1230
        }
1231

    
1232
        if (interp_elf_ex.e_ident[0] != 0x7f ||
1233
                    strncmp(&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1234
            interpreter_type &= ~INTERPRETER_ELF;
1235
        }
1236

    
1237
        if (!interpreter_type) {
1238
            free(elf_interpreter);
1239
            free(elf_phdata);
1240
            close(bprm->fd);
1241
            return -ELIBBAD;
1242
        }
1243
    }
1244

    
1245
    /* OK, we are done with that, now set up the arg stuff,
1246
       and then start this sucker up */
1247

    
1248
    {
1249
        char * passed_p;
1250

    
1251
        if (interpreter_type == INTERPRETER_AOUT) {
1252
            snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1253
            passed_p = passed_fileno;
1254

    
1255
            if (elf_interpreter) {
1256
                bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
1257
                bprm->argc++;
1258
            }
1259
        }
1260
        if (!bprm->p) {
1261
            if (elf_interpreter) {
1262
                free(elf_interpreter);
1263
            }
1264
            free (elf_phdata);
1265
            close(bprm->fd);
1266
            return -E2BIG;
1267
        }
1268
    }
1269

    
1270
    /* OK, This is the point of no return */
1271
    info->end_data = 0;
1272
    info->end_code = 0;
1273
    info->start_mmap = (abi_ulong)ELF_START_MMAP;
1274
    info->mmap = 0;
1275
    elf_entry = (abi_ulong) elf_ex.e_entry;
1276

    
1277
    /* Do this so that we can load the interpreter, if need be.  We will
1278
       change some of these later */
1279
    info->rss = 0;
1280
    bprm->p = setup_arg_pages(bprm->p, bprm, info);
1281
    info->start_stack = bprm->p;
1282

    
1283
    /* Now we do a little grungy work by mmaping the ELF image into
1284
     * the correct location in memory.  At this point, we assume that
1285
     * the image should be loaded at fixed address, not at a variable
1286
     * address.
1287
     */
1288

    
1289
    for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1290
        int elf_prot = 0;
1291
        int elf_flags = 0;
1292
        abi_ulong error;
1293

    
1294
        if (elf_ppnt->p_type != PT_LOAD)
1295
            continue;
1296

    
1297
        if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1298
        if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1299
        if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1300
        elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1301
        if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1302
            elf_flags |= MAP_FIXED;
1303
        } else if (elf_ex.e_type == ET_DYN) {
1304
            /* Try and get dynamic programs out of the way of the default mmap
1305
               base, as well as whatever program they might try to exec.  This
1306
               is because the brk will follow the loader, and is not movable.  */
1307
            /* NOTE: for qemu, we do a big mmap to get enough space
1308
               without hardcoding any address */
1309
            error = target_mmap(0, ET_DYN_MAP_SIZE,
1310
                                PROT_NONE, MAP_PRIVATE | MAP_ANON,
1311
                                -1, 0);
1312
            if (error == -1) {
1313
                perror("mmap");
1314
                exit(-1);
1315
            }
1316
            load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1317
        }
1318

    
1319
        error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1320
                            (elf_ppnt->p_filesz +
1321
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1322
                            elf_prot,
1323
                            (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1324
                            bprm->fd,
1325
                            (elf_ppnt->p_offset -
1326
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1327
        if (error == -1) {
1328
            perror("mmap");
1329
            exit(-1);
1330
        }
1331

    
1332
#ifdef LOW_ELF_STACK
1333
        if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1334
            elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1335
#endif
1336

    
1337
        if (!load_addr_set) {
1338
            load_addr_set = 1;
1339
            load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1340
            if (elf_ex.e_type == ET_DYN) {
1341
                load_bias += error -
1342
                    TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1343
                load_addr += load_bias;
1344
                reloc_func_desc = load_bias;
1345
            }
1346
        }
1347
        k = elf_ppnt->p_vaddr;
1348
        if (k < start_code)
1349
            start_code = k;
1350
        if (start_data < k)
1351
            start_data = k;
1352
        k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1353
        if (k > elf_bss)
1354
            elf_bss = k;
1355
        if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1356
            end_code = k;
1357
        if (end_data < k)
1358
            end_data = k;
1359
        k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1360
        if (k > elf_brk) elf_brk = k;
1361
    }
1362

    
1363
    elf_entry += load_bias;
1364
    elf_bss += load_bias;
1365
    elf_brk += load_bias;
1366
    start_code += load_bias;
1367
    end_code += load_bias;
1368
    start_data += load_bias;
1369
    end_data += load_bias;
1370

    
1371
    if (elf_interpreter) {
1372
        if (interpreter_type & 1) {
1373
            elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1374
        }
1375
        else if (interpreter_type & 2) {
1376
            elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1377
                                            &interp_load_addr);
1378
        }
1379
        reloc_func_desc = interp_load_addr;
1380

    
1381
        close(interpreter_fd);
1382
        free(elf_interpreter);
1383

    
1384
        if (elf_entry == ~((abi_ulong)0UL)) {
1385
            printf("Unable to load interpreter\n");
1386
            free(elf_phdata);
1387
            exit(-1);
1388
            return 0;
1389
        }
1390
    }
1391

    
1392
    free(elf_phdata);
1393

    
1394
    if (loglevel)
1395
        load_symbols(&elf_ex, bprm->fd);
1396

    
1397
    if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1398
    info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1399

    
1400
#ifdef LOW_ELF_STACK
1401
    info->start_stack = bprm->p = elf_stack - 4;
1402
#endif
1403
    bprm->p = create_elf_tables(bprm->p,
1404
                    bprm->argc,
1405
                    bprm->envc,
1406
                    &elf_ex,
1407
                    load_addr, load_bias,
1408
                    interp_load_addr,
1409
                    (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1410
                    info);
1411
    info->load_addr = reloc_func_desc;
1412
    info->start_brk = info->brk = elf_brk;
1413
    info->end_code = end_code;
1414
    info->start_code = start_code;
1415
    info->start_data = start_data;
1416
    info->end_data = end_data;
1417
    info->start_stack = bprm->p;
1418

    
1419
    /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1420
       sections */
1421
    set_brk(elf_bss, elf_brk);
1422

    
1423
    padzero(elf_bss, elf_brk);
1424

    
1425
#if 0
1426
    printf("(start_brk) %x\n" , info->start_brk);
1427
    printf("(end_code) %x\n" , info->end_code);
1428
    printf("(start_code) %x\n" , info->start_code);
1429
    printf("(end_data) %x\n" , info->end_data);
1430
    printf("(start_stack) %x\n" , info->start_stack);
1431
    printf("(brk) %x\n" , info->brk);
1432
#endif
1433

    
1434
    if ( info->personality == PER_SVR4 )
1435
    {
1436
            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1437
               and some applications "depend" upon this behavior.
1438
               Since we do not have the power to recompile these, we
1439
               emulate the SVr4 behavior.  Sigh.  */
1440
            mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1441
                                      MAP_FIXED | MAP_PRIVATE, -1, 0);
1442
    }
1443

    
1444
    info->entry = elf_entry;
1445

    
1446
    return 0;
1447
}
1448

    
1449
static int load_aout_interp(void * exptr, int interp_fd)
1450
{
1451
    printf("a.out interpreter not yet supported\n");
1452
    return(0);
1453
}
1454

    
1455
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
1456
{
1457
    init_thread(regs, infop);
1458
}