Statistics
| Branch: | Revision:

root / bsd-user / elfload.c @ 8fc94e5a

History | View | Annotate | Download (47.2 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/disas.h"
14

    
15
#ifdef _ARCH_PPC64
16
#undef ARCH_DLINFO
17
#undef ELF_PLATFORM
18
#undef ELF_HWCAP
19
#undef ELF_CLASS
20
#undef ELF_DATA
21
#undef ELF_ARCH
22
#endif
23

    
24
/* from personality.h */
25

    
26
/*
27
 * Flags for bug emulation.
28
 *
29
 * These occupy the top three bytes.
30
 */
31
enum {
32
        ADDR_NO_RANDOMIZE =     0x0040000,      /* disable randomization of VA space */
33
        FDPIC_FUNCPTRS =        0x0080000,      /* userspace function ptrs point to descriptors
34
                                                 * (signal handling)
35
                                                 */
36
        MMAP_PAGE_ZERO =        0x0100000,
37
        ADDR_COMPAT_LAYOUT =    0x0200000,
38
        READ_IMPLIES_EXEC =     0x0400000,
39
        ADDR_LIMIT_32BIT =      0x0800000,
40
        SHORT_INODE =           0x1000000,
41
        WHOLE_SECONDS =         0x2000000,
42
        STICKY_TIMEOUTS =       0x4000000,
43
        ADDR_LIMIT_3GB =        0x8000000,
44
};
45

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

    
79
/*
80
 * Return the base personality without flags.
81
 */
82
#define personality(pers)       (pers & PER_MASK)
83

    
84
/* this flag is uneffective under linux too, should be deleted */
85
#ifndef MAP_DENYWRITE
86
#define MAP_DENYWRITE 0
87
#endif
88

    
89
/* should probably go in elf.h */
90
#ifndef ELIBBAD
91
#define ELIBBAD 80
92
#endif
93

    
94
#ifdef TARGET_I386
95

    
96
#define ELF_PLATFORM get_elf_platform()
97

    
98
static const char *get_elf_platform(void)
99
{
100
    static char elf_platform[] = "i386";
101
    int family = (thread_env->cpuid_version >> 8) & 0xff;
102
    if (family > 6)
103
        family = 6;
104
    if (family >= 3)
105
        elf_platform[1] = '0' + family;
106
    return elf_platform;
107
}
108

    
109
#define ELF_HWCAP get_elf_hwcap()
110

    
111
static uint32_t get_elf_hwcap(void)
112
{
113
  return thread_env->cpuid_features;
114
}
115

    
116
#ifdef TARGET_X86_64
117
#define ELF_START_MMAP 0x2aaaaab000ULL
118
#define elf_check_arch(x) ( ((x) == ELF_ARCH) )
119

    
120
#define ELF_CLASS      ELFCLASS64
121
#define ELF_DATA       ELFDATA2LSB
122
#define ELF_ARCH       EM_X86_64
123

    
124
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
125
{
126
    regs->rax = 0;
127
    regs->rsp = infop->start_stack;
128
    regs->rip = infop->entry;
129
    if (bsd_type == target_freebsd) {
130
        regs->rdi = infop->start_stack;
131
    }
132
}
133

    
134
#else
135

    
136
#define ELF_START_MMAP 0x80000000
137

    
138
/*
139
 * This is used to ensure we don't load something for the wrong architecture.
140
 */
141
#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
142

    
143
/*
144
 * These are used to set parameters in the core dumps.
145
 */
146
#define ELF_CLASS       ELFCLASS32
147
#define ELF_DATA        ELFDATA2LSB
148
#define ELF_ARCH        EM_386
149

    
150
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
151
{
152
    regs->esp = infop->start_stack;
153
    regs->eip = infop->entry;
154

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

161
       A value of 0 tells we have no such handler.  */
162
    regs->edx = 0;
163
}
164
#endif
165

    
166
#define USE_ELF_CORE_DUMP
167
#define ELF_EXEC_PAGESIZE       4096
168

    
169
#endif
170

    
171
#ifdef TARGET_ARM
172

    
173
#define ELF_START_MMAP 0x80000000
174

    
175
#define elf_check_arch(x) ( (x) == EM_ARM )
176

    
177
#define ELF_CLASS       ELFCLASS32
178
#ifdef TARGET_WORDS_BIGENDIAN
179
#define ELF_DATA        ELFDATA2MSB
180
#else
181
#define ELF_DATA        ELFDATA2LSB
182
#endif
183
#define ELF_ARCH        EM_ARM
184

    
185
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
186
{
187
    abi_long stack = infop->start_stack;
188
    memset(regs, 0, sizeof(*regs));
189
    regs->ARM_cpsr = 0x10;
190
    if (infop->entry & 1)
191
      regs->ARM_cpsr |= CPSR_T;
192
    regs->ARM_pc = infop->entry & 0xfffffffe;
193
    regs->ARM_sp = infop->start_stack;
194
    /* FIXME - what to for failure of get_user()? */
195
    get_user_ual(regs->ARM_r2, stack + 8); /* envp */
196
    get_user_ual(regs->ARM_r1, stack + 4); /* envp */
197
    /* XXX: it seems that r0 is zeroed after ! */
198
    regs->ARM_r0 = 0;
199
    /* For uClinux PIC binaries.  */
200
    /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
201
    regs->ARM_r10 = infop->start_data;
202
}
203

    
204
#define USE_ELF_CORE_DUMP
205
#define ELF_EXEC_PAGESIZE       4096
206

    
207
enum
208
{
209
  ARM_HWCAP_ARM_SWP       = 1 << 0,
210
  ARM_HWCAP_ARM_HALF      = 1 << 1,
211
  ARM_HWCAP_ARM_THUMB     = 1 << 2,
212
  ARM_HWCAP_ARM_26BIT     = 1 << 3,
213
  ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
214
  ARM_HWCAP_ARM_FPA       = 1 << 5,
215
  ARM_HWCAP_ARM_VFP       = 1 << 6,
216
  ARM_HWCAP_ARM_EDSP      = 1 << 7,
217
};
218

    
219
#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF              \
220
                    | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT     \
221
                    | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP)
