Annotation of qemu/linux-user/elfload.c, revision 1.1.1.15

1.1       root        1: /* This is the Linux kernel elf-loading code, ported into user space */
1.1.1.8   root        2: #include <sys/time.h>
                      3: #include <sys/param.h>
1.1       root        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>
1.1.1.8   root       11: #include <sys/resource.h>
1.1       root       12: #include <stdlib.h>
                     13: #include <string.h>
1.1.1.8   root       14: #include <time.h>
1.1       root       15: 
                     16: #include "qemu.h"
                     17: #include "disas.h"
                     18: 
1.1.1.7   root       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: 
1.1.1.8   root       28: #define ELF_OSABI   ELFOSABI_SYSV
                     29: 
1.1.1.6   root       30: /* from personality.h */
                     31: 
                     32: /*
                     33:  * Flags for bug emulation.
                     34:  *
                     35:  * These occupy the top three bytes.
                     36:  */
                     37: enum {
1.1.1.12  root       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,
1.1.1.6   root       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 {
1.1.1.12  root       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,
1.1.1.6   root       81: };
                     82: 
                     83: /*
                     84:  * Return the base personality without flags.
                     85:  */
1.1.1.12  root       86: #define personality(pers)       (pers & PER_MASK)
1.1.1.6   root       87: 
1.1       root       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: 
1.1.1.12  root       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;
1.1.1.11  root      105: #ifdef USE_UID16
1.1.1.13  root      106: typedef target_ushort   target_uid_t;
                    107: typedef target_ushort   target_gid_t;
1.1.1.11  root      108: #else
1.1.1.13  root      109: typedef target_uint     target_uid_t;
                    110: typedef target_uint     target_gid_t;
1.1.1.11  root      111: #endif
1.1.1.13  root      112: typedef target_int      target_pid_t;
1.1.1.11  root      113: 
1.1       root      114: #ifdef TARGET_I386
                    115: 
1.1.1.2   root      116: #define ELF_PLATFORM get_elf_platform()
                    117: 
                    118: static const char *get_elf_platform(void)
                    119: {
                    120:     static char elf_platform[] = "i386";
1.1.1.7   root      121:     int family = (thread_env->cpuid_version >> 8) & 0xff;
1.1.1.2   root      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: {
1.1.1.12  root      133:     return thread_env->cpuid_features;
1.1.1.2   root      134: }
                    135: 
1.1.1.6   root      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: 
1.1.1.8   root      150: #define ELF_NREG    27
1.1.1.9   root      151: typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
1.1.1.8   root      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:  */
1.1.1.15! root      160: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env)
1.1.1.8   root      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: 
1.1.1.6   root      191: #else
                    192: 
1.1       root      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:  */
1.1.1.12  root      203: #define ELF_CLASS       ELFCLASS32
                    204: #define ELF_ARCH        EM_386
1.1       root      205: 
1.1.1.12  root      206: static inline void init_thread(struct target_pt_regs *regs,
                    207:                                struct image_info *infop)
1.1       root      208: {
                    209:     regs->esp = infop->start_stack;
                    210:     regs->eip = infop->entry;
1.1.1.4   root      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;
1.1       root      220: }
1.1.1.8   root      221: 
                    222: #define ELF_NREG    17
1.1.1.9   root      223: typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
1.1.1.8   root      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:  */
1.1.1.15! root      232: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env)
1.1.1.8   root      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: }
1.1.1.6   root      252: #endif
1.1       root      253: 
                    254: #define USE_ELF_CORE_DUMP
1.1.1.12  root      255: #define ELF_EXEC_PAGESIZE       4096
1.1       root      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: 
1.1.1.12  root      265: #define ELF_CLASS       ELFCLASS32
                    266: #define ELF_ARCH        EM_ARM
1.1       root      267: 
1.1.1.12  root      268: static inline void init_thread(struct target_pt_regs *regs,
                    269:                                struct image_info *infop)
1.1       root      270: {
1.1.1.6   root      271:     abi_long stack = infop->start_stack;
1.1       root      272:     memset(regs, 0, sizeof(*regs));
                    273:     regs->ARM_cpsr = 0x10;
1.1.1.3   root      274:     if (infop->entry & 1)
1.1.1.12  root      275:         regs->ARM_cpsr |= CPSR_T;
1.1.1.3   root      276:     regs->ARM_pc = infop->entry & 0xfffffffe;
1.1       root      277:     regs->ARM_sp = infop->start_stack;
1.1.1.6   root      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 */
1.1       root      281:     /* XXX: it seems that r0 is zeroed after ! */
1.1.1.4   root      282:     regs->ARM_r0 = 0;
                    283:     /* For uClinux PIC binaries.  */
1.1.1.6   root      284:     /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
1.1.1.4   root      285:     regs->ARM_r10 = infop->start_data;
1.1       root      286: }
                    287: 
1.1.1.8   root      288: #define ELF_NREG    18
1.1.1.9   root      289: typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
1.1.1.8   root      290: 
1.1.1.15! root      291: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUARMState *env)
1.1.1.8   root      292: {
1.1.1.11  root      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]);
1.1.1.8   root      309: 
1.1.1.15! root      310:     (*regs)[16] = tswapl(cpsr_read((CPUARMState *)env));
1.1.1.11  root      311:     (*regs)[17] = tswapl(env->regs[0]); /* XXX */
1.1.1.8   root      312: }
                    313: 
1.1       root      314: #define USE_ELF_CORE_DUMP
1.1.1.12  root      315: #define ELF_EXEC_PAGESIZE       4096
1.1       root      316: 
1.1.1.2   root      317: enum
                    318: {
1.1.1.12  root      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,
1.1.1.2   root      333: };
                    334: 
1.1.1.14  root      335: #define TARGET_HAS_GUEST_VALIDATE_BASE
                    336: /* We want the opportunity to check the suggested base */
                    337: bool guest_validate_base(unsigned long guest_base)
                    338: {
                    339:     unsigned long real_start, test_page_addr;
                    340: 
                    341:     /* We need to check that we can force a fault on access to the
                    342:      * commpage at 0xffff0fxx
                    343:      */
                    344:     test_page_addr = guest_base + (0xffff0f00 & qemu_host_page_mask);
                    345:     /* Note it needs to be writeable to let us initialise it */
                    346:     real_start = (unsigned long)
                    347:                  mmap((void *)test_page_addr, qemu_host_page_size,
                    348:                      PROT_READ | PROT_WRITE,
                    349:                      MAP_ANONYMOUS | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
                    350: 
                    351:     /* If we can't map it then try another address */
                    352:     if (real_start == -1ul) {
                    353:         return 0;
                    354:     }
                    355: 
                    356:     if (real_start != test_page_addr) {
                    357:         /* OS didn't put the page where we asked - unmap and reject */
                    358:         munmap((void *)real_start, qemu_host_page_size);
                    359:         return 0;
                    360:     }
                    361: 
                    362:     /* Leave the page mapped
                    363:      * Populate it (mmap should have left it all 0'd)
                    364:      */
                    365: 
                    366:     /* Kernel helper versions */
                    367:     __put_user(5, (uint32_t *)g2h(0xffff0ffcul));
                    368: 
                    369:     /* Now it's populated make it RO */
                    370:     if (mprotect((void *)test_page_addr, qemu_host_page_size, PROT_READ)) {
                    371:         perror("Protecting guest commpage");
                    372:         exit(-1);
                    373:     }
                    374: 
                    375:     return 1; /* All good */
                    376: }
                    377: 
1.1.1.15! root      378: 
        !           379: #define ELF_HWCAP get_elf_hwcap()
        !           380: 
        !           381: static uint32_t get_elf_hwcap(void)
        !           382: {
        !           383:     CPUARMState *e = thread_env;
        !           384:     uint32_t hwcaps = 0;
        !           385: 
        !           386:     hwcaps |= ARM_HWCAP_ARM_SWP;
        !           387:     hwcaps |= ARM_HWCAP_ARM_HALF;
        !           388:     hwcaps |= ARM_HWCAP_ARM_THUMB;
        !           389:     hwcaps |= ARM_HWCAP_ARM_FAST_MULT;
        !           390:     hwcaps |= ARM_HWCAP_ARM_FPA;
        !           391: 
        !           392:     /* probe for the extra features */
        !           393: #define GET_FEATURE(feat, hwcap) \
        !           394:     do {if (arm_feature(e, feat)) { hwcaps |= hwcap; } } while (0)
        !           395:     GET_FEATURE(ARM_FEATURE_VFP, ARM_HWCAP_ARM_VFP);
        !           396:     GET_FEATURE(ARM_FEATURE_IWMMXT, ARM_HWCAP_ARM_IWMMXT);
        !           397:     GET_FEATURE(ARM_FEATURE_THUMB2EE, ARM_HWCAP_ARM_THUMBEE);
        !           398:     GET_FEATURE(ARM_FEATURE_NEON, ARM_HWCAP_ARM_NEON);
        !           399:     GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPv3);
        !           400:     GET_FEATURE(ARM_FEATURE_VFP_FP16, ARM_HWCAP_ARM_VFPv3D16);
        !           401: #undef GET_FEATURE
        !           402: 
        !           403:     return hwcaps;
        !           404: }
1.1.1.2   root      405: 
1.1       root      406: #endif
                    407: 
1.1.1.13  root      408: #ifdef TARGET_UNICORE32
                    409: 
                    410: #define ELF_START_MMAP          0x80000000
                    411: 
                    412: #define elf_check_arch(x)       ((x) == EM_UNICORE32)
                    413: 
                    414: #define ELF_CLASS               ELFCLASS32
                    415: #define ELF_DATA                ELFDATA2LSB
                    416: #define ELF_ARCH                EM_UNICORE32
                    417: 
                    418: static inline void init_thread(struct target_pt_regs *regs,
                    419:         struct image_info *infop)
                    420: {
                    421:     abi_long stack = infop->start_stack;
                    422:     memset(regs, 0, sizeof(*regs));
                    423:     regs->UC32_REG_asr = 0x10;
                    424:     regs->UC32_REG_pc = infop->entry & 0xfffffffe;
                    425:     regs->UC32_REG_sp = infop->start_stack;
                    426:     /* FIXME - what to for failure of get_user()? */
                    427:     get_user_ual(regs->UC32_REG_02, stack + 8); /* envp */
                    428:     get_user_ual(regs->UC32_REG_01, stack + 4); /* envp */
                    429:     /* XXX: it seems that r0 is zeroed after ! */
                    430:     regs->UC32_REG_00 = 0;
                    431: }
                    432: 
                    433: #define ELF_NREG    34
                    434: typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
                    435: 
1.1.1.15! root      436: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUUniCore32State *env)
1.1.1.13  root      437: {
                    438:     (*regs)[0] = env->regs[0];
                    439:     (*regs)[1] = env->regs[1];
                    440:     (*regs)[2] = env->regs[2];
                    441:     (*regs)[3] = env->regs[3];
                    442:     (*regs)[4] = env->regs[4];
                    443:     (*regs)[5] = env->regs[5];
                    444:     (*regs)[6] = env->regs[6];
                    445:     (*regs)[7] = env->regs[7];
                    446:     (*regs)[8] = env->regs[8];
                    447:     (*regs)[9] = env->regs[9];
                    448:     (*regs)[10] = env->regs[10];
                    449:     (*regs)[11] = env->regs[11];
                    450:     (*regs)[12] = env->regs[12];
                    451:     (*regs)[13] = env->regs[13];
                    452:     (*regs)[14] = env->regs[14];
                    453:     (*regs)[15] = env->regs[15];
                    454:     (*regs)[16] = env->regs[16];
                    455:     (*regs)[17] = env->regs[17];
                    456:     (*regs)[18] = env->regs[18];
                    457:     (*regs)[19] = env->regs[19];
                    458:     (*regs)[20] = env->regs[20];
                    459:     (*regs)[21] = env->regs[21];
                    460:     (*regs)[22] = env->regs[22];
                    461:     (*regs)[23] = env->regs[23];
                    462:     (*regs)[24] = env->regs[24];
                    463:     (*regs)[25] = env->regs[25];
                    464:     (*regs)[26] = env->regs[26];
                    465:     (*regs)[27] = env->regs[27];
                    466:     (*regs)[28] = env->regs[28];
                    467:     (*regs)[29] = env->regs[29];
                    468:     (*regs)[30] = env->regs[30];
                    469:     (*regs)[31] = env->regs[31];
                    470: 
1.1.1.15! root      471:     (*regs)[32] = cpu_asr_read((CPUUniCore32State *)env);
1.1.1.13  root      472:     (*regs)[33] = env->regs[0]; /* XXX */
                    473: }
                    474: 
                    475: #define USE_ELF_CORE_DUMP
                    476: #define ELF_EXEC_PAGESIZE               4096
                    477: 
                    478: #define ELF_HWCAP                       (UC32_HWCAP_CMOV | UC32_HWCAP_UCF64)
                    479: 
                    480: #endif
                    481: 
1.1       root      482: #ifdef TARGET_SPARC
                    483: #ifdef TARGET_SPARC64
                    484: 
                    485: #define ELF_START_MMAP 0x80000000
1.1.1.13  root      486: #define ELF_HWCAP  (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
                    487:                     | HWCAP_SPARC_MULDIV | HWCAP_SPARC_V9)
1.1.1.6   root      488: #ifndef TARGET_ABI32
                    489: #define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
                    490: #else
                    491: #define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
                    492: #endif
1.1       root      493: 
                    494: #define ELF_CLASS   ELFCLASS64
1.1.1.4   root      495: #define ELF_ARCH    EM_SPARCV9
1.1       root      496: 
1.1.1.12  root      497: #define STACK_BIAS              2047
1.1       root      498: 
1.1.1.12  root      499: static inline void init_thread(struct target_pt_regs *regs,
                    500:                                struct image_info *infop)
1.1       root      501: {
1.1.1.6   root      502: #ifndef TARGET_ABI32
1.1       root      503:     regs->tstate = 0;
1.1.1.6   root      504: #endif
1.1       root      505:     regs->pc = infop->entry;
                    506:     regs->npc = regs->pc + 4;
                    507:     regs->y = 0;
1.1.1.6   root      508: #ifdef TARGET_ABI32
                    509:     regs->u_regs[14] = infop->start_stack - 16 * 4;
                    510: #else
                    511:     if (personality(infop->personality) == PER_LINUX32)
                    512:         regs->u_regs[14] = infop->start_stack - 16 * 4;
                    513:     else
                    514:         regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
                    515: #endif
1.1       root      516: }
                    517: 
                    518: #else
                    519: #define ELF_START_MMAP 0x80000000
1.1.1.13  root      520: #define ELF_HWCAP  (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
                    521:                     | HWCAP_SPARC_MULDIV)
1.1       root      522: #define elf_check_arch(x) ( (x) == EM_SPARC )
                    523: 
                    524: #define ELF_CLASS   ELFCLASS32
                    525: #define ELF_ARCH    EM_SPARC
                    526: 
1.1.1.12  root      527: static inline void init_thread(struct target_pt_regs *regs,
                    528:                                struct image_info *infop)
1.1       root      529: {
                    530:     regs->psr = 0;
                    531:     regs->pc = infop->entry;
                    532:     regs->npc = regs->pc + 4;
                    533:     regs->y = 0;
                    534:     regs->u_regs[14] = infop->start_stack - 16 * 4;
                    535: }
                    536: 
                    537: #endif
                    538: #endif
                    539: 
                    540: #ifdef TARGET_PPC
                    541: 
                    542: #define ELF_START_MMAP 0x80000000
                    543: 
