Statistics
| Branch: | Revision:

root / linux-user / elfload.c @ 5d5c9930

History | View | Annotate | Download (75.9 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
40
                                           descriptors (signal handling) */
41
    MMAP_PAGE_ZERO =    0x0100000,
42
    ADDR_COMPAT_LAYOUT = 0x0200000,
43
    READ_IMPLIES_EXEC = 0x0400000,
44
    ADDR_LIMIT_32BIT =  0x0800000,
45
    SHORT_INODE =       0x1000000,
46
    WHOLE_SECONDS =     0x2000000,
47
    STICKY_TIMEOUTS =   0x4000000,
48
    ADDR_LIMIT_3GB =    0x8000000,
49
};
50

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

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

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

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

    
98
#ifdef TARGET_WORDS_BIGENDIAN
99
#define ELF_DATA        ELFDATA2MSB
100
#else
101
#define ELF_DATA        ELFDATA2LSB
102
#endif
103

    
104
typedef target_ulong    target_elf_greg_t;
105
#ifdef USE_UID16
106
typedef uint16_t        target_uid_t;
107
typedef uint16_t        target_gid_t;
108
#else
109
typedef uint32_t        target_uid_t;
110
typedef uint32_t        target_gid_t;
111
#endif
112
typedef int32_t         target_pid_t;
113

    
114
#ifdef TARGET_I386
115

    
116
#define ELF_PLATFORM get_elf_platform()
117

    
118
static const char *get_elf_platform(void)
119
{
120
    static char elf_platform[] = "i386";
121
    int family = (thread_env->cpuid_version >> 8) & 0xff;
122
    if (family > 6)
123
        family = 6;
124
    if (family >= 3)
125
        elf_platform[1] = '0' + family;
126
    return elf_platform;
127
}
128

    
129
#define ELF_HWCAP get_elf_hwcap()
130

    
131
static uint32_t get_elf_hwcap(void)
132
{
133
    return thread_env->cpuid_features;
134
}
135

    
136
#ifdef TARGET_X86_64
137
#define ELF_START_MMAP 0x2aaaaab000ULL
138
#define elf_check_arch(x) ( ((x) == ELF_ARCH) )
139

    
140
#define ELF_CLASS      ELFCLASS64
141
#define ELF_ARCH       EM_X86_64
142

    
143
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
144
{
145
    regs->rax = 0;
146
    regs->rsp = infop->start_stack;
147
    regs->rip = infop->entry;
148
}
149

    
150
#define ELF_NREG    27
151
typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
152

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

    
191
#else
192

    
193
#define ELF_START_MMAP 0x80000000
194

    
195
/*
196
 * This is used to ensure we don't load something for the wrong architecture.
197
 */
198
#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
199

    
200
/*
201
 * These are used to set parameters in the core dumps.
202
 */
203
#define ELF_CLASS       ELFCLASS32
204
#define ELF_ARCH        EM_386
205

    
206
static inline void init_thread(struct target_pt_regs *regs,
207
                               struct image_info *infop)
208
{
209
    regs->esp = infop->start_stack;
210
    regs->eip = infop->entry;
211

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

218
       A value of 0 tells we have no such handler.  */
219
    regs->edx = 0;
220
}
221

    
222
#define ELF_NREG    17
223
typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
224

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

    
254
#define USE_ELF_CORE_DUMP
255
#define ELF_EXEC_PAGESIZE       4096
256

    
257
#endif
258

    
259
#ifdef TARGET_ARM
260

    
261
#define ELF_START_MMAP 0x80000000
262

    
263
#define elf_check_arch(x) ( (x) == EM_ARM )
264

    
265
#define ELF_CLASS       ELFCLASS32
266
#define ELF_ARCH        EM_ARM
267

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

    
288
#define ELF_NREG    18
289
typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
290

    
291
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
292
{
293
    (*regs)[0] = tswapl(env->regs[0]);
294
    (*regs)[1] = tswapl(env->regs[1]);
295
    (*regs)[2] = tswapl(env->regs[2]);
296
    (*regs)[3] = tswapl(env->regs[3]);
297
    (*regs)[4] = tswapl(env->regs[4]);
298
    (*regs)[5] = tswapl(env->regs[5]);
299
    (*regs)[6] = tswapl(env->regs[6]);
300
    (*regs)[7] = tswapl(env->regs[7]);
301
    (*regs)[8] = tswapl(env->regs[8]);
302
    (*regs)[9] = tswapl(env->regs[9]);
303
    (*regs)[10] = tswapl(env->regs[10]);
304
    (*regs)[11] = tswapl(env->regs[11]);
305
    (*regs)[12] = tswapl(env->regs[12]);
306
    (*regs)[13] = tswapl(env->regs[13]);
307
    (*regs)[14] = tswapl(env->regs[14]);
308
    (*regs)[15] = tswapl(env->regs[15]);
309

    
310
    (*regs)[16] = tswapl(cpsr_read((CPUState *)env));
311
    (*regs)[17] = tswapl(env->regs[0]); /* XXX */
312
}
313

    
314
#define USE_ELF_CORE_DUMP
315
#define ELF_EXEC_PAGESIZE       4096
316

    
317
enum
318
{
319
    ARM_HWCAP_ARM_SWP       = 1 << 0,
320
    ARM_HWCAP_ARM_HALF      = 1 << 1,
321
    ARM_HWCAP_ARM_THUMB     = 1 << 2,
322
    ARM_HWCAP_ARM_26BIT     = 1 << 3,
323
    ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
324
    ARM_HWCAP_ARM_FPA       = 1 << 5,
325
    ARM_HWCAP_ARM_VFP       = 1 << 6,
326
    ARM_HWCAP_ARM_EDSP      = 1 << 7,
327
    ARM_HWCAP_ARM_JAVA      = 1 << 8,
328
    ARM_HWCAP_ARM_IWMMXT    = 1 << 9,
329
    ARM_HWCAP_ARM_THUMBEE   = 1 << 10,
330
    ARM_HWCAP_ARM_NEON      = 1 << 11,
331
    ARM_HWCAP_ARM_VFPv3     = 1 << 12,
332
    ARM_HWCAP_ARM_VFPv3D16  = 1 << 13,
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
                   | ARM_HWCAP_ARM_NEON | ARM_HWCAP_ARM_VFPv3 )
339

    
340
#endif
341

    
342
#ifdef TARGET_SPARC
343
#ifdef TARGET_SPARC64
344

    
345
#define ELF_START_MMAP 0x80000000
346

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

    
353
#define ELF_CLASS   ELFCLASS64
354
#define ELF_ARCH    EM_SPARCV9
355

    
356
#define STACK_BIAS              2047
357

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

    
377
#else
378
#define ELF_START_MMAP 0x80000000
379

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

    
382
#define ELF_CLASS   ELFCLASS32
383
#define ELF_ARCH    EM_SPARC
384

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

    
395
#endif
396
#endif
397

    
398
#ifdef TARGET_PPC
399

    
400
#define ELF_START_MMAP 0x80000000
401

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

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

    
406
#define ELF_CLASS       ELFCLASS64
407

    
408
#else
409

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

    
412
#define ELF_CLASS       ELFCLASS32
413

    
414
#endif
415

    
416
#define ELF_ARCH        EM_PPC
417

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

    
448
    QEMU_PPC_FEATURE_TRUE_LE = 0x00000002,
449
    QEMU_PPC_FEATURE_PPC_LE = 0x00000001,
450
};
451

    
452
#define ELF_HWCAP get_elf_hwcap()
453

    
454
static uint32_t get_elf_hwcap(void)
455
{
456
    CPUState *e = thread_env;
457
    uint32_t features = 0;
458

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

    
473
    return features;
474
}
475

    
476
/*
477
 * The requirements here are:
478
 * - keep the final alignment of sp (sp & 0xf)
479
 * - make sure the 32-bit value at the first 16 byte aligned position of
480
 *   AUXV is greater than 16 for glibc compatibility.
481
 *   AT_IGNOREPPC is used for that.
482
 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
483
 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
484
 */
485
#define DLINFO_ARCH_ITEMS       5
486
#define ARCH_DLINFO                                     \
487
    do {                                                \
488
        NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);              \
489
        NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);              \
490
        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                 \
491
        /*                                              \
492
         * Now handle glibc compatibility.              \
493
         */                                             \
494
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);        \
495
        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);        \
496
    } while (0)
497

    
498
static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
499
{
500
    _regs->gpr[1] = infop->start_stack;
501
#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
502
    _regs->gpr[2] = ldq_raw(infop->entry + 8) + infop->load_addr;
503
    infop->entry = ldq_raw(infop->entry) + infop->load_addr;
504
#endif
505
    _regs->nip = infop->entry;
506
}
507

    
508
/* See linux kernel: arch/powerpc/include/asm/elf.h.  */
509
#define ELF_NREG 48
510
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
511

    
512
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
513
{
514
    int i;
515
    target_ulong ccr = 0;
516

    
517
    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
518
        (*regs)[i] = tswapl(env->gpr[i]);
519
    }
520

    
521
    (*regs)[32] = tswapl(env->nip);
522
    (*regs)[33] = tswapl(env->msr);
523
    (*regs)[35] = tswapl(env->ctr);
524
    (*regs)[36] = tswapl(env->lr);
525
    (*regs)[37] = tswapl(env->xer);
526

    
527
    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
528
        ccr |= env->crf[i] << (32 - ((i + 1) * 4));
529
    }
530
    (*regs)[38] = tswapl(ccr);
531
}
532

    
533
#define USE_ELF_CORE_DUMP
534
#define ELF_EXEC_PAGESIZE       4096
535

    
536
#endif
537

    
538
#ifdef TARGET_MIPS
539

    
540
#define ELF_START_MMAP 0x80000000
541

    
542
#define elf_check_arch(x) ( (x) == EM_MIPS )
543

    
544
#ifdef TARGET_MIPS64
545
#define ELF_CLASS   ELFCLASS64
546
#else
547
#define ELF_CLASS   ELFCLASS32
548
#endif
549
#define ELF_ARCH    EM_MIPS
550

    
551
static inline void init_thread(struct target_pt_regs *regs,
552
                               struct image_info *infop)
