Statistics
| Branch: | Revision:

root / linux-user / elfload.c @ 99a0949b

History | View | Annotate | Download (75 kB)

1
/* This is the Linux kernel elf-loading code, ported into user space */
2
#include <sys/time.h>
3
#include <sys/param.h>
4

    
5
#include <stdio.h>
6
#include <sys/types.h>
7
#include <fcntl.h>
8
#include <errno.h>
9
#include <unistd.h>
10
#include <sys/mman.h>
11
#include <sys/resource.h>
12
#include <stdlib.h>
13
#include <string.h>
14
#include <time.h>
15

    
16
#include "qemu.h"
17
#include "disas.h"
18

    
19
#ifdef _ARCH_PPC64
20
#undef ARCH_DLINFO
21
#undef ELF_PLATFORM
22
#undef ELF_HWCAP
23
#undef ELF_CLASS
24
#undef ELF_DATA
25
#undef ELF_ARCH
26
#endif
27

    
28
#define ELF_OSABI   ELFOSABI_SYSV
29

    
30
/* from personality.h */
31

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

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

    
85
/*
86
 * Return the base personality without flags.
87
 */
88
#define personality(pers)        (pers & PER_MASK)
89

    
90
/* this flag is uneffective under linux too, should be deleted */
91
#ifndef MAP_DENYWRITE
92
#define MAP_DENYWRITE 0
93
#endif
94

    
95
/* should probably go in elf.h */
96
#ifndef ELIBBAD
97
#define ELIBBAD 80
98
#endif
99

    
100
#ifdef TARGET_I386
101

    
102
#define ELF_PLATFORM get_elf_platform()
103

    
104
static const char *get_elf_platform(void)
105
{
106
    static char elf_platform[] = "i386";
107
    int family = (thread_env->cpuid_version >> 8) & 0xff;
108
    if (family > 6)
109
        family = 6;
110
    if (family >= 3)
111
        elf_platform[1] = '0' + family;
112
    return elf_platform;
113
}
114

    
115
#define ELF_HWCAP get_elf_hwcap()
116

    
117
static uint32_t get_elf_hwcap(void)
118
{
119
  return thread_env->cpuid_features;
120
}
121

    
122
#ifdef TARGET_X86_64
123
#define ELF_START_MMAP 0x2aaaaab000ULL
124
#define elf_check_arch(x) ( ((x) == ELF_ARCH) )
125

    
126
#define ELF_CLASS      ELFCLASS64
127
#define ELF_DATA       ELFDATA2LSB
128
#define ELF_ARCH       EM_X86_64
129

    
130
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
131
{
132
    regs->rax = 0;
133
    regs->rsp = infop->start_stack;
134
    regs->rip = infop->entry;
135
}
136

    
137
typedef target_ulong    a_target_elf_greg;
138
typedef uint32_t        a_target_uid;
139
typedef uint32_t        a_target_gid;
140
typedef int32_t         a_target_pid;
141

    
142
#define ELF_NREG    27
143
typedef a_target_elf_greg  a_target_elf_gregset[ELF_NREG];
144

    
145
/*
146
 * Note that ELF_NREG should be 29 as there should be place for
147
 * TRAPNO and ERR "registers" as well but linux doesn't dump
148
 * those.
149
 *
150
 * See linux kernel: arch/x86/include/asm/elf.h
151
 */
152
static void elf_core_copy_regs(a_target_elf_gregset *regs, const CPUState *env)
153
{
154
    (*regs)[0] = env->regs[15];
155
    (*regs)[1] = env->regs[14];
156
    (*regs)[2] = env->regs[13];
157
    (*regs)[3] = env->regs[12];
158
    (*regs)[4] = env->regs[R_EBP];
159
    (*regs)[5] = env->regs[R_EBX];
160
    (*regs)[6] = env->regs[11];
161
    (*regs)[7] = env->regs[10];
162
    (*regs)[8] = env->regs[9];
163
    (*regs)[9] = env->regs[8];
164
    (*regs)[10] = env->regs[R_EAX];
165
    (*regs)[11] = env->regs[R_ECX];
166
    (*regs)[12] = env->regs[R_EDX];
167
    (*regs)[13] = env->regs[R_ESI];
168
    (*regs)[14] = env->regs[R_EDI];
169
    (*regs)[15] = env->regs[R_EAX]; /* XXX */
170
    (*regs)[16] = env->eip;
171
    (*regs)[17] = env->segs[R_CS].selector & 0xffff;
172
    (*regs)[18] = env->eflags;
173
    (*regs)[19] = env->regs[R_ESP];
174
    (*regs)[20] = env->segs[R_SS].selector & 0xffff;
175
    (*regs)[21] = env->segs[R_FS].selector & 0xffff;
176
    (*regs)[22] = env->segs[R_GS].selector & 0xffff;
177
    (*regs)[23] = env->segs[R_DS].selector & 0xffff;
178
    (*regs)[24] = env->segs[R_ES].selector & 0xffff;
179
    (*regs)[25] = env->segs[R_FS].selector & 0xffff;
180
    (*regs)[26] = env->segs[R_GS].selector & 0xffff;
181
}
182

    
183
#else
184

    
185
#define ELF_START_MMAP 0x80000000
186

    
187
/*
188
 * This is used to ensure we don't load something for the wrong architecture.
189
 */
190
#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
191

    
192
/*
193
 * These are used to set parameters in the core dumps.
194
 */
195
#define ELF_CLASS        ELFCLASS32
196
#define ELF_DATA        ELFDATA2LSB
197
#define ELF_ARCH        EM_386
198

    
199
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
200
{
201
    regs->esp = infop->start_stack;
202
    regs->eip = infop->entry;
203

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

210
       A value of 0 tells we have no such handler.  */
211
    regs->edx = 0;
212
}
213

    
214
typedef target_ulong    a_target_elf_greg;
215
typedef uint16_t        a_target_uid;
216
typedef uint16_t        a_target_gid;
217
typedef int32_t         a_target_pid;
218

    
219
#define ELF_NREG    17
220
typedef a_target_elf_greg  a_target_elf_gregset[ELF_NREG];
221

    
222
/*
223
 * Note that ELF_NREG should be 19 as there should be place for
224
 * TRAPNO and ERR "registers" as well but linux doesn't dump
225
 * those.
226
 *
227
 * See linux kernel: arch/x86/include/asm/elf.h
228
 */
229
static void elf_core_copy_regs(a_target_elf_gregset *regs, const CPUState *env)
230
{
231
    (*regs)[0] = env->regs[R_EBX];
232
    (*regs)[1] = env->regs[R_ECX];
233
    (*regs)[2] = env->regs[R_EDX];
234
    (*regs)[3] = env->regs[R_ESI];
235
    (*regs)[4] = env->regs[R_EDI];
236
    (*regs)[5] = env->regs[R_EBP];
237
    (*regs)[6] = env->regs[R_EAX];
238
    (*regs)[7] = env->segs[R_DS].selector & 0xffff;
239
    (*regs)[8] = env->segs[R_ES].selector & 0xffff;
240
    (*regs)[9] = env->segs[R_FS].selector & 0xffff;
241
    (*regs)[10] = env->segs[R_GS].selector & 0xffff;
242
    (*regs)[11] = env->regs[R_EAX]; /* XXX */
243
    (*regs)[12] = env->eip;
244
    (*regs)[13] = env->segs[R_CS].selector & 0xffff;
245
    (*regs)[14] = env->eflags;
246
    (*regs)[15] = env->regs[R_ESP];
247
    (*regs)[16] = env->segs[R_SS].selector & 0xffff;
248
}
249
#endif
250

    
251
#define USE_ELF_CORE_DUMP
252
#define ELF_EXEC_PAGESIZE        4096
253

    
254
#endif
255

    
256
#ifdef TARGET_ARM
257

    
258
#define ELF_START_MMAP 0x80000000
259

    
260
#define elf_check_arch(x) ( (x) == EM_ARM )
261

    
262
#define ELF_CLASS        ELFCLASS32
263
#ifdef TARGET_WORDS_BIGENDIAN
264
#define ELF_DATA        ELFDATA2MSB
265
#else
266
#define ELF_DATA        ELFDATA2LSB
267
#endif
268
#define ELF_ARCH        EM_ARM
269

    
270
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
271
{
272
    abi_long stack = infop->start_stack;
273
    memset(regs, 0, sizeof(*regs));
274
    regs->ARM_cpsr = 0x10;
275
    if (infop->entry & 1)
276
      regs->ARM_cpsr |= CPSR_T;
277
    regs->ARM_pc = infop->entry & 0xfffffffe;
278
    regs->ARM_sp = infop->start_stack;
279
    /* FIXME - what to for failure of get_user()? */
280
    get_user_ual(regs->ARM_r2, stack + 8); /* envp */
281
    get_user_ual(regs->ARM_r1, stack + 4); /* envp */
282
    /* XXX: it seems that r0 is zeroed after ! */
283
    regs->ARM_r0 = 0;
284
    /* For uClinux PIC binaries.  */
285
    /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
286
    regs->ARM_r10 = infop->start_data;
287
}
288

    
289
typedef uint32_t a_target_elf_greg;
290
typedef uint16_t a_target_uid;
291
typedef uint16_t a_target_gid;
292
typedef int32_t  a_target_pid;
293

    
294
#define ELF_NREG    18
295
typedef a_target_elf_greg  a_target_elf_gregset[ELF_NREG];
296

    
297
static void elf_core_copy_regs(a_target_elf_gregset *regs, const CPUState *env)
298
{
299
    (*regs)[0] = env->regs[0];
300
    (*regs)[1] = env->regs[1];
301
    (*regs)[2] = env->regs[2];
302
    (*regs)[3] = env->regs[3];
303
    (*regs)[4] = env->regs[4];
304
    (*regs)[5] = env->regs[5];
305
    (*regs)[6] = env->regs[6];
306
    (*regs)[7] = env->regs[7];
307
    (*regs)[8] = env->regs[8];
308
    (*regs)[9] = env->regs[9];
309
    (*regs)[10] = env->regs[10];
310
    (*regs)[11] = env->regs[11];
311
    (*regs)[12] = env->regs[12];
312
    (*regs)[13] = env->regs[13];
313
    (*regs)[14] = env->regs[14];
314
    (*regs)[15] = env->regs[15];
315

    
316
    (*regs)[16] = cpsr_read((CPUState *)env);
317
    (*regs)[17] = env->regs[0]; /* XXX */
318
}
319

    
320
#define USE_ELF_CORE_DUMP
321
#define ELF_EXEC_PAGESIZE        4096
322

    
323
enum
324
{
325
  ARM_HWCAP_ARM_SWP       = 1 << 0,
326
  ARM_HWCAP_ARM_HALF      = 1 << 1,
327
  ARM_HWCAP_ARM_THUMB     = 1 << 2,
328
  ARM_HWCAP_ARM_26BIT     = 1 << 3,
329
  ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
330
  ARM_HWCAP_ARM_FPA       = 1 << 5,
331
  ARM_HWCAP_ARM_VFP       = 1 << 6,
332
  ARM_HWCAP_ARM_EDSP      = 1 << 7,
333
};
334

    
335
#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF              \
336
                    | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT     \
337
                    | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP)