1.1.1.6   root      544: #if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
                    545: 
                    546: #define elf_check_arch(x) ( (x) == EM_PPC64 )
                    547: 
1.1.1.12  root      548: #define ELF_CLASS       ELFCLASS64
1.1.1.6   root      549: 
                    550: #else
                    551: 
1.1       root      552: #define elf_check_arch(x) ( (x) == EM_PPC )
                    553: 
1.1.1.12  root      554: #define ELF_CLASS       ELFCLASS32
1.1.1.6   root      555: 
                    556: #endif
                    557: 
1.1.1.12  root      558: #define ELF_ARCH        EM_PPC
1.1       root      559: 
1.1.1.8   root      560: /* Feature masks for the Aux Vector Hardware Capabilities (AT_HWCAP).
                    561:    See arch/powerpc/include/asm/cputable.h.  */
                    562: enum {
1.1.1.10  root      563:     QEMU_PPC_FEATURE_32 = 0x80000000,
                    564:     QEMU_PPC_FEATURE_64 = 0x40000000,
                    565:     QEMU_PPC_FEATURE_601_INSTR = 0x20000000,
                    566:     QEMU_PPC_FEATURE_HAS_ALTIVEC = 0x10000000,
                    567:     QEMU_PPC_FEATURE_HAS_FPU = 0x08000000,
                    568:     QEMU_PPC_FEATURE_HAS_MMU = 0x04000000,
                    569:     QEMU_PPC_FEATURE_HAS_4xxMAC = 0x02000000,
                    570:     QEMU_PPC_FEATURE_UNIFIED_CACHE = 0x01000000,
                    571:     QEMU_PPC_FEATURE_HAS_SPE = 0x00800000,
                    572:     QEMU_PPC_FEATURE_HAS_EFP_SINGLE = 0x00400000,
                    573:     QEMU_PPC_FEATURE_HAS_EFP_DOUBLE = 0x00200000,
                    574:     QEMU_PPC_FEATURE_NO_TB = 0x00100000,
                    575:     QEMU_PPC_FEATURE_POWER4 = 0x00080000,
                    576:     QEMU_PPC_FEATURE_POWER5 = 0x00040000,
                    577:     QEMU_PPC_FEATURE_POWER5_PLUS = 0x00020000,
                    578:     QEMU_PPC_FEATURE_CELL = 0x00010000,
                    579:     QEMU_PPC_FEATURE_BOOKE = 0x00008000,
                    580:     QEMU_PPC_FEATURE_SMT = 0x00004000,
                    581:     QEMU_PPC_FEATURE_ICACHE_SNOOP = 0x00002000,
                    582:     QEMU_PPC_FEATURE_ARCH_2_05 = 0x00001000,
                    583:     QEMU_PPC_FEATURE_PA6T = 0x00000800,
                    584:     QEMU_PPC_FEATURE_HAS_DFP = 0x00000400,
                    585:     QEMU_PPC_FEATURE_POWER6_EXT = 0x00000200,
                    586:     QEMU_PPC_FEATURE_ARCH_2_06 = 0x00000100,
                    587:     QEMU_PPC_FEATURE_HAS_VSX = 0x00000080,
                    588:     QEMU_PPC_FEATURE_PSERIES_PERFMON_COMPAT = 0x00000040,
1.1.1.8   root      589: 
1.1.1.10  root      590:     QEMU_PPC_FEATURE_TRUE_LE = 0x00000002,
                    591:     QEMU_PPC_FEATURE_PPC_LE = 0x00000001,
1.1.1.8   root      592: };
                    593: 
                    594: #define ELF_HWCAP get_elf_hwcap()
                    595: 
                    596: static uint32_t get_elf_hwcap(void)
                    597: {
1.1.1.15! root      598:     CPUPPCState *e = thread_env;
1.1.1.8   root      599:     uint32_t features = 0;
                    600: 
                    601:     /* We don't have to be terribly complete here; the high points are
                    602:        Altivec/FP/SPE support.  Anything else is just a bonus.  */
1.1.1.12  root      603: #define GET_FEATURE(flag, feature)                                      \
1.1.1.8   root      604:     do {if (e->insns_flags & flag) features |= feature; } while(0)
1.1.1.10  root      605:     GET_FEATURE(PPC_64B, QEMU_PPC_FEATURE_64);
                    606:     GET_FEATURE(PPC_FLOAT, QEMU_PPC_FEATURE_HAS_FPU);
                    607:     GET_FEATURE(PPC_ALTIVEC, QEMU_PPC_FEATURE_HAS_ALTIVEC);
                    608:     GET_FEATURE(PPC_SPE, QEMU_PPC_FEATURE_HAS_SPE);
                    609:     GET_FEATURE(PPC_SPE_SINGLE, QEMU_PPC_FEATURE_HAS_EFP_SINGLE);
                    610:     GET_FEATURE(PPC_SPE_DOUBLE, QEMU_PPC_FEATURE_HAS_EFP_DOUBLE);
                    611:     GET_FEATURE(PPC_BOOKE, QEMU_PPC_FEATURE_BOOKE);
                    612:     GET_FEATURE(PPC_405_MAC, QEMU_PPC_FEATURE_HAS_4xxMAC);
1.1.1.8   root      613: #undef GET_FEATURE
                    614: 
                    615:     return features;
                    616: }
                    617: 
1.1       root      618: /*
                    619:  * The requirements here are:
                    620:  * - keep the final alignment of sp (sp & 0xf)
                    621:  * - make sure the 32-bit value at the first 16 byte aligned position of
                    622:  *   AUXV is greater than 16 for glibc compatibility.
                    623:  *   AT_IGNOREPPC is used for that.
                    624:  * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
                    625:  *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
                    626:  */
                    627: #define DLINFO_ARCH_ITEMS       5
1.1.1.12  root      628: #define ARCH_DLINFO                                     \
                    629:     do {                                                \
                    630:         NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20);              \
                    631:         NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20);              \
                    632:         NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                 \
                    633:         /*                                              \
                    634:          * Now handle glibc compatibility.              \
                    635:          */                                             \
                    636:         NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);        \
                    637:         NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);        \
                    638:     } while (0)
1.1       root      639: 
                    640: static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
                    641: {
                    642:     _regs->gpr[1] = infop->start_stack;
1.1.1.6   root      643: #if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
1.1.1.14  root      644:     _regs->gpr[2] = ldq_raw(infop->entry + 8) + infop->load_bias;
                    645:     infop->entry = ldq_raw(infop->entry) + infop->load_bias;
1.1.1.6   root      646: #endif
1.1       root      647:     _regs->nip = infop->entry;
                    648: }
                    649: 
1.1.1.11  root      650: /* See linux kernel: arch/powerpc/include/asm/elf.h.  */
                    651: #define ELF_NREG 48
                    652: typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
                    653: 
1.1.1.15! root      654: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *env)
1.1.1.11  root      655: {
                    656:     int i;
                    657:     target_ulong ccr = 0;
                    658: 
                    659:     for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
                    660:         (*regs)[i] = tswapl(env->gpr[i]);
                    661:     }
                    662: 
                    663:     (*regs)[32] = tswapl(env->nip);
                    664:     (*regs)[33] = tswapl(env->msr);
                    665:     (*regs)[35] = tswapl(env->ctr);
                    666:     (*regs)[36] = tswapl(env->lr);
                    667:     (*regs)[37] = tswapl(env->xer);
                    668: 
                    669:     for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
                    670:         ccr |= env->crf[i] << (32 - ((i + 1) * 4));
                    671:     }
                    672:     (*regs)[38] = tswapl(ccr);
                    673: }
                    674: 
                    675: #define USE_ELF_CORE_DUMP
1.1.1.12  root      676: #define ELF_EXEC_PAGESIZE       4096
1.1       root      677: 
                    678: #endif
                    679: 
1.1.1.2   root      680: #ifdef TARGET_MIPS
                    681: 
                    682: #define ELF_START_MMAP 0x80000000
                    683: 
                    684: #define elf_check_arch(x) ( (x) == EM_MIPS )
                    685: 
1.1.1.6   root      686: #ifdef TARGET_MIPS64
                    687: #define ELF_CLASS   ELFCLASS64
                    688: #else
1.1.1.2   root      689: #define ELF_CLASS   ELFCLASS32
1.1.1.6   root      690: #endif
1.1.1.2   root      691: #define ELF_ARCH    EM_MIPS
                    692: 
1.1.1.12  root      693: static inline void init_thread(struct target_pt_regs *regs,
                    694:                                struct image_info *infop)
1.1.1.2   root      695: {
1.1.1.6   root      696:     regs->cp0_status = 2 << CP0St_KSU;
1.1.1.2   root      697:     regs->cp0_epc = infop->entry;
                    698:     regs->regs[29] = infop->start_stack;
                    699: }
                    700: 
1.1.1.11  root      701: /* See linux kernel: arch/mips/include/asm/elf.h.  */
                    702: #define ELF_NREG 45
                    703: typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
                    704: 
                    705: /* See linux kernel: arch/mips/include/asm/reg.h.  */
                    706: enum {
                    707: #ifdef TARGET_MIPS64
                    708:     TARGET_EF_R0 = 0,
                    709: #else
                    710:     TARGET_EF_R0 = 6,
                    711: #endif
                    712:     TARGET_EF_R26 = TARGET_EF_R0 + 26,
                    713:     TARGET_EF_R27 = TARGET_EF_R0 + 27,
                    714:     TARGET_EF_LO = TARGET_EF_R0 + 32,
                    715:     TARGET_EF_HI = TARGET_EF_R0 + 33,
                    716:     TARGET_EF_CP0_EPC = TARGET_EF_R0 + 34,
                    717:     TARGET_EF_CP0_BADVADDR = TARGET_EF_R0 + 35,
                    718:     TARGET_EF_CP0_STATUS = TARGET_EF_R0 + 36,
                    719:     TARGET_EF_CP0_CAUSE = TARGET_EF_R0 + 37
                    720: };
                    721: 
                    722: /* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
1.1.1.15! root      723: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMIPSState *env)
1.1.1.11  root      724: {
                    725:     int i;
                    726: 
                    727:     for (i = 0; i < TARGET_EF_R0; i++) {
                    728:         (*regs)[i] = 0;
                    729:     }
                    730:     (*regs)[TARGET_EF_R0] = 0;
                    731: 
                    732:     for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) {
                    733:         (*regs)[TARGET_EF_R0 + i] = tswapl(env->active_tc.gpr[i]);
                    734:     }
                    735: 
                    736:     (*regs)[TARGET_EF_R26] = 0;
                    737:     (*regs)[TARGET_EF_R27] = 0;
                    738:     (*regs)[TARGET_EF_LO] = tswapl(env->active_tc.LO[0]);
                    739:     (*regs)[TARGET_EF_HI] = tswapl(env->active_tc.HI[0]);
                    740:     (*regs)[TARGET_EF_CP0_EPC] = tswapl(env->active_tc.PC);
                    741:     (*regs)[TARGET_EF_CP0_BADVADDR] = tswapl(env->CP0_BadVAddr);
                    742:     (*regs)[TARGET_EF_CP0_STATUS] = tswapl(env->CP0_Status);
                    743:     (*regs)[TARGET_EF_CP0_CAUSE] = tswapl(env->CP0_Cause);
                    744: }
                    745: 
                    746: #define USE_ELF_CORE_DUMP
1.1.1.6   root      747: #define ELF_EXEC_PAGESIZE        4096
                    748: 
1.1.1.2   root      749: #endif /* TARGET_MIPS */
                    750: 
1.1.1.8   root      751: #ifdef TARGET_MICROBLAZE
                    752: 
                    753: #define ELF_START_MMAP 0x80000000
                    754: 
1.1.1.11  root      755: #define elf_check_arch(x) ( (x) == EM_MICROBLAZE || (x) == EM_MICROBLAZE_OLD)
1.1.1.8   root      756: 
                    757: #define ELF_CLASS   ELFCLASS32
1.1.1.11  root      758: #define ELF_ARCH    EM_MICROBLAZE
1.1.1.8   root      759: 
1.1.1.12  root      760: static inline void init_thread(struct target_pt_regs *regs,
                    761:                                struct image_info *infop)
1.1.1.8   root      762: {
                    763:     regs->pc = infop->entry;
                    764:     regs->r1 = infop->start_stack;
                    765: 
                    766: }
                    767: 
                    768: #define ELF_EXEC_PAGESIZE        4096
                    769: 
1.1.1.11  root      770: #define USE_ELF_CORE_DUMP
                    771: #define ELF_NREG 38
                    772: typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
                    773: 
                    774: /* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
1.1.1.15! root      775: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMBState *env)
1.1.1.11  root      776: {
                    777:     int i, pos = 0;
                    778: 
                    779:     for (i = 0; i < 32; i++) {
                    780:         (*regs)[pos++] = tswapl(env->regs[i]);
                    781:     }
                    782: 
                    783:     for (i = 0; i < 6; i++) {
                    784:         (*regs)[pos++] = tswapl(env->sregs[i]);
                    785:     }
                    786: }
                    787: 
1.1.1.8   root      788: #endif /* TARGET_MICROBLAZE */
                    789: 
1.1.1.3   root      790: #ifdef TARGET_SH4
                    791: 
                    792: #define ELF_START_MMAP 0x80000000
                    793: 
                    794: #define elf_check_arch(x) ( (x) == EM_SH )
                    795: 
                    796: #define ELF_CLASS ELFCLASS32
                    797: #define ELF_ARCH  EM_SH
                    798: 
1.1.1.12  root      799: static inline void init_thread(struct target_pt_regs *regs,
                    800:                                struct image_info *infop)
1.1.1.3   root      801: {
1.1.1.12  root      802:     /* Check other registers XXXXX */
                    803:     regs->pc = infop->entry;
                    804:     regs->regs[15] = infop->start_stack;
1.1.1.3   root      805: }
                    806: 
1.1.1.11  root      807: /* See linux kernel: arch/sh/include/asm/elf.h.  */
                    808: #define ELF_NREG 23
                    809: typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
                    810: 
                    811: /* See linux kernel: arch/sh/include/asm/ptrace.h.  */
                    812: enum {
                    813:     TARGET_REG_PC = 16,
                    814:     TARGET_REG_PR = 17,
                    815:     TARGET_REG_SR = 18,
                    816:     TARGET_REG_GBR = 19,
                    817:     TARGET_REG_MACH = 20,
                    818:     TARGET_REG_MACL = 21,
                    819:     TARGET_REG_SYSCALL = 22
                    820: };
                    821: 
1.1.1.12  root      822: static inline void elf_core_copy_regs(target_elf_gregset_t *regs,
1.1.1.15! root      823:                                       const CPUSH4State *env)
1.1.1.11  root      824: {
                    825:     int i;
                    826: 
                    827:     for (i = 0; i < 16; i++) {
                    828:         (*regs[i]) = tswapl(env->gregs[i]);
                    829:     }
                    830: 
                    831:     (*regs)[TARGET_REG_PC] = tswapl(env->pc);
                    832:     (*regs)[TARGET_REG_PR] = tswapl(env->pr);
                    833:     (*regs)[TARGET_REG_SR] = tswapl(env->sr);
                    834:     (*regs)[TARGET_REG_GBR] = tswapl(env->gbr);
                    835:     (*regs)[TARGET_REG_MACH] = tswapl(env->mach);
                    836:     (*regs)[TARGET_REG_MACL] = tswapl(env->macl);
                    837:     (*regs)[TARGET_REG_SYSCALL] = 0; /* FIXME */
                    838: }
                    839: 
                    840: #define USE_ELF_CORE_DUMP