222

    
223
#endif
224

    
225
#ifdef TARGET_SPARC
226
#ifdef TARGET_SPARC64
227

    
228
#define ELF_START_MMAP 0x80000000
229

    
230
#ifndef TARGET_ABI32
231
#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
232
#else
233
#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
234
#endif
235

    
236
#define ELF_CLASS   ELFCLASS64
237
#define ELF_DATA    ELFDATA2MSB
238
#define ELF_ARCH    EM_SPARCV9
239

    
240
#define STACK_BIAS              2047
241

    
242
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
243
{
244
#ifndef TARGET_ABI32
245
    regs->tstate = 0;
246
#endif
247
    regs->pc = infop->entry;
248
    regs->npc = regs->pc + 4;
249
    regs->y = 0;
250
#ifdef TARGET_ABI32
251
    regs->u_regs[14] = infop->start_stack - 16 * 4;
252
#else
253
    if (personality(infop->personality) == PER_LINUX32)
254
        regs->u_regs[14] = infop->start_stack - 16 * 4;
255
    else {
256
        regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
257
        if (bsd_type == target_freebsd) {
258
            regs->u_regs[8] = infop->start_stack;
259
            regs->u_regs[11] = infop->start_stack;
260
        }
261
    }
262
#endif
263
}
264

    
265
#else
266
#define ELF_START_MMAP 0x80000000
267

    
268
#define elf_check_arch(x) ( (x) == EM_SPARC )
269

    
270
#define ELF_CLASS   ELFCLASS32
271
#define ELF_DATA    ELFDATA2MSB
272
#define ELF_ARCH    EM_SPARC
273

    
274
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
275
{
276
    regs->psr = 0;
277
    regs->pc = infop->entry;
278
    regs->npc = regs->pc + 4;
279
    regs->y = 0;
280
    regs->u_regs[14] = infop->start_stack - 16 * 4;
281
}
282

    
283
#endif
284
#endif
285

    
286
#ifdef TARGET_PPC
287

    
288
#define ELF_START_MMAP 0x80000000
289

    
290
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
291

    
292
#define elf_check_arch(x) ( (x) == EM_PPC64 )
293

    
294
#define ELF_CLASS       ELFCLASS64
295

    
296
#else
297

    
298
#define elf_check_arch(x) ( (x) == EM_PPC )
299

    
300
#define ELF_CLASS       ELFCLASS32
301

    
302
#endif
303

    
304
#ifdef TARGET_WORDS_BIGENDIAN
305
#define ELF_DATA        ELFDATA2MSB
306
#else
307
#define ELF_DATA        ELFDATA2LSB
308
#endif
309
#define ELF_ARCH        EM_PPC
310

    
311
/*
312
 * We need to put in some extra aux table entries to tell glibc what
313
 * the cache block size is, so it can use the dcbz instruction safely.
314
 */
315
#define AT_DCACHEBSIZE          19
316
#define AT_ICACHEBSIZE          20
317
#define AT_UCACHEBSIZE          21
318
/* A special ignored type value for PPC, for glibc compatibility.  */
319
#define AT_IGNOREPPC            22
320
/*
321
 * The requirements here are:
322
 * - keep the final alignment of sp (sp & 0xf)
323
 * - make sure the 32-bit value at the first 16 byte aligned position of
324
 *   AUXV is greater than 16 for glibc compatibility.
325
 *   AT_IGNOREPPC is used for that.
326
 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
327
 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
328
 */
329
#define DLINFO_ARCH_ITEMS       5
330
#define ARCH_DLINFO                                                     \
331
do {                                                                    \
332
        NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);                              \
333
        NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);                              \
334
        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                                 \
335
        /*                                                              \
336
         * Now handle glibc compatibility.                              \
337
         */                                                             \
338
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
339
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
340
 } while (0)