338

    
339
#endif
340

    
341
#ifdef TARGET_SPARC
342
#ifdef TARGET_SPARC64
343

    
344
#define ELF_START_MMAP 0x80000000
345

    
346
#ifndef TARGET_ABI32
347
#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
348
#else
349
#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
350
#endif
351

    
352
#define ELF_CLASS   ELFCLASS64
353
#define ELF_DATA    ELFDATA2MSB
354
#define ELF_ARCH    EM_SPARCV9
355

    
356
#define STACK_BIAS                2047
357

    
358
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
359
{
360
#ifndef TARGET_ABI32
361
    regs->tstate = 0;
362
#endif
363
    regs->pc = infop->entry;
364
    regs->npc = regs->pc + 4;
365
    regs->y = 0;
366
#ifdef TARGET_ABI32
367
    regs->u_regs[14] = infop->start_stack - 16 * 4;
368
#else
369
    if (personality(infop->personality) == PER_LINUX32)
370
        regs->u_regs[14] = infop->start_stack - 16 * 4;
371
    else
372
        regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
373
#endif
374
}
375

    
376
#else
377
#define ELF_START_MMAP 0x80000000
378

    
379
#define elf_check_arch(x) ( (x) == EM_SPARC )
380

    
381
#define ELF_CLASS   ELFCLASS32
382
#define ELF_DATA    ELFDATA2MSB
383
#define ELF_ARCH    EM_SPARC
384

    
385
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
386
{
387
    regs->psr = 0;
388
    regs->pc = infop->entry;
389
    regs->npc = regs->pc + 4;
390
    regs->y = 0;
391
    regs->u_regs[14] = infop->start_stack - 16 * 4;
392
}
393

    
394
#endif
395
#endif
396

    
397
#ifdef TARGET_PPC
398

    
399
#define ELF_START_MMAP 0x80000000
400

    
401
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
402

    
403
#define elf_check_arch(x) ( (x) == EM_PPC64 )
404

    
405
#define ELF_CLASS        ELFCLASS64
406

    
407
#else
408

    
409
#define elf_check_arch(x) ( (x) == EM_PPC )
410

    
411
#define ELF_CLASS        ELFCLASS32
412

    
413
#endif
414

    
415
#ifdef TARGET_WORDS_BIGENDIAN
416
#define ELF_DATA        ELFDATA2MSB
417
#else
418
#define ELF_DATA        ELFDATA2LSB
419
#endif
420
#define ELF_ARCH        EM_PPC
421

    
422
/* Feature masks for the Aux Vector Hardware Capabilities (AT_HWCAP).
423
   See arch/powerpc/include/asm/cputable.h.  */
424
enum {
425
    QEMU_PPC_FEATURE_32 = 0x80000000,
426
    QEMU_PPC_FEATURE_64 = 0x40000000,
427
    QEMU_PPC_FEATURE_601_INSTR = 0x20000000,
428
    QEMU_PPC_FEATURE_HAS_ALTIVEC = 0x10000000,
429
    QEMU_PPC_FEATURE_HAS_FPU = 0x08000000,
430
    QEMU_PPC_FEATURE_HAS_MMU = 0x04000000,
431
    QEMU_PPC_FEATURE_HAS_4xxMAC = 0x02000000,
432
    QEMU_PPC_FEATURE_UNIFIED_CACHE = 0x01000000,
433
    QEMU_PPC_FEATURE_HAS_SPE = 0x00800000,
434
    QEMU_PPC_FEATURE_HAS_EFP_SINGLE = 0x00400000,
435
    QEMU_PPC_FEATURE_HAS_EFP_DOUBLE = 0x00200000,
436
    QEMU_PPC_FEATURE_NO_TB = 0x00100000,
437
    QEMU_PPC_FEATURE_POWER4 = 0x00080000,
438
    QEMU_PPC_FEATURE_POWER5 = 0x00040000,
439
    QEMU_PPC_FEATURE_POWER5_PLUS = 0x00020000,
440
    QEMU_PPC_FEATURE_CELL = 0x00010000,
441
    QEMU_PPC_FEATURE_BOOKE = 0x00008000,
442
    QEMU_PPC_FEATURE_SMT = 0x00004000,
443
    QEMU_PPC_FEATURE_ICACHE_SNOOP = 0x00002000,
444
    QEMU_PPC_FEATURE_ARCH_2_05 = 0x00001000,
445
    QEMU_PPC_FEATURE_PA6T = 0x00000800,
446
    QEMU_PPC_FEATURE_HAS_DFP = 0x00000400,
447
    QEMU_PPC_FEATURE_POWER6_EXT = 0x00000200,
448
    QEMU_PPC_FEATURE_ARCH_2_06 = 0x00000100,
449
    QEMU_PPC_FEATURE_HAS_VSX = 0x00000080,
450
    QEMU_PPC_FEATURE_PSERIES_PERFMON_COMPAT = 0x00000040,
451

    
452
    QEMU_PPC_FEATURE_TRUE_LE = 0x00000002,
453
    QEMU_PPC_FEATURE_PPC_LE = 0x00000001,
454
};
455

    
456
#define ELF_HWCAP get_elf_hwcap()
457

    
458
static uint32_t get_elf_hwcap(void)
459
{
460
    CPUState *e = thread_env;
461
    uint32_t features = 0;
462

    
463
    /* We don't have to be terribly complete here; the high points are
464
       Altivec/FP/SPE support.  Anything else is just a bonus.  */
465
#define GET_FEATURE(flag, feature)              \
466
    do {if (e->insns_flags & flag) features |= feature; } while(0)
467
    GET_FEATURE(PPC_64B, QEMU_PPC_FEATURE_64);
468
    GET_FEATURE(PPC_FLOAT, QEMU_PPC_FEATURE_HAS_FPU);
469
    GET_FEATURE(PPC_ALTIVEC, QEMU_PPC_FEATURE_HAS_ALTIVEC);
470
    GET_FEATURE(PPC_SPE, QEMU_PPC_FEATURE_HAS_SPE);
471
    GET_FEATURE(PPC_SPE_SINGLE, QEMU_PPC_FEATURE_HAS_EFP_SINGLE);
472
    GET_FEATURE(PPC_SPE_DOUBLE, QEMU_PPC_FEATURE_HAS_EFP_DOUBLE);
473
    GET_FEATURE(PPC_BOOKE, QEMU_PPC_FEATURE_BOOKE);
474
    GET_FEATURE(PPC_405_MAC, QEMU_PPC_FEATURE_HAS_4xxMAC);
475
#undef GET_FEATURE
476

    
477
    return features;
478
}
479

    
480
/*
481
 * We need to put in some extra aux table entries to tell glibc what
482
 * the cache block size is, so it can use the dcbz instruction safely.
483
 */
484
#define AT_DCACHEBSIZE          19
485
#define AT_ICACHEBSIZE          20
486
#define AT_UCACHEBSIZE          21
487
/* A special ignored type value for PPC, for glibc compatibility.  */
488
#define AT_IGNOREPPC            22
489
/*
490
 * The requirements here are:
491
 * - keep the final alignment of sp (sp & 0xf)
492
 * - make sure the 32-bit value at the first 16 byte aligned position of
493
 *   AUXV is greater than 16 for glibc compatibility.
494
 *   AT_IGNOREPPC is used for that.
495
 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
496
 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
497
 */
498
#define DLINFO_ARCH_ITEMS       5
499
#define ARCH_DLINFO                                                     \
500
do {                                                                    \
501
        NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);                              \
502
        NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);                              \
503
        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                                 \
504
        /*                                                              \
505
         * Now handle glibc compatibility.                              \
506
         */                                                             \
507
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
508
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);                        \
509
 } while (0)