1.1.1.3   root      841: #define ELF_EXEC_PAGESIZE        4096
                    842: 
                    843: #endif
                    844: 
1.1.1.6   root      845: #ifdef TARGET_CRIS
                    846: 
                    847: #define ELF_START_MMAP 0x80000000
                    848: 
                    849: #define elf_check_arch(x) ( (x) == EM_CRIS )
                    850: 
                    851: #define ELF_CLASS ELFCLASS32
                    852: #define ELF_ARCH  EM_CRIS
                    853: 
1.1.1.12  root      854: static inline void init_thread(struct target_pt_regs *regs,
                    855:                                struct image_info *infop)
1.1.1.6   root      856: {
1.1.1.12  root      857:     regs->erp = infop->entry;
1.1.1.6   root      858: }
                    859: 
                    860: #define ELF_EXEC_PAGESIZE        8192
                    861: 
                    862: #endif
                    863: 
1.1.1.5   root      864: #ifdef TARGET_M68K
                    865: 
                    866: #define ELF_START_MMAP 0x80000000
                    867: 
                    868: #define elf_check_arch(x) ( (x) == EM_68K )
                    869: 
1.1.1.12  root      870: #define ELF_CLASS       ELFCLASS32
                    871: #define ELF_ARCH        EM_68K
1.1.1.5   root      872: 
                    873: /* ??? Does this need to do anything?
1.1.1.12  root      874:    #define ELF_PLAT_INIT(_r) */
1.1.1.5   root      875: 
1.1.1.12  root      876: static inline void init_thread(struct target_pt_regs *regs,
                    877:                                struct image_info *infop)
1.1.1.5   root      878: {
                    879:     regs->usp = infop->start_stack;
                    880:     regs->sr = 0;
                    881:     regs->pc = infop->entry;
                    882: }
                    883: 
1.1.1.11  root      884: /* See linux kernel: arch/m68k/include/asm/elf.h.  */
                    885: #define ELF_NREG 20
                    886: typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
                    887: 
1.1.1.15! root      888: static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUM68KState *env)
1.1.1.11  root      889: {
                    890:     (*regs)[0] = tswapl(env->dregs[1]);
                    891:     (*regs)[1] = tswapl(env->dregs[2]);
                    892:     (*regs)[2] = tswapl(env->dregs[3]);
                    893:     (*regs)[3] = tswapl(env->dregs[4]);
                    894:     (*regs)[4] = tswapl(env->dregs[5]);
                    895:     (*regs)[5] = tswapl(env->dregs[6]);
                    896:     (*regs)[6] = tswapl(env->dregs[7]);
                    897:     (*regs)[7] = tswapl(env->aregs[0]);
                    898:     (*regs)[8] = tswapl(env->aregs[1]);
                    899:     (*regs)[9] = tswapl(env->aregs[2]);
                    900:     (*regs)[10] = tswapl(env->aregs[3]);
                    901:     (*regs)[11] = tswapl(env->aregs[4]);
                    902:     (*regs)[12] = tswapl(env->aregs[5]);
                    903:     (*regs)[13] = tswapl(env->aregs[6]);
                    904:     (*regs)[14] = tswapl(env->dregs[0]);
                    905:     (*regs)[15] = tswapl(env->aregs[7]);
                    906:     (*regs)[16] = tswapl(env->dregs[0]); /* FIXME: orig_d0 */
                    907:     (*regs)[17] = tswapl(env->sr);
                    908:     (*regs)[18] = tswapl(env->pc);
                    909:     (*regs)[19] = 0;  /* FIXME: regs->format | regs->vector */
                    910: }
                    911: 
                    912: #define USE_ELF_CORE_DUMP
1.1.1.12  root      913: #define ELF_EXEC_PAGESIZE       8192
1.1.1.5   root      914: 
                    915: #endif
                    916: 
1.1.1.6   root      917: #ifdef TARGET_ALPHA
                    918: 
                    919: #define ELF_START_MMAP (0x30000000000ULL)
                    920: 
                    921: #define elf_check_arch(x) ( (x) == ELF_ARCH )
                    922: 
                    923: #define ELF_CLASS      ELFCLASS64
                    924: #define ELF_ARCH       EM_ALPHA
                    925: 
1.1.1.12  root      926: static inline void init_thread(struct target_pt_regs *regs,
                    927:                                struct image_info *infop)
1.1.1.6   root      928: {
                    929:     regs->pc = infop->entry;
                    930:     regs->ps = 8;
                    931:     regs->usp = infop->start_stack;
                    932: }
                    933: 
                    934: #define ELF_EXEC_PAGESIZE        8192
                    935: 
                    936: #endif /* TARGET_ALPHA */
                    937: 
1.1.1.13  root      938: #ifdef TARGET_S390X
                    939: 
                    940: #define ELF_START_MMAP (0x20000000000ULL)
                    941: 
                    942: #define elf_check_arch(x) ( (x) == ELF_ARCH )
                    943: 
                    944: #define ELF_CLASS      ELFCLASS64
                    945: #define ELF_DATA       ELFDATA2MSB
                    946: #define ELF_ARCH       EM_S390
                    947: 
                    948: static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
                    949: {
                    950:     regs->psw.addr = infop->entry;
                    951:     regs->psw.mask = PSW_MASK_64 | PSW_MASK_32;
                    952:     regs->gprs[15] = infop->start_stack;
                    953: }
                    954: 
                    955: #endif /* TARGET_S390X */
                    956: 
1.1.1.2   root      957: #ifndef ELF_PLATFORM
                    958: #define ELF_PLATFORM (NULL)
                    959: #endif
                    960: 
                    961: #ifndef ELF_HWCAP
                    962: #define ELF_HWCAP 0
                    963: #endif
                    964: 
1.1.1.6   root      965: #ifdef TARGET_ABI32
                    966: #undef ELF_CLASS
                    967: #define ELF_CLASS ELFCLASS32
                    968: #undef bswaptls
                    969: #define bswaptls(ptr) bswap32s(ptr)
                    970: #endif
                    971: 
1.1       root      972: #include "elf.h"
                    973: 
                    974: struct exec
                    975: {
1.1.1.12  root      976:     unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
                    977:     unsigned int a_text;   /* length of text, in bytes */
                    978:     unsigned int a_data;   /* length of data, in bytes */
                    979:     unsigned int a_bss;    /* length of uninitialized data area, in bytes */
                    980:     unsigned int a_syms;   /* length of symbol table data in file, in bytes */
                    981:     unsigned int a_entry;  /* start address */
                    982:     unsigned int a_trsize; /* length of relocation info for text, in bytes */
                    983:     unsigned int a_drsize; /* length of relocation info for data, in bytes */
1.1       root      984: };
                    985: 
                    986: 
                    987: #define N_MAGIC(exec) ((exec).a_info & 0xffff)
                    988: #define OMAGIC 0407
                    989: #define NMAGIC 0410
                    990: #define ZMAGIC 0413
                    991: #define QMAGIC 0314
                    992: 
                    993: /* Necessary parameters */
                    994: #define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
                    995: #define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
                    996: #define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
                    997: 
1.1.1.13  root      998: #define DLINFO_ITEMS 13
1.1       root      999: 
                   1000: static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
                   1001: {
1.1.1.12  root     1002:     memcpy(to, from, n);
1.1       root     1003: }
                   1004: 
                   1005: #ifdef BSWAP_NEEDED
                   1006: static void bswap_ehdr(struct elfhdr *ehdr)
                   1007: {
1.1.1.12  root     1008:     bswap16s(&ehdr->e_type);            /* Object file type */
                   1009:     bswap16s(&ehdr->e_machine);         /* Architecture */
                   1010:     bswap32s(&ehdr->e_version);         /* Object file version */
                   1011:     bswaptls(&ehdr->e_entry);           /* Entry point virtual address */
                   1012:     bswaptls(&ehdr->e_phoff);           /* Program header table file offset */
                   1013:     bswaptls(&ehdr->e_shoff);           /* Section header table file offset */
                   1014:     bswap32s(&ehdr->e_flags);           /* Processor-specific flags */
                   1015:     bswap16s(&ehdr->e_ehsize);          /* ELF header size in bytes */
                   1016:     bswap16s(&ehdr->e_phentsize);       /* Program header table entry size */
                   1017:     bswap16s(&ehdr->e_phnum);           /* Program header table entry count */
                   1018:     bswap16s(&ehdr->e_shentsize);       /* Section header table entry size */
                   1019:     bswap16s(&ehdr->e_shnum);           /* Section header table entry count */
                   1020:     bswap16s(&ehdr->e_shstrndx);        /* Section header string table index */
                   1021: }
                   1022: 
                   1023: static void bswap_phdr(struct elf_phdr *phdr, int phnum)
                   1024: {
                   1025:     int i;
                   1026:     for (i = 0; i < phnum; ++i, ++phdr) {
                   1027:         bswap32s(&phdr->p_type);        /* Segment type */
                   1028:         bswap32s(&phdr->p_flags);       /* Segment flags */
                   1029:         bswaptls(&phdr->p_offset);      /* Segment file offset */
                   1030:         bswaptls(&phdr->p_vaddr);       /* Segment virtual address */
                   1031:         bswaptls(&phdr->p_paddr);       /* Segment physical address */
                   1032:         bswaptls(&phdr->p_filesz);      /* Segment size in file */
                   1033:         bswaptls(&phdr->p_memsz);       /* Segment size in memory */
                   1034:         bswaptls(&phdr->p_align);       /* Segment alignment */
                   1035:     }
                   1036: }
                   1037: 
                   1038: static void bswap_shdr(struct elf_shdr *shdr, int shnum)
                   1039: {
                   1040:     int i;
                   1041:     for (i = 0; i < shnum; ++i, ++shdr) {
                   1042:         bswap32s(&shdr->sh_name);
                   1043:         bswap32s(&shdr->sh_type);
                   1044:         bswaptls(&shdr->sh_flags);
                   1045:         bswaptls(&shdr->sh_addr);
                   1046:         bswaptls(&shdr->sh_offset);
                   1047:         bswaptls(&shdr->sh_size);
                   1048:         bswap32s(&shdr->sh_link);
                   1049:         bswap32s(&shdr->sh_info);
                   1050:         bswaptls(&shdr->sh_addralign);
                   1051:         bswaptls(&shdr->sh_entsize);
                   1052:     }
1.1       root     1053: }
                   1054: 
1.1.1.6   root     1055: static void bswap_sym(struct elf_sym *sym)
1.1       root     1056: {
                   1057:     bswap32s(&sym->st_name);
1.1.1.6   root     1058:     bswaptls(&sym->st_value);
                   1059:     bswaptls(&sym->st_size);
1.1       root     1060:     bswap16s(&sym->st_shndx);
                   1061: }
1.1.1.12  root     1062: #else
                   1063: static inline void bswap_ehdr(struct elfhdr *ehdr) { }
                   1064: static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { }
                   1065: static inline void bswap_shdr(struct elf_shdr *shdr, int shnum) { }
                   1066: static inline void bswap_sym(struct elf_sym *sym) { }
1.1       root     1067: #endif
                   1068: 
1.1.1.8   root     1069: #ifdef USE_ELF_CORE_DUMP
1.1.1.15! root     1070: static int elf_core_dump(int, const CPUArchState *);
1.1.1.12  root     1071: #endif /* USE_ELF_CORE_DUMP */
                   1072: static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias);
1.1.1.8   root     1073: 
1.1.1.12  root     1074: /* Verify the portions of EHDR within E_IDENT for the target.
                   1075:    This can be performed before bswapping the entire header.  */
                   1076: static bool elf_check_ident(struct elfhdr *ehdr)
                   1077: {
                   1078:     return (ehdr->e_ident[EI_MAG0] == ELFMAG0
                   1079:             && ehdr->e_ident[EI_MAG1] == ELFMAG1
                   1080:             && ehdr->e_ident[EI_MAG2] == ELFMAG2
                   1081:             && ehdr->e_ident[EI_MAG3] == ELFMAG3
                   1082:             && ehdr->e_ident[EI_CLASS] == ELF_CLASS
                   1083:             && ehdr->e_ident[EI_DATA] == ELF_DATA
                   1084:             && ehdr->e_ident[EI_VERSION] == EV_CURRENT);
                   1085: }
                   1086: 
                   1087: /* Verify the portions of EHDR outside of E_IDENT for the target.
                   1088:    This has to wait until after bswapping the header.  */
                   1089: static bool elf_check_ehdr(struct elfhdr *ehdr)
                   1090: {
                   1091:     return (elf_check_arch(ehdr->e_machine)
                   1092:             && ehdr->e_ehsize == sizeof(struct elfhdr)
                   1093:             && ehdr->e_phentsize == sizeof(struct elf_phdr)
                   1094:             && ehdr->e_shentsize == sizeof(struct elf_shdr)
                   1095:             && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));
1.1.1.8   root     1096: }
                   1097: 
1.1       root     1098: /*
1.1.1.4   root     1099:  * 'copy_elf_strings()' copies argument/envelope strings from user
1.1       root     1100:  * memory to free pages in kernel mem. These are in a format ready
                   1101:  * to be put directly into the top of new user memory.
                   1102:  *
                   1103:  */
1.1.1.6   root     1104: static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
                   1105:                                   abi_ulong p)
1.1       root     1106: {
                   1107:     char *tmp, *tmp1, *pag = NULL;
                   1108:     int len, offset = 0;
                   1109: 
                   1110:     if (!p) {
1.1.1.12  root     1111:         return 0;       /* bullet-proofing */
1.1       root     1112:     }
                   1113:     while (argc-- > 0) {
                   1114:         tmp = argv[argc];
                   1115:         if (!tmp) {
1.1.1.12  root     1116:             fprintf(stderr, "VFS: argc is wrong");
                   1117:             exit(-1);
                   1118:         }
1.1       root     1119:         tmp1 = tmp;
1.1.1.12  root     1120:         while (*tmp++);
                   1121:         len = tmp - tmp1;
                   1122:         if (p < len) {  /* this shouldn't happen - 128kB */
                   1123:             return 0;
                   1124:         }
                   1125:         while (len) {
                   1126:             --p; --tmp; --len;
                   1127:             if (--offset < 0) {
                   1128:                 offset = p % TARGET_PAGE_SIZE;
1.1.1.3   root     1129:                 pag = (char *)page[p/TARGET_PAGE_SIZE];
1.1       root     1130:                 if (!pag) {
1.1.1.14  root     1131:                     pag = g_try_malloc0(TARGET_PAGE_SIZE);
1.1.1.3   root     1132:                     page[p/TARGET_PAGE_SIZE] = pag;
1.1       root     1133:                     if (!pag)
                   1134:                         return 0;
1.1.1.12  root     1135:                 }
                   1136:             }
                   1137:             if (len == 0 || offset == 0) {
                   1138:                 *(pag + offset) = *tmp;
                   1139:             }
                   1140:             else {
                   1141:                 int bytes_to_copy = (len > offset) ? offset : len;
                   1142:                 tmp -= bytes_to_copy;
                   1143:                 p -= bytes_to_copy;
                   1144:                 offset -= bytes_to_copy;
                   1145:                 len -= bytes_to_copy;
                   1146:                 memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
                   1147:             }
                   1148:         }
1.1       root     1149:     }
                   1150:     return p;
                   1151: }
                   1152: 
1.1.1.6   root     1153: static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
                   1154:                                  struct image_info *info)