553
{
554
    regs->cp0_status = 2 << CP0St_KSU;
555
    regs->cp0_epc = infop->entry;
556
    regs->regs[29] = infop->start_stack;
557
}
558

    
559
/* See linux kernel: arch/mips/include/asm/elf.h.  */
560
#define ELF_NREG 45
561
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
562

    
563
/* See linux kernel: arch/mips/include/asm/reg.h.  */
564
enum {
565
#ifdef TARGET_MIPS64
566
    TARGET_EF_R0 = 0,
567
#else
568
    TARGET_EF_R0 = 6,
569
#endif
570
    TARGET_EF_R26 = TARGET_EF_R0 + 26,
571
    TARGET_EF_R27 = TARGET_EF_R0 + 27,
572
    TARGET_EF_LO = TARGET_EF_R0 + 32,
573
    TARGET_EF_HI = TARGET_EF_R0 + 33,
574
    TARGET_EF_CP0_EPC = TARGET_EF_R0 + 34,
575
    TARGET_EF_CP0_BADVADDR = TARGET_EF_R0 + 35,
576
    TARGET_EF_CP0_STATUS = TARGET_EF_R0 + 36,
577
    TARGET_EF_CP0_CAUSE = TARGET_EF_R0 + 37
578
};
579

    
580
/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
581
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
582
{
583
    int i;
584

    
585
    for (i = 0; i < TARGET_EF_R0; i++) {
586
        (*regs)[i] = 0;
587
    }
588
    (*regs)[TARGET_EF_R0] = 0;
589

    
590
    for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) {
591
        (*regs)[TARGET_EF_R0 + i] = tswapl(env->active_tc.gpr[i]);
592
    }
593

    
594
    (*regs)[TARGET_EF_R26] = 0;
595
    (*regs)[TARGET_EF_R27] = 0;
596
    (*regs)[TARGET_EF_LO] = tswapl(env->active_tc.LO[0]);
597
    (*regs)[TARGET_EF_HI] = tswapl(env->active_tc.HI[0]);
598
    (*regs)[TARGET_EF_CP0_EPC] = tswapl(env->active_tc.PC);
599
    (*regs)[TARGET_EF_CP0_BADVADDR] = tswapl(env->CP0_BadVAddr);
600
    (*regs)[TARGET_EF_CP0_STATUS] = tswapl(env->CP0_Status);
601
    (*regs)[TARGET_EF_CP0_CAUSE] = tswapl(env->CP0_Cause);
602
}
603

    
604
#define USE_ELF_CORE_DUMP
605
#define ELF_EXEC_PAGESIZE        4096
606

    
607
#endif /* TARGET_MIPS */
608

    
609
#ifdef TARGET_MICROBLAZE
610

    
611
#define ELF_START_MMAP 0x80000000
612

    
613
#define elf_check_arch(x) ( (x) == EM_MICROBLAZE || (x) == EM_MICROBLAZE_OLD)
614

    
615
#define ELF_CLASS   ELFCLASS32
616
#define ELF_ARCH    EM_MICROBLAZE
617

    
618
static inline void init_thread(struct target_pt_regs *regs,
619
                               struct image_info *infop)
620
{
621
    regs->pc = infop->entry;
622
    regs->r1 = infop->start_stack;
623

    
624
}
625

    
626
#define ELF_EXEC_PAGESIZE        4096
627

    
628
#define USE_ELF_CORE_DUMP
629
#define ELF_NREG 38
630
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
631

    
632
/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
633
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
634
{
635
    int i, pos = 0;
636

    
637
    for (i = 0; i < 32; i++) {
638
        (*regs)[pos++] = tswapl(env->regs[i]);
639
    }
640

    
641
    for (i = 0; i < 6; i++) {
642
        (*regs)[pos++] = tswapl(env->sregs[i]);
643
    }
644
}
645

    
646
#endif /* TARGET_MICROBLAZE */
647

    
648
#ifdef TARGET_SH4
649

    
650
#define ELF_START_MMAP 0x80000000
651

    
652
#define elf_check_arch(x) ( (x) == EM_SH )
653

    
654
#define ELF_CLASS ELFCLASS32
655
#define ELF_ARCH  EM_SH
656

    
657
static inline void init_thread(struct target_pt_regs *regs,
658
                               struct image_info *infop)
659
{
660
    /* Check other registers XXXXX */
661
    regs->pc = infop->entry;
662
    regs->regs[15] = infop->start_stack;
663
}
664

    
665
/* See linux kernel: arch/sh/include/asm/elf.h.  */
666
#define ELF_NREG 23
667
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
668

    
669
/* See linux kernel: arch/sh/include/asm/ptrace.h.  */
670
enum {
671
    TARGET_REG_PC = 16,
672
    TARGET_REG_PR = 17,
673
    TARGET_REG_SR = 18,
674
    TARGET_REG_GBR = 19,
675
    TARGET_REG_MACH = 20,
676
    TARGET_REG_MACL = 21,
677
    TARGET_REG_SYSCALL = 22
678
};
679

    
680
static inline void elf_core_copy_regs(target_elf_gregset_t *regs,
681
                                      const CPUState *env)
682
{
683
    int i;
684

    
685
    for (i = 0; i < 16; i++) {
686
        (*regs[i]) = tswapl(env->gregs[i]);
687
    }
688

    
689
    (*regs)[TARGET_REG_PC] = tswapl(env->pc);
690
    (*regs)[TARGET_REG_PR] = tswapl(env->pr);
691
    (*regs)[TARGET_REG_SR] = tswapl(env->sr);
692
    (*regs)[TARGET_REG_GBR] = tswapl(env->gbr);
693
    (*regs)[TARGET_REG_MACH] = tswapl(env->mach);
694
    (*regs)[TARGET_REG_MACL] = tswapl(env->macl);
695
    (*regs)[TARGET_REG_SYSCALL] = 0; /* FIXME */
696
}
697

    
698
#define USE_ELF_CORE_DUMP
699
#define ELF_EXEC_PAGESIZE        4096
700

    
701
#endif
702

    
703
#ifdef TARGET_CRIS
704

    
705
#define ELF_START_MMAP 0x80000000
706

    
707
#define elf_check_arch(x) ( (x) == EM_CRIS )
708

    
709
#define ELF_CLASS ELFCLASS32
710
#define ELF_ARCH  EM_CRIS
711

    
712
static inline void init_thread(struct target_pt_regs *regs,
713
                               struct image_info *infop)
714
{
715
    regs->erp = infop->entry;
716
}
717

    
718
#define ELF_EXEC_PAGESIZE        8192
719

    
720
#endif
721

    
722
#ifdef TARGET_M68K
723

    
724
#define ELF_START_MMAP 0x80000000
725

    
726
#define elf_check_arch(x) ( (x) == EM_68K )
727

    
728
#define ELF_CLASS       ELFCLASS32
729
#define ELF_ARCH        EM_68K
730

    
731
/* ??? Does this need to do anything?
732
   #define ELF_PLAT_INIT(_r) */
733

    
734
static inline void init_thread(struct target_pt_regs *regs,
735
                               struct image_info *infop)
736
{
737
    regs->usp = infop->start_stack;
738
    regs->sr = 0;
739
    regs->pc = infop->entry;
740
}
741

    
742
/* See linux kernel: arch/m68k/include/asm/elf.h.  */
743
#define ELF_NREG 20
744
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
745

    
746
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
747
{
748
    (*regs)[0] = tswapl(env->dregs[1]);
749
    (*regs)[1] = tswapl(env->dregs[2]);
750
    (*regs)[2] = tswapl(env->dregs[3]);
751
    (*regs)[3] = tswapl(env->dregs[4]);
752
    (*regs)[4] = tswapl(env->dregs[5]);
753
    (*regs)[5] = tswapl(env->dregs[6]);
754
    (*regs)[6] = tswapl(env->dregs[7]);
755
    (*regs)[7] = tswapl(env->aregs[0]);
756
    (*regs)[8] = tswapl(env->aregs[1]);
757
    (*regs)[9] = tswapl(env->aregs[2]);
758
    (*regs)[10] = tswapl(env->aregs[3]);
759
    (*regs)[11] = tswapl(env->aregs[4]);
760
    (*regs)[12] = tswapl(env->aregs[5]);
761
    (*regs)[13] = tswapl(env->aregs[6]);
762
    (*regs)[14] = tswapl(env->dregs[0]);
763
    (*regs)[15] = tswapl(env->aregs[7]);
764
    (*regs)[16] = tswapl(env->dregs[0]); /* FIXME: orig_d0 */
765
    (*regs)[17] = tswapl(env->sr);
766
    (*regs)[18] = tswapl(env->pc);
767
    (*regs)[19] = 0;  /* FIXME: regs->format | regs->vector */
768
}
769

    
770
#define USE_ELF_CORE_DUMP
771
#define ELF_EXEC_PAGESIZE       8192
772

    
773
#endif
774

    
775
#ifdef TARGET_ALPHA
776

    
777
#define ELF_START_MMAP (0x30000000000ULL)
778

    
779
#define elf_check_arch(x) ( (x) == ELF_ARCH )
780

    
781
#define ELF_CLASS      ELFCLASS64
782
#define ELF_ARCH       EM_ALPHA
783

    
784
static inline void init_thread(struct target_pt_regs *regs,
785
                               struct image_info *infop)