510

    
511
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
512
{
513
    abi_ulong pos = infop->start_stack;
514
    abi_ulong tmp;
515
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
516
    abi_ulong entry, toc;
517
#endif
518

    
519
    _regs->gpr[1] = infop->start_stack;
520
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
521
    entry = ldq_raw(infop->entry) + infop->load_addr;
522
    toc = ldq_raw(infop->entry + 8) + infop->load_addr;
523
    _regs->gpr[2] = toc;
524
    infop->entry = entry;
525
#endif
526
    _regs->nip = infop->entry;
527
    /* Note that isn't exactly what regular kernel does
528
     * but this is what the ABI wants and is needed to allow
529
     * execution of PPC BSD programs.
530
     */
531
    /* FIXME - what to for failure of get_user()? */
532
    get_user_ual(_regs->gpr[3], pos);
533
    pos += sizeof(abi_ulong);
534
    _regs->gpr[4] = pos;
535
    for (tmp = 1; tmp != 0; pos += sizeof(abi_ulong))
536
        tmp = ldl(pos);
537
    _regs->gpr[5] = pos;
538
}
539

    
540
#define ELF_EXEC_PAGESIZE        4096
541

    
542
#endif
543

    
544
#ifdef TARGET_MIPS
545

    
546
#define ELF_START_MMAP 0x80000000
547

    
548
#define elf_check_arch(x) ( (x) == EM_MIPS )
549

    
550
#ifdef TARGET_MIPS64
551
#define ELF_CLASS   ELFCLASS64
552
#else
553
#define ELF_CLASS   ELFCLASS32
554
#endif
555
#ifdef TARGET_WORDS_BIGENDIAN
556
#define ELF_DATA        ELFDATA2MSB
557
#else
558
#define ELF_DATA        ELFDATA2LSB
559
#endif
560
#define ELF_ARCH    EM_MIPS
561

    
562
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
563
{
564
    regs->cp0_status = 2 << CP0St_KSU;
565
    regs->cp0_epc = infop->entry;
566
    regs->regs[29] = infop->start_stack;
567
}
568

    
569
#define ELF_EXEC_PAGESIZE        4096
570

    
571
#endif /* TARGET_MIPS */
572

    
573
#ifdef TARGET_MICROBLAZE
574

    
575
#define ELF_START_MMAP 0x80000000
576

    
577
#define elf_check_arch(x) ( (x) == EM_XILINX_MICROBLAZE )
578

    
579
#define ELF_CLASS   ELFCLASS32
580
#define ELF_DATA        ELFDATA2MSB
581
#define ELF_ARCH    EM_MIPS
582

    
583
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
584
{
585
    regs->pc = infop->entry;
586
    regs->r1 = infop->start_stack;
587

    
588
}
589

    
590
#define ELF_EXEC_PAGESIZE        4096
591

    
592
#endif /* TARGET_MICROBLAZE */
593

    
594
#ifdef TARGET_SH4
595

    
596
#define ELF_START_MMAP 0x80000000
597

    
598
#define elf_check_arch(x) ( (x) == EM_SH )
599

    
600
#define ELF_CLASS ELFCLASS32
601
#define ELF_DATA  ELFDATA2LSB
602
#define ELF_ARCH  EM_SH
603

    
604
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
605
{
606
  /* Check other registers XXXXX */
607
  regs->pc = infop->entry;
608
  regs->regs[15] = infop->start_stack;
609
}
610

    
611
#define ELF_EXEC_PAGESIZE        4096
612

    
613
#endif
614

    
615
#ifdef TARGET_CRIS
616

    
617
#define ELF_START_MMAP 0x80000000
618

    
619
#define elf_check_arch(x) ( (x) == EM_CRIS )
620

    
621
#define ELF_CLASS ELFCLASS32
622
#define ELF_DATA  ELFDATA2LSB
623
#define ELF_ARCH  EM_CRIS
624

    
625
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
626
{
627
  regs->erp = infop->entry;
628
}
629

    
630
#define ELF_EXEC_PAGESIZE        8192
631

    
632
#endif
633

    
634
#ifdef TARGET_M68K
635

    
636
#define ELF_START_MMAP 0x80000000
637

    
638
#define elf_check_arch(x) ( (x) == EM_68K )
639

    
640
#define ELF_CLASS        ELFCLASS32
641
#define ELF_DATA        ELFDATA2MSB
642
#define ELF_ARCH        EM_68K
643

    
644
/* ??? Does this need to do anything?
645
#define ELF_PLAT_INIT(_r) */
646

    
647
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
648
{
649
    regs->usp = infop->start_stack;
650
    regs->sr = 0;
651
    regs->pc = infop->entry;
652
}
653

    
654
#define ELF_EXEC_PAGESIZE        8192
655

    
656
#endif
657

    
658
#ifdef TARGET_ALPHA
659

    
660
#define ELF_START_MMAP (0x30000000000ULL)
661

    
662
#define elf_check_arch(x) ( (x) == ELF_ARCH )
663

    
664
#define ELF_CLASS      ELFCLASS64
665
#define ELF_DATA       ELFDATA2MSB
666
#define ELF_ARCH       EM_ALPHA
667

    
668
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
669
{
670
    regs->pc = infop->entry;
671
    regs->ps = 8;
672
    regs->usp = infop->start_stack;
673
    regs->unique = infop->start_data; /* ? */
674
    printf("Set unique value to " TARGET_FMT_lx " (" TARGET_FMT_lx ")\n",
675
           regs->unique, infop->start_data);
676
}
677

    
678
#define ELF_EXEC_PAGESIZE        8192
679

    
680
#endif /* TARGET_ALPHA */
681

    
682
#ifndef ELF_PLATFORM
683
#define ELF_PLATFORM (NULL)
684
#endif
685

    
686
#ifndef ELF_HWCAP
687
#define ELF_HWCAP 0
688
#endif
689

    
690
#ifdef TARGET_ABI32
691
#undef ELF_CLASS
692
#define ELF_CLASS ELFCLASS32
693
#undef bswaptls
694
#define bswaptls(ptr) bswap32s(ptr)
695
#endif
696

    
697
#include "elf.h"
698

    
699
struct exec
700
{
701
  unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
702
  unsigned int a_text;   /* length of text, in bytes */
703
  unsigned int a_data;   /* length of data, in bytes */
704
  unsigned int a_bss;    /* length of uninitialized data area, in bytes */
705
  unsigned int a_syms;   /* length of symbol table data in file, in bytes */
706
  unsigned int a_entry;  /* start address */
707
  unsigned int a_trsize; /* length of relocation info for text, in bytes */
708
  unsigned int a_drsize; /* length of relocation info for data, in bytes */
709
};
710

    
711

    
712
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
713
#define OMAGIC 0407
714
#define NMAGIC 0410
715
#define ZMAGIC 0413
716
#define QMAGIC 0314
717

    
718
/* max code+data+bss space allocated to elf interpreter */
719
#define INTERP_MAP_SIZE (32 * 1024 * 1024)
720

    
721
/* max code+data+bss+brk space allocated to ET_DYN executables */
722
#define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
723

    
724
/* Necessary parameters */
725
#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
726
#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
727
#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
728

    
729
#define INTERPRETER_NONE 0
730
#define INTERPRETER_AOUT 1
731
#define INTERPRETER_ELF 2
732

    
733
#define DLINFO_ITEMS 12
734

    
735
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
736
{
737
        memcpy(to, from, n);
738
}
739

    
740
static int load_aout_interp(void * exptr, int interp_fd);
741

    
742
#ifdef BSWAP_NEEDED
743
static void bswap_ehdr(struct elfhdr *ehdr)
744
{
745
    bswap16s(&ehdr->e_type);                        /* Object file type */
746
    bswap16s(&ehdr->e_machine);                /* Architecture */
747
    bswap32s(&ehdr->e_version);                /* Object file version */
748
    bswaptls(&ehdr->e_entry);                /* Entry point virtual address */
749
    bswaptls(&ehdr->e_phoff);                /* Program header table file offset */
750
    bswaptls(&ehdr->e_shoff);                /* Section header table file offset */
751
    bswap32s(&ehdr->e_flags);                /* Processor-specific flags */
752
    bswap16s(&ehdr->e_ehsize);                /* ELF header size in bytes */
753
    bswap16s(&ehdr->e_phentsize);                /* Program header table entry size */
754
    bswap16s(&ehdr->e_phnum);                /* Program header table entry count */
755
    bswap16s(&ehdr->e_shentsize);                /* Section header table entry size */
756
    bswap16s(&ehdr->e_shnum);                /* Section header table entry count */
757
    bswap16s(&ehdr->e_shstrndx);                /* Section header string table index */
758
}
759

    
760
static void bswap_phdr(struct elf_phdr *phdr)
761
{
762
    bswap32s(&phdr->p_type);                        /* Segment type */
763
    bswaptls(&phdr->p_offset);                /* Segment file offset */
764
    bswaptls(&phdr->p_vaddr);                /* Segment virtual address */
765
    bswaptls(&phdr->p_paddr);                /* Segment physical address */
766
    bswaptls(&phdr->p_filesz);                /* Segment size in file */
767
    bswaptls(&phdr->p_memsz);                /* Segment size in memory */
768
    bswap32s(&phdr->p_flags);                /* Segment flags */
769
    bswaptls(&phdr->p_align);                /* Segment alignment */
770
}
771

    
772
static void bswap_shdr(struct elf_shdr *shdr)
773
{
774
    bswap32s(&shdr->sh_name);
775
    bswap32s(&shdr->sh_type);
776
    bswaptls(&shdr->sh_flags);
777
    bswaptls(&shdr->sh_addr);
778
    bswaptls(&shdr->sh_offset);
779
    bswaptls(&shdr->sh_size);
780
    bswap32s(&shdr->sh_link);
781
    bswap32s(&shdr->sh_info);
782
    bswaptls(&shdr->sh_addralign);
783
    bswaptls(&shdr->sh_entsize);
784
}
785

    
786
static void bswap_sym(struct elf_sym *sym)
787
{
788
    bswap32s(&sym->st_name);
789
    bswaptls(&sym->st_value);
790
    bswaptls(&sym->st_size);
791
    bswap16s(&sym->st_shndx);
792
}
793
#endif
794

    
795
#ifdef USE_ELF_CORE_DUMP
796
static int elf_core_dump(int, const CPUState *);
797

    
798
#ifdef BSWAP_NEEDED
799
static void bswap_note(struct elf_note *en)
800
{
801
    bswap32s(&en->n_namesz);
802
    bswap32s(&en->n_descsz);
803
    bswap32s(&en->n_type);
804
}
805
#endif /* BSWAP_NEEDED */
806

    
807
#endif /* USE_ELF_CORE_DUMP */
808

    
809
/*
810
 * 'copy_elf_strings()' copies argument/envelope strings from user
811
 * memory to free pages in kernel mem. These are in a format ready
812
 * to be put directly into the top of new user memory.
813
 *
814
 */
815
static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
816
                                  abi_ulong p)
817
{
818
    char *tmp, *tmp1, *pag = NULL;
819
    int len, offset = 0;
820

    
821
    if (!p) {
822
        return 0;       /* bullet-proofing */
823
    }
824
    while (argc-- > 0) {
825
        tmp = argv[argc];
826
        if (!tmp) {
827
            fprintf(stderr, "VFS: argc is wrong");
828
            exit(-1);
829
        }
830
        tmp1 = tmp;
831
        while (*tmp++);
832
        len = tmp - tmp1;
833
        if (p < len) {  /* this shouldn't happen - 128kB */
834
                return 0;
835
        }
836
        while (len) {
837
            --p; --tmp; --len;
838
            if (--offset < 0) {
839
                offset = p % TARGET_PAGE_SIZE;
840
                pag = (char *)page[p/TARGET_PAGE_SIZE];
841
                if (!pag) {
842
                    pag = (char *)malloc(TARGET_PAGE_SIZE);
843
                    memset(pag, 0, TARGET_PAGE_SIZE);
844
                    page[p/TARGET_PAGE_SIZE] = pag;
845
                    if (!pag)
846
                        return 0;
847
                }
848
            }
849
            if (len == 0 || offset == 0) {
850
                *(pag + offset) = *tmp;
851
            }
852
            else {
853
              int bytes_to_copy = (len > offset) ? offset : len;
854
              tmp -= bytes_to_copy;
855
              p -= bytes_to_copy;
856
              offset -= bytes_to_copy;
857
              len -= bytes_to_copy;
858
              memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
859
            }
860
        }
861
    }
862
    return p;
863
}
864

    
865
static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
866
                                 struct image_info *info)
867
{
868
    abi_ulong stack_base, size, error;
869
    int i;
870

    
871
    /* Create enough stack to hold everything.  If we don't use
872
     * it for args, we'll use it for something else...
873
     */
874
    size = x86_stack_size;
875
    if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
876
        size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
877
    error = target_mmap(0,
878
                        size + qemu_host_page_size,
879
                        PROT_READ | PROT_WRITE,
880
                        MAP_PRIVATE | MAP_ANONYMOUS,
881
                        -1, 0);
882
    if (error == -1) {
883
        perror("stk mmap");
884
        exit(-1);
885
    }
886
    /* we reserve one extra page at the top of the stack as guard */
887
    target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
888

    
889
    stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
890
    p += stack_base;
891

    
892
    for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
893
        if (bprm->page[i]) {
894
            info->rss++;
895
            /* FIXME - check return value of memcpy_to_target() for failure */
896
            memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
897
            free(bprm->page[i]);
898
        }
899
        stack_base += TARGET_PAGE_SIZE;
900
    }
901
    return p;
902
}
903

    
904
static void set_brk(abi_ulong start, abi_ulong end)
905
{
906
        /* page-align the start and end addresses... */
907
        start = HOST_PAGE_ALIGN(start);
908
        end = HOST_PAGE_ALIGN(end);
909
        if (end <= start)
910
                return;
911
        if(target_mmap(start, end - start,
912
                       PROT_READ | PROT_WRITE | PROT_EXEC,
913
                       MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == -1) {
914
            perror("cannot mmap brk");
915
            exit(-1);
916
        }
917
}
918

    
919

    
920
/* We need to explicitly zero any fractional pages after the data
921
   section (i.e. bss).  This would contain the junk from the file that
922
   should not be in memory. */
923
static void padzero(abi_ulong elf_bss, abi_ulong last_bss)
924
{
925
        abi_ulong nbyte;
926

    
927
        if (elf_bss >= last_bss)
928
                return;
929

    
930
        /* XXX: this is really a hack : if the real host page size is
931
           smaller than the target page size, some pages after the end
932
           of the file may not be mapped. A better fix would be to
933
           patch target_mmap(), but it is more complicated as the file
934
           size must be known */
935
        if (qemu_real_host_page_size < qemu_host_page_size) {
936
            abi_ulong end_addr, end_addr1;
937
            end_addr1 = (elf_bss + qemu_real_host_page_size - 1) &
938
                ~(qemu_real_host_page_size - 1);
939
            end_addr = HOST_PAGE_ALIGN(elf_bss);
940
            if (end_addr1 < end_addr) {
941
                mmap((void *)g2h(end_addr1), end_addr - end_addr1,
942
                     PROT_READ|PROT_WRITE|PROT_EXEC,
943
                     MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
944
            }
945
        }
946

    
947
        nbyte = elf_bss & (qemu_host_page_size-1);
948
        if (nbyte) {
949
            nbyte = qemu_host_page_size - nbyte;
950
            do {
951
                /* FIXME - what to do if put_user() fails? */
952
                put_user_u8(0, elf_bss);
953
                elf_bss++;
954
            } while (--nbyte);
955
        }
956
}
957

    
958

    
959
static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
960
                                   struct elfhdr * exec,
961
                                   abi_ulong load_addr,
962
                                   abi_ulong load_bias,
963
                                   abi_ulong interp_load_addr, int ibcs,
964
                                   struct image_info *info)
965
{
966
        abi_ulong sp;
967
        int size;
968
        abi_ulong u_platform;
969
        const char *k_platform;
970
        const int n = sizeof(elf_addr_t);
971

    
972
        sp = p;
973
        u_platform = 0;
974
        k_platform = ELF_PLATFORM;
975
        if (k_platform) {
976
            size_t len = strlen(k_platform) + 1;
977
            sp -= (len + n - 1) & ~(n - 1);
978
            u_platform = sp;
979
            /* FIXME - check return value of memcpy_to_target() for failure */
980
            memcpy_to_target(sp, k_platform, len);
981
        }
982
        /*
983
         * Force 16 byte _final_ alignment here for generality.
984
         */
985
        sp = sp &~ (abi_ulong)15;
986
        size = (DLINFO_ITEMS + 1) * 2;
987
        if (k_platform)
988
          size += 2;
989
#ifdef DLINFO_ARCH_ITEMS
990
        size += DLINFO_ARCH_ITEMS * 2;
991
#endif
992
        size += envc + argc + 2;
993
        size += (!ibcs ? 3 : 1);        /* argc itself */
994
        size *= n;
995
        if (size & 15)
996
            sp -= 16 - (size & 15);
997

    
998
        /* This is correct because Linux defines
999
         * elf_addr_t as Elf32_Off / Elf64_Off
1000
         */
1001
#define NEW_AUX_ENT(id, val) do {                \
1002
            sp -= n; put_user_ual(val, sp);        \
1003
            sp -= n; put_user_ual(id, sp);        \
1004
          } while(0)
1005

    
1006
        NEW_AUX_ENT (AT_NULL, 0);
1007

    
1008
        /* There must be exactly DLINFO_ITEMS entries here.  */
1009
        NEW_AUX_ENT(AT_PHDR, (abi_ulong)(load_addr + exec->e_phoff));
1010
        NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
1011
        NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
1012
        NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
1013
        NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_load_addr));