1.1       root     1155: {
1.1.1.12  root     1156:     abi_ulong stack_base, size, error, guard;
1.1       root     1157:     int i;
                   1158: 
                   1159:     /* Create enough stack to hold everything.  If we don't use
1.1.1.12  root     1160:        it for args, we'll use it for something else.  */
1.1.1.11  root     1161:     size = guest_stack_size;
1.1.1.12  root     1162:     if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE) {
1.1       root     1163:         size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
1.1.1.12  root     1164:     }
                   1165:     guard = TARGET_PAGE_SIZE;
                   1166:     if (guard < qemu_real_host_page_size) {
                   1167:         guard = qemu_real_host_page_size;
                   1168:     }
                   1169: 
                   1170:     error = target_mmap(0, size + guard, PROT_READ | PROT_WRITE,
                   1171:                         MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1.1       root     1172:     if (error == -1) {
1.1.1.12  root     1173:         perror("mmap stack");
1.1       root     1174:         exit(-1);
                   1175:     }
                   1176: 
1.1.1.12  root     1177:     /* We reserve one extra page at the top of the stack as guard.  */
                   1178:     target_mprotect(error, guard, PROT_NONE);
                   1179: 
                   1180:     info->stack_limit = error + guard;
                   1181:     stack_base = info->stack_limit + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
1.1       root     1182:     p += stack_base;
                   1183: 
                   1184:     for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
1.1.1.12  root     1185:         if (bprm->page[i]) {
                   1186:             info->rss++;
1.1.1.6   root     1187:             /* FIXME - check return value of memcpy_to_target() for failure */
1.1.1.12  root     1188:             memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
1.1.1.14  root     1189:             g_free(bprm->page[i]);
1.1.1.12  root     1190:         }
1.1.1.3   root     1191:         stack_base += TARGET_PAGE_SIZE;
1.1       root     1192:     }
                   1193:     return p;
                   1194: }
                   1195: 
1.1.1.12  root     1196: /* Map and zero the bss.  We need to explicitly zero any fractional pages
                   1197:    after the data section (i.e. bss).  */
                   1198: static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot)
                   1199: {
                   1200:     uintptr_t host_start, host_map_start, host_end;
                   1201: 
                   1202:     last_bss = TARGET_PAGE_ALIGN(last_bss);
                   1203: 
                   1204:     /* ??? There is confusion between qemu_real_host_page_size and
                   1205:        qemu_host_page_size here and elsewhere in target_mmap, which
                   1206:        may lead to the end of the data section mapping from the file
                   1207:        not being mapped.  At least there was an explicit test and
                   1208:        comment for that here, suggesting that "the file size must
                   1209:        be known".  The comment probably pre-dates the introduction
                   1210:        of the fstat system call in target_mmap which does in fact
                   1211:        find out the size.  What isn't clear is if the workaround
                   1212:        here is still actually needed.  For now, continue with it,
                   1213:        but merge it with the "normal" mmap that would allocate the bss.  */
                   1214: 
                   1215:     host_start = (uintptr_t) g2h(elf_bss);
                   1216:     host_end = (uintptr_t) g2h(last_bss);
                   1217:     host_map_start = (host_start + qemu_real_host_page_size - 1);
                   1218:     host_map_start &= -qemu_real_host_page_size;
                   1219: 
                   1220:     if (host_map_start < host_end) {
                   1221:         void *p = mmap((void *)host_map_start, host_end - host_map_start,
                   1222:                        prot, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
                   1223:         if (p == MAP_FAILED) {
                   1224:             perror("cannot mmap brk");
                   1225:             exit(-1);
1.1       root     1226:         }
                   1227: 
1.1.1.12  root     1228:         /* Since we didn't use target_mmap, make sure to record
                   1229:            the validity of the pages with qemu.  */
                   1230:         page_set_flags(elf_bss & TARGET_PAGE_MASK, last_bss, prot|PAGE_VALID);
                   1231:     }
1.1       root     1232: 
1.1.1.12  root     1233:     if (host_start < host_map_start) {
                   1234:         memset((void *)host_start, 0, host_map_start - host_start);
                   1235:     }
                   1236: }
1.1.1.3   root     1237: 
1.1.1.13  root     1238: #ifdef CONFIG_USE_FDPIC
                   1239: static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong sp)
                   1240: {
                   1241:     uint16_t n;
                   1242:     struct elf32_fdpic_loadseg *loadsegs = info->loadsegs;
                   1243: 
                   1244:     /* elf32_fdpic_loadseg */
                   1245:     n = info->nsegs;
                   1246:     while (n--) {
                   1247:         sp -= 12;
                   1248:         put_user_u32(loadsegs[n].addr, sp+0);
                   1249:         put_user_u32(loadsegs[n].p_vaddr, sp+4);
                   1250:         put_user_u32(loadsegs[n].p_memsz, sp+8);
                   1251:     }
                   1252: 
                   1253:     /* elf32_fdpic_loadmap */
                   1254:     sp -= 4;
                   1255:     put_user_u16(0, sp+0); /* version */
                   1256:     put_user_u16(info->nsegs, sp+2); /* nsegs */
                   1257: 
                   1258:     info->personality = PER_LINUX_FDPIC;
                   1259:     info->loadmap_addr = sp;
                   1260: 
                   1261:     return sp;
                   1262: }
                   1263: #endif
                   1264: 
1.1.1.6   root     1265: static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
1.1.1.12  root     1266:                                    struct elfhdr *exec,
                   1267:                                    struct image_info *info,
                   1268:                                    struct image_info *interp_info)
                   1269: {
                   1270:     abi_ulong sp;
1.1.1.15! root     1271:     abi_ulong sp_auxv;
1.1.1.12  root     1272:     int size;
1.1.1.13  root     1273:     int i;
                   1274:     abi_ulong u_rand_bytes;
                   1275:     uint8_t k_rand_bytes[16];
1.1.1.12  root     1276:     abi_ulong u_platform;
                   1277:     const char *k_platform;
                   1278:     const int n = sizeof(elf_addr_t);
                   1279: 
                   1280:     sp = p;
1.1.1.13  root     1281: 
                   1282: #ifdef CONFIG_USE_FDPIC
                   1283:     /* Needs to be before we load the env/argc/... */
                   1284:     if (elf_is_fdpic(exec)) {
                   1285:         /* Need 4 byte alignment for these structs */
                   1286:         sp &= ~3;
                   1287:         sp = loader_build_fdpic_loadmap(info, sp);
                   1288:         info->other_info = interp_info;
                   1289:         if (interp_info) {
                   1290:             interp_info->other_info = info;
                   1291:             sp = loader_build_fdpic_loadmap(interp_info, sp);
                   1292:         }
                   1293:     }
                   1294: #endif
                   1295: 
1.1.1.12  root     1296:     u_platform = 0;
                   1297:     k_platform = ELF_PLATFORM;
                   1298:     if (k_platform) {
                   1299:         size_t len = strlen(k_platform) + 1;
                   1300:         sp -= (len + n - 1) & ~(n - 1);
                   1301:         u_platform = sp;
                   1302:         /* FIXME - check return value of memcpy_to_target() for failure */
                   1303:         memcpy_to_target(sp, k_platform, len);
                   1304:     }
1.1.1.13  root     1305: 
                   1306:     /*
                   1307:      * Generate 16 random bytes for userspace PRNG seeding (not
                   1308:      * cryptically secure but it's not the aim of QEMU).
                   1309:      */
                   1310:     srand((unsigned int) time(NULL));
                   1311:     for (i = 0; i < 16; i++) {
                   1312:         k_rand_bytes[i] = rand();
                   1313:     }
                   1314:     sp -= 16;
                   1315:     u_rand_bytes = sp;
                   1316:     /* FIXME - check return value of memcpy_to_target() for failure */
                   1317:     memcpy_to_target(sp, k_rand_bytes, 16);
                   1318: 
1.1.1.12  root     1319:     /*
                   1320:      * Force 16 byte _final_ alignment here for generality.
                   1321:      */
                   1322:     sp = sp &~ (abi_ulong)15;
                   1323:     size = (DLINFO_ITEMS + 1) * 2;
                   1324:     if (k_platform)
                   1325:         size += 2;
1.1       root     1326: #ifdef DLINFO_ARCH_ITEMS
1.1.1.12  root     1327:     size += DLINFO_ARCH_ITEMS * 2;
1.1       root     1328: #endif
1.1.1.12  root     1329:     size += envc + argc + 2;
                   1330:     size += 1;  /* argc itself */
                   1331:     size *= n;
                   1332:     if (size & 15)
                   1333:         sp -= 16 - (size & 15);
1.1.1.6   root     1334: 
1.1.1.12  root     1335:     /* This is correct because Linux defines
                   1336:      * elf_addr_t as Elf32_Off / Elf64_Off
                   1337:      */
                   1338: #define NEW_AUX_ENT(id, val) do {               \
                   1339:         sp -= n; put_user_ual(val, sp);         \
                   1340:         sp -= n; put_user_ual(id, sp);          \
                   1341:     } while(0)
                   1342: 
1.1.1.15! root     1343:     sp_auxv = sp;
1.1.1.12  root     1344:     NEW_AUX_ENT (AT_NULL, 0);
                   1345: 
                   1346:     /* There must be exactly DLINFO_ITEMS entries here.  */
                   1347:     NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff));
                   1348:     NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
                   1349:     NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
                   1350:     NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
                   1351:     NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0));
                   1352:     NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
                   1353:     NEW_AUX_ENT(AT_ENTRY, info->entry);
                   1354:     NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
                   1355:     NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
                   1356:     NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
                   1357:     NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
                   1358:     NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
                   1359:     NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
1.1.1.13  root     1360:     NEW_AUX_ENT(AT_RANDOM, (abi_ulong) u_rand_bytes);
                   1361: 
1.1.1.12  root     1362:     if (k_platform)
                   1363:         NEW_AUX_ENT(AT_PLATFORM, u_platform);
1.1       root     1364: #ifdef ARCH_DLINFO
1.1.1.12  root     1365:     /*
                   1366:      * ARCH_DLINFO must come last so platform specific code can enforce
                   1367:      * special alignment requirements on the AUXV if necessary (eg. PPC).
                   1368:      */
                   1369:     ARCH_DLINFO;
1.1       root     1370: #endif
                   1371: #undef NEW_AUX_ENT
                   1372: 
1.1.1.12  root     1373:     info->saved_auxv = sp;
1.1.1.15! root     1374:     info->auxv_len = sp_auxv - sp;
1.1.1.8   root     1375: 
1.1.1.12  root     1376:     sp = loader_build_argptr(envc, argc, sp, p, 0);
                   1377:     return sp;
1.1       root     1378: }
                   1379: 
1.1.1.14  root     1380: #ifndef TARGET_HAS_GUEST_VALIDATE_BASE
                   1381: /* If the guest doesn't have a validation function just agree */
                   1382: bool guest_validate_base(unsigned long guest_base)
                   1383: {
                   1384:     return 1;
                   1385: }
                   1386: #endif
                   1387: 
1.1.1.13  root     1388: static void probe_guest_base(const char *image_name,
                   1389:                              abi_ulong loaddr, abi_ulong hiaddr)
                   1390: {
                   1391:     /* Probe for a suitable guest base address, if the user has not set
                   1392:      * it explicitly, and set guest_base appropriately.
                   1393:      * In case of error we will print a suitable message and exit.
                   1394:      */
                   1395: #if defined(CONFIG_USE_GUEST_BASE)
                   1396:     const char *errmsg;
                   1397:     if (!have_guest_base && !reserved_va) {
                   1398:         unsigned long host_start, real_start, host_size;
                   1399: 
                   1400:         /* Round addresses to page boundaries.  */
                   1401:         loaddr &= qemu_host_page_mask;
                   1402:         hiaddr = HOST_PAGE_ALIGN(hiaddr);
                   1403: 
                   1404:         if (loaddr < mmap_min_addr) {
                   1405:             host_start = HOST_PAGE_ALIGN(mmap_min_addr);
                   1406:         } else {
                   1407:             host_start = loaddr;
                   1408:             if (host_start != loaddr) {
                   1409:                 errmsg = "Address overflow loading ELF binary";
                   1410:                 goto exit_errmsg;
                   1411:             }
                   1412:         }
                   1413:         host_size = hiaddr - loaddr;
                   1414:         while (1) {
                   1415:             /* Do not use mmap_find_vma here because that is limited to the
                   1416:                guest address space.  We are going to make the
                   1417:                guest address space fit whatever we're given.  */
                   1418:             real_start = (unsigned long)
                   1419:                 mmap((void *)host_start, host_size, PROT_NONE,
                   1420:                      MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0);
                   1421:             if (real_start == (unsigned long)-1) {
                   1422:                 goto exit_perror;
                   1423:             }
1.1.1.14  root     1424:             guest_base = real_start - loaddr;
                   1425:             if ((real_start == host_start) &&
                   1426:                 guest_validate_base(guest_base)) {
1.1.1.13  root     1427:                 break;
                   1428:             }
                   1429:             /* That address didn't work.  Unmap and try a different one.
                   1430:                The address the host picked because is typically right at
                   1431:                the top of the host address space and leaves the guest with
                   1432:                no usable address space.  Resort to a linear search.  We
                   1433:                already compensated for mmap_min_addr, so this should not
                   1434:                happen often.  Probably means we got unlucky and host
                   1435:                address space randomization put a shared library somewhere
                   1436:                inconvenient.  */
                   1437:             munmap((void *)real_start, host_size);
                   1438:             host_start += qemu_host_page_size;
                   1439:             if (host_start == loaddr) {
                   1440:                 /* Theoretically possible if host doesn't have any suitably
                   1441:                    aligned areas.  Normally the first mmap will fail.  */
                   1442:                 errmsg = "Unable to find space for application";
                   1443:                 goto exit_errmsg;
                   1444:             }
                   1445:         }
                   1446:         qemu_log("Relocating guest address space from 0x"
                   1447:                  TARGET_ABI_FMT_lx " to 0x%lx\n",
                   1448:                  loaddr, real_start);
                   1449:     }
                   1450:     return;
                   1451: 
                   1452: exit_perror:
                   1453:     errmsg = strerror(errno);
                   1454: exit_errmsg:
                   1455:     fprintf(stderr, "%s: %s\n", image_name, errmsg);
                   1456:     exit(-1);
                   1457: #endif
                   1458: }
                   1459: 
                   1460: 
1.1.1.12  root     1461: /* Load an ELF image into the address space.
                   1462: 
                   1463:    IMAGE_NAME is the filename of the image, to use in error messages.
                   1464:    IMAGE_FD is the open file descriptor for the image.
                   1465: 
                   1466:    BPRM_BUF is a copy of the beginning of the file; this of course
                   1467:    contains the elf file header at offset 0.  It is assumed that this
                   1468:    buffer is sufficiently aligned to present no problems to the host
                   1469:    in accessing data at aligned offsets within the buffer.
                   1470: 
                   1471:    On return: INFO values will be filled in, as necessary or available.  */
1.1       root     1472: 
1.1.1.12  root     1473: static void load_elf_image(const char *image_name, int image_fd,
                   1474:                            struct image_info *info, char **pinterp_name,
                   1475:                            char bprm_buf[BPRM_BUF_SIZE])