786
{
787
    regs->pc = infop->entry;
788
    regs->ps = 8;
789
    regs->usp = infop->start_stack;
790
}
791

    
792
#define ELF_EXEC_PAGESIZE        8192
793

    
794
#endif /* TARGET_ALPHA */
795

    
796
#ifndef ELF_PLATFORM
797
#define ELF_PLATFORM (NULL)
798
#endif
799

    
800
#ifndef ELF_HWCAP
801
#define ELF_HWCAP 0
802
#endif
803

    
804
#ifdef TARGET_ABI32
805
#undef ELF_CLASS
806
#define ELF_CLASS ELFCLASS32
807
#undef bswaptls
808
#define bswaptls(ptr) bswap32s(ptr)
809
#endif
810

    
811
#include "elf.h"
812

    
813
struct exec
814
{
815
    unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
816
    unsigned int a_text;   /* length of text, in bytes */
817
    unsigned int a_data;   /* length of data, in bytes */
818
    unsigned int a_bss;    /* length of uninitialized data area, in bytes */
819
    unsigned int a_syms;   /* length of symbol table data in file, in bytes */
820
    unsigned int a_entry;  /* start address */
821
    unsigned int a_trsize; /* length of relocation info for text, in bytes */
822
    unsigned int a_drsize; /* length of relocation info for data, in bytes */
823
};
824

    
825

    
826
#define N_MAGIC(exec) ((exec).a_info & 0xffff)
827
#define OMAGIC 0407
828
#define NMAGIC 0410
829
#define ZMAGIC 0413
830
#define QMAGIC 0314
831

    
832
/* Necessary parameters */
833
#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
834
#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
835
#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
836

    
837
#define DLINFO_ITEMS 12
838

    
839
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
840
{
841
    memcpy(to, from, n);
842
}
843

    
844
#ifdef BSWAP_NEEDED
845
static void bswap_ehdr(struct elfhdr *ehdr)
846
{
847
    bswap16s(&ehdr->e_type);            /* Object file type */
848
    bswap16s(&ehdr->e_machine);         /* Architecture */
849
    bswap32s(&ehdr->e_version);         /* Object file version */
850
    bswaptls(&ehdr->e_entry);           /* Entry point virtual address */
851
    bswaptls(&ehdr->e_phoff);           /* Program header table file offset */
852
    bswaptls(&ehdr->e_shoff);           /* Section header table file offset */
853
    bswap32s(&ehdr->e_flags);           /* Processor-specific flags */
854
    bswap16s(&ehdr->e_ehsize);          /* ELF header size in bytes */
855
    bswap16s(&ehdr->e_phentsize);       /* Program header table entry size */
856
    bswap16s(&ehdr->e_phnum);           /* Program header table entry count */
857
    bswap16s(&ehdr->e_shentsize);       /* Section header table entry size */
858
    bswap16s(&ehdr->e_shnum);           /* Section header table entry count */
859
    bswap16s(&ehdr->e_shstrndx);        /* Section header string table index */
860
}
861

    
862
static void bswap_phdr(struct elf_phdr *phdr, int phnum)
863
{
864
    int i;
865
    for (i = 0; i < phnum; ++i, ++phdr) {
866
        bswap32s(&phdr->p_type);        /* Segment type */
867
        bswap32s(&phdr->p_flags);       /* Segment flags */
868
        bswaptls(&phdr->p_offset);      /* Segment file offset */
869
        bswaptls(&phdr->p_vaddr);       /* Segment virtual address */
870
        bswaptls(&phdr->p_paddr);       /* Segment physical address */
871
        bswaptls(&phdr->p_filesz);      /* Segment size in file */
872
        bswaptls(&phdr->p_memsz);       /* Segment size in memory */
873
        bswaptls(&phdr->p_align);       /* Segment alignment */
874
    }
875
}
876

    
877
static void bswap_shdr(struct elf_shdr *shdr, int shnum)
878
{
879
    int i;
880
    for (i = 0; i < shnum; ++i, ++shdr) {
881
        bswap32s(&shdr->sh_name);
882
        bswap32s(&shdr->sh_type);
883
        bswaptls(&shdr->sh_flags);
884
        bswaptls(&shdr->sh_addr);
885
        bswaptls(&shdr->sh_offset);
886
        bswaptls(&shdr->sh_size);
887
        bswap32s(&shdr->sh_link);
888
        bswap32s(&shdr->sh_info);
889
        bswaptls(&shdr->sh_addralign);
890
        bswaptls(&shdr->sh_entsize);
891
    }
892
}
893

    
894
static void bswap_sym(struct elf_sym *sym)
895
{
896
    bswap32s(&sym->st_name);
897
    bswaptls(&sym->st_value);
898
    bswaptls(&sym->st_size);
899
    bswap16s(&sym->st_shndx);
900
}
901
#else
902
static inline void bswap_ehdr(struct elfhdr *ehdr) { }
903
static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { }
904
static inline void bswap_shdr(struct elf_shdr *shdr, int shnum) { }
905
static inline void bswap_sym(struct elf_sym *sym) { }
906
#endif
907

    
908
#ifdef USE_ELF_CORE_DUMP
909
static int elf_core_dump(int, const CPUState *);
910
#endif /* USE_ELF_CORE_DUMP */
911
static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias);
912

    
913
/* Verify the portions of EHDR within E_IDENT for the target.
914
   This can be performed before bswapping the entire header.  */
915
static bool elf_check_ident(struct elfhdr *ehdr)
916
{
917
    return (ehdr->e_ident[EI_MAG0] == ELFMAG0
918
            && ehdr->e_ident[EI_MAG1] == ELFMAG1
919
            && ehdr->e_ident[EI_MAG2] == ELFMAG2
920
            && ehdr->e_ident[EI_MAG3] == ELFMAG3
921
            && ehdr->e_ident[EI_CLASS] == ELF_CLASS
922
            && ehdr->e_ident[EI_DATA] == ELF_DATA
923
            && ehdr->e_ident[EI_VERSION] == EV_CURRENT);
924
}
925

    
926
/* Verify the portions of EHDR outside of E_IDENT for the target.
927
   This has to wait until after bswapping the header.  */
928
static bool elf_check_ehdr(struct elfhdr *ehdr)
929
{
930
    return (elf_check_arch(ehdr->e_machine)
931
            && ehdr->e_ehsize == sizeof(struct elfhdr)
932
            && ehdr->e_phentsize == sizeof(struct elf_phdr)
933
            && ehdr->e_shentsize == sizeof(struct elf_shdr)
934
            && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));
935
}
936

    
937
/*
938
 * 'copy_elf_strings()' copies argument/envelope strings from user
939
 * memory to free pages in kernel mem. These are in a format ready
940
 * to be put directly into the top of new user memory.
941
 *
942
 */
943
static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
944
                                  abi_ulong p)
945
{
946
    char *tmp, *tmp1, *pag = NULL;
947
    int len, offset = 0;
948

    
949
    if (!p) {
950
        return 0;       /* bullet-proofing */
951
    }
952
    while (argc-- > 0) {
953
        tmp = argv[argc];
954
        if (!tmp) {
955
            fprintf(stderr, "VFS: argc is wrong");
956
            exit(-1);
957
        }
958
        tmp1 = tmp;
959
        while (*tmp++);
960
        len = tmp - tmp1;
961
        if (p < len) {  /* this shouldn't happen - 128kB */
962
            return 0;
963
        }
964
        while (len) {
965
            --p; --tmp; --len;
966
            if (--offset < 0) {
967
                offset = p % TARGET_PAGE_SIZE;
968
                pag = (char *)page[p/TARGET_PAGE_SIZE];
969
                if (!pag) {
970
                    pag = (char *)malloc(TARGET_PAGE_SIZE);
971
                    memset(pag, 0, TARGET_PAGE_SIZE);
972
                    page[p/TARGET_PAGE_SIZE] = pag;
973
                    if (!pag)
974
                        return 0;
975
                }
976
            }
977
            if (len == 0 || offset == 0) {
978
                *(pag + offset) = *tmp;
979
            }
980
            else {
981
                int bytes_to_copy = (len > offset) ? offset : len;
982
                tmp -= bytes_to_copy;
983
                p -= bytes_to_copy;
984
                offset -= bytes_to_copy;
985
                len -= bytes_to_copy;
986
                memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
987
            }
988
        }
989
    }
990
    return p;
991
}
992

    
993
static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
994
                                 struct image_info *info)
995
{
996
    abi_ulong stack_base, size, error, guard;
997
    int i;
998

    
999
    /* Create enough stack to hold everything.  If we don't use
1000
       it for args, we'll use it for something else.  */
1001
    size = guest_stack_size;
1002
    if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE) {
1003
        size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
1004
    }
1005
    guard = TARGET_PAGE_SIZE;
1006
    if (guard < qemu_real_host_page_size) {
1007
        guard = qemu_real_host_page_size;
1008
    }
1009

    
1010
    error = target_mmap(0, size + guard, PROT_READ | PROT_WRITE,
1011
                        MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1012
    if (error == -1) {
1013
        perror("mmap stack");
1014
        exit(-1);
1015
    }
1016

    
1017
    /* We reserve one extra page at the top of the stack as guard.  */
1018
    target_mprotect(error, guard, PROT_NONE);
1019

    
1020
    info->stack_limit = error + guard;
1021
    stack_base = info->stack_limit + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
1022
    p += stack_base;
1023

    
1024
    for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
1025
        if (bprm->page[i]) {
1026
            info->rss++;
1027
            /* FIXME - check return value of memcpy_to_target() for failure */
1028
            memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
1029
            free(bprm->page[i]);
1030
        }
1031
        stack_base += TARGET_PAGE_SIZE;
1032
    }
1033
    return p;
1034
}
1035

    
1036
/* Map and zero the bss.  We need to explicitly zero any fractional pages
1037
   after the data section (i.e. bss).  */
1038
static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot)
1039
{
1040
    uintptr_t host_start, host_map_start, host_end;
1041

    
1042
    last_bss = TARGET_PAGE_ALIGN(last_bss);
1043

    
1044
    /* ??? There is confusion between qemu_real_host_page_size and
1045
       qemu_host_page_size here and elsewhere in target_mmap, which
1046
       may lead to the end of the data section mapping from the file
1047
       not being mapped.  At least there was an explicit test and
1048
       comment for that here, suggesting that "the file size must
1049
       be known".  The comment probably pre-dates the introduction
1050
       of the fstat system call in target_mmap which does in fact
1051
       find out the size.  What isn't clear is if the workaround
1052
       here is still actually needed.  For now, continue with it,
1053
       but merge it with the "normal" mmap that would allocate the bss.  */
1054

    
1055
    host_start = (uintptr_t) g2h(elf_bss);
1056
    host_end = (uintptr_t) g2h(last_bss);
1057
    host_map_start = (host_start + qemu_real_host_page_size - 1);
1058
    host_map_start &= -qemu_real_host_page_size;
1059

    
1060
    if (host_map_start < host_end) {
1061
        void *p = mmap((void *)host_map_start, host_end - host_map_start,
1062
                       prot, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1063
        if (p == MAP_FAILED) {
1064
            perror("cannot mmap brk");
1065
            exit(-1);
1066
        }
1067

    
1068
        /* Since we didn't use target_mmap, make sure to record
1069
           the validity of the pages with qemu.  */
1070
        page_set_flags(elf_bss & TARGET_PAGE_MASK, last_bss, prot|PAGE_VALID);
1071
    }
1072

    
1073
    if (host_start < host_map_start) {
1074
        memset((void *)host_start, 0, host_map_start - host_start);
1075
    }
1076
}
1077

    
1078
static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
1079
                                   struct elfhdr *exec,
1080
                                   struct image_info *info,
1081
                                   struct image_info *interp_info)
1082
{
1083
    abi_ulong sp;
1084
    int size;
1085
    abi_ulong u_platform;
1086
    const char *k_platform;
1087
    const int n = sizeof(elf_addr_t);
1088

    
1089
    sp = p;
1090
    u_platform = 0;
1091
    k_platform = ELF_PLATFORM;
1092
    if (k_platform) {
1093
        size_t len = strlen(k_platform) + 1;
1094
        sp -= (len + n - 1) & ~(n - 1);
1095
        u_platform = sp;
1096
        /* FIXME - check return value of memcpy_to_target() for failure */
1097
        memcpy_to_target(sp, k_platform, len);
1098
    }
1099
    /*
1100
     * Force 16 byte _final_ alignment here for generality.
1101
     */
1102
    sp = sp &~ (abi_ulong)15;
1103
    size = (DLINFO_ITEMS + 1) * 2;
1104
    if (k_platform)
1105
        size += 2;
1106
#ifdef DLINFO_ARCH_ITEMS
1107
    size += DLINFO_ARCH_ITEMS * 2;
1108
#endif
1109
    size += envc + argc + 2;
1110
    size += 1;  /* argc itself */
1111
    size *= n;
1112
    if (size & 15)
1113
        sp -= 16 - (size & 15);
1114

    
1115
    /* This is correct because Linux defines
1116
     * elf_addr_t as Elf32_Off / Elf64_Off
1117
     */
1118
#define NEW_AUX_ENT(id, val) do {               \
1119
        sp -= n; put_user_ual(val, sp);         \
1120
        sp -= n; put_user_ual(id, sp);          \
1121
    } while(0)