1014
        NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
1015
        NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
1016
        NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
1017
        NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
1018
        NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
1019
        NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
1020
        NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
1021
        NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
1022
        if (k_platform)
1023
            NEW_AUX_ENT(AT_PLATFORM, u_platform);
1024
#ifdef ARCH_DLINFO
1025
        /*
1026
         * ARCH_DLINFO must come last so platform specific code can enforce
1027
         * special alignment requirements on the AUXV if necessary (eg. PPC).
1028
         */
1029
        ARCH_DLINFO;
1030
#endif
1031
#undef NEW_AUX_ENT
1032

    
1033
        info->saved_auxv = sp;
1034

    
1035
        sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
1036
        return sp;
1037
}
1038

    
1039

    
1040
static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
1041
                                 int interpreter_fd,
1042
                                 abi_ulong *interp_load_addr)
1043
{
1044
        struct elf_phdr *elf_phdata  =  NULL;
1045
        struct elf_phdr *eppnt;
1046
        abi_ulong load_addr = 0;
1047
        int load_addr_set = 0;
1048
        int retval;
1049
        abi_ulong last_bss, elf_bss;
1050
        abi_ulong error;
1051
        int i;
1052

    
1053
        elf_bss = 0;
1054
        last_bss = 0;
1055
        error = 0;
1056

    
1057
#ifdef BSWAP_NEEDED
1058
        bswap_ehdr(interp_elf_ex);
1059
#endif
1060
        /* First of all, some simple consistency checks */
1061
        if ((interp_elf_ex->e_type != ET_EXEC &&
1062
             interp_elf_ex->e_type != ET_DYN) ||
1063
           !elf_check_arch(interp_elf_ex->e_machine)) {
1064
                return ~((abi_ulong)0UL);
1065
        }
1066

    
1067

    
1068
        /* Now read in all of the header information */
1069

    
1070
        if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
1071
            return ~(abi_ulong)0UL;
1072

    
1073
        elf_phdata =  (struct elf_phdr *)
1074
                malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
1075

    
1076
        if (!elf_phdata)
1077
          return ~((abi_ulong)0UL);
1078

    
1079
        /*
1080
         * If the size of this structure has changed, then punt, since
1081
         * we will be doing the wrong thing.
1082
         */
1083
        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
1084
            free(elf_phdata);
1085
            return ~((abi_ulong)0UL);
1086
        }
1087

    
1088
        retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
1089
        if(retval >= 0) {
1090
            retval = read(interpreter_fd,
1091
                           (char *) elf_phdata,
1092
                           sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
1093
        }
1094
        if (retval < 0) {
1095
                perror("load_elf_interp");
1096
                exit(-1);
1097
                free (elf_phdata);
1098
                return retval;
1099
         }
1100
#ifdef BSWAP_NEEDED
1101
        eppnt = elf_phdata;
1102
        for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
1103
            bswap_phdr(eppnt);
1104
        }
1105
#endif
1106

    
1107
        if (interp_elf_ex->e_type == ET_DYN) {
1108
            /* in order to avoid hardcoding the interpreter load
1109
               address in qemu, we allocate a big enough memory zone */
1110
            error = target_mmap(0, INTERP_MAP_SIZE,
1111
                                PROT_NONE, MAP_PRIVATE | MAP_ANON,
1112
                                -1, 0);
1113
            if (error == -1) {
1114
                perror("mmap");
1115
                exit(-1);
1116
            }
1117
            load_addr = error;
1118
            load_addr_set = 1;
1119
        }
1120

    
1121
        eppnt = elf_phdata;
1122
        for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
1123
          if (eppnt->p_type == PT_LOAD) {
1124
            int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
1125
            int elf_prot = 0;
1126
            abi_ulong vaddr = 0;
1127
            abi_ulong k;
1128

    
1129
            if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
1130
            if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1131
            if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1132
            if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
1133
                    elf_type |= MAP_FIXED;
1134
                    vaddr = eppnt->p_vaddr;
1135
            }
1136
            error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
1137
                 eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
1138
                 elf_prot,
1139
                 elf_type,
1140
                 interpreter_fd,
1141
                 eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
1142

    
1143
            if (error == -1) {
1144
              /* Real error */
1145
              close(interpreter_fd);
1146
              free(elf_phdata);
1147
              return ~((abi_ulong)0UL);
1148
            }
1149

    
1150
            if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
1151
              load_addr = error;
1152
              load_addr_set = 1;
1153
            }
1154

    
1155
            /*
1156
             * Find the end of the file  mapping for this phdr, and keep
1157
             * track of the largest address we see for this.
1158
             */
1159
            k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
1160
            if (k > elf_bss) elf_bss = k;
1161

    
1162
            /*
1163
             * Do the same thing for the memory mapping - between
1164
             * elf_bss and last_bss is the bss section.
1165
             */
1166
            k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
1167
            if (k > last_bss) last_bss = k;
1168
          }
1169

    
1170
        /* Now use mmap to map the library into memory. */
1171

    
1172
        close(interpreter_fd);
1173

    
1174
        /*
1175
         * Now fill out the bss section.  First pad the last page up
1176
         * to the page boundary, and then perform a mmap to make sure
1177
         * that there are zeromapped pages up to and including the last
1178
         * bss page.
1179
         */
1180
        padzero(elf_bss, last_bss);
1181
        elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
1182

    
1183
        /* Map the last of the bss segment */
1184
        if (last_bss > elf_bss) {
1185
            target_mmap(elf_bss, last_bss-elf_bss,
1186
                        PROT_READ|PROT_WRITE|PROT_EXEC,
1187
                        MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
1188
        }
1189
        free(elf_phdata);
1190

    
1191
        *interp_load_addr = load_addr;
1192
        return ((abi_ulong) interp_elf_ex->e_entry) + load_addr;
1193
}
1194

    
1195
static int symfind(const void *s0, const void *s1)
1196
{
1197
    struct elf_sym *key = (struct elf_sym *)s0;
1198
    struct elf_sym *sym = (struct elf_sym *)s1;
1199
    int result = 0;
1200
    if (key->st_value < sym->st_value) {
1201
        result = -1;
1202
    } else if (key->st_value >= sym->st_value + sym->st_size) {
1203
        result = 1;
1204
    }
1205
    return result;
1206
}
1207

    
1208
static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
1209
{
1210
#if ELF_CLASS == ELFCLASS32
1211
    struct elf_sym *syms = s->disas_symtab.elf32;
1212
#else
1213
    struct elf_sym *syms = s->disas_symtab.elf64;
1214
#endif
1215

    
1216
    // binary search
1217
    struct elf_sym key;
1218
    struct elf_sym *sym;
1219

    
1220
    key.st_value = orig_addr;
1221

    
1222
    sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
1223
    if (sym != NULL) {
1224
        return s->disas_strtab + sym->st_name;
1225
    }
1226

    
1227
    return "";
1228
}
1229

    
1230
/* FIXME: This should use elf_ops.h  */
1231
static int symcmp(const void *s0, const void *s1)
1232
{
1233
    struct elf_sym *sym0 = (struct elf_sym *)s0;
1234
    struct elf_sym *sym1 = (struct elf_sym *)s1;
1235
    return (sym0->st_value < sym1->st_value)
1236
        ? -1
1237
        : ((sym0->st_value > sym1->st_value) ? 1 : 0);
1238
}
1239

    
1240
/* Best attempt to load symbols from this ELF object. */
1241
static void load_symbols(struct elfhdr *hdr, int fd)
1242
{
1243
    unsigned int i, nsyms;
1244
    struct elf_shdr sechdr, symtab, strtab;
1245
    char *strings;
1246
    struct syminfo *s;
1247
    struct elf_sym *syms;
1248

    
1249
    lseek(fd, hdr->e_shoff, SEEK_SET);
1250
    for (i = 0; i < hdr->e_shnum; i++) {
1251
        if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
1252
            return;
1253
#ifdef BSWAP_NEEDED
1254
        bswap_shdr(&sechdr);
1255
#endif
1256
        if (sechdr.sh_type == SHT_SYMTAB) {
1257
            symtab = sechdr;
1258
            lseek(fd, hdr->e_shoff
1259
                  + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
1260
            if (read(fd, &strtab, sizeof(strtab))
1261
                != sizeof(strtab))
1262
                return;
1263
#ifdef BSWAP_NEEDED
1264
            bswap_shdr(&strtab);
1265
#endif
1266
            goto found;
1267
        }
1268
    }
1269
    return; /* Shouldn't happen... */
1270

    
1271
 found:
1272
    /* Now know where the strtab and symtab are.  Snarf them. */
1273
    s = malloc(sizeof(*s));
1274
    syms = malloc(symtab.sh_size);
1275
    if (!syms)
1276
        return;
1277
    s->disas_strtab = strings = malloc(strtab.sh_size);
1278
    if (!s->disas_strtab)
1279
        return;
1280

    
1281
    lseek(fd, symtab.sh_offset, SEEK_SET);
1282
    if (read(fd, syms, symtab.sh_size) != symtab.sh_size)
1283
        return;
1284

    
1285
    nsyms = symtab.sh_size / sizeof(struct elf_sym);
1286

    
1287
    i = 0;
1288
    while (i < nsyms) {
1289
#ifdef BSWAP_NEEDED
1290
        bswap_sym(syms + i);
1291
#endif
1292
        // Throw away entries which we do not need.
1293
        if (syms[i].st_shndx == SHN_UNDEF ||
1294
                syms[i].st_shndx >= SHN_LORESERVE ||
1295
                ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
1296
            nsyms--;
1297
            if (i < nsyms) {
1298
                syms[i] = syms[nsyms];
1299
            }
1300
            continue;
1301
        }
1302
#if defined(TARGET_ARM) || defined (TARGET_MIPS)
1303
        /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
1304
        syms[i].st_value &= ~(target_ulong)1;
1305
#endif
1306
        i++;
1307
    }
1308
    syms = realloc(syms, nsyms * sizeof(*syms));
1309

    
1310
    qsort(syms, nsyms, sizeof(*syms), symcmp);
1311

    
1312
    lseek(fd, strtab.sh_offset, SEEK_SET);
1313
    if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
1314
        return;
1315
    s->disas_num_syms = nsyms;
1316
#if ELF_CLASS == ELFCLASS32
1317
    s->disas_symtab.elf32 = syms;
1318
    s->lookup_symbol = (lookup_symbol_t)lookup_symbolxx;
1319
#else
1320
    s->disas_symtab.elf64 = syms;
1321
    s->lookup_symbol = (lookup_symbol_t)lookup_symbolxx;
1322
#endif
1323
    s->next = syminfos;
1324
    syminfos = s;
1325
}
1326

    
1327
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1328
                    struct image_info * info)
1329
{
1330
    struct elfhdr elf_ex;
1331
    struct elfhdr interp_elf_ex;
1332
    struct exec interp_ex;
1333
    int interpreter_fd = -1; /* avoid warning */
1334
    abi_ulong load_addr, load_bias;
1335
    int load_addr_set = 0;
1336
    unsigned int interpreter_type = INTERPRETER_NONE;
1337
    unsigned char ibcs2_interpreter;
1338
    int i;
1339
    abi_ulong mapped_addr;
1340
    struct elf_phdr * elf_ppnt;
1341
    struct elf_phdr *elf_phdata;
1342
    abi_ulong elf_bss, k, elf_brk;
1343
    int retval;
1344
    char * elf_interpreter;
1345
    abi_ulong elf_entry, interp_load_addr = 0;
1346
    int status;
1347
    abi_ulong start_code, end_code, start_data, end_data;
1348
    abi_ulong reloc_func_desc = 0;
1349
    abi_ulong elf_stack;
1350
    char passed_fileno[6];
1351

    
1352
    ibcs2_interpreter = 0;
1353
    status = 0;
1354
    load_addr = 0;
1355
    load_bias = 0;
1356
    elf_ex = *((struct elfhdr *) bprm->buf);          /* exec-header */
1357
#ifdef BSWAP_NEEDED
1358
    bswap_ehdr(&elf_ex);
1359
#endif
1360

    
1361
    /* First of all, some simple consistency checks */
1362
    if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
1363
                                       (! elf_check_arch(elf_ex.e_machine))) {
1364
            return -ENOEXEC;
1365
    }