1.1       root     1476: {
1.1.1.12  root     1477:     struct elfhdr *ehdr = (struct elfhdr *)bprm_buf;
                   1478:     struct elf_phdr *phdr;
                   1479:     abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
                   1480:     int i, retval;
                   1481:     const char *errmsg;
1.1.1.6   root     1482: 
1.1.1.12  root     1483:     /* First of all, some simple consistency checks */
                   1484:     errmsg = "Invalid ELF image for this architecture";
                   1485:     if (!elf_check_ident(ehdr)) {
                   1486:         goto exit_errmsg;
                   1487:     }
                   1488:     bswap_ehdr(ehdr);
                   1489:     if (!elf_check_ehdr(ehdr)) {
                   1490:         goto exit_errmsg;
                   1491:     }
1.1       root     1492: 
1.1.1.12  root     1493:     i = ehdr->e_phnum * sizeof(struct elf_phdr);
                   1494:     if (ehdr->e_phoff + i <= BPRM_BUF_SIZE) {
                   1495:         phdr = (struct elf_phdr *)(bprm_buf + ehdr->e_phoff);
                   1496:     } else {
                   1497:         phdr = (struct elf_phdr *) alloca(i);
                   1498:         retval = pread(image_fd, phdr, i, ehdr->e_phoff);
                   1499:         if (retval != i) {
                   1500:             goto exit_read;
1.1       root     1501:         }
1.1.1.12  root     1502:     }
                   1503:     bswap_phdr(phdr, ehdr->e_phnum);
1.1       root     1504: 
1.1.1.13  root     1505: #ifdef CONFIG_USE_FDPIC
                   1506:     info->nsegs = 0;
                   1507:     info->pt_dynamic_addr = 0;
                   1508: #endif
                   1509: 
1.1.1.12  root     1510:     /* Find the maximum size of the image and allocate an appropriate
                   1511:        amount of memory to handle that.  */
                   1512:     loaddr = -1, hiaddr = 0;
                   1513:     for (i = 0; i < ehdr->e_phnum; ++i) {
                   1514:         if (phdr[i].p_type == PT_LOAD) {
                   1515:             abi_ulong a = phdr[i].p_vaddr;
                   1516:             if (a < loaddr) {
                   1517:                 loaddr = a;
                   1518:             }
                   1519:             a += phdr[i].p_memsz;
                   1520:             if (a > hiaddr) {
                   1521:                 hiaddr = a;
                   1522:             }
1.1.1.13  root     1523: #ifdef CONFIG_USE_FDPIC
                   1524:             ++info->nsegs;
                   1525: #endif
1.1       root     1526:         }
1.1.1.12  root     1527:     }
1.1       root     1528: 
1.1.1.12  root     1529:     load_addr = loaddr;
                   1530:     if (ehdr->e_type == ET_DYN) {
                   1531:         /* The image indicates that it can be loaded anywhere.  Find a
                   1532:            location that can hold the memory space required.  If the
                   1533:            image is pre-linked, LOADDR will be non-zero.  Since we do
                   1534:            not supply MAP_FIXED here we'll use that address if and
                   1535:            only if it remains available.  */
                   1536:         load_addr = target_mmap(loaddr, hiaddr - loaddr, PROT_NONE,
                   1537:                                 MAP_PRIVATE | MAP_ANON | MAP_NORESERVE,
1.1       root     1538:                                 -1, 0);
1.1.1.12  root     1539:         if (load_addr == -1) {
                   1540:             goto exit_perror;
                   1541:         }
                   1542:     } else if (pinterp_name != NULL) {
                   1543:         /* This is the main executable.  Make sure that the low
                   1544:            address does not conflict with MMAP_MIN_ADDR or the
                   1545:            QEMU application itself.  */
1.1.1.13  root     1546:         probe_guest_base(image_name, loaddr, hiaddr);
                   1547:     }
                   1548:     load_bias = load_addr - loaddr;
1.1.1.12  root     1549: 
1.1.1.13  root     1550: #ifdef CONFIG_USE_FDPIC
                   1551:     {
                   1552:         struct elf32_fdpic_loadseg *loadsegs = info->loadsegs =
1.1.1.14  root     1553:             g_malloc(sizeof(*loadsegs) * info->nsegs);
1.1.1.13  root     1554: 
                   1555:         for (i = 0; i < ehdr->e_phnum; ++i) {
                   1556:             switch (phdr[i].p_type) {
                   1557:             case PT_DYNAMIC:
                   1558:                 info->pt_dynamic_addr = phdr[i].p_vaddr + load_bias;
                   1559:                 break;
                   1560:             case PT_LOAD:
                   1561:                 loadsegs->addr = phdr[i].p_vaddr + load_bias;
                   1562:                 loadsegs->p_vaddr = phdr[i].p_vaddr;
                   1563:                 loadsegs->p_memsz = phdr[i].p_memsz;
                   1564:                 ++loadsegs;
                   1565:                 break;
1.1.1.12  root     1566:             }
                   1567:         }
                   1568:     }
1.1.1.13  root     1569: #endif
1.1.1.12  root     1570: 
                   1571:     info->load_bias = load_bias;
                   1572:     info->load_addr = load_addr;
                   1573:     info->entry = ehdr->e_entry + load_bias;
                   1574:     info->start_code = -1;
                   1575:     info->end_code = 0;
                   1576:     info->start_data = -1;
                   1577:     info->end_data = 0;
                   1578:     info->brk = 0;
1.1.1.15! root     1579:     info->elf_flags = ehdr->e_flags;
1.1.1.12  root     1580: 
                   1581:     for (i = 0; i < ehdr->e_phnum; i++) {
                   1582:         struct elf_phdr *eppnt = phdr + i;
                   1583:         if (eppnt->p_type == PT_LOAD) {
                   1584:             abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em;
                   1585:             int elf_prot = 0;
                   1586: 
                   1587:             if (eppnt->p_flags & PF_R) elf_prot =  PROT_READ;
                   1588:             if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
                   1589:             if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
                   1590: 
                   1591:             vaddr = load_bias + eppnt->p_vaddr;
                   1592:             vaddr_po = TARGET_ELF_PAGEOFFSET(vaddr);
                   1593:             vaddr_ps = TARGET_ELF_PAGESTART(vaddr);
                   1594: 
                   1595:             error = target_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po,
                   1596:                                 elf_prot, MAP_PRIVATE | MAP_FIXED,
                   1597:                                 image_fd, eppnt->p_offset - vaddr_po);
1.1       root     1598:             if (error == -1) {
1.1.1.12  root     1599:                 goto exit_perror;
1.1       root     1600:             }
1.1.1.12  root     1601: 
                   1602:             vaddr_ef = vaddr + eppnt->p_filesz;
                   1603:             vaddr_em = vaddr + eppnt->p_memsz;
                   1604: 
                   1605:             /* If the load segment requests extra zeros (e.g. bss), map it.  */
                   1606:             if (vaddr_ef < vaddr_em) {
                   1607:                 zero_bss(vaddr_ef, vaddr_em, elf_prot);
                   1608:             }
                   1609: 
                   1610:             /* Find the full program boundaries.  */
                   1611:             if (elf_prot & PROT_EXEC) {
                   1612:                 if (vaddr < info->start_code) {
                   1613:                     info->start_code = vaddr;
                   1614:                 }
                   1615:                 if (vaddr_ef > info->end_code) {
                   1616:                     info->end_code = vaddr_ef;
                   1617:                 }
                   1618:             }
                   1619:             if (elf_prot & PROT_WRITE) {
                   1620:                 if (vaddr < info->start_data) {
                   1621:                     info->start_data = vaddr;
                   1622:                 }
                   1623:                 if (vaddr_ef > info->end_data) {
                   1624:                     info->end_data = vaddr_ef;
                   1625:                 }
                   1626:                 if (vaddr_em > info->brk) {
                   1627:                     info->brk = vaddr_em;
                   1628:                 }
                   1629:             }
                   1630:         } else if (eppnt->p_type == PT_INTERP && pinterp_name) {
                   1631:             char *interp_name;
                   1632: 
                   1633:             if (*pinterp_name) {
                   1634:                 errmsg = "Multiple PT_INTERP entries";
                   1635:                 goto exit_errmsg;
                   1636:             }
                   1637:             interp_name = malloc(eppnt->p_filesz);
                   1638:             if (!interp_name) {
                   1639:                 goto exit_perror;
                   1640:             }
                   1641: 
                   1642:             if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
                   1643:                 memcpy(interp_name, bprm_buf + eppnt->p_offset,
                   1644:                        eppnt->p_filesz);
                   1645:             } else {
                   1646:                 retval = pread(image_fd, interp_name, eppnt->p_filesz,
                   1647:                                eppnt->p_offset);
                   1648:                 if (retval != eppnt->p_filesz) {
                   1649:                     goto exit_perror;
                   1650:                 }
                   1651:             }
                   1652:             if (interp_name[eppnt->p_filesz - 1] != 0) {
                   1653:                 errmsg = "Invalid PT_INTERP entry";
                   1654:                 goto exit_errmsg;
                   1655:             }
                   1656:             *pinterp_name = interp_name;
1.1       root     1657:         }
1.1.1.12  root     1658:     }
                   1659: 
                   1660:     if (info->end_data == 0) {
                   1661:         info->start_data = info->end_code;
                   1662:         info->end_data = info->end_code;
                   1663:         info->brk = info->end_code;
                   1664:     }
                   1665: 
                   1666:     if (qemu_log_enabled()) {
                   1667:         load_symbols(ehdr, image_fd, load_bias);
                   1668:     }
1.1       root     1669: 
1.1.1.12  root     1670:     close(image_fd);
                   1671:     return;
1.1       root     1672: 
1.1.1.12  root     1673:  exit_read:
                   1674:     if (retval >= 0) {
                   1675:         errmsg = "Incomplete read of file header";
                   1676:         goto exit_errmsg;
                   1677:     }
                   1678:  exit_perror:
                   1679:     errmsg = strerror(errno);
                   1680:  exit_errmsg:
                   1681:     fprintf(stderr, "%s: %s\n", image_name, errmsg);
                   1682:     exit(-1);
                   1683: }
                   1684: 
                   1685: static void load_elf_interp(const char *filename, struct image_info *info,
                   1686:                             char bprm_buf[BPRM_BUF_SIZE])
                   1687: {
                   1688:     int fd, retval;
                   1689: 
                   1690:     fd = open(path(filename), O_RDONLY);
                   1691:     if (fd < 0) {
                   1692:         goto exit_perror;
                   1693:     }
                   1694: 
                   1695:     retval = read(fd, bprm_buf, BPRM_BUF_SIZE);
                   1696:     if (retval < 0) {
                   1697:         goto exit_perror;
                   1698:     }
                   1699:     if (retval < BPRM_BUF_SIZE) {
                   1700:         memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval);
                   1701:     }
                   1702: 
                   1703:     load_elf_image(filename, fd, info, NULL, bprm_buf);
                   1704:     return;
                   1705: 
                   1706:  exit_perror:
                   1707:     fprintf(stderr, "%s: %s\n", filename, strerror(errno));
                   1708:     exit(-1);
1.1       root     1709: }
                   1710: 
1.1.1.7   root     1711: static int symfind(const void *s0, const void *s1)
                   1712: {
1.1.1.15! root     1713:     target_ulong addr = *(target_ulong *)s0;
1.1.1.7   root     1714:     struct elf_sym *sym = (struct elf_sym *)s1;
                   1715:     int result = 0;
1.1.1.15! root     1716:     if (addr < sym->st_value) {
1.1.1.7   root     1717:         result = -1;
1.1.1.15! root     1718:     } else if (addr >= sym->st_value + sym->st_size) {
1.1.1.7   root     1719:         result = 1;
                   1720:     }
                   1721:     return result;
                   1722: }
                   1723: 
                   1724: static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
                   1725: {
                   1726: #if ELF_CLASS == ELFCLASS32
                   1727:     struct elf_sym *syms = s->disas_symtab.elf32;
                   1728: #else
                   1729:     struct elf_sym *syms = s->disas_symtab.elf64;
                   1730: #endif
                   1731: 
                   1732:     // binary search
                   1733:     struct elf_sym *sym;
                   1734: 
1.1.1.15! root     1735:     sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind);
1.1.1.8   root     1736:     if (sym != NULL) {
1.1.1.7   root     1737:         return s->disas_strtab + sym->st_name;
                   1738:     }
                   1739: 
                   1740:     return "";
                   1741: }
                   1742: 
                   1743: /* FIXME: This should use elf_ops.h  */
                   1744: static int symcmp(const void *s0, const void *s1)
                   1745: {
                   1746:     struct elf_sym *sym0 = (struct elf_sym *)s0;
                   1747:     struct elf_sym *sym1 = (struct elf_sym *)s1;
                   1748:     return (sym0->st_value < sym1->st_value)
                   1749:         ? -1
                   1750:         : ((sym0->st_value > sym1->st_value) ? 1 : 0);
                   1751: }
                   1752: 
1.1       root     1753: /* Best attempt to load symbols from this ELF object. */
1.1.1.12  root     1754: static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
1.1       root     1755: {
1.1.1.12  root     1756:     int i, shnum, nsyms, sym_idx = 0, str_idx = 0;
                   1757:     struct elf_shdr *shdr;
1.1.1.13  root     1758:     char *strings = NULL;
                   1759:     struct syminfo *s = NULL;
                   1760:     struct elf_sym *new_syms, *syms = NULL;
1.1       root     1761: 
1.1.1.12  root     1762:     shnum = hdr->e_shnum;
                   1763:     i = shnum * sizeof(struct elf_shdr);
                   1764:     shdr = (struct elf_shdr *)alloca(i);
                   1765:     if (pread(fd, shdr, i, hdr->e_shoff) != i) {
                   1766:         return;
                   1767:     }
                   1768: 
                   1769:     bswap_shdr(shdr, shnum);
                   1770:     for (i = 0; i < shnum; ++i) {
                   1771:         if (shdr[i].sh_type == SHT_SYMTAB) {
                   1772:             sym_idx = i;
                   1773:             str_idx = shdr[i].sh_link;
1.1.1.7   root     1774:             goto found;
                   1775:         }
1.1       root     1776:     }
1.1.1.12  root     1777: 
                   1778:     /* There will be no symbol table if the file was stripped.  */
                   1779:     return;
1.1       root     1780: 
                   1781:  found:
1.1.1.12  root     1782:     /* Now know where the strtab and symtab are.  Snarf them.  */
1.1       root     1783:     s = malloc(sizeof(*s));
1.1.1.12  root     1784:     if (!s) {
1.1.1.13  root     1785:         goto give_up;
1.1.1.12  root     1786:     }
1.1.1.6   root     1787: 
1.1.1.12  root     1788:     i = shdr[str_idx].sh_size;
                   1789:     s->disas_strtab = strings = malloc(i);
                   1790:     if (!strings || pread(fd, strings, i, shdr[str_idx].sh_offset) != i) {
1.1.1.13  root     1791:         goto give_up;
1.1.1.12  root     1792:     }
1.1.1.7   root     1793: 
1.1.1.12  root     1794:     i = shdr[sym_idx].sh_size;
                   1795:     syms = malloc(i);
                   1796:     if (!syms || pread(fd, syms, i, shdr[sym_idx].sh_offset) != i) {
1.1.1.13  root     1797:         goto give_up;
1.1.1.12  root     1798:     }
1.1       root     1799: 
1.1.1.12  root     1800:     nsyms = i / sizeof(struct elf_sym);
                   1801:     for (i = 0; i < nsyms; ) {
1.1.1.7   root     1802:         bswap_sym(syms + i);
1.1.1.12  root     1803:         /* Throw away entries which we do not need.  */
                   1804:         if (syms[i].st_shndx == SHN_UNDEF
                   1805:             || syms[i].st_shndx >= SHN_LORESERVE
                   1806:             || ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
                   1807:             if (i < --nsyms) {
1.1.1.7   root     1808:                 syms[i] = syms[nsyms];
                   1809:             }
1.1.1.12  root     1810:         } else {
1.1.1.7   root     1811: #if defined(TARGET_ARM) || defined (TARGET_MIPS)
1.1.1.12  root     1812:             /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
                   1813:             syms[i].st_value &= ~(target_ulong)1;
1.1.1.6   root     1814: #endif
1.1.1.12  root     1815:             syms[i].st_value += load_bias;
                   1816:             i++;
                   1817:         }
                   1818:     }
                   1819: 
1.1.1.13  root     1820:     /* No "useful" symbol.  */
                   1821:     if (nsyms == 0) {
                   1822:         goto give_up;
                   1823:     }
                   1824: 
1.1.1.12  root     1825:     /* Attempt to free the storage associated with the local symbols
                   1826:        that we threw away.  Whether or not this has any effect on the
                   1827:        memory allocation depends on the malloc implementation and how
                   1828:        many symbols we managed to discard.  */
                   1829:     new_syms = realloc(syms, nsyms * sizeof(*syms));
                   1830:     if (new_syms == NULL) {
1.1.1.13  root     1831:         goto give_up;
1.1.1.6   root     1832:     }
1.1.1.12  root     1833:     syms = new_syms;
1.1.1.7   root     1834: 
                   1835:     qsort(syms, nsyms, sizeof(*syms), symcmp);
1.1       root     1836: 
1.1.1.7   root     1837:     s->disas_num_syms = nsyms;
                   1838: #if ELF_CLASS == ELFCLASS32
                   1839:     s->disas_symtab.elf32 = syms;
                   1840: #else
                   1841:     s->disas_symtab.elf64 = syms;
                   1842: #endif
1.1.1.12  root     1843:     s->lookup_symbol = lookup_symbolxx;
1.1       root     1844:     s->next = syminfos;
                   1845:     syminfos = s;
1.1.1.13  root     1846: 
                   1847:     return;
                   1848: 
                   1849: give_up:
                   1850:     free(s);
                   1851:     free(strings);
                   1852:     free(syms);
1.1       root     1853: }
                   1854: 