341

    
342
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
343
{
344
    abi_ulong pos = infop->start_stack;
345
    abi_ulong tmp;
346
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
347
    abi_ulong entry, toc;
348
#endif
349

    
350
    _regs->gpr[1] = infop->start_stack;
351
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
352
    entry = ldq_raw(infop->entry) + infop->load_addr;
353
    toc = ldq_raw(infop->entry + 8) + infop->load_addr;
354
    _regs->gpr[2] = toc;
355
    infop->entry = entry;
356
#endif
357
    _regs->nip = infop->entry;
358
    /* Note that isn't exactly what regular kernel does
359
     * but this is what the ABI wants and is needed to allow
360
     * execution of PPC BSD programs.
361
     */
362
    /* FIXME - what to for failure of get_user()? */
363
    get_user_ual(_regs->gpr[3], pos);
364
    pos += sizeof(abi_ulong);
365
    _regs->gpr[4] = pos;
366
    for (tmp = 1; tmp != 0; pos += sizeof(abi_ulong))
367
        tmp = ldl(pos);
368
    _regs->gpr[5] = pos;
369
}
370

    
371
#define USE_ELF_CORE_DUMP
372
#define ELF_EXEC_PAGESIZE       4096
373

    
374
#endif
375

    
376
#ifdef TARGET_MIPS
377

    
378
#define ELF_START_MMAP 0x80000000
379

    
380
#define elf_check_arch(x) ( (x) == EM_MIPS )
381

    
382
#ifdef TARGET_MIPS64
383
#define ELF_CLASS   ELFCLASS64
384
#else
385
#define ELF_CLASS   ELFCLASS32
386
#endif
387
#ifdef TARGET_WORDS_BIGENDIAN
388
#define ELF_DATA        ELFDATA2MSB
389
#else
390
#define ELF_DATA        ELFDATA2LSB
391
#endif
392
#define ELF_ARCH    EM_MIPS
393

    
394
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
395
{
396
    regs->cp0_status = 2 << CP0St_KSU;
397
    regs->cp0_epc = infop->entry;
398
    regs->regs[29] = infop->start_stack;
399
}
400

    
401
#define USE_ELF_CORE_DUMP
402
#define ELF_EXEC_PAGESIZE        4096
403

    
404
#endif /* TARGET_MIPS */
405

    
406
#ifdef TARGET_SH4
407

    
408
#define ELF_START_MMAP 0x80000000
409

    
410
#define elf_check_arch(x) ( (x) == EM_SH )
411

    
412
#define ELF_CLASS ELFCLASS32
413
#define ELF_DATA  ELFDATA2LSB
414
#define ELF_ARCH  EM_SH
415

    
416
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
417
{
418
  /* Check other registers XXXXX */
419
  regs->pc = infop->entry;
420
  regs->regs[15] = infop->start_stack;
421
}
422

    
423
#define USE_ELF_CORE_DUMP
424
#define ELF_EXEC_PAGESIZE        4096
425

    
426
#endif
427

    
428
#ifdef TARGET_CRIS
429

    
430
#define ELF_START_MMAP 0x80000000
431

    
432
#define elf_check_arch(x) ( (x) == EM_CRIS )
433

    
434
#define ELF_CLASS ELFCLASS32
435
#define ELF_DATA  ELFDATA2LSB
436
#define ELF_ARCH  EM_CRIS
437

    
438
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
439
{
440
  regs->erp = infop->entry;
441
}
442

    
443
#define USE_ELF_CORE_DUMP
444
#define ELF_EXEC_PAGESIZE        8192
445

    
446
#endif
447

    
448
#ifdef TARGET_M68K
449

    
450
#define ELF_START_MMAP 0x80000000
451

    
452
#define elf_check_arch(x) ( (x) == EM_68K )
453

    
454
#define ELF_CLASS       ELFCLASS32
455
#define ELF_DATA        ELFDATA2MSB
456
#define ELF_ARCH        EM_68K
457

    
458
/* ??? Does this need to do anything?
459
#define ELF_PLAT_INIT(_r) */
460

    
461
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
462
{
463
    regs->usp = infop->start_stack;
464
    regs->sr = 0;
465
    regs->pc = infop->entry;
466
}
467

    
468
#define USE_ELF_CORE_DUMP
469
#define ELF_EXEC_PAGESIZE       8192
470

    
471
#endif
472

    
473
#ifdef TARGET_ALPHA
474

    
475
#define ELF_START_MMAP (0x30000000000ULL)
476

    
477
#define elf_check_arch(x) ( (x) == ELF_ARCH )
478

    
479
#define ELF_CLASS      ELFCLASS64
480
#define ELF_DATA       ELFDATA2MSB
481
#define ELF_ARCH       EM_ALPHA
482

    
483
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
484
{
485
    regs->pc = infop->entry;
486
    regs->ps = 8;
487
    regs->usp = infop->start_stack;
488
    regs->unique = infop->start_data; /* ? */
489
    printf("Set unique value to " TARGET_FMT_lx " (" TARGET_FMT_lx ")\n",
490
           regs->unique, infop->start_data);
491
}
492

    
493
#define USE_ELF_CORE_DUMP
494
#define ELF_EXEC_PAGESIZE        8192
495

    
496
#endif /* TARGET_ALPHA */
497

    
498
#ifndef ELF_PLATFORM
499
#define ELF_PLATFORM (NULL)
500
#endif
501

    
502
#ifndef ELF_HWCAP
503
#define ELF_HWCAP 0
504
#endif
505

    
506
#ifdef TARGET_ABI32
507
#undef ELF_CLASS
508
#define ELF_CLASS ELFCLASS32
509
#undef bswaptls
510
#define bswaptls(ptr) bswap32s(ptr)
511
#endif
512

    
513
#include "elf.h"
514

    
515
struct exec
516
{
517
  unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
518
  unsigned int a_text;   /* length of text, in bytes */
519
  unsigned int a_data;   /* length of data, in bytes */
520
  unsigned int a_bss;    /* length of uninitialized data area, in bytes */
521
  unsigned int a_syms;   /* length of symbol table data in file, in bytes */
522
  unsigned int a_entry;  /* start address */
523
  unsigned int a_trsize; /* length of relocation info for text, in bytes */
524
  unsigned int a_drsize; /* length of relocation info for data, in bytes */
525
};
526

    
527

    
528
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
529
#define OMAGIC 0407
530
#define NMAGIC 0410
531
#define ZMAGIC 0413
532
#define QMAGIC 0314
533

    
534
/* max code+data+bss space allocated to elf interpreter */
535
#define INTERP_MAP_SIZE (32 * 1024 * 1024)
536

    
537
/* max code+data+bss+brk space allocated to ET_DYN executables */
538
#define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
539

    
540
/* Necessary parameters */
541
#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
542
#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
543
#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
544

    
545
#define INTERPRETER_NONE 0
546
#define INTERPRETER_AOUT 1
547
#define INTERPRETER_ELF 2
548

    
549
#define DLINFO_ITEMS 12
550

    
551
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
552
{
553
        memcpy(to, from, n);
554
}
555

    
556
static int load_aout_interp(void * exptr, int interp_fd);
557

    
558
#ifdef BSWAP_NEEDED
559
static void bswap_ehdr(struct elfhdr *ehdr)
560
{
561
    bswap16s(&ehdr->e_type);                    /* Object file type */
562
    bswap16s(&ehdr->e_machine);         /* Architecture */
563
    bswap32s(&ehdr->e_version);         /* Object file version */
564
    bswaptls(&ehdr->e_entry);           /* Entry point virtual address */
565
    bswaptls(&ehdr->e_phoff);           /* Program header table file offset */
566
    bswaptls(&ehdr->e_shoff);           /* Section header table file offset */
567
    bswap32s(&ehdr->e_flags);           /* Processor-specific flags */
568
    bswap16s(&ehdr->e_ehsize);          /* ELF header size in bytes */
569
    bswap16s(&ehdr->e_phentsize);               /* Program header table entry size */
570
    bswap16s(&ehdr->e_phnum);           /* Program header table entry count */
571
    bswap16s(&ehdr->e_shentsize);               /* Section header table entry size */
572
    bswap16s(&ehdr->e_shnum);           /* Section header table entry count */
573
    bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
574
}
575

    
576
static void bswap_phdr(struct elf_phdr *phdr)
577
{
578
    bswap32s(&phdr->p_type);                    /* Segment type */
579
    bswaptls(&phdr->p_offset);          /* Segment file offset */
580
    bswaptls(&phdr->p_vaddr);           /* Segment virtual address */
581
    bswaptls(&phdr->p_paddr);           /* Segment physical address */
582
    bswaptls(&phdr->p_filesz);          /* Segment size in file */
583
    bswaptls(&phdr->p_memsz);           /* Segment size in memory */
584
    bswap32s(&phdr->p_flags);           /* Segment flags */
585
    bswaptls(&phdr->p_align);           /* Segment alignment */
586
}
587

    
588
static void bswap_shdr(struct elf_shdr *shdr)
589
{
590
    bswap32s(&shdr->sh_name);
591
    bswap32s(&shdr->sh_type);
592
    bswaptls(&shdr->sh_flags);
593
    bswaptls(&shdr->sh_addr);
594
    bswaptls(&shdr->sh_offset);
595
    bswaptls(&shdr->sh_size);
596
    bswap32s(&shdr->sh_link);
597
    bswap32s(&shdr->sh_info);
598
    bswaptls(&shdr->sh_addralign);
599
    bswaptls(&shdr->sh_entsize);
600
}
601

    
602
static void bswap_sym(struct elf_sym *sym)
603
{
604
    bswap32s(&sym->st_name);
605
    bswaptls(&sym->st_value);
606
    bswaptls(&sym->st_size);
607
    bswap16s(&sym->st_shndx);
608
}
609
#endif
610

    
611
/*
612
 * 'copy_elf_strings()' copies argument/envelope strings from user
613
 * memory to free pages in kernel mem. These are in a format ready
614
 * to be put directly into the top of new user memory.
615
 *
616
 */