1122

    
1123
    NEW_AUX_ENT (AT_NULL, 0);
1124

    
1125
    /* There must be exactly DLINFO_ITEMS entries here.  */
1126
    NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff));
1127
    NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
1128
    NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
1129
    NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
1130
    NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0));
1131
    NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
1132
    NEW_AUX_ENT(AT_ENTRY, info->entry);
1133
    NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
1134
    NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
1135
    NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
1136
    NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
1137
    NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
1138
    NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
1139
    if (k_platform)
1140
        NEW_AUX_ENT(AT_PLATFORM, u_platform);
1141
#ifdef ARCH_DLINFO
1142
    /*
1143
     * ARCH_DLINFO must come last so platform specific code can enforce
1144
     * special alignment requirements on the AUXV if necessary (eg. PPC).
1145
     */
1146
    ARCH_DLINFO;
1147
#endif
1148
#undef NEW_AUX_ENT
1149

    
1150
    info->saved_auxv = sp;
1151

    
1152
    sp = loader_build_argptr(envc, argc, sp, p, 0);
1153
    return sp;
1154
}
1155

    
1156
/* Load an ELF image into the address space.
1157

1158
   IMAGE_NAME is the filename of the image, to use in error messages.
1159
   IMAGE_FD is the open file descriptor for the image.
1160

1161
   BPRM_BUF is a copy of the beginning of the file; this of course
1162
   contains the elf file header at offset 0.  It is assumed that this
1163
   buffer is sufficiently aligned to present no problems to the host
1164
   in accessing data at aligned offsets within the buffer.
1165

1166
   On return: INFO values will be filled in, as necessary or available.  */
1167

    
1168
static void load_elf_image(const char *image_name, int image_fd,
1169
                           struct image_info *info, char **pinterp_name,
1170
                           char bprm_buf[BPRM_BUF_SIZE])
1171
{
1172
    struct elfhdr *ehdr = (struct elfhdr *)bprm_buf;
1173
    struct elf_phdr *phdr;
1174
    abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
1175
    int i, retval;
1176
    const char *errmsg;
1177

    
1178
    /* First of all, some simple consistency checks */
1179
    errmsg = "Invalid ELF image for this architecture";
1180
    if (!elf_check_ident(ehdr)) {
1181
        goto exit_errmsg;
1182
    }
1183
    bswap_ehdr(ehdr);
1184
    if (!elf_check_ehdr(ehdr)) {
1185
        goto exit_errmsg;
1186
    }
1187

    
1188
    i = ehdr->e_phnum * sizeof(struct elf_phdr);
1189
    if (ehdr->e_phoff + i <= BPRM_BUF_SIZE) {
1190
        phdr = (struct elf_phdr *)(bprm_buf + ehdr->e_phoff);
1191
    } else {
1192
        phdr = (struct elf_phdr *) alloca(i);
1193
        retval = pread(image_fd, phdr, i, ehdr->e_phoff);
1194
        if (retval != i) {
1195
            goto exit_read;
1196
        }
1197
    }
1198
    bswap_phdr(phdr, ehdr->e_phnum);
1199

    
1200
    /* Find the maximum size of the image and allocate an appropriate
1201
       amount of memory to handle that.  */
1202
    loaddr = -1, hiaddr = 0;
1203
    for (i = 0; i < ehdr->e_phnum; ++i) {
1204
        if (phdr[i].p_type == PT_LOAD) {
1205
            abi_ulong a = phdr[i].p_vaddr;
1206
            if (a < loaddr) {
1207
                loaddr = a;
1208
            }
1209
            a += phdr[i].p_memsz;
1210
            if (a > hiaddr) {
1211
                hiaddr = a;
1212
            }
1213
        }
1214
    }
1215

    
1216
    load_addr = loaddr;
1217
    if (ehdr->e_type == ET_DYN) {
1218
        /* The image indicates that it can be loaded anywhere.  Find a
1219
           location that can hold the memory space required.  If the
1220
           image is pre-linked, LOADDR will be non-zero.  Since we do
1221
           not supply MAP_FIXED here we'll use that address if and
1222
           only if it remains available.  */
1223
        load_addr = target_mmap(loaddr, hiaddr - loaddr, PROT_NONE,
1224
                                MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
1225
                                -1, 0);
1226
        if (load_addr == -1) {
1227
            goto exit_perror;
1228
        }
1229
    } else if (pinterp_name != NULL) {
1230
        /* This is the main executable.  Make sure that the low
1231
           address does not conflict with MMAP_MIN_ADDR or the
1232
           QEMU application itself.  */
1233
#if defined(CONFIG_USE_GUEST_BASE)
1234
        /*
1235
         * In case where user has not explicitly set the guest_base, we
1236
         * probe here that should we set it automatically.
1237
         */
1238
        if (!have_guest_base && !reserved_va) {
1239
            unsigned long host_start, real_start, host_size;
1240

    
1241
            /* Round addresses to page boundaries.  */
1242
            loaddr &= qemu_host_page_mask;
1243
            hiaddr = HOST_PAGE_ALIGN(hiaddr);
1244

    
1245
            if (loaddr < mmap_min_addr) {
1246
                host_start = HOST_PAGE_ALIGN(mmap_min_addr);
1247
            } else {
1248
                host_start = loaddr;
1249
                if (host_start != loaddr) {
1250
                    errmsg = "Address overflow loading ELF binary";
1251
                    goto exit_errmsg;
1252
                }
1253
            }
1254
            host_size = hiaddr - loaddr;
1255
            while (1) {
1256
                /* Do not use mmap_find_vma here because that is limited to the
1257
                   guest address space.  We are going to make the
1258
                   guest address space fit whatever we're given.  */
1259
                real_start = (unsigned long)
1260
                    mmap((void *)host_start, host_size, PROT_NONE,
1261
                         MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0);
1262
                if (real_start == (unsigned long)-1) {
1263
                    goto exit_perror;
1264
                }
1265
                if (real_start == host_start) {
1266
                    break;
1267
                }
1268
                /* That address didn't work.  Unmap and try a different one.
1269
                   The address the host picked because is typically right at
1270
                   the top of the host address space and leaves the guest with
1271
                   no usable address space.  Resort to a linear search.  We
1272
                   already compensated for mmap_min_addr, so this should not
1273
                   happen often.  Probably means we got unlucky and host
1274
                   address space randomization put a shared library somewhere
1275
                   inconvenient.  */
1276
                munmap((void *)real_start, host_size);
1277
                host_start += qemu_host_page_size;
1278
                if (host_start == loaddr) {
1279
                    /* Theoretically possible if host doesn't have any suitably
1280
                       aligned areas.  Normally the first mmap will fail.  */
1281
                    errmsg = "Unable to find space for application";
1282
                    goto exit_errmsg;
1283
                }
1284
            }
1285
            qemu_log("Relocating guest address space from 0x"
1286
                     TARGET_ABI_FMT_lx " to 0x%lx\n", loaddr, real_start);
1287
            guest_base = real_start - loaddr;
1288
        }
1289
#endif
1290
    }
1291
    load_bias = load_addr - loaddr;
1292

    
1293
    info->load_bias = load_bias;
1294
    info->load_addr = load_addr;
1295
    info->entry = ehdr->e_entry + load_bias;
1296
    info->start_code = -1;
1297
    info->end_code = 0;
1298
    info->start_data = -1;
1299
    info->end_data = 0;
1300
    info->brk = 0;
1301

    
1302
    for (i = 0; i < ehdr->e_phnum; i++) {
1303
        struct elf_phdr *eppnt = phdr + i;
1304
        if (eppnt->p_type == PT_LOAD) {
1305
            abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em;
1306
            int elf_prot = 0;
1307

    
1308
            if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
1309
            if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1310
            if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1311

    
1312
            vaddr = load_bias + eppnt->p_vaddr;
1313
            vaddr_po = TARGET_ELF_PAGEOFFSET(vaddr);
1314
            vaddr_ps = TARGET_ELF_PAGESTART(vaddr);
1315

    
1316
            error = target_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po,
1317
                                elf_prot, MAP_PRIVATE | MAP_FIXED,
1318
                                image_fd, eppnt->p_offset - vaddr_po);
1319
            if (error == -1) {
1320
                goto exit_perror;
1321
            }
1322

    
1323
            vaddr_ef = vaddr + eppnt->p_filesz;
1324
            vaddr_em = vaddr + eppnt->p_memsz;
1325

    
1326
            /* If the load segment requests extra zeros (e.g. bss), map it.  */
1327
            if (vaddr_ef < vaddr_em) {
1328
                zero_bss(vaddr_ef, vaddr_em, elf_prot);
1329
            }
1330

    
1331
            /* Find the full program boundaries.  */
1332
            if (elf_prot & PROT_EXEC) {
1333
                if (vaddr < info->start_code) {
1334
                    info->start_code = vaddr;
1335
                }
1336
                if (vaddr_ef > info->end_code) {
1337
                    info->end_code = vaddr_ef;
1338
                }
1339
            }
1340
            if (elf_prot & PROT_WRITE) {
1341
                if (vaddr < info->start_data) {
1342
                    info->start_data = vaddr;
1343
                }
1344
                if (vaddr_ef > info->end_data) {
1345
                    info->end_data = vaddr_ef;
1346
                }
1347
                if (vaddr_em > info->brk) {
1348
                    info->brk = vaddr_em;
1349
                }
1350
            }
1351
        } else if (eppnt->p_type == PT_INTERP && pinterp_name) {
1352
            char *interp_name;
1353

    
1354
            if (*pinterp_name) {
1355
                errmsg = "Multiple PT_INTERP entries";
1356
                goto exit_errmsg;
1357
            }
1358
            interp_name = malloc(eppnt->p_filesz);
1359
            if (!interp_name) {
1360
                goto exit_perror;
1361
            }
1362

    
1363
            if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
1364
                memcpy(interp_name, bprm_buf + eppnt->p_offset,
1365
                       eppnt->p_filesz);
1366
            } else {
1367
                retval = pread(image_fd, interp_name, eppnt->p_filesz,
1368
                               eppnt->p_offset);
1369
                if (retval != eppnt->p_filesz) {
1370
                    goto exit_perror;
1371
                }
1372
            }
1373
            if (interp_name[eppnt->p_filesz - 1] != 0) {
1374
                errmsg = "Invalid PT_INTERP entry";
1375
                goto exit_errmsg;
1376
            }
1377
            *pinterp_name = interp_name;
1378
        }
1379
    }
1380

    
1381
    if (info->end_data == 0) {
1382
        info->start_data = info->end_code;
1383
        info->end_data = info->end_code;
1384
        info->brk = info->end_code;
1385
    }
1386

    
1387
    if (qemu_log_enabled()) {
1388
        load_symbols(ehdr, image_fd, load_bias);
1389
    }
1390

    
1391
    close(image_fd);
1392
    return;
1393

    
1394
 exit_read:
1395
    if (retval >= 0) {
1396
        errmsg = "Incomplete read of file header";
1397
        goto exit_errmsg;
1398
    }