1.1.1.4   root     1855: int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
                   1856:                     struct image_info * info)
1.1       root     1857: {
1.1.1.12  root     1858:     struct image_info interp_info;
1.1       root     1859:     struct elfhdr elf_ex;
1.1.1.12  root     1860:     char *elf_interpreter = NULL;
1.1       root     1861: 
1.1.1.12  root     1862:     info->start_mmap = (abi_ulong)ELF_START_MMAP;
                   1863:     info->mmap = 0;
                   1864:     info->rss = 0;
                   1865: 
                   1866:     load_elf_image(bprm->filename, bprm->fd, info,
                   1867:                    &elf_interpreter, bprm->buf);
                   1868: 
                   1869:     /* ??? We need a copy of the elf header for passing to create_elf_tables.
                   1870:        If we do nothing, we'll have overwritten this when we re-use bprm->buf
                   1871:        when we load the interpreter.  */
                   1872:     elf_ex = *(struct elfhdr *)bprm->buf;
1.1       root     1873: 
1.1.1.4   root     1874:     bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
                   1875:     bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
                   1876:     bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
                   1877:     if (!bprm->p) {
1.1.1.12  root     1878:         fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG));
                   1879:         exit(-1);
1.1.1.10  root     1880:     }
                   1881: 
1.1       root     1882:     /* Do this so that we can load the interpreter, if need be.  We will
                   1883:        change some of these later */
                   1884:     bprm->p = setup_arg_pages(bprm->p, bprm, info);
                   1885: 
1.1.1.12  root     1886:     if (elf_interpreter) {
                   1887:         load_elf_interp(elf_interpreter, &interp_info, bprm->buf);
1.1.1.6   root     1888: 
1.1.1.12  root     1889:         /* If the program interpreter is one of these two, then assume
                   1890:            an iBCS2 image.  Otherwise assume a native linux image.  */
1.1.1.6   root     1891: 
1.1.1.12  root     1892:         if (strcmp(elf_interpreter, "/usr/lib/libc.so.1") == 0
                   1893:             || strcmp(elf_interpreter, "/usr/lib/ld.so.1") == 0) {
                   1894:             info->personality = PER_SVR4;
                   1895: 
                   1896:             /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
                   1897:                and some applications "depend" upon this behavior.  Since
                   1898:                we do not have the power to recompile these, we emulate
                   1899:                the SVr4 behavior.  Sigh.  */
                   1900:             target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
                   1901:                         MAP_FIXED | MAP_PRIVATE, -1, 0);
1.1       root     1902:         }
1.1.1.12  root     1903:     }
1.1       root     1904: 
1.1.1.12  root     1905:     bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex,
                   1906:                                 info, (elf_interpreter ? &interp_info : NULL));
1.1       root     1907:     info->start_stack = bprm->p;
                   1908: 
1.1.1.12  root     1909:     /* If we have an interpreter, set that as the program's entry point.
1.1.1.14  root     1910:        Copy the load_bias as well, to help PPC64 interpret the entry
1.1.1.12  root     1911:        point as a function descriptor.  Do this after creating elf tables
                   1912:        so that we copy the original program entry point into the AUXV.  */
                   1913:     if (elf_interpreter) {
1.1.1.14  root     1914:         info->load_bias = interp_info.load_bias;
1.1.1.12  root     1915:         info->entry = interp_info.entry;
                   1916:         free(elf_interpreter);
1.1       root     1917:     }
                   1918: 
1.1.1.8   root     1919: #ifdef USE_ELF_CORE_DUMP
                   1920:     bprm->core_dump = &elf_core_dump;
                   1921: #endif
                   1922: 
1.1       root     1923:     return 0;
                   1924: }
                   1925: 
1.1.1.8   root     1926: #ifdef USE_ELF_CORE_DUMP
                   1927: /*
                   1928:  * Definitions to generate Intel SVR4-like core files.
1.1.1.9   root     1929:  * These mostly have the same names as the SVR4 types with "target_elf_"
1.1.1.8   root     1930:  * tacked on the front to prevent clashes with linux definitions,
                   1931:  * and the typedef forms have been avoided.  This is mostly like
                   1932:  * the SVR4 structure, but more Linuxy, with things that Linux does
                   1933:  * not support and which gdb doesn't really use excluded.
                   1934:  *
                   1935:  * Fields we don't dump (their contents is zero) in linux-user qemu
                   1936:  * are marked with XXX.
                   1937:  *
                   1938:  * Core dump code is copied from linux kernel (fs/binfmt_elf.c).
                   1939:  *
                   1940:  * Porting ELF coredump for target is (quite) simple process.  First you
1.1.1.11  root     1941:  * define USE_ELF_CORE_DUMP in target ELF code (where init_thread() for
1.1.1.8   root     1942:  * the target resides):
                   1943:  *
                   1944:  * #define USE_ELF_CORE_DUMP
                   1945:  *
                   1946:  * Next you define type of register set used for dumping.  ELF specification
                   1947:  * says that it needs to be array of elf_greg_t that has size of ELF_NREG.
                   1948:  *
1.1.1.9   root     1949:  * typedef <target_regtype> target_elf_greg_t;
1.1.1.8   root     1950:  * #define ELF_NREG <number of registers>
1.1.1.9   root     1951:  * typedef taret_elf_greg_t target_elf_gregset_t[ELF_NREG];
1.1.1.8   root     1952:  *
                   1953:  * Last step is to implement target specific function that copies registers
                   1954:  * from given cpu into just specified register set.  Prototype is:
                   1955:  *
1.1.1.9   root     1956:  * static void elf_core_copy_regs(taret_elf_gregset_t *regs,
1.1.1.15! root     1957:  *                                const CPUArchState *env);
1.1.1.8   root     1958:  *
                   1959:  * Parameters:
                   1960:  *     regs - copy register values into here (allocated and zeroed by caller)
                   1961:  *     env - copy registers from here
                   1962:  *
                   1963:  * Example for ARM target is provided in this file.
                   1964:  */
                   1965: 
                   1966: /* An ELF note in memory */
                   1967: struct memelfnote {
                   1968:     const char *name;
                   1969:     size_t     namesz;
                   1970:     size_t     namesz_rounded;
                   1971:     int        type;
                   1972:     size_t     datasz;
1.1.1.13  root     1973:     size_t     datasz_rounded;
1.1.1.8   root     1974:     void       *data;
                   1975:     size_t     notesz;
                   1976: };
                   1977: 
1.1.1.9   root     1978: struct target_elf_siginfo {
1.1.1.13  root     1979:     target_int  si_signo; /* signal number */
                   1980:     target_int  si_code;  /* extra code */
                   1981:     target_int  si_errno; /* errno */
1.1.1.8   root     1982: };
                   1983: 
1.1.1.9   root     1984: struct target_elf_prstatus {
                   1985:     struct target_elf_siginfo pr_info;      /* Info associated with signal */
1.1.1.13  root     1986:     target_short       pr_cursig;    /* Current signal */
1.1.1.8   root     1987:     target_ulong       pr_sigpend;   /* XXX */
                   1988:     target_ulong       pr_sighold;   /* XXX */
                   1989:     target_pid_t       pr_pid;
                   1990:     target_pid_t       pr_ppid;
                   1991:     target_pid_t       pr_pgrp;
                   1992:     target_pid_t       pr_sid;
                   1993:     struct target_timeval pr_utime;  /* XXX User time */
                   1994:     struct target_timeval pr_stime;  /* XXX System time */
                   1995:     struct target_timeval pr_cutime; /* XXX Cumulative user time */
                   1996:     struct target_timeval pr_cstime; /* XXX Cumulative system time */
1.1.1.9   root     1997:     target_elf_gregset_t      pr_reg;       /* GP registers */
1.1.1.13  root     1998:     target_int         pr_fpvalid;   /* XXX */
1.1.1.8   root     1999: };
                   2000: 
                   2001: #define ELF_PRARGSZ     (80) /* Number of chars for args */
                   2002: 
1.1.1.9   root     2003: struct target_elf_prpsinfo {
1.1.1.8   root     2004:     char         pr_state;       /* numeric process state */
                   2005:     char         pr_sname;       /* char for pr_state */
                   2006:     char         pr_zomb;        /* zombie */
                   2007:     char         pr_nice;        /* nice val */
                   2008:     target_ulong pr_flag;        /* flags */
                   2009:     target_uid_t pr_uid;
                   2010:     target_gid_t pr_gid;
                   2011:     target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
                   2012:     /* Lots missing */
                   2013:     char    pr_fname[16];           /* filename of executable */
                   2014:     char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
                   2015: };
                   2016: 
                   2017: /* Here is the structure in which status of each thread is captured. */
                   2018: struct elf_thread_status {
1.1.1.10  root     2019:     QTAILQ_ENTRY(elf_thread_status)  ets_link;
1.1.1.9   root     2020:     struct target_elf_prstatus prstatus;   /* NT_PRSTATUS */
1.1.1.8   root     2021: #if 0
                   2022:     elf_fpregset_t fpu;             /* NT_PRFPREG */
                   2023:     struct task_struct *thread;
                   2024:     elf_fpxregset_t xfpu;           /* ELF_CORE_XFPREG_TYPE */
                   2025: #endif
                   2026:     struct memelfnote notes[1];
                   2027:     int num_notes;
                   2028: };
                   2029: 
                   2030: struct elf_note_info {
                   2031:     struct memelfnote   *notes;
1.1.1.9   root     2032:     struct target_elf_prstatus *prstatus;  /* NT_PRSTATUS */
                   2033:     struct target_elf_prpsinfo *psinfo;    /* NT_PRPSINFO */
1.1.1.8   root     2034: 
1.1.1.10  root     2035:     QTAILQ_HEAD(thread_list_head, elf_thread_status) thread_list;
1.1.1.8   root     2036: #if 0
                   2037:     /*
                   2038:      * Current version of ELF coredump doesn't support
                   2039:      * dumping fp regs etc.
                   2040:      */
                   2041:     elf_fpregset_t *fpu;
                   2042:     elf_fpxregset_t *xfpu;
                   2043:     int thread_status_size;
                   2044: #endif
                   2045:     int notes_size;
                   2046:     int numnote;
                   2047: };
                   2048: 
                   2049: struct vm_area_struct {
                   2050:     abi_ulong   vma_start;  /* start vaddr of memory region */
                   2051:     abi_ulong   vma_end;    /* end vaddr of memory region */
                   2052:     abi_ulong   vma_flags;  /* protection etc. flags for the region */
1.1.1.10  root     2053:     QTAILQ_ENTRY(vm_area_struct) vma_link;
1.1.1.8   root     2054: };
                   2055: 
                   2056: struct mm_struct {
1.1.1.10  root     2057:     QTAILQ_HEAD(, vm_area_struct) mm_mmap;
1.1.1.8   root     2058:     int mm_count;           /* number of mappings */
                   2059: };
                   2060: 
                   2061: static struct mm_struct *vma_init(void);
                   2062: static void vma_delete(struct mm_struct *);
                   2063: static int vma_add_mapping(struct mm_struct *, abi_ulong,
1.1.1.12  root     2064:                            abi_ulong, abi_ulong);
1.1.1.8   root     2065: static int vma_get_mapping_count(const struct mm_struct *);
                   2066: static struct vm_area_struct *vma_first(const struct mm_struct *);
                   2067: static struct vm_area_struct *vma_next(struct vm_area_struct *);
                   2068: static abi_ulong vma_dump_size(const struct vm_area_struct *);
1.1.1.11  root     2069: static int vma_walker(void *priv, abi_ulong start, abi_ulong end,
1.1.1.12  root     2070:                       unsigned long flags);
1.1.1.8   root     2071: 
                   2072: static void fill_elf_header(struct elfhdr *, int, uint16_t, uint32_t);
                   2073: static void fill_note(struct memelfnote *, const char *, int,
1.1.1.12  root     2074:                       unsigned int, void *);
1.1.1.9   root     2075: static void fill_prstatus(struct target_elf_prstatus *, const TaskState *, int);
                   2076: static int fill_psinfo(struct target_elf_prpsinfo *, const TaskState *);
1.1.1.8   root     2077: static void fill_auxv_note(struct memelfnote *, const TaskState *);
                   2078: static void fill_elf_note_phdr(struct elf_phdr *, int, off_t);
                   2079: static size_t note_size(const struct memelfnote *);
                   2080: static void free_note_info(struct elf_note_info *);
1.1.1.15! root     2081: static int fill_note_info(struct elf_note_info *, long, const CPUArchState *);
        !          2082: static void fill_thread_info(struct elf_note_info *, const CPUArchState *);
1.1.1.8   root     2083: static int core_dump_filename(const TaskState *, char *, size_t);
                   2084: 
                   2085: static int dump_write(int, const void *, size_t);
                   2086: static int write_note(struct memelfnote *, int);
                   2087: static int write_note_info(struct elf_note_info *, int);
                   2088: 
                   2089: #ifdef BSWAP_NEEDED
1.1.1.9   root     2090: static void bswap_prstatus(struct target_elf_prstatus *prstatus)
1.1.1.8   root     2091: {
                   2092:     prstatus->pr_info.si_signo = tswapl(prstatus->pr_info.si_signo);
                   2093:     prstatus->pr_info.si_code = tswapl(prstatus->pr_info.si_code);
                   2094:     prstatus->pr_info.si_errno = tswapl(prstatus->pr_info.si_errno);
                   2095:     prstatus->pr_cursig = tswap16(prstatus->pr_cursig);
                   2096:     prstatus->pr_sigpend = tswapl(prstatus->pr_sigpend);
                   2097:     prstatus->pr_sighold = tswapl(prstatus->pr_sighold);
                   2098:     prstatus->pr_pid = tswap32(prstatus->pr_pid);
                   2099:     prstatus->pr_ppid = tswap32(prstatus->pr_ppid);
                   2100:     prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp);
                   2101:     prstatus->pr_sid = tswap32(prstatus->pr_sid);
                   2102:     /* cpu times are not filled, so we skip them */
                   2103:     /* regs should be in correct format already */
                   2104:     prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid);
                   2105: }
                   2106: 