617
static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
618
                                  abi_ulong p)
619
{
620
    char *tmp, *tmp1, *pag = NULL;
621
    int len, offset = 0;
622

    
623
    if (!p) {
624
        return 0;       /* bullet-proofing */
625
    }
626
    while (argc-- > 0) {
627
        tmp = argv[argc];
628
        if (!tmp) {
629
            fprintf(stderr, "VFS: argc is wrong");
630
            exit(-1);
631
        }
632
        tmp1 = tmp;
633
        while (*tmp++);
634
        len = tmp - tmp1;
635
        if (p < len) {  /* this shouldn't happen - 128kB */
636
                return 0;
637
        }
638
        while (len) {
639
            --p; --tmp; --len;
640
            if (--offset < 0) {
641
                offset = p % TARGET_PAGE_SIZE;
642
                pag = (char *)page[p/TARGET_PAGE_SIZE];
643
                if (!pag) {
644
                    pag = g_try_malloc0(TARGET_PAGE_SIZE);
645
                    page[p/TARGET_PAGE_SIZE] = pag;
646
                    if (!pag)
647
                        return 0;
648
                }
649
            }
650
            if (len == 0 || offset == 0) {
651
                *(pag + offset) = *tmp;
652
            }
653
            else {
654
              int bytes_to_copy = (len > offset) ? offset : len;
655
              tmp -= bytes_to_copy;
656
              p -= bytes_to_copy;
657
              offset -= bytes_to_copy;
658
              len -= bytes_to_copy;
659
              memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
660
            }
661
        }
662
    }
663
    return p;
664
}
665

    
666
static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
667
                                 struct image_info *info)
668
{
669
    abi_ulong stack_base, size, error;
670
    int i;
671

    
672
    /* Create enough stack to hold everything.  If we don't use
673
     * it for args, we'll use it for something else...
674
     */
675
    size = x86_stack_size;
676
    if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
677
        size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
678
    error = target_mmap(0,
679
                        size + qemu_host_page_size,
680
                        PROT_READ | PROT_WRITE,
681
                        MAP_PRIVATE | MAP_ANON,
682
                        -1, 0);
683
    if (error == -1) {
684
        perror("stk mmap");
685
        exit(-1);
686
    }
687
    /* we reserve one extra page at the top of the stack as guard */
688
    target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
689

    
690
    stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
691
    p += stack_base;
692

    
693
    for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
694
        if (bprm->page[i]) {
695
            info->rss++;
696
            /* FIXME - check return value of memcpy_to_target() for failure */
697
            memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
698
            g_free(bprm->page[i]);
699
        }
700
        stack_base += TARGET_PAGE_SIZE;
701
    }
702
    return p;
703
}
704

    
705
static void set_brk(abi_ulong start, abi_ulong end)
706
{
707
        /* page-align the start and end addresses... */
708
        start = HOST_PAGE_ALIGN(start);
709
        end = HOST_PAGE_ALIGN(end);
710
        if (end <= start)
711
                return;
712
        if(target_mmap(start, end - start,
713
                       PROT_READ | PROT_WRITE | PROT_EXEC,
714
                       MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0) == -1) {
715
            perror("cannot mmap brk");
716
            exit(-1);
717
        }
718
}
719

    
720

    
721
/* We need to explicitly zero any fractional pages after the data
722
   section (i.e. bss).  This would contain the junk from the file that
723
   should not be in memory. */
724
static void padzero(abi_ulong elf_bss, abi_ulong last_bss)
725
{
726
        abi_ulong nbyte;
727

    
728
        if (elf_bss >= last_bss)
729
                return;
730

    
731
        /* XXX: this is really a hack : if the real host page size is
732
           smaller than the target page size, some pages after the end
733
           of the file may not be mapped. A better fix would be to
734
           patch target_mmap(), but it is more complicated as the file
735
           size must be known */
736
        if (qemu_real_host_page_size < qemu_host_page_size) {
737
            abi_ulong end_addr, end_addr1;
738
            end_addr1 = (elf_bss + qemu_real_host_page_size - 1) &
739
                ~(qemu_real_host_page_size - 1);
740
            end_addr = HOST_PAGE_ALIGN(elf_bss);
741
            if (end_addr1 < end_addr) {
742
                mmap((void *)g2h(end_addr1), end_addr - end_addr1,
743
                     PROT_READ|PROT_WRITE|PROT_EXEC,
744
                     MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
745
            }
746
        }
747

    
748
        nbyte = elf_bss & (qemu_host_page_size-1);
749
        if (nbyte) {
750
            nbyte = qemu_host_page_size - nbyte;
751
            do {
752
                /* FIXME - what to do if put_user() fails? */
753
                put_user_u8(0, elf_bss);
754
                elf_bss++;
755
            } while (--nbyte);
756
        }
757
}
758

    
759

    
760
static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
761
                                   struct elfhdr * exec,
762
                                   abi_ulong load_addr,
763
                                   abi_ulong load_bias,
764
                                   abi_ulong interp_load_addr, int ibcs,
765
                                   struct image_info *info)
766
{
767
        abi_ulong sp;
768
        int size;
769
        abi_ulong u_platform;
770
        const char *k_platform;
771
        const int n = sizeof(elf_addr_t);
772

    
773
        sp = p;
774
        u_platform = 0;
775
        k_platform = ELF_PLATFORM;
776
        if (k_platform) {
777
            size_t len = strlen(k_platform) + 1;
778
            sp -= (len + n - 1) & ~(n - 1);
779
            u_platform = sp;
780
            /* FIXME - check return value of memcpy_to_target() for failure */
781
            memcpy_to_target(sp, k_platform, len);
782
        }
783
        /*
784
         * Force 16 byte _final_ alignment here for generality.
785
         */
786
        sp = sp &~ (abi_ulong)15;
787
        size = (DLINFO_ITEMS + 1) * 2;
788
        if (k_platform)
789
          size += 2;
790
#ifdef DLINFO_ARCH_ITEMS
791
        size += DLINFO_ARCH_ITEMS * 2;
792
#endif
793
        size += envc + argc + 2;
794
        size += (!ibcs ? 3 : 1);        /* argc itself */
795
        size *= n;
796
        if (size & 15)
797
            sp -= 16 - (size & 15);
798

    
799
        /* This is correct because Linux defines
800
         * elf_addr_t as Elf32_Off / Elf64_Off
801
         */
802
#define NEW_AUX_ENT(id, val) do {               \
803
            sp -= n; put_user_ual(val, sp);     \
804
            sp -= n; put_user_ual(id, sp);      \
805
          } while(0)