1399
 exit_perror:
1400
    errmsg = strerror(errno);
1401
 exit_errmsg:
1402
    fprintf(stderr, "%s: %s\n", image_name, errmsg);
1403
    exit(-1);
1404
}
1405

    
1406
static void load_elf_interp(const char *filename, struct image_info *info,
1407
                            char bprm_buf[BPRM_BUF_SIZE])
1408
{
1409
    int fd, retval;
1410

    
1411
    fd = open(path(filename), O_RDONLY);
1412
    if (fd < 0) {
1413
        goto exit_perror;
1414
    }
1415

    
1416
    retval = read(fd, bprm_buf, BPRM_BUF_SIZE);
1417
    if (retval < 0) {
1418
        goto exit_perror;
1419
    }
1420
    if (retval < BPRM_BUF_SIZE) {
1421
        memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval);
1422
    }
1423

    
1424
    load_elf_image(filename, fd, info, NULL, bprm_buf);
1425
    return;
1426

    
1427
 exit_perror:
1428
    fprintf(stderr, "%s: %s\n", filename, strerror(errno));
1429
    exit(-1);
1430
}
1431

    
1432
static int symfind(const void *s0, const void *s1)
1433
{
1434
    struct elf_sym *key = (struct elf_sym *)s0;
1435
    struct elf_sym *sym = (struct elf_sym *)s1;
1436
    int result = 0;
1437
    if (key->st_value < sym->st_value) {
1438
        result = -1;
1439
    } else if (key->st_value >= sym->st_value + sym->st_size) {
1440
        result = 1;
1441
    }
1442
    return result;
1443
}
1444

    
1445
static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
1446
{
1447
#if ELF_CLASS == ELFCLASS32
1448
    struct elf_sym *syms = s->disas_symtab.elf32;
1449
#else
1450
    struct elf_sym *syms = s->disas_symtab.elf64;
1451
#endif
1452

    
1453
    // binary search
1454
    struct elf_sym key;
1455
    struct elf_sym *sym;
1456

    
1457
    key.st_value = orig_addr;
1458

    
1459
    sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
1460
    if (sym != NULL) {
1461
        return s->disas_strtab + sym->st_name;
1462
    }
1463

    
1464
    return "";
1465
}
1466

    
1467
/* FIXME: This should use elf_ops.h  */
1468
static int symcmp(const void *s0, const void *s1)
1469
{
1470
    struct elf_sym *sym0 = (struct elf_sym *)s0;
1471
    struct elf_sym *sym1 = (struct elf_sym *)s1;
1472
    return (sym0->st_value < sym1->st_value)
1473
        ? -1
1474
        : ((sym0->st_value > sym1->st_value) ? 1 : 0);
1475
}
1476

    
1477
/* Best attempt to load symbols from this ELF object. */
1478
static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
1479
{
1480
    int i, shnum, nsyms, sym_idx = 0, str_idx = 0;
1481
    struct elf_shdr *shdr;
1482
    char *strings;
1483
    struct syminfo *s;
1484
    struct elf_sym *syms;
1485

    
1486
    shnum = hdr->e_shnum;
1487
    i = shnum * sizeof(struct elf_shdr);
1488
    shdr = (struct elf_shdr *)alloca(i);
1489
    if (pread(fd, shdr, i, hdr->e_shoff) != i) {
1490
        return;
1491
    }
1492

    
1493
    bswap_shdr(shdr, shnum);
1494
    for (i = 0; i < shnum; ++i) {
1495
        if (shdr[i].sh_type == SHT_SYMTAB) {
1496
            sym_idx = i;
1497
            str_idx = shdr[i].sh_link;
1498
            goto found;
1499
        }
1500
    }
1501

    
1502
    /* There will be no symbol table if the file was stripped.  */
1503
    return;
1504

    
1505
 found:
1506
    /* Now know where the strtab and symtab are.  Snarf them.  */
1507
    s = malloc(sizeof(*s));
1508
    if (!s) {
1509
        return;
1510
    }
1511

    
1512
    i = shdr[str_idx].sh_size;
1513
    s->disas_strtab = strings = malloc(i);
1514
    if (!strings || pread(fd, strings, i, shdr[str_idx].sh_offset) != i) {
1515
        free(s);
1516
        free(strings);
1517
        return;
1518
    }
1519

    
1520
    i = shdr[sym_idx].sh_size;
1521
    syms = malloc(i);
1522
    if (!syms || pread(fd, syms, i, shdr[sym_idx].sh_offset) != i) {
1523
        free(s);
1524
        free(strings);
1525
        free(syms);
1526
        return;
1527
    }
1528

    
1529
    nsyms = i / sizeof(struct elf_sym);
1530
    for (i = 0; i < nsyms; ) {
1531
        bswap_sym(syms + i);
1532
        /* Throw away entries which we do not need.  */
1533
        if (syms[i].st_shndx == SHN_UNDEF
1534
            || syms[i].st_shndx >= SHN_LORESERVE
1535
            || ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
1536
            if (i < --nsyms) {
1537
                syms[i] = syms[nsyms];
1538
            }
1539
        } else {
1540
#if defined(TARGET_ARM) || defined (TARGET_MIPS)
1541
            /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
1542
            syms[i].st_value &= ~(target_ulong)1;
1543
#endif
1544
            syms[i].st_value += load_bias;
1545
            i++;
1546
        }
1547
    }
1548

    
1549
    /* Attempt to free the storage associated with the local symbols
1550
       that we threw away.  Whether or not this has any effect on the
1551
       memory allocation depends on the malloc implementation and how
1552
       many symbols we managed to discard.  */
1553
    syms = realloc(syms, nsyms * sizeof(*syms));
1554
    if (syms == NULL) {
1555
        free(s);
1556
        free(strings);
1557
        return;
1558
    }
1559

    
1560
    qsort(syms, nsyms, sizeof(*syms), symcmp);
1561

    
1562
    s->disas_num_syms = nsyms;
1563
#if ELF_CLASS == ELFCLASS32
1564
    s->disas_symtab.elf32 = syms;
1565
#else
1566
    s->disas_symtab.elf64 = syms;
1567
#endif
1568
    s->lookup_symbol = lookup_symbolxx;
1569
    s->next = syminfos;
1570
    syminfos = s;
1571
}
1572

    
1573
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
1574
                    struct image_info * info)
1575
{
1576
    struct image_info interp_info;
1577
    struct elfhdr elf_ex;
1578
    char *elf_interpreter = NULL;
1579

    
1580
    info->start_mmap = (abi_ulong)ELF_START_MMAP;
1581
    info->mmap = 0;
1582
    info->rss = 0;
1583

    
1584
    load_elf_image(bprm->filename, bprm->fd, info,
1585
                   &elf_interpreter, bprm->buf);
1586

    
1587
    /* ??? We need a copy of the elf header for passing to create_elf_tables.
1588
       If we do nothing, we'll have overwritten this when we re-use bprm->buf
1589
       when we load the interpreter.  */
1590
    elf_ex = *(struct elfhdr *)bprm->buf;
1591

    
1592
    bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
1593
    bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
1594
    bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
1595
    if (!bprm->p) {
1596
        fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG));
1597
        exit(-1);
1598
    }
1599

    
1600
    /* Do this so that we can load the interpreter, if need be.  We will
1601
       change some of these later */
1602
    bprm->p = setup_arg_pages(bprm->p, bprm, info);
1603

    
1604
    if (elf_interpreter) {
1605
        load_elf_interp(elf_interpreter, &interp_info, bprm->buf);
1606

    
1607
        /* If the program interpreter is one of these two, then assume
1608
           an iBCS2 image.  Otherwise assume a native linux image.  */
1609

    
1610
        if (strcmp(elf_interpreter, "/usr/lib/libc.so.1") == 0
1611
            || strcmp(elf_interpreter, "/usr/lib/ld.so.1") == 0) {
1612
            info->personality = PER_SVR4;
1613

    
1614
            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
1615
               and some applications "depend" upon this behavior.  Since
1616
               we do not have the power to recompile these, we emulate
1617
               the SVr4 behavior.  Sigh.  */
1618
            target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
1619
                        MAP_FIXED | MAP_PRIVATE, -1, 0);
1620
        }
1621
    }
1622

    
1623
    bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex,
1624
                                info, (elf_interpreter ? &interp_info : NULL));
1625
    info->start_stack = bprm->p;
1626

    
1627
    /* If we have an interpreter, set that as the program's entry point.
1628
       Copy the load_addr as well, to help PPC64 interpret the entry
1629
       point as a function descriptor.  Do this after creating elf tables
1630
       so that we copy the original program entry point into the AUXV.  */
1631
    if (elf_interpreter) {
1632
        info->load_addr = interp_info.load_addr;
1633
        info->entry = interp_info.entry;
1634
        free(elf_interpreter);
1635
    }
1636

    
1637
#ifdef USE_ELF_CORE_DUMP
1638
    bprm->core_dump = &elf_core_dump;
1639
#endif
1640

    
1641
    return 0;
1642
}
1643

    
1644
#ifdef USE_ELF_CORE_DUMP
1645
/*
1646
 * Definitions to generate Intel SVR4-like core files.
1647
 * These mostly have the same names as the SVR4 types with "target_elf_"
1648
 * tacked on the front to prevent clashes with linux definitions,
1649
 * and the typedef forms have been avoided.  This is mostly like
1650
 * the SVR4 structure, but more Linuxy, with things that Linux does
1651
 * not support and which gdb doesn't really use excluded.
1652
 *
1653
 * Fields we don't dump (their contents is zero) in linux-user qemu
1654
 * are marked with XXX.
1655
 *
1656
 * Core dump code is copied from linux kernel (fs/binfmt_elf.c).
1657
 *
1658
 * Porting ELF coredump for target is (quite) simple process.  First you
1659
 * define USE_ELF_CORE_DUMP in target ELF code (where init_thread() for
1660
 * the target resides):
1661
 *
1662
 * #define USE_ELF_CORE_DUMP
1663
 *
1664
 * Next you define type of register set used for dumping.  ELF specification
1665
 * says that it needs to be array of elf_greg_t that has size of ELF_NREG.
1666
 *
1667
 * typedef <target_regtype> target_elf_greg_t;
1668
 * #define ELF_NREG <number of registers>
1669
 * typedef taret_elf_greg_t target_elf_gregset_t[ELF_NREG];
1670
 *
1671
 * Last step is to implement target specific function that copies registers
1672
 * from given cpu into just specified register set.  Prototype is:
1673
 *
1674
 * static void elf_core_copy_regs(taret_elf_gregset_t *regs,
1675
 *                                const CPUState *env);
1676
 *
1677
 * Parameters:
1678
 *     regs - copy register values into here (allocated and zeroed by caller)
1679
 *     env - copy registers from here
1680
 *
1681
 * Example for ARM target is provided in this file.
1682
 */