1.1.1.9   root     2107: static void bswap_psinfo(struct target_elf_prpsinfo *psinfo)
1.1.1.8   root     2108: {
                   2109:     psinfo->pr_flag = tswapl(psinfo->pr_flag);
                   2110:     psinfo->pr_uid = tswap16(psinfo->pr_uid);
                   2111:     psinfo->pr_gid = tswap16(psinfo->pr_gid);
                   2112:     psinfo->pr_pid = tswap32(psinfo->pr_pid);
                   2113:     psinfo->pr_ppid = tswap32(psinfo->pr_ppid);
                   2114:     psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp);
                   2115:     psinfo->pr_sid = tswap32(psinfo->pr_sid);
                   2116: }
1.1.1.12  root     2117: 
                   2118: static void bswap_note(struct elf_note *en)
                   2119: {
                   2120:     bswap32s(&en->n_namesz);
                   2121:     bswap32s(&en->n_descsz);
                   2122:     bswap32s(&en->n_type);
                   2123: }
                   2124: #else
                   2125: static inline void bswap_prstatus(struct target_elf_prstatus *p) { }
                   2126: static inline void bswap_psinfo(struct target_elf_prpsinfo *p) {}
                   2127: static inline void bswap_note(struct elf_note *en) { }
1.1.1.8   root     2128: #endif /* BSWAP_NEEDED */
                   2129: 
                   2130: /*
                   2131:  * Minimal support for linux memory regions.  These are needed
                   2132:  * when we are finding out what memory exactly belongs to
                   2133:  * emulated process.  No locks needed here, as long as
                   2134:  * thread that received the signal is stopped.
                   2135:  */
                   2136: 
                   2137: static struct mm_struct *vma_init(void)
                   2138: {
                   2139:     struct mm_struct *mm;
                   2140: 
1.1.1.14  root     2141:     if ((mm = g_malloc(sizeof (*mm))) == NULL)
1.1.1.8   root     2142:         return (NULL);
                   2143: 
                   2144:     mm->mm_count = 0;
1.1.1.10  root     2145:     QTAILQ_INIT(&mm->mm_mmap);
1.1.1.8   root     2146: 
                   2147:     return (mm);
                   2148: }
                   2149: 
                   2150: static void vma_delete(struct mm_struct *mm)
                   2151: {
                   2152:     struct vm_area_struct *vma;
                   2153: 
                   2154:     while ((vma = vma_first(mm)) != NULL) {
1.1.1.10  root     2155:         QTAILQ_REMOVE(&mm->mm_mmap, vma, vma_link);
1.1.1.14  root     2156:         g_free(vma);
1.1.1.8   root     2157:     }
1.1.1.14  root     2158:     g_free(mm);
1.1.1.8   root     2159: }
                   2160: 
                   2161: static int vma_add_mapping(struct mm_struct *mm, abi_ulong start,
1.1.1.12  root     2162:                            abi_ulong end, abi_ulong flags)
1.1.1.8   root     2163: {
                   2164:     struct vm_area_struct *vma;
                   2165: 
1.1.1.14  root     2166:     if ((vma = g_malloc0(sizeof (*vma))) == NULL)
1.1.1.8   root     2167:         return (-1);
                   2168: 
                   2169:     vma->vma_start = start;
                   2170:     vma->vma_end = end;
                   2171:     vma->vma_flags = flags;
                   2172: 
1.1.1.10  root     2173:     QTAILQ_INSERT_TAIL(&mm->mm_mmap, vma, vma_link);
1.1.1.8   root     2174:     mm->mm_count++;
                   2175: 
                   2176:     return (0);
                   2177: }
                   2178: 
                   2179: static struct vm_area_struct *vma_first(const struct mm_struct *mm)
                   2180: {
1.1.1.10  root     2181:     return (QTAILQ_FIRST(&mm->mm_mmap));
1.1.1.8   root     2182: }
                   2183: 
                   2184: static struct vm_area_struct *vma_next(struct vm_area_struct *vma)
                   2185: {
1.1.1.10  root     2186:     return (QTAILQ_NEXT(vma, vma_link));
1.1.1.8   root     2187: }
                   2188: 
                   2189: static int vma_get_mapping_count(const struct mm_struct *mm)
                   2190: {
                   2191:     return (mm->mm_count);
                   2192: }
                   2193: 
                   2194: /*
                   2195:  * Calculate file (dump) size of given memory region.
                   2196:  */
                   2197: static abi_ulong vma_dump_size(const struct vm_area_struct *vma)
                   2198: {
                   2199:     /* if we cannot even read the first page, skip it */
                   2200:     if (!access_ok(VERIFY_READ, vma->vma_start, TARGET_PAGE_SIZE))
                   2201:         return (0);
                   2202: 
                   2203:     /*
                   2204:      * Usually we don't dump executable pages as they contain
                   2205:      * non-writable code that debugger can read directly from
                   2206:      * target library etc.  However, thread stacks are marked
                   2207:      * also executable so we read in first page of given region
                   2208:      * and check whether it contains elf header.  If there is
                   2209:      * no elf header, we dump it.
                   2210:      */
                   2211:     if (vma->vma_flags & PROT_EXEC) {
                   2212:         char page[TARGET_PAGE_SIZE];
                   2213: 
                   2214:         copy_from_user(page, vma->vma_start, sizeof (page));
                   2215:         if ((page[EI_MAG0] == ELFMAG0) &&
                   2216:             (page[EI_MAG1] == ELFMAG1) &&
                   2217:             (page[EI_MAG2] == ELFMAG2) &&
                   2218:             (page[EI_MAG3] == ELFMAG3)) {
                   2219:             /*
                   2220:              * Mappings are possibly from ELF binary.  Don't dump
                   2221:              * them.
                   2222:              */
                   2223:             return (0);
                   2224:         }
                   2225:     }
                   2226: 
                   2227:     return (vma->vma_end - vma->vma_start);
                   2228: }
                   2229: 
1.1.1.11  root     2230: static int vma_walker(void *priv, abi_ulong start, abi_ulong end,
1.1.1.12  root     2231:                       unsigned long flags)
1.1.1.8   root     2232: {
                   2233:     struct mm_struct *mm = (struct mm_struct *)priv;
                   2234: 
                   2235:     vma_add_mapping(mm, start, end, flags);
                   2236:     return (0);
                   2237: }
                   2238: 
                   2239: static void fill_note(struct memelfnote *note, const char *name, int type,
1.1.1.12  root     2240:                       unsigned int sz, void *data)
1.1.1.8   root     2241: {
                   2242:     unsigned int namesz;
                   2243: 
                   2244:     namesz = strlen(name) + 1;
                   2245:     note->name = name;
                   2246:     note->namesz = namesz;
                   2247:     note->namesz_rounded = roundup(namesz, sizeof (int32_t));
                   2248:     note->type = type;
1.1.1.13  root     2249:     note->datasz = sz;
                   2250:     note->datasz_rounded = roundup(sz, sizeof (int32_t));
                   2251: 
1.1.1.8   root     2252:     note->data = data;
                   2253: 
                   2254:     /*
                   2255:      * We calculate rounded up note size here as specified by
                   2256:      * ELF document.
                   2257:      */
                   2258:     note->notesz = sizeof (struct elf_note) +
1.1.1.13  root     2259:         note->namesz_rounded + note->datasz_rounded;
1.1.1.8   root     2260: }
                   2261: 
                   2262: static void fill_elf_header(struct elfhdr *elf, int segs, uint16_t machine,
1.1.1.12  root     2263:                             uint32_t flags)
1.1.1.8   root     2264: {
                   2265:     (void) memset(elf, 0, sizeof(*elf));
                   2266: 
                   2267:     (void) memcpy(elf->e_ident, ELFMAG, SELFMAG);
                   2268:     elf->e_ident[EI_CLASS] = ELF_CLASS;
                   2269:     elf->e_ident[EI_DATA] = ELF_DATA;
                   2270:     elf->e_ident[EI_VERSION] = EV_CURRENT;
                   2271:     elf->e_ident[EI_OSABI] = ELF_OSABI;
                   2272: 
                   2273:     elf->e_type = ET_CORE;
                   2274:     elf->e_machine = machine;
                   2275:     elf->e_version = EV_CURRENT;
                   2276:     elf->e_phoff = sizeof(struct elfhdr);
                   2277:     elf->e_flags = flags;
                   2278:     elf->e_ehsize = sizeof(struct elfhdr);
                   2279:     elf->e_phentsize = sizeof(struct elf_phdr);
                   2280:     elf->e_phnum = segs;
                   2281: 
                   2282:     bswap_ehdr(elf);
                   2283: }
                   2284: 
                   2285: static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset)
                   2286: {
                   2287:     phdr->p_type = PT_NOTE;
                   2288:     phdr->p_offset = offset;
                   2289:     phdr->p_vaddr = 0;
                   2290:     phdr->p_paddr = 0;
                   2291:     phdr->p_filesz = sz;
                   2292:     phdr->p_memsz = 0;
                   2293:     phdr->p_flags = 0;
                   2294:     phdr->p_align = 0;
                   2295: 
1.1.1.12  root     2296:     bswap_phdr(phdr, 1);
1.1.1.8   root     2297: }
                   2298: 
                   2299: static size_t note_size(const struct memelfnote *note)
                   2300: {
                   2301:     return (note->notesz);
                   2302: }
                   2303: 
1.1.1.9   root     2304: static void fill_prstatus(struct target_elf_prstatus *prstatus,
1.1.1.12  root     2305:                           const TaskState *ts, int signr)
1.1.1.8   root     2306: {
                   2307:     (void) memset(prstatus, 0, sizeof (*prstatus));
                   2308:     prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
                   2309:     prstatus->pr_pid = ts->ts_tid;
                   2310:     prstatus->pr_ppid = getppid();
                   2311:     prstatus->pr_pgrp = getpgrp();
                   2312:     prstatus->pr_sid = getsid(0);
                   2313: 
                   2314:     bswap_prstatus(prstatus);
                   2315: }
                   2316: 
1.1.1.9   root     2317: static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
1.1.1.8   root     2318: {
                   2319:     char *filename, *base_filename;
                   2320:     unsigned int i, len;
                   2321: 
                   2322:     (void) memset(psinfo, 0, sizeof (*psinfo));
                   2323: 
                   2324:     len = ts->info->arg_end - ts->info->arg_start;
                   2325:     if (len >= ELF_PRARGSZ)
                   2326:         len = ELF_PRARGSZ - 1;
                   2327:     if (copy_from_user(&psinfo->pr_psargs, ts->info->arg_start, len))
                   2328:         return -EFAULT;
                   2329:     for (i = 0; i < len; i++)
                   2330:         if (psinfo->pr_psargs[i] == 0)
                   2331:             psinfo->pr_psargs[i] = ' ';
                   2332:     psinfo->pr_psargs[len] = 0;
                   2333: 
                   2334:     psinfo->pr_pid = getpid();
                   2335:     psinfo->pr_ppid = getppid();
                   2336:     psinfo->pr_pgrp = getpgrp();
                   2337:     psinfo->pr_sid = getsid(0);
                   2338:     psinfo->pr_uid = getuid();
                   2339:     psinfo->pr_gid = getgid();
                   2340: 
                   2341:     filename = strdup(ts->bprm->filename);
                   2342:     base_filename = strdup(basename(filename));
                   2343:     (void) strncpy(psinfo->pr_fname, base_filename,
1.1.1.12  root     2344:                    sizeof(psinfo->pr_fname));
1.1.1.8   root     2345:     free(base_filename);
                   2346:     free(filename);
                   2347: 
                   2348:     bswap_psinfo(psinfo);
                   2349:     return (0);
                   2350: }
                   2351: 
                   2352: static void fill_auxv_note(struct memelfnote *note, const TaskState *ts)
                   2353: {
                   2354:     elf_addr_t auxv = (elf_addr_t)ts->info->saved_auxv;
                   2355:     elf_addr_t orig_auxv = auxv;
                   2356:     void *ptr;
1.1.1.15! root     2357:     int len = ts->info->auxv_len;
1.1.1.8   root     2358: 
                   2359:     /*
                   2360:      * Auxiliary vector is stored in target process stack.  It contains
                   2361:      * {type, value} pairs that we need to dump into note.  This is not
                   2362:      * strictly necessary but we do it here for sake of completeness.
                   2363:      */
                   2364: 
                   2365:     /* read in whole auxv vector and copy it to memelfnote */
                   2366:     ptr = lock_user(VERIFY_READ, orig_auxv, len, 0);
                   2367:     if (ptr != NULL) {
                   2368:         fill_note(note, "CORE", NT_AUXV, len, ptr);
                   2369:         unlock_user(ptr, auxv, len);
                   2370:     }
                   2371: }
                   2372: 
                   2373: /*
                   2374:  * Constructs name of coredump file.  We have following convention
                   2375:  * for the name:
                   2376:  *     qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core
                   2377:  *
                   2378:  * Returns 0 in case of success, -1 otherwise (errno is set).
                   2379:  */
                   2380: static int core_dump_filename(const TaskState *ts, char *buf,
1.1.1.12  root     2381:                               size_t bufsize)
1.1.1.8   root     2382: {
                   2383:     char timestamp[64];
                   2384:     char *filename = NULL;
                   2385:     char *base_filename = NULL;
                   2386:     struct timeval tv;
                   2387:     struct tm tm;
                   2388: 
                   2389:     assert(bufsize >= PATH_MAX);
                   2390: 
                   2391:     if (gettimeofday(&tv, NULL) < 0) {
                   2392:         (void) fprintf(stderr, "unable to get current timestamp: %s",
1.1.1.12  root     2393:                        strerror(errno));
1.1.1.8   root     2394:         return (-1);
                   2395:     }
                   2396: 
                   2397:     filename = strdup(ts->bprm->filename);
                   2398:     base_filename = strdup(basename(filename));
                   2399:     (void) strftime(timestamp, sizeof (timestamp), "%Y%m%d-%H%M%S",
1.1.1.12  root     2400:                     localtime_r(&tv.tv_sec, &tm));
1.1.1.8   root     2401:     (void) snprintf(buf, bufsize, "qemu_%s_%s_%d.core",
1.1.1.12  root     2402:                     base_filename, timestamp, (int)getpid());
1.1.1.8   root     2403:     free(base_filename);
                   2404:     free(filename);
                   2405: 
                   2406:     return (0);
                   2407: }
                   2408: 
                   2409: static int dump_write(int fd, const void *ptr, size_t size)
                   2410: {
                   2411:     const char *bufp = (const char *)ptr;
                   2412:     ssize_t bytes_written, bytes_left;
                   2413:     struct rlimit dumpsize;
                   2414:     off_t pos;
                   2415: 
                   2416:     bytes_written = 0;
                   2417:     getrlimit(RLIMIT_CORE, &dumpsize);
                   2418:     if ((pos = lseek(fd, 0, SEEK_CUR))==-1) {
                   2419:         if (errno == ESPIPE) { /* not a seekable stream */
                   2420:             bytes_left = size;
                   2421:         } else {
                   2422:             return pos;
                   2423:         }
                   2424:     } else {
                   2425:         if (dumpsize.rlim_cur <= pos) {
                   2426:             return -1;
                   2427:         } else if (dumpsize.rlim_cur == RLIM_INFINITY) {
                   2428:             bytes_left = size;
                   2429:         } else {
                   2430:             size_t limit_left=dumpsize.rlim_cur - pos;
                   2431:             bytes_left = limit_left >= size ? size : limit_left ;
                   2432:         }
                   2433:     }
                   2434: 
                   2435:     /*
                   2436:      * In normal conditions, single write(2) should do but
                   2437:      * in case of socket etc. this mechanism is more portable.
                   2438:      */
                   2439:     do {
                   2440:         bytes_written = write(fd, bufp, bytes_left);
                   2441:         if (bytes_written < 0) {
                   2442:             if (errno == EINTR)
                   2443:                 continue;
                   2444:             return (-1);
                   2445:         } else if (bytes_written == 0) { /* eof */
                   2446:             return (-1);
                   2447:         }
                   2448:         bufp += bytes_written;
                   2449:         bytes_left -= bytes_written;
                   2450:     } while (bytes_left > 0);
                   2451: 
                   2452:     return (0);
                   2453: }
                   2454: 
                   2455: static int write_note(struct memelfnote *men, int fd)
                   2456: {
                   2457:     struct elf_note en;
                   2458: 
                   2459:     en.n_namesz = men->namesz;
                   2460:     en.n_type = men->type;
                   2461:     en.n_descsz = men->datasz;
                   2462: 
                   2463:     bswap_note(&en);
                   2464: 
                   2465:     if (dump_write(fd, &en, sizeof(en)) != 0)
                   2466:         return (-1);
                   2467:     if (dump_write(fd, men->name, men->namesz_rounded) != 0)
                   2468:         return (-1);
1.1.1.13  root     2469:     if (dump_write(fd, men->data, men->datasz_rounded) != 0)
1.1.1.8   root     2470:         return (-1);
                   2471: 
                   2472:     return (0);
                   2473: }
                   2474: 