806

    
807
        NEW_AUX_ENT (AT_NULL, 0);
808

    
809
        /* There must be exactly DLINFO_ITEMS entries here.  */
810
        NEW_AUX_ENT(AT_PHDR, (abi_ulong)(load_addr + exec->e_phoff));
811
        NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
812
        NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
813
        NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
814
        NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_load_addr));
815
        NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
816
        NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
817
        NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
818
        NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
819
        NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
820
        NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
821
        NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
822
        NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
823
        if (k_platform)
824
            NEW_AUX_ENT(AT_PLATFORM, u_platform);
825
#ifdef ARCH_DLINFO
826
        /*
827
         * ARCH_DLINFO must come last so platform specific code can enforce
828
         * special alignment requirements on the AUXV if necessary (eg. PPC).
829
         */
830
        ARCH_DLINFO;
831
#endif
832
#undef NEW_AUX_ENT
833

    
834
        sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
835
        return sp;
836
}
837

    
838

    
839
static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
840
                                 int interpreter_fd,
841
                                 abi_ulong *interp_load_addr)
842
{
843
        struct elf_phdr *elf_phdata  =  NULL;
844
        struct elf_phdr *eppnt;
845
        abi_ulong load_addr = 0;
846
        int load_addr_set = 0;
847
        int retval;
848
        abi_ulong last_bss, elf_bss;
849
        abi_ulong error;
850
        int i;
851

    
852
        elf_bss = 0;
853
        last_bss = 0;
854
        error = 0;
855

    
856
#ifdef BSWAP_NEEDED
857
        bswap_ehdr(interp_elf_ex);
858
#endif
859
        /* First of all, some simple consistency checks */
860
        if ((interp_elf_ex->e_type != ET_EXEC &&
861
             interp_elf_ex->e_type != ET_DYN) ||
862
           !elf_check_arch(interp_elf_ex->e_machine)) {
863
                return ~((abi_ulong)0UL);
864
        }
865

    
866

    
867
        /* Now read in all of the header information */
868

    
869
        if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
870
            return ~(abi_ulong)0UL;
871

    
872
        elf_phdata =  (struct elf_phdr *)
873
                malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
874

    
875
        if (!elf_phdata)
876
          return ~((abi_ulong)0UL);
877

    
878
        /*
879
         * If the size of this structure has changed, then punt, since
880
         * we will be doing the wrong thing.
881
         */
882
        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
883
            free(elf_phdata);
884
            return ~((abi_ulong)0UL);
885
        }
886

    
887
        retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
888
        if(retval >= 0) {
889
            retval = read(interpreter_fd,
890
                           (char *) elf_phdata,
891
                           sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
892
        }
893
        if (retval < 0) {
894
                perror("load_elf_interp");
895
                exit(-1);
896
                free (elf_phdata);
897
                return retval;
898
        }
899
#ifdef BSWAP_NEEDED
900
        eppnt = elf_phdata;
901
        for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
902
            bswap_phdr(eppnt);
903
        }
904
#endif
905

    
906
        if (interp_elf_ex->e_type == ET_DYN) {
907
            /* in order to avoid hardcoding the interpreter load
908
               address in qemu, we allocate a big enough memory zone */
909
            error = target_mmap(0, INTERP_MAP_SIZE,
910
                                PROT_NONE, MAP_PRIVATE | MAP_ANON,
911
                                -1, 0);
912
            if (error == -1) {
913
                perror("mmap");
914
                exit(-1);
915
            }
916
            load_addr = error;
917
            load_addr_set = 1;
918
        }
919

    
920
        eppnt = elf_phdata;
921
        for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
922
          if (eppnt->p_type == PT_LOAD) {
923
            int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
924
            int elf_prot = 0;
925
            abi_ulong vaddr = 0;
926
            abi_ulong k;
927

    
928
            if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
929
            if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
930
            if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
931
            if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
932
                elf_type |= MAP_FIXED;
933
                vaddr = eppnt->p_vaddr;
934
            }
935
            error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
936
                 eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
937
                 elf_prot,
938
                 elf_type,
939
                 interpreter_fd,
940
                 eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
941

    
942
            if (error == -1) {
943
              /* Real error */
944
              close(interpreter_fd);
945
              free(elf_phdata);
946
              return ~((abi_ulong)0UL);
947
            }
948

    
949
            if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
950
              load_addr = error;
951
              load_addr_set = 1;
952
            }
953

    
954
            /*
955
             * Find the end of the file  mapping for this phdr, and keep
956
             * track of the largest address we see for this.
957
             */
958
            k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
959
            if (k > elf_bss) elf_bss = k;
960

    
961
            /*
962
             * Do the same thing for the memory mapping - between
963
             * elf_bss and last_bss is the bss section.
964
             */
965
            k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
966
            if (k > last_bss) last_bss = k;
967
          }
968

    
969
        /* Now use mmap to map the library into memory. */
970

    
971
        close(interpreter_fd);
972

    
973
        /*
974
         * Now fill out the bss section.  First pad the last page up
975
         * to the page boundary, and then perform a mmap to make sure
976
         * that there are zeromapped pages up to and including the last
977
         * bss page.
978
         */
979
        padzero(elf_bss, last_bss);
980
        elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
981

    
982
        /* Map the last of the bss segment */
983
        if (last_bss > elf_bss) {
984
            target_mmap(elf_bss, last_bss-elf_bss,
985
                        PROT_READ|PROT_WRITE|PROT_EXEC,
986
                        MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
987
        }
988
        free(elf_phdata);
989

    
990
        *interp_load_addr = load_addr;
991
        return ((abi_ulong) interp_elf_ex->e_entry) + load_addr;
992
}
993

    
994
static int symfind(const void *s0, const void *s1)
995
{
996
    target_ulong addr = *(target_ulong *)s0;
997
    struct elf_sym *sym = (struct elf_sym *)s1;
998
    int result = 0;
999
    if (addr < sym->st_value) {
1000
        result = -1;
1001
    } else if (addr >= sym->st_value + sym->st_size) {
1002
        result = 1;
1003
    }
1004
    return result;
1005
}
1006

    
1007
static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
1008
{
1009
#if ELF_CLASS == ELFCLASS32
1010
    struct elf_sym *syms = s->disas_symtab.elf32;
1011
#else
1012
    struct elf_sym *syms = s->disas_symtab.elf64;
1013
#endif
1014

    
1015
    // binary search
1016
    struct elf_sym *sym;
1017

    
1018
    sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind);