1366

    
1367
    bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1368
    bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1369
    bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1370
    if (!bprm->p) {
1371
        retval = -E2BIG;
1372
    }
1373

    
1374
    /* Now read in all of the header information */
1375
    elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
1376
    if (elf_phdata == NULL) {
1377
        return -ENOMEM;
1378
    }
1379

    
1380
    retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
1381
    if(retval > 0) {
1382
        retval = read(bprm->fd, (char *) elf_phdata,
1383
                                elf_ex.e_phentsize * elf_ex.e_phnum);
1384
    }
1385

    
1386
    if (retval < 0) {
1387
        perror("load_elf_binary");
1388
        exit(-1);
1389
        free (elf_phdata);
1390
        return -errno;
1391
    }
1392

    
1393
#ifdef BSWAP_NEEDED
1394
    elf_ppnt = elf_phdata;
1395
    for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
1396
        bswap_phdr(elf_ppnt);
1397
    }
1398
#endif
1399
    elf_ppnt = elf_phdata;
1400

    
1401
    elf_bss = 0;
1402
    elf_brk = 0;
1403

    
1404

    
1405
    elf_stack = ~((abi_ulong)0UL);
1406
    elf_interpreter = NULL;
1407
    start_code = ~((abi_ulong)0UL);
1408
    end_code = 0;
1409
    start_data = 0;
1410
    end_data = 0;
1411
    interp_ex.a_info = 0;
1412

    
1413
    for(i=0;i < elf_ex.e_phnum; i++) {
1414
        if (elf_ppnt->p_type == PT_INTERP) {
1415
            if ( elf_interpreter != NULL )
1416
            {
1417
                free (elf_phdata);
1418
                free(elf_interpreter);
1419
                close(bprm->fd);
1420
                return -EINVAL;
1421
            }
1422

    
1423
            /* This is the program interpreter used for
1424
             * shared libraries - for now assume that this
1425
             * is an a.out format binary
1426
             */
1427

    
1428
            elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
1429

    
1430
            if (elf_interpreter == NULL) {
1431
                free (elf_phdata);
1432
                close(bprm->fd);
1433
                return -ENOMEM;
1434
            }
1435

    
1436
            retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
1437
            if(retval >= 0) {
1438
                retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
1439
            }
1440
            if(retval < 0) {
1441
                 perror("load_elf_binary2");
1442
                exit(-1);
1443
            }
1444

    
1445
            /* If the program interpreter is one of these two,
1446
               then assume an iBCS2 image. Otherwise assume
1447
               a native linux image. */
1448

    
1449
            /* JRP - Need to add X86 lib dir stuff here... */
1450

    
1451
            if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
1452
                strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
1453
              ibcs2_interpreter = 1;
1454
            }
1455

    
1456
#if 0
1457
            printf("Using ELF interpreter %s\n", elf_interpreter);
1458
#endif
1459
            if (retval >= 0) {
1460
                retval = open(path(elf_interpreter), O_RDONLY);
1461
                if(retval >= 0) {
1462
                    interpreter_fd = retval;
1463
                }
1464
                else {
1465
                    perror(elf_interpreter);
1466
                    exit(-1);
1467
                    /* retval = -errno; */
1468
                }
1469
            }
1470

    
1471
            if (retval >= 0) {
1472
                retval = lseek(interpreter_fd, 0, SEEK_SET);
1473
                if(retval >= 0) {
1474
                    retval = read(interpreter_fd,bprm->buf,128);
1475
                }
1476
            }
1477
            if (retval >= 0) {
1478
                interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1479
                interp_elf_ex = *((struct elfhdr *) bprm->buf); /* elf exec-header */
1480
            }
1481
            if (retval < 0) {
1482
                perror("load_elf_binary3");
1483
                exit(-1);
1484
                free (elf_phdata);
1485
                free(elf_interpreter);
1486
                close(bprm->fd);
1487
                return retval;
1488
            }
1489
        }
1490
        elf_ppnt++;
1491
    }
1492

    
1493
    /* Some simple consistency checks for the interpreter */
1494
    if (elf_interpreter){
1495
        interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1496

    
1497
        /* Now figure out which format our binary is */
1498
        if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1499
                    (N_MAGIC(interp_ex) != QMAGIC)) {
1500
          interpreter_type = INTERPRETER_ELF;
1501
        }
1502

    
1503
        if (interp_elf_ex.e_ident[0] != 0x7f ||
1504
            strncmp((char *)&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1505
            interpreter_type &= ~INTERPRETER_ELF;
1506
        }
1507

    
1508
        if (!interpreter_type) {
1509
            free(elf_interpreter);
1510
            free(elf_phdata);
1511
            close(bprm->fd);
1512
            return -ELIBBAD;
1513
        }
1514
    }
1515

    
1516
    /* OK, we are done with that, now set up the arg stuff,
1517
       and then start this sucker up */
1518

    
1519
    {
1520
        char * passed_p;
1521

    
1522
        if (interpreter_type == INTERPRETER_AOUT) {
1523
            snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
1524
            passed_p = passed_fileno;
1525

    
1526
            if (elf_interpreter) {
1527
                bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
1528
                bprm->argc++;
1529
            }
1530
        }
1531
        if (!bprm->p) {
1532
            if (elf_interpreter) {
1533
                free(elf_interpreter);
1534
            }
1535
            free (elf_phdata);
1536
            close(bprm->fd);
1537
            return -E2BIG;
1538
        }
1539
    }
1540

    
1541
    /* OK, This is the point of no return */
1542
    info->end_data = 0;
1543
    info->end_code = 0;
1544
    info->start_mmap = (abi_ulong)ELF_START_MMAP;
1545
    info->mmap = 0;
1546
    elf_entry = (abi_ulong) elf_ex.e_entry;
1547

    
1548
#if defined(CONFIG_USE_GUEST_BASE)
1549
    /*
1550
     * In case where user has not explicitly set the guest_base, we
1551
     * probe here that should we set it automatically.
1552
     */
1553
    if (!have_guest_base) {
1554
        /*
1555
         * Go through ELF program header table and find out whether
1556
         * any of the segments drop below our current mmap_min_addr and
1557
         * in that case set guest_base to corresponding address.
1558
         */
1559
        for (i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum;
1560
            i++, elf_ppnt++) {
1561
            if (elf_ppnt->p_type != PT_LOAD)
1562
                continue;
1563
            if (HOST_PAGE_ALIGN(elf_ppnt->p_vaddr) < mmap_min_addr) {
1564
                guest_base = HOST_PAGE_ALIGN(mmap_min_addr);
1565
                break;
1566
            }
1567
        }
1568
    }
1569
#endif /* CONFIG_USE_GUEST_BASE */
1570

    
1571
    /* Do this so that we can load the interpreter, if need be.  We will
1572
       change some of these later */
1573
    info->rss = 0;
1574
    bprm->p = setup_arg_pages(bprm->p, bprm, info);
1575
    info->start_stack = bprm->p;
1576

    
1577
    /* Now we do a little grungy work by mmaping the ELF image into
1578
     * the correct location in memory.  At this point, we assume that
1579
     * the image should be loaded at fixed address, not at a variable
1580
     * address.
1581
     */
1582

    
1583
    for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1584
        int elf_prot = 0;
1585
        int elf_flags = 0;
1586
        abi_ulong error;
1587

    
1588
        if (elf_ppnt->p_type != PT_LOAD)
1589
            continue;
1590

    
1591
        if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1592
        if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1593
        if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1594
        elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1595
        if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1596
            elf_flags |= MAP_FIXED;
1597
        } else if (elf_ex.e_type == ET_DYN) {
1598
            /* Try and get dynamic programs out of the way of the default mmap
1599
               base, as well as whatever program they might try to exec.  This
1600
               is because the brk will follow the loader, and is not movable.  */
1601
            /* NOTE: for qemu, we do a big mmap to get enough space
1602
               without hardcoding any address */
1603
            error = target_mmap(0, ET_DYN_MAP_SIZE,
1604
                                PROT_NONE, MAP_PRIVATE | MAP_ANON,
1605
                                -1, 0);
1606
            if (error == -1) {
1607
                perror("mmap");
1608
                exit(-1);
1609
            }
1610
            load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1611
        }
1612

    
1613
        error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1614
                            (elf_ppnt->p_filesz +
1615
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1616
                            elf_prot,
1617
                            (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1618
                            bprm->fd,
1619
                            (elf_ppnt->p_offset -
1620
                             TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1621
        if (error == -1) {
1622
            perror("mmap");
1623
            exit(-1);
1624
        }
1625

    
1626
#ifdef LOW_ELF_STACK
1627
        if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1628
            elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1629
#endif
1630

    
1631
        if (!load_addr_set) {
1632
            load_addr_set = 1;
1633
            load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1634
            if (elf_ex.e_type == ET_DYN) {
1635
                load_bias += error -
1636
                    TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1637
                load_addr += load_bias;
1638
                reloc_func_desc = load_bias;
1639
            }
1640
        }
1641
        k = elf_ppnt->p_vaddr;
1642
        if (k < start_code)
1643
            start_code = k;
1644
        if (start_data < k)
1645
            start_data = k;
1646
        k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1647
        if (k > elf_bss)
1648
            elf_bss = k;
1649
        if ((elf_ppnt->p_flags & PF_X) && end_code <  k)
1650
            end_code = k;
1651
        if (end_data < k)
1652
            end_data = k;
1653
        k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1654
        if (k > elf_brk) elf_brk = k;
1655
    }
1656

    
1657
    elf_entry += load_bias;
1658
    elf_bss += load_bias;
1659
    elf_brk += load_bias;
1660
    start_code += load_bias;
1661
    end_code += load_bias;
1662
    start_data += load_bias;
1663
    end_data += load_bias;
1664

    
1665
    if (elf_interpreter) {
1666
        if (interpreter_type & 1) {
1667
            elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1668
        }
1669
        else if (interpreter_type & 2) {
1670
            elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1671
                                            &interp_load_addr);
1672
        }
1673
        reloc_func_desc = interp_load_addr;
1674

    
1675
        close(interpreter_fd);
1676
        free(elf_interpreter);
1677

    
1678
        if (elf_entry == ~((abi_ulong)0UL)) {
1679
            printf("Unable to load interpreter\n");
1680
            free(elf_phdata);
1681
            exit(-1);
1682
            return 0;
1683
        }
1684
    }
1685

    
1686
    free(elf_phdata);
1687

    
1688
    if (qemu_log_enabled())
1689
        load_symbols(&elf_ex, bprm->fd);
1690

    
1691
    if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1692
    info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1693

    
1694
#ifdef LOW_ELF_STACK
1695
    info->start_stack = bprm->p = elf_stack - 4;
1696
#endif
1697
    bprm->p = create_elf_tables(bprm->p,
1698
                    bprm->argc,
1699
                    bprm->envc,
1700
                    &elf_ex,
1701
                    load_addr, load_bias,
1702
                    interp_load_addr,
1703
                    (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1704
                    info);
1705
    info->load_addr = reloc_func_desc;
1706
    info->start_brk = info->brk = elf_brk;
1707
    info->end_code = end_code;
1708
    info->start_code = start_code;
1709
    info->start_data = start_data;
1710
    info->end_data = end_data;
1711
    info->start_stack = bprm->p;
1712

    
1713
    /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1714
       sections */
1715
    set_brk(elf_bss, elf_brk);
1716

    
1717
    padzero(elf_bss, elf_brk);
1718

    
1719
#if 0
1720
    printf("(start_brk) %x\n" , info->start_brk);
1721
    printf("(end_code) %x\n" , info->end_code);
1722
    printf("(start_code) %x\n" , info->start_code);
1723
    printf("(end_data) %x\n" , info->end_data);
1724
    printf("(start_stack) %x\n" , info->start_stack);
1725
    printf("(brk) %x\n" , info->brk);
1726
#endif
1727

    
1728
    if ( info->personality == PER_SVR4 )
1729
    {
1730
            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1731
               and some applications "depend" upon this behavior.
1732
               Since we do not have the power to recompile these, we
1733
               emulate the SVr4 behavior.  Sigh.  */
1734
            mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1735
                                      MAP_FIXED | MAP_PRIVATE, -1, 0);
1736
    }
1737

    
1738
    info->entry = elf_entry;
1739

    
1740
#ifdef USE_ELF_CORE_DUMP
1741
    bprm->core_dump = &elf_core_dump;
1742
#endif
1743

    
1744
    return 0;
1745
}
1746

    
1747
#ifdef USE_ELF_CORE_DUMP
1748

    
1749
/*
1750
 * Definitions to generate Intel SVR4-like core files.
1751
 * These mostly have the same names as the SVR4 types with "target_elf_"
1752
 * tacked on the front to prevent clashes with linux definitions,
1753
 * and the typedef forms have been avoided.  This is mostly like
1754
 * the SVR4 structure, but more Linuxy, with things that Linux does
1755
 * not support and which gdb doesn't really use excluded.
1756
 *
1757
 * Fields we don't dump (their contents is zero) in linux-user qemu
1758
 * are marked with XXX.
1759
 *
1760
 * Core dump code is copied from linux kernel (fs/binfmt_elf.c).
1761
 *
1762
 * Porting ELF coredump for target is (quite) simple process.  First you
1763
 * define ELF_USE_CORE_DUMP in target ELF code (where init_thread() for
1764
 * the target resides):
1765
 *
1766
 * #define USE_ELF_CORE_DUMP
1767
 *
1768
 * Next you define type of register set used for dumping.  ELF specification
1769
 * says that it needs to be array of elf_greg_t that has size of ELF_NREG.
1770
 *
1771
 * typedef <target_regtype> a_target_elf_greg;
1772
 * #define ELF_NREG <number of registers>
1773
 * typedef a_taret_elf_greg a_target_elf_gregset[ELF_NREG];
1774
 *
1775
 * Then define following types to match target types.  Actual types can
1776
 * be found from linux kernel (arch/<ARCH>/include/asm/posix_types.h):
1777
 *
1778
 * typedef <target_uid_type> a_target_uid;
1779
 * typedef <target_gid_type> a_target_gid;
1780
 * typedef <target_pid_type> a_target_pid;
1781
 *
1782
 * Last step is to implement target specific function that copies registers
1783
 * from given cpu into just specified register set.  Prototype is:
1784
 *
1785
 * static void elf_core_copy_regs(a_taret_elf_gregset *regs,
1786
 *                                const CPUState *env);
1787
 *
1788
 * Parameters:
1789
 *     regs - copy register values into here (allocated and zeroed by caller)
1790
 *     env - copy registers from here
1791
 *
1792
 * Example for ARM target is provided in this file.
1793
 */