1.1.1.15! root     2475: static void fill_thread_info(struct elf_note_info *info, const CPUArchState *env)
1.1.1.8   root     2476: {
                   2477:     TaskState *ts = (TaskState *)env->opaque;
                   2478:     struct elf_thread_status *ets;
                   2479: 
1.1.1.14  root     2480:     ets = g_malloc0(sizeof (*ets));
1.1.1.8   root     2481:     ets->num_notes = 1; /* only prstatus is dumped */
                   2482:     fill_prstatus(&ets->prstatus, ts, 0);
                   2483:     elf_core_copy_regs(&ets->prstatus.pr_reg, env);
                   2484:     fill_note(&ets->notes[0], "CORE", NT_PRSTATUS, sizeof (ets->prstatus),
1.1.1.12  root     2485:               &ets->prstatus);
1.1.1.8   root     2486: 
1.1.1.10  root     2487:     QTAILQ_INSERT_TAIL(&info->thread_list, ets, ets_link);
1.1.1.8   root     2488: 
                   2489:     info->notes_size += note_size(&ets->notes[0]);
                   2490: }
                   2491: 
                   2492: static int fill_note_info(struct elf_note_info *info,
1.1.1.15! root     2493:                           long signr, const CPUArchState *env)
1.1.1.8   root     2494: {
                   2495: #define NUMNOTES 3
1.1.1.15! root     2496:     CPUArchState *cpu = NULL;
1.1.1.8   root     2497:     TaskState *ts = (TaskState *)env->opaque;
                   2498:     int i;
                   2499: 
                   2500:     (void) memset(info, 0, sizeof (*info));
                   2501: 
1.1.1.10  root     2502:     QTAILQ_INIT(&info->thread_list);
1.1.1.8   root     2503: 
1.1.1.14  root     2504:     info->notes = g_malloc0(NUMNOTES * sizeof (struct memelfnote));
1.1.1.8   root     2505:     if (info->notes == NULL)
                   2506:         return (-ENOMEM);
1.1.1.14  root     2507:     info->prstatus = g_malloc0(sizeof (*info->prstatus));
1.1.1.8   root     2508:     if (info->prstatus == NULL)
                   2509:         return (-ENOMEM);
1.1.1.14  root     2510:     info->psinfo = g_malloc0(sizeof (*info->psinfo));
1.1.1.8   root     2511:     if (info->prstatus == NULL)
                   2512:         return (-ENOMEM);
                   2513: 
                   2514:     /*
                   2515:      * First fill in status (and registers) of current thread
                   2516:      * including process info & aux vector.
                   2517:      */
                   2518:     fill_prstatus(info->prstatus, ts, signr);
                   2519:     elf_core_copy_regs(&info->prstatus->pr_reg, env);
                   2520:     fill_note(&info->notes[0], "CORE", NT_PRSTATUS,
1.1.1.12  root     2521:               sizeof (*info->prstatus), info->prstatus);
1.1.1.8   root     2522:     fill_psinfo(info->psinfo, ts);
                   2523:     fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
1.1.1.12  root     2524:               sizeof (*info->psinfo), info->psinfo);
1.1.1.8   root     2525:     fill_auxv_note(&info->notes[2], ts);
                   2526:     info->numnote = 3;
                   2527: 
                   2528:     info->notes_size = 0;
                   2529:     for (i = 0; i < info->numnote; i++)
                   2530:         info->notes_size += note_size(&info->notes[i]);
                   2531: 
                   2532:     /* read and fill status of all threads */
                   2533:     cpu_list_lock();
                   2534:     for (cpu = first_cpu; cpu != NULL; cpu = cpu->next_cpu) {
                   2535:         if (cpu == thread_env)
                   2536:             continue;
                   2537:         fill_thread_info(info, cpu);
                   2538:     }
                   2539:     cpu_list_unlock();
                   2540: 
                   2541:     return (0);
                   2542: }
                   2543: 
                   2544: static void free_note_info(struct elf_note_info *info)
                   2545: {
                   2546:     struct elf_thread_status *ets;
                   2547: 
1.1.1.10  root     2548:     while (!QTAILQ_EMPTY(&info->thread_list)) {
                   2549:         ets = QTAILQ_FIRST(&info->thread_list);
                   2550:         QTAILQ_REMOVE(&info->thread_list, ets, ets_link);
1.1.1.14  root     2551:         g_free(ets);
1.1.1.8   root     2552:     }
                   2553: 
1.1.1.14  root     2554:     g_free(info->prstatus);
                   2555:     g_free(info->psinfo);
                   2556:     g_free(info->notes);
1.1.1.8   root     2557: }
                   2558: 
                   2559: static int write_note_info(struct elf_note_info *info, int fd)
                   2560: {
                   2561:     struct elf_thread_status *ets;
                   2562:     int i, error = 0;
                   2563: 
                   2564:     /* write prstatus, psinfo and auxv for current thread */
                   2565:     for (i = 0; i < info->numnote; i++)
                   2566:         if ((error = write_note(&info->notes[i], fd)) != 0)
                   2567:             return (error);
                   2568: 
                   2569:     /* write prstatus for each thread */
                   2570:     for (ets = info->thread_list.tqh_first; ets != NULL;
1.1.1.12  root     2571:          ets = ets->ets_link.tqe_next) {
1.1.1.8   root     2572:         if ((error = write_note(&ets->notes[0], fd)) != 0)
                   2573:             return (error);
                   2574:     }
                   2575: 
                   2576:     return (0);
                   2577: }
                   2578: 
                   2579: /*
                   2580:  * Write out ELF coredump.
                   2581:  *
                   2582:  * See documentation of ELF object file format in:
                   2583:  * http://www.caldera.com/developers/devspecs/gabi41.pdf
                   2584:  *
                   2585:  * Coredump format in linux is following:
                   2586:  *
                   2587:  * 0   +----------------------+         \
                   2588:  *     | ELF header           | ET_CORE  |
                   2589:  *     +----------------------+          |
                   2590:  *     | ELF program headers  |          |--- headers
                   2591:  *     | - NOTE section       |          |
                   2592:  *     | - PT_LOAD sections   |          |
                   2593:  *     +----------------------+         /
                   2594:  *     | NOTEs:               |
                   2595:  *     | - NT_PRSTATUS        |
                   2596:  *     | - NT_PRSINFO         |
                   2597:  *     | - NT_AUXV            |
                   2598:  *     +----------------------+ <-- aligned to target page
                   2599:  *     | Process memory dump  |
                   2600:  *     :                      :
                   2601:  *     .                      .
                   2602:  *     :                      :
                   2603:  *     |                      |
                   2604:  *     +----------------------+
                   2605:  *
                   2606:  * NT_PRSTATUS -> struct elf_prstatus (per thread)
                   2607:  * NT_PRSINFO  -> struct elf_prpsinfo
                   2608:  * NT_AUXV is array of { type, value } pairs (see fill_auxv_note()).
                   2609:  *
                   2610:  * Format follows System V format as close as possible.  Current
                   2611:  * version limitations are as follows:
                   2612:  *     - no floating point registers are dumped
                   2613:  *
                   2614:  * Function returns 0 in case of success, negative errno otherwise.
                   2615:  *
                   2616:  * TODO: make this work also during runtime: it should be
                   2617:  * possible to force coredump from running process and then
                   2618:  * continue processing.  For example qemu could set up SIGUSR2
                   2619:  * handler (provided that target process haven't registered
                   2620:  * handler for that) that does the dump when signal is received.
                   2621:  */
1.1.1.15! root     2622: static int elf_core_dump(int signr, const CPUArchState *env)
1.1.1.8   root     2623: {
                   2624:     const TaskState *ts = (const TaskState *)env->opaque;
                   2625:     struct vm_area_struct *vma = NULL;
                   2626:     char corefile[PATH_MAX];
                   2627:     struct elf_note_info info;
                   2628:     struct elfhdr elf;
                   2629:     struct elf_phdr phdr;
                   2630:     struct rlimit dumpsize;
                   2631:     struct mm_struct *mm = NULL;
                   2632:     off_t offset = 0, data_offset = 0;
                   2633:     int segs = 0;
                   2634:     int fd = -1;
                   2635: 
                   2636:     errno = 0;
                   2637:     getrlimit(RLIMIT_CORE, &dumpsize);
                   2638:     if (dumpsize.rlim_cur == 0)
1.1.1.12  root     2639:         return 0;
1.1.1.8   root     2640: 
                   2641:     if (core_dump_filename(ts, corefile, sizeof (corefile)) < 0)
                   2642:         return (-errno);
                   2643: 
                   2644:     if ((fd = open(corefile, O_WRONLY | O_CREAT,
1.1.1.12  root     2645:                    S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
1.1.1.8   root     2646:         return (-errno);
                   2647: 
                   2648:     /*
                   2649:      * Walk through target process memory mappings and
                   2650:      * set up structure containing this information.  After
                   2651:      * this point vma_xxx functions can be used.
                   2652:      */
                   2653:     if ((mm = vma_init()) == NULL)
                   2654:         goto out;
                   2655: 
                   2656:     walk_memory_regions(mm, vma_walker);
                   2657:     segs = vma_get_mapping_count(mm);
                   2658: 
                   2659:     /*
                   2660:      * Construct valid coredump ELF header.  We also
                   2661:      * add one more segment for notes.
                   2662:      */
                   2663:     fill_elf_header(&elf, segs + 1, ELF_MACHINE, 0);
                   2664:     if (dump_write(fd, &elf, sizeof (elf)) != 0)
                   2665:         goto out;
                   2666: 
                   2667:     /* fill in in-memory version of notes */
                   2668:     if (fill_note_info(&info, signr, env) < 0)
                   2669:         goto out;
                   2670: 
                   2671:     offset += sizeof (elf);                             /* elf header */
                   2672:     offset += (segs + 1) * sizeof (struct elf_phdr);    /* program headers */
                   2673: 
                   2674:     /* write out notes program header */
                   2675:     fill_elf_note_phdr(&phdr, info.notes_size, offset);
                   2676: 
                   2677:     offset += info.notes_size;
                   2678:     if (dump_write(fd, &phdr, sizeof (phdr)) != 0)
                   2679:         goto out;
                   2680: 
                   2681:     /*
                   2682:      * ELF specification wants data to start at page boundary so
                   2683:      * we align it here.
                   2684:      */
1.1.1.13  root     2685:     data_offset = offset = roundup(offset, ELF_EXEC_PAGESIZE);
1.1.1.8   root     2686: 
                   2687:     /*
                   2688:      * Write program headers for memory regions mapped in
                   2689:      * the target process.
                   2690:      */
                   2691:     for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
                   2692:         (void) memset(&phdr, 0, sizeof (phdr));
                   2693: 
                   2694:         phdr.p_type = PT_LOAD;
                   2695:         phdr.p_offset = offset;
                   2696:         phdr.p_vaddr = vma->vma_start;
                   2697:         phdr.p_paddr = 0;
                   2698:         phdr.p_filesz = vma_dump_size(vma);
                   2699:         offset += phdr.p_filesz;
                   2700:         phdr.p_memsz = vma->vma_end - vma->vma_start;
                   2701:         phdr.p_flags = vma->vma_flags & PROT_READ ? PF_R : 0;
                   2702:         if (vma->vma_flags & PROT_WRITE)
                   2703:             phdr.p_flags |= PF_W;
                   2704:         if (vma->vma_flags & PROT_EXEC)
                   2705:             phdr.p_flags |= PF_X;
                   2706:         phdr.p_align = ELF_EXEC_PAGESIZE;
                   2707: 
1.1.1.13  root     2708:         bswap_phdr(&phdr, 1);
1.1.1.8   root     2709:         dump_write(fd, &phdr, sizeof (phdr));
                   2710:     }
                   2711: 
                   2712:     /*
                   2713:      * Next we write notes just after program headers.  No
                   2714:      * alignment needed here.
                   2715:      */
                   2716:     if (write_note_info(&info, fd) < 0)
                   2717:         goto out;
                   2718: 
                   2719:     /* align data to page boundary */
                   2720:     if (lseek(fd, data_offset, SEEK_SET) != data_offset)
                   2721:         goto out;
                   2722: 
                   2723:     /*
                   2724:      * Finally we can dump process memory into corefile as well.
                   2725:      */
                   2726:     for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
                   2727:         abi_ulong addr;
                   2728:         abi_ulong end;
                   2729: 
                   2730:         end = vma->vma_start + vma_dump_size(vma);
                   2731: 
                   2732:         for (addr = vma->vma_start; addr < end;
1.1.1.12  root     2733:              addr += TARGET_PAGE_SIZE) {
1.1.1.8   root     2734:             char page[TARGET_PAGE_SIZE];
                   2735:             int error;
                   2736: 
                   2737:             /*
                   2738:              *  Read in page from target process memory and
                   2739:              *  write it to coredump file.
                   2740:              */
                   2741:             error = copy_from_user(page, addr, sizeof (page));
                   2742:             if (error != 0) {
1.1.1.11  root     2743:                 (void) fprintf(stderr, "unable to dump " TARGET_ABI_FMT_lx "\n",
1.1.1.12  root     2744:                                addr);
1.1.1.8   root     2745:                 errno = -error;
                   2746:                 goto out;
                   2747:             }
                   2748:             if (dump_write(fd, page, TARGET_PAGE_SIZE) < 0)
                   2749:                 goto out;
                   2750:         }
                   2751:     }
                   2752: 
1.1.1.12  root     2753:  out:
1.1.1.8   root     2754:     free_note_info(&info);
                   2755:     if (mm != NULL)
                   2756:         vma_delete(mm);
                   2757:     (void) close(fd);
                   2758: 
                   2759:     if (errno != 0)
                   2760:         return (-errno);
                   2761:     return (0);
                   2762: }
                   2763: #endif /* USE_ELF_CORE_DUMP */
                   2764: 
1.1.1.4   root     2765: void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
                   2766: {
                   2767:     init_thread(regs, infop);
                   2768: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.