1019
    if (sym != NULL) {
1020
        return s->disas_strtab + sym->st_name;
1021
    }
1022

    
1023
    return "";
1024
}
1025

    
1026
/* FIXME: This should use elf_ops.h  */
1027
static int symcmp(const void *s0, const void *s1)
1028
{
1029
    struct elf_sym *sym0 = (struct elf_sym *)s0;
1030
    struct elf_sym *sym1 = (struct elf_sym *)s1;
1031
    return (sym0->st_value < sym1->st_value)
1032
        ? -1
1033
        : ((sym0->st_value > sym1->st_value) ? 1 : 0);
1034
}
1035

    
1036
/* Best attempt to load symbols from this ELF object. */
1037
static void load_symbols(struct elfhdr *hdr, int fd)
1038
{
1039
    unsigned int i, nsyms;
1040
    struct elf_shdr sechdr, symtab, strtab;
1041
    char *strings;
1042
    struct syminfo *s;
1043
    struct elf_sym *syms, *new_syms;
1044

    
1045
    lseek(fd, hdr->e_shoff, SEEK_SET);
1046
    for (i = 0; i < hdr->e_shnum; i++) {
1047
        if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
1048
            return;
1049
#ifdef BSWAP_NEEDED
1050
        bswap_shdr(&sechdr);
1051
#endif
1052
        if (sechdr.sh_type == SHT_SYMTAB) {
1053
            symtab = sechdr;
1054
            lseek(fd, hdr->e_shoff
1055
                  + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
1056
            if (read(fd, &strtab, sizeof(strtab))
1057
                != sizeof(strtab))
1058
                return;
1059
#ifdef BSWAP_NEEDED
1060
            bswap_shdr(&strtab);
1061
#endif
1062
            goto found;
1063
        }
1064
    }
1065
    return; /* Shouldn't happen... */
1066

    
1067
 found:
1068
    /* Now know where the strtab and symtab are.  Snarf them. */
1069
    s = malloc(sizeof(*s));
1070
    syms = malloc(symtab.sh_size);
1071
    if (!syms) {
1072
        free(s);
1073
        return;
1074
    }
1075
    s->disas_strtab = strings = malloc(strtab.sh_size);
1076
    if (!s->disas_strtab) {
1077
        free(s);
1078
        free(syms);
1079
        return;
1080
    }
1081

    
1082
    lseek(fd, symtab.sh_offset, SEEK_SET);
1083
    if (read(fd, syms, symtab.sh_size) != symtab.sh_size) {
1084
        free(s);
1085
        free(syms);
1086
        free(strings);
1087
        return;
1088
    }
1089

    
1090
    nsyms = symtab.sh_size / sizeof(struct elf_sym);
1091

    
1092
    i = 0;
1093
    while (i < nsyms) {
1094
#ifdef BSWAP_NEEDED
1095
        bswap_sym(syms + i);
1096
#endif
1097
        // Throw away entries which we do not need.
1098
        if (syms[i].st_shndx == SHN_UNDEF ||
1099
                syms[i].st_shndx >= SHN_LORESERVE ||
1100
                ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
1101
            nsyms--;
1102
            if (i < nsyms) {
1103
                syms[i] = syms[nsyms];
1104
            }
1105
            continue;
1106
        }
1107
#if defined(TARGET_ARM) || defined (TARGET_MIPS)
1108
        /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
1109
        syms[i].st_value &= ~(target_ulong)1;
1110
#endif
1111
        i++;
1112
    }
1113

    
1114
     /* Attempt to free the storage associated with the local symbols
1115
        that we threw away.  Whether or not this has any effect on the
1116
        memory allocation depends on the malloc implementation and how
1117
        many symbols we managed to discard. */
1118
    new_syms = realloc(syms, nsyms * sizeof(*syms));
1119
    if (new_syms == NULL) {
1120
        free(s);
1121
        free(syms);
1122
        free(strings);
1123
        return;
1124
    }
1125
    syms = new_syms;
1126

    
1127
    qsort(syms, nsyms, sizeof(*syms), symcmp);
1128

    
1129
    lseek(fd, strtab.sh_offset, SEEK_SET);
1130
    if (read(fd, strings, strtab.sh_size) != strtab.sh_size) {
1131
        free(s);
1132
        free(syms);
1133
        free(strings);
1134
        return;
1135
    }
1136
    s->disas_num_syms = nsyms;
1137
#if ELF_CLASS == ELFCLASS32
1138
    s->disas_symtab.elf32 = syms;
1139
    s->lookup_symbol = (lookup_symbol_t)lookup_symbolxx;
1140
#else
1141
    s->disas_symtab.elf64 = syms;
1142
    s->lookup_symbol = (lookup_symbol_t)lookup_symbolxx;
1143
#endif
1144
    s->next = syminfos;
1145
    syminfos = s;
1146
}
1147

    
1148
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1149
                    struct image_info * info)
1150
{
1151
    struct elfhdr elf_ex;
1152
    struct elfhdr interp_elf_ex;
1153
    struct exec interp_ex;
1154
    int interpreter_fd = -1; /* avoid warning */
1155
    abi_ulong load_addr, load_bias;
1156
    int load_addr_set = 0;
1157
    unsigned int interpreter_type = INTERPRETER_NONE;
1158
    unsigned char ibcs2_interpreter;
1159
    int i;
1160
    abi_ulong mapped_addr;
1161
    struct elf_phdr * elf_ppnt;
1162
    struct elf_phdr *elf_phdata;
1163
    abi_ulong elf_bss, k, elf_brk;
1164
    int retval;
1165
    char * elf_interpreter;
1166
    abi_ulong elf_entry, interp_load_addr = 0;
1167
    int status;
1168
    abi_ulong start_code, end_code, start_data, end_data;
1169
    abi_ulong reloc_func_desc = 0;
1170
    abi_ulong elf_stack;
1171
    char passed_fileno[6];
1172

    
1173
    ibcs2_interpreter = 0;
1174
    status = 0;
1175
    load_addr = 0;
1176
    load_bias = 0;
1177
    elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
1178
#ifdef BSWAP_NEEDED
1179
    bswap_ehdr(&elf_ex);
1180
#endif
1181

    
1182
    /* First of all, some simple consistency checks */
1183
    if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
1184
                                (! elf_check_arch(elf_ex.e_machine))) {
1185
            return -ENOEXEC;
1186
    }