1794

    
1795
/* An ELF note in memory */
1796
struct memelfnote {
1797
    const char *name;
1798
    size_t     namesz;
1799
    size_t     namesz_rounded;
1800
    int        type;
1801
    size_t     datasz;
1802
    void       *data;
1803
    size_t     notesz;
1804
};
1805

    
1806
struct target_elf_siginfo {
1807
    int  si_signo; /* signal number */
1808
    int  si_code;  /* extra code */
1809
    int  si_errno; /* errno */
1810
};
1811

    
1812
struct target_elf_prstatus {
1813
    struct target_elf_siginfo pr_info;      /* Info associated with signal */
1814
    short              pr_cursig;    /* Current signal */
1815
    target_ulong       pr_sigpend;   /* XXX */
1816
    target_ulong       pr_sighold;   /* XXX */
1817
    a_target_pid       pr_pid;
1818
    a_target_pid       pr_ppid;
1819
    a_target_pid       pr_pgrp;
1820
    a_target_pid       pr_sid;
1821
    struct target_timeval pr_utime;  /* XXX User time */
1822
    struct target_timeval pr_stime;  /* XXX System time */
1823
    struct target_timeval pr_cutime; /* XXX Cumulative user time */
1824
    struct target_timeval pr_cstime; /* XXX Cumulative system time */
1825
    a_target_elf_gregset      pr_reg;       /* GP registers */
1826
    int                pr_fpvalid;   /* XXX */
1827
};
1828

    
1829
#define ELF_PRARGSZ     (80) /* Number of chars for args */
1830

    
1831
struct target_elf_prpsinfo {
1832
    char         pr_state;       /* numeric process state */
1833
    char         pr_sname;       /* char for pr_state */
1834
    char         pr_zomb;        /* zombie */
1835
    char         pr_nice;        /* nice val */
1836
    target_ulong pr_flag;        /* flags */
1837
    a_target_uid pr_uid;
1838
    a_target_gid pr_gid;
1839
    a_target_pid pr_pid, pr_ppid, pr_pgrp, pr_sid;
1840
    /* Lots missing */
1841
    char    pr_fname[16];           /* filename of executable */
1842
    char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
1843
};
1844

    
1845
/* Here is the structure in which status of each thread is captured. */
1846
struct elf_thread_status {
1847
    QTAILQ_ENTRY(elf_thread_status)  ets_link;
1848
    struct target_elf_prstatus prstatus;   /* NT_PRSTATUS */
1849
#if 0
1850
    elf_fpregset_t fpu;             /* NT_PRFPREG */
1851
    struct task_struct *thread;
1852
    elf_fpxregset_t xfpu;           /* ELF_CORE_XFPREG_TYPE */
1853
#endif
1854
    struct memelfnote notes[1];
1855
    int num_notes;
1856
};
1857

    
1858
struct elf_note_info {
1859
    struct memelfnote   *notes;
1860
    struct target_elf_prstatus *prstatus;  /* NT_PRSTATUS */
1861
    struct target_elf_prpsinfo *psinfo;    /* NT_PRPSINFO */
1862

    
1863
    QTAILQ_HEAD(thread_list_head, elf_thread_status) thread_list;
1864
#if 0
1865
    /*
1866
     * Current version of ELF coredump doesn't support
1867
     * dumping fp regs etc.
1868
     */
1869
    elf_fpregset_t *fpu;
1870
    elf_fpxregset_t *xfpu;
1871
    int thread_status_size;
1872
#endif
1873
    int notes_size;
1874
    int numnote;
1875
};
1876

    
1877
struct vm_area_struct {
1878
    abi_ulong   vma_start;  /* start vaddr of memory region */
1879
    abi_ulong   vma_end;    /* end vaddr of memory region */
1880
    abi_ulong   vma_flags;  /* protection etc. flags for the region */
1881
    QTAILQ_ENTRY(vm_area_struct) vma_link;
1882
};
1883

    
1884
struct mm_struct {
1885
    QTAILQ_HEAD(, vm_area_struct) mm_mmap;
1886
    int mm_count;           /* number of mappings */
1887
};
1888

    
1889
static struct mm_struct *vma_init(void);
1890
static void vma_delete(struct mm_struct *);
1891
static int vma_add_mapping(struct mm_struct *, abi_ulong,
1892
    abi_ulong, abi_ulong);
1893
static int vma_get_mapping_count(const struct mm_struct *);
1894
static struct vm_area_struct *vma_first(const struct mm_struct *);
1895
static struct vm_area_struct *vma_next(struct vm_area_struct *);
1896
static abi_ulong vma_dump_size(const struct vm_area_struct *);
1897
static int vma_walker(void *priv, unsigned long start, unsigned long end,
1898
    unsigned long flags);
1899

    
1900
static void fill_elf_header(struct elfhdr *, int, uint16_t, uint32_t);
1901
static void fill_note(struct memelfnote *, const char *, int,
1902
    unsigned int, void *);
1903
static void fill_prstatus(struct target_elf_prstatus *, const TaskState *, int);
1904
static int fill_psinfo(struct target_elf_prpsinfo *, const TaskState *);
1905
static void fill_auxv_note(struct memelfnote *, const TaskState *);
1906
static void fill_elf_note_phdr(struct elf_phdr *, int, off_t);
1907
static size_t note_size(const struct memelfnote *);
1908
static void free_note_info(struct elf_note_info *);
1909
static int fill_note_info(struct elf_note_info *, long, const CPUState *);
1910
static void fill_thread_info(struct elf_note_info *, const CPUState *);
1911
static int core_dump_filename(const TaskState *, char *, size_t);
1912

    
1913
static int dump_write(int, const void *, size_t);
1914
static int write_note(struct memelfnote *, int);
1915
static int write_note_info(struct elf_note_info *, int);
1916

    
1917
#ifdef BSWAP_NEEDED
1918
static void bswap_prstatus(struct target_elf_prstatus *);
1919
static void bswap_psinfo(struct target_elf_prpsinfo *);
1920

    
1921
static void bswap_prstatus(struct target_elf_prstatus *prstatus)
1922
{
1923
    prstatus->pr_info.si_signo = tswapl(prstatus->pr_info.si_signo);
1924
    prstatus->pr_info.si_code = tswapl(prstatus->pr_info.si_code);
1925
    prstatus->pr_info.si_errno = tswapl(prstatus->pr_info.si_errno);
1926
    prstatus->pr_cursig = tswap16(prstatus->pr_cursig);
1927
    prstatus->pr_sigpend = tswapl(prstatus->pr_sigpend);
1928
    prstatus->pr_sighold = tswapl(prstatus->pr_sighold);
1929
    prstatus->pr_pid = tswap32(prstatus->pr_pid);
1930
    prstatus->pr_ppid = tswap32(prstatus->pr_ppid);
1931
    prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp);
1932
    prstatus->pr_sid = tswap32(prstatus->pr_sid);
1933
    /* cpu times are not filled, so we skip them */
1934
    /* regs should be in correct format already */
1935
    prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid);
1936
}
1937

    
1938
static void bswap_psinfo(struct target_elf_prpsinfo *psinfo)
1939
{
1940
    psinfo->pr_flag = tswapl(psinfo->pr_flag);
1941
    psinfo->pr_uid = tswap16(psinfo->pr_uid);
1942
    psinfo->pr_gid = tswap16(psinfo->pr_gid);
1943
    psinfo->pr_pid = tswap32(psinfo->pr_pid);
1944
    psinfo->pr_ppid = tswap32(psinfo->pr_ppid);
1945
    psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp);
1946
    psinfo->pr_sid = tswap32(psinfo->pr_sid);
1947
}
1948
#endif /* BSWAP_NEEDED */
1949

    
1950
/*
1951
 * Minimal support for linux memory regions.  These are needed
1952
 * when we are finding out what memory exactly belongs to
1953
 * emulated process.  No locks needed here, as long as
1954
 * thread that received the signal is stopped.
1955
 */
1956

    
1957
static struct mm_struct *vma_init(void)
1958
{
1959
    struct mm_struct *mm;
1960

    
1961
    if ((mm = qemu_malloc(sizeof (*mm))) == NULL)
1962
        return (NULL);
1963

    
1964
    mm->mm_count = 0;
1965
    QTAILQ_INIT(&mm->mm_mmap);
1966

    
1967
    return (mm);
1968
}
1969

    
1970
static void vma_delete(struct mm_struct *mm)
1971
{
1972
    struct vm_area_struct *vma;
1973

    
1974
    while ((vma = vma_first(mm)) != NULL) {
1975
        QTAILQ_REMOVE(&mm->mm_mmap, vma, vma_link);
1976
        qemu_free(vma);
1977
    }
1978
    qemu_free(mm);
1979
}
1980

    
1981
static int vma_add_mapping(struct mm_struct *mm, abi_ulong start,
1982
    abi_ulong end, abi_ulong flags)