1683

    
1684
/* An ELF note in memory */
1685
struct memelfnote {
1686
    const char *name;
1687
    size_t     namesz;
1688
    size_t     namesz_rounded;
1689
    int        type;
1690
    size_t     datasz;
1691
    void       *data;
1692
    size_t     notesz;
1693
};
1694

    
1695
struct target_elf_siginfo {
1696
    int  si_signo; /* signal number */
1697
    int  si_code;  /* extra code */
1698
    int  si_errno; /* errno */
1699
};
1700

    
1701
struct target_elf_prstatus {
1702
    struct target_elf_siginfo pr_info;      /* Info associated with signal */
1703
    short              pr_cursig;    /* Current signal */
1704
    target_ulong       pr_sigpend;   /* XXX */
1705
    target_ulong       pr_sighold;   /* XXX */
1706
    target_pid_t       pr_pid;
1707
    target_pid_t       pr_ppid;
1708
    target_pid_t       pr_pgrp;
1709
    target_pid_t       pr_sid;
1710
    struct target_timeval pr_utime;  /* XXX User time */
1711
    struct target_timeval pr_stime;  /* XXX System time */
1712
    struct target_timeval pr_cutime; /* XXX Cumulative user time */
1713
    struct target_timeval pr_cstime; /* XXX Cumulative system time */
1714
    target_elf_gregset_t      pr_reg;       /* GP registers */
1715
    int                pr_fpvalid;   /* XXX */
1716
};
1717

    
1718
#define ELF_PRARGSZ     (80) /* Number of chars for args */
1719

    
1720
struct target_elf_prpsinfo {
1721
    char         pr_state;       /* numeric process state */
1722
    char         pr_sname;       /* char for pr_state */
1723
    char         pr_zomb;        /* zombie */
1724
    char         pr_nice;        /* nice val */
1725
    target_ulong pr_flag;        /* flags */
1726
    target_uid_t pr_uid;
1727
    target_gid_t pr_gid;
1728
    target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
1729
    /* Lots missing */
1730
    char    pr_fname[16];           /* filename of executable */
1731
    char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
1732
};
1733

    
1734
/* Here is the structure in which status of each thread is captured. */
1735
struct elf_thread_status {
1736
    QTAILQ_ENTRY(elf_thread_status)  ets_link;
1737
    struct target_elf_prstatus prstatus;   /* NT_PRSTATUS */
1738
#if 0
1739
    elf_fpregset_t fpu;             /* NT_PRFPREG */
1740
    struct task_struct *thread;
1741
    elf_fpxregset_t xfpu;           /* ELF_CORE_XFPREG_TYPE */
1742
#endif
1743
    struct memelfnote notes[1];
1744
    int num_notes;
1745
};
1746

    
1747
struct elf_note_info {
1748
    struct memelfnote   *notes;
1749
    struct target_elf_prstatus *prstatus;  /* NT_PRSTATUS */
1750
    struct target_elf_prpsinfo *psinfo;    /* NT_PRPSINFO */
1751

    
1752
    QTAILQ_HEAD(thread_list_head, elf_thread_status) thread_list;
1753
#if 0
1754
    /*
1755
     * Current version of ELF coredump doesn't support
1756
     * dumping fp regs etc.
1757
     */
1758
    elf_fpregset_t *fpu;
1759
    elf_fpxregset_t *xfpu;
1760
    int thread_status_size;
1761
#endif
1762
    int notes_size;
1763
    int numnote;
1764
};
1765

    
1766
struct vm_area_struct {
1767
    abi_ulong   vma_start;  /* start vaddr of memory region */
1768
    abi_ulong   vma_end;    /* end vaddr of memory region */
1769
    abi_ulong   vma_flags;  /* protection etc. flags for the region */
1770
    QTAILQ_ENTRY(vm_area_struct) vma_link;
1771
};
1772

    
1773
struct mm_struct {
1774
    QTAILQ_HEAD(, vm_area_struct) mm_mmap;
1775
    int mm_count;           /* number of mappings */
1776
};
1777

    
1778
static struct mm_struct *vma_init(void);
1779
static void vma_delete(struct mm_struct *);
1780
static int vma_add_mapping(struct mm_struct *, abi_ulong,
1781
                           abi_ulong, abi_ulong);
1782
static int vma_get_mapping_count(const struct mm_struct *);
1783
static struct vm_area_struct *vma_first(const struct mm_struct *);
1784
static struct vm_area_struct *vma_next(struct vm_area_struct *);
1785
static abi_ulong vma_dump_size(const struct vm_area_struct *);
1786
static int vma_walker(void *priv, abi_ulong start, abi_ulong end,
1787
                      unsigned long flags);
1788

    
1789
static void fill_elf_header(struct elfhdr *, int, uint16_t, uint32_t);
1790
static void fill_note(struct memelfnote *, const char *, int,
1791
                      unsigned int, void *);
1792
static void fill_prstatus(struct target_elf_prstatus *, const TaskState *, int);
1793
static int fill_psinfo(struct target_elf_prpsinfo *, const TaskState *);
1794
static void fill_auxv_note(struct memelfnote *, const TaskState *);
1795
static void fill_elf_note_phdr(struct elf_phdr *, int, off_t);
1796
static size_t note_size(const struct memelfnote *);
1797
static void free_note_info(struct elf_note_info *);
1798
static int fill_note_info(struct elf_note_info *, long, const CPUState *);
1799
static void fill_thread_info(struct elf_note_info *, const CPUState *);
1800
static int core_dump_filename(const TaskState *, char *, size_t);
1801

    
1802
static int dump_write(int, const void *, size_t);
1803
static int write_note(struct memelfnote *, int);
1804
static int write_note_info(struct elf_note_info *, int);
1805

    
1806
#ifdef BSWAP_NEEDED
1807
static void bswap_prstatus(struct target_elf_prstatus *prstatus)
1808
{
1809
    prstatus->pr_info.si_signo = tswapl(prstatus->pr_info.si_signo);
1810
    prstatus->pr_info.si_code = tswapl(prstatus->pr_info.si_code);
1811
    prstatus->pr_info.si_errno = tswapl(prstatus->pr_info.si_errno);
1812
    prstatus->pr_cursig = tswap16(prstatus->pr_cursig);
1813
    prstatus->pr_sigpend = tswapl(prstatus->pr_sigpend);
1814
    prstatus->pr_sighold = tswapl(prstatus->pr_sighold);
1815
    prstatus->pr_pid = tswap32(prstatus->pr_pid);
1816
    prstatus->pr_ppid = tswap32(prstatus->pr_ppid);
1817
    prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp);
1818
    prstatus->pr_sid = tswap32(prstatus->pr_sid);
1819
    /* cpu times are not filled, so we skip them */
1820
    /* regs should be in correct format already */
1821
    prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid);
1822
}
1823

    
1824
static void bswap_psinfo(struct target_elf_prpsinfo *psinfo)
1825
{
1826
    psinfo->pr_flag = tswapl(psinfo->pr_flag);
1827
    psinfo->pr_uid = tswap16(psinfo->pr_uid);
1828
    psinfo->pr_gid = tswap16(psinfo->pr_gid);
1829
    psinfo->pr_pid = tswap32(psinfo->pr_pid);
1830
    psinfo->pr_ppid = tswap32(psinfo->pr_ppid);
1831
    psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp);
1832
    psinfo->pr_sid = tswap32(psinfo->pr_sid);
1833
}
1834

    
1835
static void bswap_note(struct elf_note *en)
1836
{
1837
    bswap32s(&en->n_namesz);
1838
    bswap32s(&en->n_descsz);
1839
    bswap32s(&en->n_type);
1840
}
1841
#else
1842
static inline void bswap_prstatus(struct target_elf_prstatus *p) { }
1843
static inline void bswap_psinfo(struct target_elf_prpsinfo *p) {}
1844
static inline void bswap_note(struct elf_note *en) { }
1845
#endif /* BSWAP_NEEDED */
1846

    
1847
/*
1848
 * Minimal support for linux memory regions.  These are needed
1849
 * when we are finding out what memory exactly belongs to
1850
 * emulated process.  No locks needed here, as long as
1851
 * thread that received the signal is stopped.
1852
 */
1853

    
1854
static struct mm_struct *vma_init(void)
1855
{
1856
    struct mm_struct *mm;
1857

    
1858
    if ((mm = qemu_malloc(sizeof (*mm))) == NULL)
1859
        return (NULL);
1860

    
1861
    mm->mm_count = 0;
1862
    QTAILQ_INIT(&mm->mm_mmap);
1863

    
1864
    return (mm);
1865
}
1866

    
1867
static void vma_delete(struct mm_struct *mm)
1868
{
1869
    struct vm_area_struct *vma;
1870

    
1871
    while ((vma = vma_first(mm)) != NULL) {
1872
        QTAILQ_REMOVE(&mm->mm_mmap, vma, vma_link);
1873
        qemu_free(vma);
1874
    }
1875
    qemu_free(mm);
1876
}
1877

    
1878
static int vma_add_mapping(struct mm_struct *mm, abi_ulong start,
1879
                           abi_ulong end, abi_ulong flags)
1880
{
1881
    struct vm_area_struct *vma;
1882

    
1883
    if ((vma = qemu_mallocz(sizeof (*vma))) == NULL)
1884
        return (-1);
1885

    
1886
    vma->vma_start = start;
1887
    vma->vma_end = end;
1888
    vma->vma_flags = flags;
1889

    
1890
    QTAILQ_INSERT_TAIL(&mm->mm_mmap, vma, vma_link);
1891
    mm->mm_count++;
1892

    
1893
    return (0);
1894
}
1895

    
1896
static struct vm_area_struct *vma_first(const struct mm_struct *mm)
1897
{
1898
    return (QTAILQ_FIRST(&mm->mm_mmap));
1899
}
1900

    
1901
static struct vm_area_struct *vma_next(struct vm_area_struct *vma)
1902
{
1903
    return (QTAILQ_NEXT(vma, vma_link));
1904
}
1905

    
1906
static int vma_get_mapping_count(const struct mm_struct *mm)
1907
{
1908
    return (mm->mm_count);
1909
}
1910

    
1911
/*
1912
 * Calculate file (dump) size of given memory region.
1913
 */
1914
static abi_ulong vma_dump_size(const struct vm_area_struct *vma)
1915
{
1916
    /* if we cannot even read the first page, skip it */
1917
    if (!access_ok(VERIFY_READ, vma->vma_start, TARGET_PAGE_SIZE))
1918
        return (0);
1919

    
1920
    /*
1921
     * Usually we don't dump executable pages as they contain
1922
     * non-writable code that debugger can read directly from
1923
     * target library etc.  However, thread stacks are marked
1924
     * also executable so we read in first page of given region
1925
     * and check whether it contains elf header.  If there is
1926
     * no elf header, we dump it.
1927
     */
1928
    if (vma->vma_flags & PROT_EXEC) {
1929
        char page[TARGET_PAGE_SIZE];
1930

    
1931
        copy_from_user(page, vma->vma_start, sizeof (page));
1932
        if ((page[EI_MAG0] == ELFMAG0) &&
1933
            (page[EI_MAG1] == ELFMAG1) &&
1934
            (page[EI_MAG2] == ELFMAG2) &&
1935
            (page[EI_MAG3] == ELFMAG3)) {
1936
            /*
1937
             * Mappings are possibly from ELF binary.  Don't dump
1938
             * them.
1939
             */
1940
            return (0);
1941
        }
1942
    }
1943

    
1944
    return (vma->vma_end - vma->vma_start);
1945
}
1946

    
1947
static int vma_walker(void *priv, abi_ulong start, abi_ulong end,
1948
                      unsigned long flags)