1187

    
1188
    bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1189
    bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1190
    bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1191
    if (!bprm->p) {
1192
        retval = -E2BIG;
1193
    }
1194

    
1195
    /* Now read in all of the header information */
1196
    elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
1197
    if (elf_phdata == NULL) {
1198
        return -ENOMEM;
1199
    }
1200

    
1201
    retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
1202
    if(retval > 0) {
1203
        retval = read(bprm->fd, (char *) elf_phdata,
1204
                                elf_ex.e_phentsize * elf_ex.e_phnum);
1205
    }
1206

    
1207
    if (retval < 0) {
1208
        perror("load_elf_binary");
1209
        exit(-1);
1210
        free (elf_phdata);
1211
        return -errno;
1212
    }
1213

    
1214
#ifdef BSWAP_NEEDED
1215
    elf_ppnt = elf_phdata;
1216
    for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
1217
        bswap_phdr(elf_ppnt);
1218
    }
1219
#endif
1220
    elf_ppnt = elf_phdata;
1221

    
1222
    elf_bss = 0;
1223
    elf_brk = 0;
1224

    
1225

    
1226
    elf_stack = ~((abi_ulong)0UL);
1227
    elf_interpreter = NULL;
1228
    start_code = ~((abi_ulong)0UL);
1229
    end_code = 0;
1230
    start_data = 0;
1231
    end_data = 0;
1232
    interp_ex.a_info = 0;
1233

    
1234
    for(i=0;i < elf_ex.e_phnum; i++) {
1235
        if (elf_ppnt->p_type == PT_INTERP) {
1236
            if ( elf_interpreter != NULL )
1237
            {
1238
                free (elf_phdata);
1239
                free(elf_interpreter);
1240
                close(bprm->fd);
1241
                return -EINVAL;
1242
            }
1243

    
1244
            /* This is the program interpreter used for
1245
             * shared libraries - for now assume that this
1246
             * is an a.out format binary
1247
             */
1248

    
1249
            elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
1250

    
1251
            if (elf_interpreter == NULL) {
1252
                free (elf_phdata);
1253
                close(bprm->fd);
1254
                return -ENOMEM;
1255
            }
1256

    
1257
            retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
1258
            if(retval >= 0) {
1259
                retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
1260
            }
1261
            if(retval < 0) {
1262
                perror("load_elf_binary2");
1263
                exit(-1);
1264
            }
1265

    
1266
            /* If the program interpreter is one of these two,
1267
               then assume an iBCS2 image. Otherwise assume
1268
               a native linux image. */
1269

    
1270
            /* JRP - Need to add X86 lib dir stuff here... */
1271

    
1272
            if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
1273
                strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
1274
              ibcs2_interpreter = 1;
1275
            }
1276

    
1277
#if 0
1278
            printf("Using ELF interpreter %s\n", path(elf_interpreter));
1279
#endif
1280
            if (retval >= 0) {
1281
                retval = open(path(elf_interpreter), O_RDONLY);
1282
                if(retval >= 0) {
1283
                    interpreter_fd = retval;
1284
                }
1285
                else {
1286
                    perror(elf_interpreter);
1287
                    exit(-1);
1288
                    /* retval = -errno; */
1289
                }
1290
            }
1291

    
1292
            if (retval >= 0) {
1293
                retval = lseek(interpreter_fd, 0, SEEK_SET);
1294
                if(retval >= 0) {
1295
                    retval = read(interpreter_fd,bprm->buf,128);
1296
                }
1297
            }
1298
            if (retval >= 0) {
1299
                interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1300
                interp_elf_ex = *((struct elfhdr *) bprm->buf); /* elf exec-header */
1301
            }
1302
            if (retval < 0) {
1303
                perror("load_elf_binary3");
1304
                exit(-1);
1305
                free (elf_phdata);
1306
                free(elf_interpreter);
1307
                close(bprm->fd);
1308
                return retval;
1309
            }
1310
        }
1311
        elf_ppnt++;
1312
    }
1313

    
1314
    /* Some simple consistency checks for the interpreter */
1315
    if (elf_interpreter){
1316
        interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1317

    
1318
        /* Now figure out which format our binary is */
1319
        if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1320
                (N_MAGIC(interp_ex) != QMAGIC)) {
1321
          interpreter_type = INTERPRETER_ELF;
1322
        }
1323

    
1324
        if (interp_elf_ex.e_ident[0] != 0x7f ||
1325
                strncmp((char *)&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1326
            interpreter_type &= ~INTERPRETER_ELF;
1327
        }
1328

    
1329
        if (!interpreter_type) {
1330
            free(elf_interpreter);
1331
            free(elf_phdata);
1332
            close(bprm->fd);
1333
            return -ELIBBAD;
1334
        }
1335
    }
1336

    
1337
    /* OK, we are done with that, now set up the arg stuff,
1338
       and then start this sucker up */
1339

    
1340
    {
1341
        char * passed_p;
1342

    
1343
        if (interpreter_type == INTERPRETER_AOUT) {
1344
            snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1345
            passed_p = passed_fileno;
1346

    
1347
            if (elf_interpreter) {
1348
                bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
1349
                bprm->argc++;
1350
            }
1351
        }
1352
        if (!bprm->p) {
1353
            if (elf_interpreter) {
1354
                free(elf_interpreter);
1355
            }
1356
            free (elf_phdata);
1357
            close(bprm->fd);
1358
            return -E2BIG;
1359
        }
1360
    }
1361

    
1362
    /* OK, This is the point of no return */
1363
    info->end_data = 0;
1364
    info->end_code = 0;
1365
    info->start_mmap = (abi_ulong)ELF_START_MMAP;
1366
    info->mmap = 0;
1367
    elf_entry = (abi_ulong) elf_ex.e_entry;
1368

    
1369
#if defined(CONFIG_USE_GUEST_BASE)
1370
    /*
1371
     * In case where user has not explicitly set the guest_base, we
1372
     * probe here that should we set it automatically.
1373
     */