1983
{
1984
    struct vm_area_struct *vma;
1985

    
1986
    if ((vma = qemu_mallocz(sizeof (*vma))) == NULL)
1987
        return (-1);
1988

    
1989
    vma->vma_start = start;
1990
    vma->vma_end = end;
1991
    vma->vma_flags = flags;
1992

    
1993
    QTAILQ_INSERT_TAIL(&mm->mm_mmap, vma, vma_link);
1994
    mm->mm_count++;
1995

    
1996
    return (0);
1997
}
1998

    
1999
static struct vm_area_struct *vma_first(const struct mm_struct *mm)
2000
{
2001
    return (QTAILQ_FIRST(&mm->mm_mmap));
2002
}
2003

    
2004
static struct vm_area_struct *vma_next(struct vm_area_struct *vma)
2005
{
2006
    return (QTAILQ_NEXT(vma, vma_link));
2007
}
2008

    
2009
static int vma_get_mapping_count(const struct mm_struct *mm)
2010
{
2011
    return (mm->mm_count);
2012
}
2013

    
2014
/*
2015
 * Calculate file (dump) size of given memory region.
2016
 */
2017
static abi_ulong vma_dump_size(const struct vm_area_struct *vma)
2018
{
2019
    /* if we cannot even read the first page, skip it */
2020
    if (!access_ok(VERIFY_READ, vma->vma_start, TARGET_PAGE_SIZE))
2021
        return (0);
2022

    
2023
    /*
2024
     * Usually we don't dump executable pages as they contain
2025
     * non-writable code that debugger can read directly from
2026
     * target library etc.  However, thread stacks are marked
2027
     * also executable so we read in first page of given region
2028
     * and check whether it contains elf header.  If there is
2029
     * no elf header, we dump it.
2030
     */
2031
    if (vma->vma_flags & PROT_EXEC) {
2032
        char page[TARGET_PAGE_SIZE];
2033

    
2034
        copy_from_user(page, vma->vma_start, sizeof (page));
2035
        if ((page[EI_MAG0] == ELFMAG0) &&
2036
            (page[EI_MAG1] == ELFMAG1) &&
2037
            (page[EI_MAG2] == ELFMAG2) &&
2038
            (page[EI_MAG3] == ELFMAG3)) {
2039
            /*
2040
             * Mappings are possibly from ELF binary.  Don't dump
2041
             * them.
2042
             */
2043
            return (0);
2044
        }
2045
    }
2046

    
2047
    return (vma->vma_end - vma->vma_start);
2048
}
2049

    
2050
static int vma_walker(void *priv, unsigned long start, unsigned long end,
2051
    unsigned long flags)
2052
{
2053
    struct mm_struct *mm = (struct mm_struct *)priv;
2054

    
2055
    /*
2056
     * Don't dump anything that qemu has reserved for internal use.
2057
     */
2058
    if (flags & PAGE_RESERVED)
2059
        return (0);
2060

    
2061
    vma_add_mapping(mm, start, end, flags);
2062
    return (0);
2063
}
2064

    
2065
static void fill_note(struct memelfnote *note, const char *name, int type,
2066
    unsigned int sz, void *data)
2067
{
2068
    unsigned int namesz;
2069

    
2070
    namesz = strlen(name) + 1;
2071
    note->name = name;
2072
    note->namesz = namesz;
2073
    note->namesz_rounded = roundup(namesz, sizeof (int32_t));
2074
    note->type = type;
2075
    note->datasz = roundup(sz, sizeof (int32_t));;
2076
    note->data = data;
2077

    
2078
    /*
2079
     * We calculate rounded up note size here as specified by
2080
     * ELF document.
2081
     */
2082
    note->notesz = sizeof (struct elf_note) +
2083
        note->namesz_rounded + note->datasz;
2084
}
2085

    
2086
static void fill_elf_header(struct elfhdr *elf, int segs, uint16_t machine,
2087
    uint32_t flags)
2088
{
2089
    (void) memset(elf, 0, sizeof(*elf));
2090

    
2091
    (void) memcpy(elf->e_ident, ELFMAG, SELFMAG);
2092
    elf->e_ident[EI_CLASS] = ELF_CLASS;
2093
    elf->e_ident[EI_DATA] = ELF_DATA;
2094
    elf->e_ident[EI_VERSION] = EV_CURRENT;
2095
    elf->e_ident[EI_OSABI] = ELF_OSABI;
2096

    
2097
    elf->e_type = ET_CORE;
2098
    elf->e_machine = machine;
2099
    elf->e_version = EV_CURRENT;
2100
    elf->e_phoff = sizeof(struct elfhdr);
2101
    elf->e_flags = flags;
2102
    elf->e_ehsize = sizeof(struct elfhdr);
2103
    elf->e_phentsize = sizeof(struct elf_phdr);
2104
    elf->e_phnum = segs;
2105

    
2106
#ifdef BSWAP_NEEDED
2107
    bswap_ehdr(elf);
2108
#endif
2109
}
2110

    
2111
static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset)
2112
{
2113
    phdr->p_type = PT_NOTE;
2114
    phdr->p_offset = offset;
2115
    phdr->p_vaddr = 0;
2116
    phdr->p_paddr = 0;
2117
    phdr->p_filesz = sz;
2118
    phdr->p_memsz = 0;
2119
    phdr->p_flags = 0;
2120
    phdr->p_align = 0;
2121

    
2122
#ifdef BSWAP_NEEDED
2123
    bswap_phdr(phdr);
2124
#endif
2125
}
2126

    
2127
static size_t note_size(const struct memelfnote *note)
2128
{
2129
    return (note->notesz);
2130
}
2131

    
2132
static void fill_prstatus(struct target_elf_prstatus *prstatus,
2133
    const TaskState *ts, int signr)
2134
{
2135
    (void) memset(prstatus, 0, sizeof (*prstatus));
2136
    prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
2137
    prstatus->pr_pid = ts->ts_tid;
2138
    prstatus->pr_ppid = getppid();
2139
    prstatus->pr_pgrp = getpgrp();
2140
    prstatus->pr_sid = getsid(0);
2141

    
2142
#ifdef BSWAP_NEEDED
2143
    bswap_prstatus(prstatus);
2144
#endif
2145
}
2146

    
2147
static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
2148
{
2149
    char *filename, *base_filename;
2150
    unsigned int i, len;
2151

    
2152
    (void) memset(psinfo, 0, sizeof (*psinfo));
2153

    
2154
    len = ts->info->arg_end - ts->info->arg_start;
2155
    if (len >= ELF_PRARGSZ)
2156
        len = ELF_PRARGSZ - 1;
2157
    if (copy_from_user(&psinfo->pr_psargs, ts->info->arg_start, len))
2158
        return -EFAULT;
2159
    for (i = 0; i < len; i++)
2160
        if (psinfo->pr_psargs[i] == 0)
2161
            psinfo->pr_psargs[i] = ' ';
2162
    psinfo->pr_psargs[len] = 0;
2163

    
2164
    psinfo->pr_pid = getpid();
2165
    psinfo->pr_ppid = getppid();
2166
    psinfo->pr_pgrp = getpgrp();
2167
    psinfo->pr_sid = getsid(0);
2168
    psinfo->pr_uid = getuid();
2169
    psinfo->pr_gid = getgid();
2170

    
2171
    filename = strdup(ts->bprm->filename);
2172
    base_filename = strdup(basename(filename));
2173
    (void) strncpy(psinfo->pr_fname, base_filename,
2174
        sizeof(psinfo->pr_fname));
2175
    free(base_filename);
2176
    free(filename);
2177

    
2178
#ifdef BSWAP_NEEDED
2179
    bswap_psinfo(psinfo);
2180
#endif
2181
    return (0);
2182
}
2183

    
2184
static void fill_auxv_note(struct memelfnote *note, const TaskState *ts)
2185
{
2186
    elf_addr_t auxv = (elf_addr_t)ts->info->saved_auxv;
2187
    elf_addr_t orig_auxv = auxv;
2188
    abi_ulong val;
2189
    void *ptr;
2190
    int i, len;
2191

    
2192
    /*
2193
     * Auxiliary vector is stored in target process stack.  It contains
2194
     * {type, value} pairs that we need to dump into note.  This is not
2195
     * strictly necessary but we do it here for sake of completeness.
2196
     */
2197

    
2198
    /* find out lenght of the vector, AT_NULL is terminator */
2199
    i = len = 0;
2200
    do {
2201
        get_user_ual(val, auxv);
2202
        i += 2;
2203
        auxv += 2 * sizeof (elf_addr_t);
2204
    } while (val != AT_NULL);
2205
    len = i * sizeof (elf_addr_t);
2206

    
2207
    /* read in whole auxv vector and copy it to memelfnote */
2208
    ptr = lock_user(VERIFY_READ, orig_auxv, len, 0);
2209
    if (ptr != NULL) {
2210
        fill_note(note, "CORE", NT_AUXV, len, ptr);
2211
        unlock_user(ptr, auxv, len);
2212
    }
2213
}
2214

    
2215
/*
2216
 * Constructs name of coredump file.  We have following convention
2217
 * for the name:
2218
 *     qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core
2219
 *
2220
 * Returns 0 in case of success, -1 otherwise (errno is set).
2221
 */
2222
static int core_dump_filename(const TaskState *ts, char *buf,
2223
    size_t bufsize)
2224
{
2225
    char timestamp[64];
2226
    char *filename = NULL;
2227
    char *base_filename = NULL;
2228
    struct timeval tv;
2229
    struct tm tm;
2230

    
2231
    assert(bufsize >= PATH_MAX);
2232

    
2233
    if (gettimeofday(&tv, NULL) < 0) {
2234
        (void) fprintf(stderr, "unable to get current timestamp: %s",
2235
            strerror(errno));
2236
        return (-1);
2237
    }
2238

    
2239
    filename = strdup(ts->bprm->filename);
2240
    base_filename = strdup(basename(filename));
2241
    (void) strftime(timestamp, sizeof (timestamp), "%Y%m%d-%H%M%S",
2242
        localtime_r(&tv.tv_sec, &tm));
2243
    (void) snprintf(buf, bufsize, "qemu_%s_%s_%d.core",
2244
        base_filename, timestamp, (int)getpid());
2245
    free(base_filename);
2246
    free(filename);
2247

    
2248
    return (0);
2249
}
2250

    
2251
static int dump_write(int fd, const void *ptr, size_t size)
2252
{
2253
    const char *bufp = (const char *)ptr;
2254
    ssize_t bytes_written, bytes_left;
2255
    struct rlimit dumpsize;
2256
    off_t pos;
2257

    
2258
    bytes_written = 0;
2259
    getrlimit(RLIMIT_CORE, &dumpsize);
2260
    if ((pos = lseek(fd, 0, SEEK_CUR))==-1) {
2261
        if (errno == ESPIPE) { /* not a seekable stream */
2262
            bytes_left = size;
2263
        } else {
2264
            return pos;
2265
        }
2266
    } else {
2267
        if (dumpsize.rlim_cur <= pos) {
2268
            return -1;
2269
        } else if (dumpsize.rlim_cur == RLIM_INFINITY) {
2270
            bytes_left = size;
2271
        } else {
2272
            size_t limit_left=dumpsize.rlim_cur - pos;
2273
            bytes_left = limit_left >= size ? size : limit_left ;
2274
        }
2275
    }
2276

    
2277
    /*
2278
     * In normal conditions, single write(2) should do but
2279
     * in case of socket etc. this mechanism is more portable.
2280
     */
2281
    do {
2282
        bytes_written = write(fd, bufp, bytes_left);
2283
        if (bytes_written < 0) {
2284
            if (errno == EINTR)
2285
                continue;
2286
            return (-1);
2287
        } else if (bytes_written == 0) { /* eof */
2288
            return (-1);
2289
        }
2290
        bufp += bytes_written;
2291
        bytes_left -= bytes_written;
2292
    } while (bytes_left > 0);
2293

    
2294
    return (0);
2295
}
2296

    
2297
static int write_note(struct memelfnote *men, int fd)
2298
{
2299
    struct elf_note en;
2300

    
2301
    en.n_namesz = men->namesz;
2302
    en.n_type = men->type;
2303
    en.n_descsz = men->datasz;
2304

    
2305
#ifdef BSWAP_NEEDED
2306
    bswap_note(&en);
2307
#endif
2308

    
2309
    if (dump_write(fd, &en, sizeof(en)) != 0)
2310
        return (-1);
2311
    if (dump_write(fd, men->name, men->namesz_rounded) != 0)
2312
        return (-1);
2313
    if (dump_write(fd, men->data, men->datasz) != 0)
2314
        return (-1);
2315

    
2316
    return (0);
2317
}
2318

    
2319
static void fill_thread_info(struct elf_note_info *info, const CPUState *env)
2320
{
2321
    TaskState *ts = (TaskState *)env->opaque;
2322
    struct elf_thread_status *ets;
2323

    
2324
    ets = qemu_mallocz(sizeof (*ets));
2325
    ets->num_notes = 1; /* only prstatus is dumped */
2326
    fill_prstatus(&ets->prstatus, ts, 0);
2327
    elf_core_copy_regs(&ets->prstatus.pr_reg, env);
2328
    fill_note(&ets->notes[0], "CORE", NT_PRSTATUS, sizeof (ets->prstatus),
2329
        &ets->prstatus);
2330

    
2331
    QTAILQ_INSERT_TAIL(&info->thread_list, ets, ets_link);
2332

    
2333
    info->notes_size += note_size(&ets->notes[0]);
2334
}
2335

    
2336
static int fill_note_info(struct elf_note_info *info,
2337
    long signr, const CPUState *env)