1949
{
1950
    struct mm_struct *mm = (struct mm_struct *)priv;
1951

    
1952
    vma_add_mapping(mm, start, end, flags);
1953
    return (0);
1954
}
1955

    
1956
static void fill_note(struct memelfnote *note, const char *name, int type,
1957
                      unsigned int sz, void *data)
1958
{
1959
    unsigned int namesz;
1960

    
1961
    namesz = strlen(name) + 1;
1962
    note->name = name;
1963
    note->namesz = namesz;
1964
    note->namesz_rounded = roundup(namesz, sizeof (int32_t));
1965
    note->type = type;
1966
    note->datasz = roundup(sz, sizeof (int32_t));;
1967
    note->data = data;
1968

    
1969
    /*
1970
     * We calculate rounded up note size here as specified by
1971
     * ELF document.
1972
     */
1973
    note->notesz = sizeof (struct elf_note) +
1974
        note->namesz_rounded + note->datasz;
1975
}
1976

    
1977
static void fill_elf_header(struct elfhdr *elf, int segs, uint16_t machine,
1978
                            uint32_t flags)
1979
{
1980
    (void) memset(elf, 0, sizeof(*elf));
1981

    
1982
    (void) memcpy(elf->e_ident, ELFMAG, SELFMAG);
1983
    elf->e_ident[EI_CLASS] = ELF_CLASS;
1984
    elf->e_ident[EI_DATA] = ELF_DATA;
1985
    elf->e_ident[EI_VERSION] = EV_CURRENT;
1986
    elf->e_ident[EI_OSABI] = ELF_OSABI;
1987

    
1988
    elf->e_type = ET_CORE;
1989
    elf->e_machine = machine;
1990
    elf->e_version = EV_CURRENT;
1991
    elf->e_phoff = sizeof(struct elfhdr);
1992
    elf->e_flags = flags;
1993
    elf->e_ehsize = sizeof(struct elfhdr);
1994
    elf->e_phentsize = sizeof(struct elf_phdr);
1995
    elf->e_phnum = segs;
1996

    
1997
    bswap_ehdr(elf);
1998
}
1999

    
2000
static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset)
2001
{
2002
    phdr->p_type = PT_NOTE;
2003
    phdr->p_offset = offset;
2004
    phdr->p_vaddr = 0;
2005
    phdr->p_paddr = 0;
2006
    phdr->p_filesz = sz;
2007
    phdr->p_memsz = 0;
2008
    phdr->p_flags = 0;
2009
    phdr->p_align = 0;
2010

    
2011
    bswap_phdr(phdr, 1);
2012
}
2013

    
2014
static size_t note_size(const struct memelfnote *note)
2015
{
2016
    return (note->notesz);
2017
}
2018

    
2019
static void fill_prstatus(struct target_elf_prstatus *prstatus,
2020
                          const TaskState *ts, int signr)
2021
{
2022
    (void) memset(prstatus, 0, sizeof (*prstatus));
2023
    prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
2024
    prstatus->pr_pid = ts->ts_tid;
2025
    prstatus->pr_ppid = getppid();
2026
    prstatus->pr_pgrp = getpgrp();
2027
    prstatus->pr_sid = getsid(0);
2028

    
2029
    bswap_prstatus(prstatus);
2030
}
2031

    
2032
static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
2033
{
2034
    char *filename, *base_filename;
2035
    unsigned int i, len;
2036

    
2037
    (void) memset(psinfo, 0, sizeof (*psinfo));
2038

    
2039
    len = ts->info->arg_end - ts->info->arg_start;
2040
    if (len >= ELF_PRARGSZ)
2041
        len = ELF_PRARGSZ - 1;
2042
    if (copy_from_user(&psinfo->pr_psargs, ts->info->arg_start, len))
2043
        return -EFAULT;
2044
    for (i = 0; i < len; i++)
2045
        if (psinfo->pr_psargs[i] == 0)
2046
            psinfo->pr_psargs[i] = ' ';
2047
    psinfo->pr_psargs[len] = 0;
2048

    
2049
    psinfo->pr_pid = getpid();
2050
    psinfo->pr_ppid = getppid();
2051
    psinfo->pr_pgrp = getpgrp();
2052
    psinfo->pr_sid = getsid(0);
2053
    psinfo->pr_uid = getuid();
2054
    psinfo->pr_gid = getgid();
2055

    
2056
    filename = strdup(ts->bprm->filename);
2057
    base_filename = strdup(basename(filename));
2058
    (void) strncpy(psinfo->pr_fname, base_filename,
2059
                   sizeof(psinfo->pr_fname));
2060
    free(base_filename);
2061
    free(filename);
2062

    
2063
    bswap_psinfo(psinfo);
2064
    return (0);
2065
}
2066

    
2067
static void fill_auxv_note(struct memelfnote *note, const TaskState *ts)
2068
{
2069
    elf_addr_t auxv = (elf_addr_t)ts->info->saved_auxv;
2070
    elf_addr_t orig_auxv = auxv;
2071
    abi_ulong val;
2072
    void *ptr;
2073
    int i, len;
2074

    
2075
    /*
2076
     * Auxiliary vector is stored in target process stack.  It contains
2077
     * {type, value} pairs that we need to dump into note.  This is not
2078
     * strictly necessary but we do it here for sake of completeness.
2079
     */
2080

    
2081
    /* find out lenght of the vector, AT_NULL is terminator */
2082
    i = len = 0;
2083
    do {
2084
        get_user_ual(val, auxv);
2085
        i += 2;
2086
        auxv += 2 * sizeof (elf_addr_t);
2087
    } while (val != AT_NULL);
2088
    len = i * sizeof (elf_addr_t);
2089

    
2090
    /* read in whole auxv vector and copy it to memelfnote */
2091
    ptr = lock_user(VERIFY_READ, orig_auxv, len, 0);
2092
    if (ptr != NULL) {
2093
        fill_note(note, "CORE", NT_AUXV, len, ptr);
2094
        unlock_user(ptr, auxv, len);
2095
    }
2096
}
2097

    
2098
/*
2099
 * Constructs name of coredump file.  We have following convention
2100
 * for the name:
2101
 *     qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core
2102
 *
2103
 * Returns 0 in case of success, -1 otherwise (errno is set).
2104
 */
2105
static int core_dump_filename(const TaskState *ts, char *buf,
2106
                              size_t bufsize)
2107
{
2108
    char timestamp[64];
2109
    char *filename = NULL;
2110
    char *base_filename = NULL;
2111
    struct timeval tv;
2112
    struct tm tm;
2113

    
2114
    assert(bufsize >= PATH_MAX);
2115

    
2116
    if (gettimeofday(&tv, NULL) < 0) {
2117
        (void) fprintf(stderr, "unable to get current timestamp: %s",
2118
                       strerror(errno));
2119
        return (-1);
2120
    }
2121

    
2122
    filename = strdup(ts->bprm->filename);
2123
    base_filename = strdup(basename(filename));
2124
    (void) strftime(timestamp, sizeof (timestamp), "%Y%m%d-%H%M%S",
2125
                    localtime_r(&tv.tv_sec, &tm));
2126
    (void) snprintf(buf, bufsize, "qemu_%s_%s_%d.core",
2127
                    base_filename, timestamp, (int)getpid());
2128
    free(base_filename);
2129
    free(filename);
2130

    
2131
    return (0);
2132
}
2133

    
2134
static int dump_write(int fd, const void *ptr, size_t size)
2135
{
2136
    const char *bufp = (const char *)ptr;
2137
    ssize_t bytes_written, bytes_left;
2138
    struct rlimit dumpsize;
2139
    off_t pos;
2140

    
2141
    bytes_written = 0;
2142
    getrlimit(RLIMIT_CORE, &dumpsize);
2143
    if ((pos = lseek(fd, 0, SEEK_CUR))==-1) {
2144
        if (errno == ESPIPE) { /* not a seekable stream */
2145
            bytes_left = size;
2146
        } else {
2147
            return pos;
2148
        }
2149
    } else {
2150
        if (dumpsize.rlim_cur <= pos) {
2151
            return -1;
2152
        } else if (dumpsize.rlim_cur == RLIM_INFINITY) {
2153
            bytes_left = size;
2154
        } else {
2155
            size_t limit_left=dumpsize.rlim_cur - pos;
2156
            bytes_left = limit_left >= size ? size : limit_left ;
2157
        }
2158
    }
2159

    
2160
    /*
2161
     * In normal conditions, single write(2) should do but
2162
     * in case of socket etc. this mechanism is more portable.
2163
     */
2164
    do {
2165
        bytes_written = write(fd, bufp, bytes_left);
2166
        if (bytes_written < 0) {
2167
            if (errno == EINTR)
2168
                continue;
2169
            return (-1);
2170
        } else if (bytes_written == 0) { /* eof */
2171
            return (-1);
2172
        }
2173
        bufp += bytes_written;
2174
        bytes_left -= bytes_written;
2175
    } while (bytes_left > 0);
2176

    
2177
    return (0);
2178
}
2179

    
2180
static int write_note(struct memelfnote *men, int fd)
2181
{
2182
    struct elf_note en;
2183

    
2184
    en.n_namesz = men->namesz;
2185
    en.n_type = men->type;
2186
    en.n_descsz = men->datasz;
2187

    
2188
    bswap_note(&en);
2189

    
2190
    if (dump_write(fd, &en, sizeof(en)) != 0)
2191
        return (-1);
2192
    if (dump_write(fd, men->name, men->namesz_rounded) != 0)
2193
        return (-1);
2194
    if (dump_write(fd, men->data, men->datasz) != 0)
2195
        return (-1);
2196

    
2197
    return (0);
2198
}
2199

    
2200
static void fill_thread_info(struct elf_note_info *info, const CPUState *env)
2201
{
2202
    TaskState *ts = (TaskState *)env->opaque;
2203
    struct elf_thread_status *ets;
2204

    
2205
    ets = qemu_mallocz(sizeof (*ets));
2206
    ets->num_notes = 1; /* only prstatus is dumped */
2207
    fill_prstatus(&ets->prstatus, ts, 0);
2208
    elf_core_copy_regs(&ets->prstatus.pr_reg, env);
2209
    fill_note(&ets->notes[0], "CORE", NT_PRSTATUS, sizeof (ets->prstatus),
2210
              &ets->prstatus);
2211

    
2212
    QTAILQ_INSERT_TAIL(&info->thread_list, ets, ets_link);
2213

    
2214
    info->notes_size += note_size(&ets->notes[0]);
2215
}
2216

    
2217
static int fill_note_info(struct elf_note_info *info,
2218
                          long signr, const CPUState *env)