1374
    if (!have_guest_base) {
1375
        /*
1376
         * Go through ELF program header table and find out whether
1377
         * any of the segments drop below our current mmap_min_addr and
1378
         * in that case set guest_base to corresponding address.
1379
         */
1380
        for (i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum;
1381
            i++, elf_ppnt++) {
1382
            if (elf_ppnt->p_type != PT_LOAD)
1383
                continue;
1384
            if (HOST_PAGE_ALIGN(elf_ppnt->p_vaddr) < mmap_min_addr) {
1385
                guest_base = HOST_PAGE_ALIGN(mmap_min_addr);
1386
                break;
1387
            }
1388
        }
1389
    }
1390
#endif /* CONFIG_USE_GUEST_BASE */
1391

    
1392
    /* Do this so that we can load the interpreter, if need be.  We will
1393
       change some of these later */
1394
    info->rss = 0;
1395
    bprm->p = setup_arg_pages(bprm->p, bprm, info);
1396
    info->start_stack = bprm->p;
1397

    
1398
    /* Now we do a little grungy work by mmaping the ELF image into
1399
     * the correct location in memory.  At this point, we assume that
1400
     * the image should be loaded at fixed address, not at a variable
1401
     * address.
1402
     */
1403

    
1404
    for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1405
        int elf_prot = 0;
1406
        int elf_flags = 0;
1407
        abi_ulong error;
1408

    
1409
        if (elf_ppnt->p_type != PT_LOAD)
1410
            continue;
1411

    
1412
        if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1413
        if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1414
        if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1415
        elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1416
        if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1417
            elf_flags |= MAP_FIXED;
1418
        } else if (elf_ex.e_type == ET_DYN) {
1419
            /* Try and get dynamic programs out of the way of the default mmap
1420
               base, as well as whatever program they might try to exec.  This
1421
               is because the brk will follow the loader, and is not movable.  */
1422
            /* NOTE: for qemu, we do a big mmap to get enough space
1423
               without hardcoding any address */
1424
            error = target_mmap(0, ET_DYN_MAP_SIZE,
1425
                                PROT_NONE, MAP_PRIVATE | MAP_ANON,
1426
                                -1, 0);
1427
            if (error == -1) {
1428
                perror("mmap");
1429
                exit(-1);
1430
            }
1431
            load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1432
        }
1433

    
1434
        error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1435
                            (elf_ppnt->p_filesz +
1436
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1437
                            elf_prot,
1438
                            (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1439
                            bprm->fd,
1440
                            (elf_ppnt->p_offset -
1441
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1442
        if (error == -1) {
1443
            perror("mmap");
1444
            exit(-1);
1445
        }
1446

    
1447
#ifdef LOW_ELF_STACK
1448
        if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1449
            elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1450
#endif
1451

    
1452
        if (!load_addr_set) {
1453
            load_addr_set = 1;
1454
            load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1455
            if (elf_ex.e_type == ET_DYN) {
1456
                load_bias += error -
1457
                    TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1458
                load_addr += load_bias;
1459
                reloc_func_desc = load_bias;
1460
            }
1461
        }
1462
        k = elf_ppnt->p_vaddr;
1463
        if (k < start_code)
1464
            start_code = k;
1465
        if (start_data < k)
1466
            start_data = k;
1467
        k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1468
        if (k > elf_bss)
1469
            elf_bss = k;
1470
        if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1471
            end_code = k;
1472
        if (end_data < k)
1473
            end_data = k;
1474
        k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1475
        if (k > elf_brk) elf_brk = k;
1476
    }
1477

    
1478
    elf_entry += load_bias;
1479
    elf_bss += load_bias;
1480
    elf_brk += load_bias;
1481
    start_code += load_bias;
1482
    end_code += load_bias;
1483
    start_data += load_bias;
1484
    end_data += load_bias;
1485

    
1486
    if (elf_interpreter) {
1487
        if (interpreter_type & 1) {
1488
            elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1489
        }
1490
        else if (interpreter_type & 2) {
1491
            elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1492
                                            &interp_load_addr);
1493
        }
1494
        reloc_func_desc = interp_load_addr;
1495

    
1496
        close(interpreter_fd);
1497
        free(elf_interpreter);
1498

    
1499
        if (elf_entry == ~((abi_ulong)0UL)) {
1500
            printf("Unable to load interpreter\n");
1501
            free(elf_phdata);
1502
            exit(-1);
1503
            return 0;
1504
        }
1505
    }
1506

    
1507
    free(elf_phdata);
1508

    
1509
    if (qemu_log_enabled())
1510
        load_symbols(&elf_ex, bprm->fd);
1511

    
1512
    if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1513
    info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1514

    
1515
#ifdef LOW_ELF_STACK
1516
    info->start_stack = bprm->p = elf_stack - 4;
1517
#endif
1518
    bprm->p = create_elf_tables(bprm->p,
1519
                    bprm->argc,
1520
                    bprm->envc,
1521
                    &elf_ex,
1522
                    load_addr, load_bias,
1523
                    interp_load_addr,
1524
                    (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1525
                    info);
1526
    info->load_addr = reloc_func_desc;
1527
    info->start_brk = info->brk = elf_brk;
1528
    info->end_code = end_code;
1529
    info->start_code = start_code;
1530
    info->start_data = start_data;
1531
    info->end_data = end_data;
1532
    info->start_stack = bprm->p;
1533

    
1534
    /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1535
       sections */
1536
    set_brk(elf_bss, elf_brk);
1537

    
1538
    padzero(elf_bss, elf_brk);
1539

    
1540
#if 0
1541
    printf("(start_brk) %x\n" , info->start_brk);
1542
    printf("(end_code) %x\n" , info->end_code);
1543
    printf("(start_code) %x\n" , info->start_code);
1544
    printf("(end_data) %x\n" , info->end_data);
1545
    printf("(start_stack) %x\n" , info->start_stack);
1546
    printf("(brk) %x\n" , info->brk);
1547
#endif
1548

    
1549
    if ( info->personality == PER_SVR4 )
1550
    {
1551
            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1552
               and some applications "depend" upon this behavior.
1553
               Since we do not have the power to recompile these, we
1554
               emulate the SVr4 behavior.  Sigh.  */
1555
            mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1556
                                      MAP_FIXED | MAP_PRIVATE, -1, 0);
1557
    }
1558

    
1559
    info->entry = elf_entry;
1560

    
1561
    return 0;
1562
}
1563

    
1564
static int load_aout_interp(void * exptr, int interp_fd)
1565
{
1566
    printf("a.out interpreter not yet supported\n");
1567
    return(0);
1568
}
1569

    
1570
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
1571
{
1572
    init_thread(regs, infop);
1573
}