2338
{
2339
#define NUMNOTES 3
2340
    CPUState *cpu = NULL;
2341
    TaskState *ts = (TaskState *)env->opaque;
2342
    int i;
2343

    
2344
    (void) memset(info, 0, sizeof (*info));
2345

    
2346
    QTAILQ_INIT(&info->thread_list);
2347

    
2348
    info->notes = qemu_mallocz(NUMNOTES * sizeof (struct memelfnote));
2349
    if (info->notes == NULL)
2350
        return (-ENOMEM);
2351
    info->prstatus = qemu_mallocz(sizeof (*info->prstatus));
2352
    if (info->prstatus == NULL)
2353
        return (-ENOMEM);
2354
    info->psinfo = qemu_mallocz(sizeof (*info->psinfo));
2355
    if (info->prstatus == NULL)
2356
        return (-ENOMEM);
2357

    
2358
    /*
2359
     * First fill in status (and registers) of current thread
2360
     * including process info & aux vector.
2361
     */
2362
    fill_prstatus(info->prstatus, ts, signr);
2363
    elf_core_copy_regs(&info->prstatus->pr_reg, env);
2364
    fill_note(&info->notes[0], "CORE", NT_PRSTATUS,
2365
        sizeof (*info->prstatus), info->prstatus);
2366
    fill_psinfo(info->psinfo, ts);
2367
    fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
2368
        sizeof (*info->psinfo), info->psinfo);
2369
    fill_auxv_note(&info->notes[2], ts);
2370
    info->numnote = 3;
2371

    
2372
    info->notes_size = 0;
2373
    for (i = 0; i < info->numnote; i++)
2374
        info->notes_size += note_size(&info->notes[i]);
2375

    
2376
    /* read and fill status of all threads */
2377
    cpu_list_lock();
2378
    for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2379
        if (cpu == thread_env)
2380
            continue;
2381
        fill_thread_info(info, cpu);
2382
    }
2383
    cpu_list_unlock();
2384

    
2385
    return (0);
2386
}
2387

    
2388
static void free_note_info(struct elf_note_info *info)
2389
{
2390
    struct elf_thread_status *ets;
2391

    
2392
    while (!QTAILQ_EMPTY(&info->thread_list)) {
2393
        ets = QTAILQ_FIRST(&info->thread_list);
2394
        QTAILQ_REMOVE(&info->thread_list, ets, ets_link);
2395
        qemu_free(ets);
2396
    }
2397

    
2398
    qemu_free(info->prstatus);
2399
    qemu_free(info->psinfo);
2400
    qemu_free(info->notes);
2401
}
2402

    
2403
static int write_note_info(struct elf_note_info *info, int fd)
2404
{
2405
    struct elf_thread_status *ets;
2406
    int i, error = 0;
2407

    
2408
    /* write prstatus, psinfo and auxv for current thread */
2409
    for (i = 0; i < info->numnote; i++)
2410
        if ((error = write_note(&info->notes[i], fd)) != 0)
2411
            return (error);
2412

    
2413
    /* write prstatus for each thread */
2414
    for (ets = info->thread_list.tqh_first; ets != NULL;
2415
        ets = ets->ets_link.tqe_next) {
2416
        if ((error = write_note(&ets->notes[0], fd)) != 0)
2417
            return (error);
2418
    }
2419

    
2420
    return (0);
2421
}
2422

    
2423
/*
2424
 * Write out ELF coredump.
2425
 *
2426
 * See documentation of ELF object file format in:
2427
 * http://www.caldera.com/developers/devspecs/gabi41.pdf
2428
 *
2429
 * Coredump format in linux is following:
2430
 *
2431
 * 0   +----------------------+         \
2432
 *     | ELF header           | ET_CORE  |
2433
 *     +----------------------+          |
2434
 *     | ELF program headers  |          |--- headers
2435
 *     | - NOTE section       |          |
2436
 *     | - PT_LOAD sections   |          |
2437
 *     +----------------------+         /
2438
 *     | NOTEs:               |
2439
 *     | - NT_PRSTATUS        |
2440
 *     | - NT_PRSINFO         |
2441
 *     | - NT_AUXV            |
2442
 *     +----------------------+ <-- aligned to target page
2443
 *     | Process memory dump  |
2444
 *     :                      :
2445
 *     .                      .
2446
 *     :                      :
2447
 *     |                      |
2448
 *     +----------------------+
2449
 *
2450
 * NT_PRSTATUS -> struct elf_prstatus (per thread)
2451
 * NT_PRSINFO  -> struct elf_prpsinfo
2452
 * NT_AUXV is array of { type, value } pairs (see fill_auxv_note()).
2453
 *
2454
 * Format follows System V format as close as possible.  Current
2455
 * version limitations are as follows:
2456
 *     - no floating point registers are dumped
2457
 *
2458
 * Function returns 0 in case of success, negative errno otherwise.
2459
 *
2460
 * TODO: make this work also during runtime: it should be
2461
 * possible to force coredump from running process and then
2462
 * continue processing.  For example qemu could set up SIGUSR2
2463
 * handler (provided that target process haven't registered
2464
 * handler for that) that does the dump when signal is received.
2465
 */
2466
static int elf_core_dump(int signr, const CPUState *env)
2467
{
2468
    const TaskState *ts = (const TaskState *)env->opaque;
2469
    struct vm_area_struct *vma = NULL;
2470
    char corefile[PATH_MAX];
2471
    struct elf_note_info info;
2472
    struct elfhdr elf;
2473
    struct elf_phdr phdr;
2474
    struct rlimit dumpsize;
2475
    struct mm_struct *mm = NULL;
2476
    off_t offset = 0, data_offset = 0;
2477
    int segs = 0;
2478
    int fd = -1;
2479

    
2480
    errno = 0;
2481
    getrlimit(RLIMIT_CORE, &dumpsize);
2482
    if (dumpsize.rlim_cur == 0)
2483
       return 0;
2484

    
2485
    if (core_dump_filename(ts, corefile, sizeof (corefile)) < 0)
2486
        return (-errno);
2487

    
2488
    if ((fd = open(corefile, O_WRONLY | O_CREAT,
2489
        S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
2490
        return (-errno);
2491

    
2492
    /*
2493
     * Walk through target process memory mappings and
2494
     * set up structure containing this information.  After
2495
     * this point vma_xxx functions can be used.
2496
     */
2497
    if ((mm = vma_init()) == NULL)
2498
        goto out;
2499

    
2500
    walk_memory_regions(mm, vma_walker);
2501
    segs = vma_get_mapping_count(mm);
2502

    
2503
    /*
2504
     * Construct valid coredump ELF header.  We also
2505
     * add one more segment for notes.
2506
     */
2507
    fill_elf_header(&elf, segs + 1, ELF_MACHINE, 0);
2508
    if (dump_write(fd, &elf, sizeof (elf)) != 0)
2509
        goto out;
2510

    
2511
    /* fill in in-memory version of notes */
2512
    if (fill_note_info(&info, signr, env) < 0)
2513
        goto out;
2514

    
2515
    offset += sizeof (elf);                             /* elf header */
2516
    offset += (segs + 1) * sizeof (struct elf_phdr);    /* program headers */
2517

    
2518
    /* write out notes program header */
2519
    fill_elf_note_phdr(&phdr, info.notes_size, offset);
2520

    
2521
    offset += info.notes_size;
2522
    if (dump_write(fd, &phdr, sizeof (phdr)) != 0)
2523
        goto out;
2524

    
2525
    /*
2526
     * ELF specification wants data to start at page boundary so
2527
     * we align it here.
2528
     */
2529
    offset = roundup(offset, ELF_EXEC_PAGESIZE);
2530

    
2531
    /*
2532
     * Write program headers for memory regions mapped in
2533
     * the target process.
2534
     */
2535
    for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
2536
        (void) memset(&phdr, 0, sizeof (phdr));
2537

    
2538
        phdr.p_type = PT_LOAD;
2539
        phdr.p_offset = offset;
2540
        phdr.p_vaddr = vma->vma_start;
2541
        phdr.p_paddr = 0;
2542
        phdr.p_filesz = vma_dump_size(vma);
2543
        offset += phdr.p_filesz;
2544
        phdr.p_memsz = vma->vma_end - vma->vma_start;
2545
        phdr.p_flags = vma->vma_flags & PROT_READ ? PF_R : 0;
2546
        if (vma->vma_flags & PROT_WRITE)
2547
            phdr.p_flags |= PF_W;
2548
        if (vma->vma_flags & PROT_EXEC)
2549
            phdr.p_flags |= PF_X;
2550
        phdr.p_align = ELF_EXEC_PAGESIZE;
2551

    
2552
        dump_write(fd, &phdr, sizeof (phdr));
2553
    }
2554

    
2555
    /*
2556
     * Next we write notes just after program headers.  No
2557
     * alignment needed here.
2558
     */
2559
    if (write_note_info(&info, fd) < 0)
2560
        goto out;
2561

    
2562
    /* align data to page boundary */
2563
    data_offset = lseek(fd, 0, SEEK_CUR);
2564
    data_offset = TARGET_PAGE_ALIGN(data_offset);
2565
    if (lseek(fd, data_offset, SEEK_SET) != data_offset)
2566
        goto out;
2567

    
2568
    /*
2569
     * Finally we can dump process memory into corefile as well.
2570
     */
2571
    for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
2572
        abi_ulong addr;
2573
        abi_ulong end;
2574

    
2575
        end = vma->vma_start + vma_dump_size(vma);
2576

    
2577
        for (addr = vma->vma_start; addr < end;
2578
            addr += TARGET_PAGE_SIZE) {
2579
            char page[TARGET_PAGE_SIZE];
2580
            int error;
2581

    
2582
            /*
2583
             *  Read in page from target process memory and
2584
             *  write it to coredump file.
2585
             */
2586
            error = copy_from_user(page, addr, sizeof (page));
2587
            if (error != 0) {
2588
                (void) fprintf(stderr, "unable to dump " TARGET_FMT_lx "\n",
2589
                    addr);
2590
                errno = -error;
2591
                goto out;
2592
            }
2593
            if (dump_write(fd, page, TARGET_PAGE_SIZE) < 0)
2594
                goto out;
2595
        }
2596
    }
2597

    
2598
out:
2599
    free_note_info(&info);
2600
    if (mm != NULL)
2601
        vma_delete(mm);
2602
    (void) close(fd);
2603

    
2604
    if (errno != 0)
2605
        return (-errno);
2606
    return (0);
2607
}
2608

    
2609
#endif /* USE_ELF_CORE_DUMP */
2610

    
2611
static int load_aout_interp(void * exptr, int interp_fd)
2612
{
2613
    printf("a.out interpreter not yet supported\n");
2614
    return(0);
2615
}
2616

    
2617
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
2618
{
2619
    init_thread(regs, infop);
2620
}