Statistics
| Branch: | Revision:

root / linux-user / elfload.c @ 8686c490

History | View | Annotate | Download (40.7 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
        NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
809
        if (k_platform)
810
            NEW_AUX_ENT(AT_PLATFORM, u_platform);
811
#ifdef ARCH_DLINFO
812
        /*
813
         * ARCH_DLINFO must come last so platform specific code can enforce
814
         * special alignment requirements on the AUXV if necessary (eg. PPC).
815
         */
816
        ARCH_DLINFO;
817
#endif
818
#undef NEW_AUX_ENT
819

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

    
824

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

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

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

    
852

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
957
        close(interpreter_fd);
958

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1132
    elf_bss = 0;
1133
    elf_brk = 0;
1134

    
1135

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1249
    {
1250
        char * passed_p;
1251

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1393
    free(elf_phdata);
1394

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

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

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

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

    
1424
    padzero(elf_bss, elf_brk);
1425

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

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

    
1445
    info->entry = elf_entry;
1446

    
1447
    return 0;
1448
}
1449

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

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