2219
{
2220
#define NUMNOTES 3
2221
    CPUState *cpu = NULL;
2222
    TaskState *ts = (TaskState *)env->opaque;
2223
    int i;
2224

    
2225
    (void) memset(info, 0, sizeof (*info));
2226

    
2227
    QTAILQ_INIT(&info->thread_list);
2228

    
2229
    info->notes = qemu_mallocz(NUMNOTES * sizeof (struct memelfnote));
2230
    if (info->notes == NULL)
2231
        return (-ENOMEM);
2232
    info->prstatus = qemu_mallocz(sizeof (*info->prstatus));
2233
    if (info->prstatus == NULL)
2234
        return (-ENOMEM);
2235
    info->psinfo = qemu_mallocz(sizeof (*info->psinfo));
2236
    if (info->prstatus == NULL)
2237
        return (-ENOMEM);
2238

    
2239
    /*
2240
     * First fill in status (and registers) of current thread
2241
     * including process info & aux vector.
2242
     */
2243
    fill_prstatus(info->prstatus, ts, signr);
2244
    elf_core_copy_regs(&info->prstatus->pr_reg, env);
2245
    fill_note(&info->notes[0], "CORE", NT_PRSTATUS,
2246
              sizeof (*info->prstatus), info->prstatus);
2247
    fill_psinfo(info->psinfo, ts);
2248
    fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
2249
              sizeof (*info->psinfo), info->psinfo);
2250
    fill_auxv_note(&info->notes[2], ts);
2251
    info->numnote = 3;
2252

    
2253
    info->notes_size = 0;
2254
    for (i = 0; i < info->numnote; i++)
2255
        info->notes_size += note_size(&info->notes[i]);
2256

    
2257
    /* read and fill status of all threads */
2258
    cpu_list_lock();
2259
    for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
2260
        if (cpu == thread_env)
2261
            continue;
2262
        fill_thread_info(info, cpu);
2263
    }
2264
    cpu_list_unlock();
2265

    
2266
    return (0);
2267
}
2268

    
2269
static void free_note_info(struct elf_note_info *info)
2270
{
2271
    struct elf_thread_status *ets;
2272

    
2273
    while (!QTAILQ_EMPTY(&info->thread_list)) {
2274
        ets = QTAILQ_FIRST(&info->thread_list);
2275
        QTAILQ_REMOVE(&info->thread_list, ets, ets_link);
2276
        qemu_free(ets);
2277
    }
2278

    
2279
    qemu_free(info->prstatus);
2280
    qemu_free(info->psinfo);
2281
    qemu_free(info->notes);
2282
}
2283

    
2284
static int write_note_info(struct elf_note_info *info, int fd)
2285
{
2286
    struct elf_thread_status *ets;
2287
    int i, error = 0;
2288

    
2289
    /* write prstatus, psinfo and auxv for current thread */
2290
    for (i = 0; i < info->numnote; i++)
2291
        if ((error = write_note(&info->notes[i], fd)) != 0)
2292
            return (error);
2293

    
2294
    /* write prstatus for each thread */
2295
    for (ets = info->thread_list.tqh_first; ets != NULL;
2296
         ets = ets->ets_link.tqe_next) {
2297
        if ((error = write_note(&ets->notes[0], fd)) != 0)
2298
            return (error);
2299
    }
2300

    
2301
    return (0);
2302
}
2303

    
2304
/*
2305
 * Write out ELF coredump.
2306
 *
2307
 * See documentation of ELF object file format in:
2308
 * http://www.caldera.com/developers/devspecs/gabi41.pdf
2309
 *
2310
 * Coredump format in linux is following:
2311
 *
2312
 * 0   +----------------------+         \
2313
 *     | ELF header           | ET_CORE  |
2314
 *     +----------------------+          |
2315
 *     | ELF program headers  |          |--- headers
2316
 *     | - NOTE section       |          |
2317
 *     | - PT_LOAD sections   |          |
2318
 *     +----------------------+         /
2319
 *     | NOTEs:               |
2320
 *     | - NT_PRSTATUS        |
2321
 *     | - NT_PRSINFO         |
2322
 *     | - NT_AUXV            |
2323
 *     +----------------------+ <-- aligned to target page
2324
 *     | Process memory dump  |
2325
 *     :                      :
2326
 *     .                      .
2327
 *     :                      :
2328
 *     |                      |
2329
 *     +----------------------+
2330
 *
2331
 * NT_PRSTATUS -> struct elf_prstatus (per thread)
2332
 * NT_PRSINFO  -> struct elf_prpsinfo
2333
 * NT_AUXV is array of { type, value } pairs (see fill_auxv_note()).
2334
 *
2335
 * Format follows System V format as close as possible.  Current
2336
 * version limitations are as follows:
2337
 *     - no floating point registers are dumped
2338
 *
2339
 * Function returns 0 in case of success, negative errno otherwise.
2340
 *
2341
 * TODO: make this work also during runtime: it should be
2342
 * possible to force coredump from running process and then
2343
 * continue processing.  For example qemu could set up SIGUSR2
2344
 * handler (provided that target process haven't registered
2345
 * handler for that) that does the dump when signal is received.
2346
 */
2347
static int elf_core_dump(int signr, const CPUState *env)
2348
{
2349
    const TaskState *ts = (const TaskState *)env->opaque;
2350
    struct vm_area_struct *vma = NULL;
2351
    char corefile[PATH_MAX];
2352
    struct elf_note_info info;
2353
    struct elfhdr elf;
2354
    struct elf_phdr phdr;
2355
    struct rlimit dumpsize;
2356
    struct mm_struct *mm = NULL;
2357
    off_t offset = 0, data_offset = 0;
2358
    int segs = 0;
2359
    int fd = -1;
2360

    
2361
    errno = 0;
2362
    getrlimit(RLIMIT_CORE, &dumpsize);
2363
    if (dumpsize.rlim_cur == 0)
2364
        return 0;
2365

    
2366
    if (core_dump_filename(ts, corefile, sizeof (corefile)) < 0)
2367
        return (-errno);
2368

    
2369
    if ((fd = open(corefile, O_WRONLY | O_CREAT,
2370
                   S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
2371
        return (-errno);
2372

    
2373
    /*
2374
     * Walk through target process memory mappings and
2375
     * set up structure containing this information.  After
2376
     * this point vma_xxx functions can be used.
2377
     */
2378
    if ((mm = vma_init()) == NULL)
2379
        goto out;
2380

    
2381
    walk_memory_regions(mm, vma_walker);
2382
    segs = vma_get_mapping_count(mm);
2383

    
2384
    /*
2385
     * Construct valid coredump ELF header.  We also
2386
     * add one more segment for notes.
2387
     */
2388
    fill_elf_header(&elf, segs + 1, ELF_MACHINE, 0);
2389
    if (dump_write(fd, &elf, sizeof (elf)) != 0)
2390
        goto out;
2391

    
2392
    /* fill in in-memory version of notes */
2393
    if (fill_note_info(&info, signr, env) < 0)
2394
        goto out;
2395

    
2396
    offset += sizeof (elf);                             /* elf header */
2397
    offset += (segs + 1) * sizeof (struct elf_phdr);    /* program headers */
2398

    
2399
    /* write out notes program header */
2400
    fill_elf_note_phdr(&phdr, info.notes_size, offset);
2401

    
2402
    offset += info.notes_size;
2403
    if (dump_write(fd, &phdr, sizeof (phdr)) != 0)
2404
        goto out;
2405

    
2406
    /*
2407
     * ELF specification wants data to start at page boundary so
2408
     * we align it here.
2409
     */
2410
    offset = roundup(offset, ELF_EXEC_PAGESIZE);
2411

    
2412
    /*
2413
     * Write program headers for memory regions mapped in
2414
     * the target process.
2415
     */
2416
    for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
2417
        (void) memset(&phdr, 0, sizeof (phdr));
2418

    
2419
        phdr.p_type = PT_LOAD;
2420
        phdr.p_offset = offset;
2421
        phdr.p_vaddr = vma->vma_start;
2422
        phdr.p_paddr = 0;
2423
        phdr.p_filesz = vma_dump_size(vma);
2424
        offset += phdr.p_filesz;
2425
        phdr.p_memsz = vma->vma_end - vma->vma_start;
2426
        phdr.p_flags = vma->vma_flags & PROT_READ ? PF_R : 0;
2427
        if (vma->vma_flags & PROT_WRITE)
2428
            phdr.p_flags |= PF_W;
2429
        if (vma->vma_flags & PROT_EXEC)
2430
            phdr.p_flags |= PF_X;
2431
        phdr.p_align = ELF_EXEC_PAGESIZE;
2432

    
2433
        dump_write(fd, &phdr, sizeof (phdr));
2434
    }
2435

    
2436
    /*
2437
     * Next we write notes just after program headers.  No
2438
     * alignment needed here.
2439
     */
2440
    if (write_note_info(&info, fd) < 0)
2441
        goto out;
2442

    
2443
    /* align data to page boundary */
2444
    data_offset = lseek(fd, 0, SEEK_CUR);
2445
    data_offset = TARGET_PAGE_ALIGN(data_offset);
2446
    if (lseek(fd, data_offset, SEEK_SET) != data_offset)
2447
        goto out;
2448

    
2449
    /*
2450
     * Finally we can dump process memory into corefile as well.
2451
     */
2452
    for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
2453
        abi_ulong addr;
2454
        abi_ulong end;
2455

    
2456
        end = vma->vma_start + vma_dump_size(vma);
2457

    
2458
        for (addr = vma->vma_start; addr < end;
2459
             addr += TARGET_PAGE_SIZE) {
2460
            char page[TARGET_PAGE_SIZE];
2461
            int error;
2462

    
2463
            /*
2464
             *  Read in page from target process memory and
2465
             *  write it to coredump file.
2466
             */
2467
            error = copy_from_user(page, addr, sizeof (page));
2468
            if (error != 0) {
2469
                (void) fprintf(stderr, "unable to dump " TARGET_ABI_FMT_lx "\n",
2470
                               addr);
2471
                errno = -error;
2472
                goto out;
2473
            }
2474
            if (dump_write(fd, page, TARGET_PAGE_SIZE) < 0)
2475
                goto out;
2476
        }
2477
    }
2478

    
2479
 out:
2480
    free_note_info(&info);
2481
    if (mm != NULL)
2482
        vma_delete(mm);
2483
    (void) close(fd);
2484

    
2485
    if (errno != 0)
2486
        return (-errno);
2487
    return (0);
2488
}
2489
#endif /* USE_ELF_CORE_DUMP */
2490

    
2491
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
2492
{
2493
    init_thread(regs, infop);
2494
}