qemu/linux-user/elfload.c
<<
>>
Prefs
   1/* This is the Linux kernel elf-loading code, ported into user space */
   2#include "qemu/osdep.h"
   3#include <sys/param.h>
   4
   5#include <sys/resource.h>
   6#include <sys/shm.h>
   7
   8#include "qemu.h"
   9#include "disas/disas.h"
  10#include "qemu/bitops.h"
  11#include "qemu/path.h"
  12#include "qemu/queue.h"
  13#include "qemu/guest-random.h"
  14#include "qemu/units.h"
  15#include "qemu/selfmap.h"
  16#include "qapi/error.h"
  17
  18#ifdef _ARCH_PPC64
  19#undef ARCH_DLINFO
  20#undef ELF_PLATFORM
  21#undef ELF_HWCAP
  22#undef ELF_HWCAP2
  23#undef ELF_CLASS
  24#undef ELF_DATA
  25#undef ELF_ARCH
  26#endif
  27
  28#define ELF_OSABI   ELFOSABI_SYSV
  29
  30/* from personality.h */
  31
  32/*
  33 * Flags for bug emulation.
  34 *
  35 * These occupy the top three bytes.
  36 */
  37enum {
  38    ADDR_NO_RANDOMIZE = 0x0040000,      /* disable randomization of VA space */
  39    FDPIC_FUNCPTRS =    0x0080000,      /* userspace function ptrs point to
  40                                           descriptors (signal handling) */
  41    MMAP_PAGE_ZERO =    0x0100000,
  42    ADDR_COMPAT_LAYOUT = 0x0200000,
  43    READ_IMPLIES_EXEC = 0x0400000,
  44    ADDR_LIMIT_32BIT =  0x0800000,
  45    SHORT_INODE =       0x1000000,
  46    WHOLE_SECONDS =     0x2000000,
  47    STICKY_TIMEOUTS =   0x4000000,
  48    ADDR_LIMIT_3GB =    0x8000000,
  49};
  50
  51/*
  52 * Personality types.
  53 *
  54 * These go in the low byte.  Avoid using the top bit, it will
  55 * conflict with error returns.
  56 */
  57enum {
  58    PER_LINUX =         0x0000,
  59    PER_LINUX_32BIT =   0x0000 | ADDR_LIMIT_32BIT,
  60    PER_LINUX_FDPIC =   0x0000 | FDPIC_FUNCPTRS,
  61    PER_SVR4 =          0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
  62    PER_SVR3 =          0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
  63    PER_SCOSVR3 =       0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS | SHORT_INODE,
  64    PER_OSR5 =          0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS,
  65    PER_WYSEV386 =      0x0004 | STICKY_TIMEOUTS | SHORT_INODE,
  66    PER_ISCR4 =         0x0005 | STICKY_TIMEOUTS,
  67    PER_BSD =           0x0006,
  68    PER_SUNOS =         0x0006 | STICKY_TIMEOUTS,
  69    PER_XENIX =         0x0007 | STICKY_TIMEOUTS | SHORT_INODE,
  70    PER_LINUX32 =       0x0008,
  71    PER_LINUX32_3GB =   0x0008 | ADDR_LIMIT_3GB,
  72    PER_IRIX32 =        0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */
  73    PER_IRIXN32 =       0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */
  74    PER_IRIX64 =        0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */
  75    PER_RISCOS =        0x000c,
  76    PER_SOLARIS =       0x000d | STICKY_TIMEOUTS,
  77    PER_UW7 =           0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
  78    PER_OSF4 =          0x000f,                  /* OSF/1 v4 */
  79    PER_HPUX =          0x0010,
  80    PER_MASK =          0x00ff,
  81};
  82
  83/*
  84 * Return the base personality without flags.
  85 */
  86#define personality(pers)       (pers & PER_MASK)
  87
  88int info_is_fdpic(struct image_info *info)
  89{
  90    return info->personality == PER_LINUX_FDPIC;
  91}
  92
  93/* this flag is uneffective under linux too, should be deleted */
  94#ifndef MAP_DENYWRITE
  95#define MAP_DENYWRITE 0
  96#endif
  97
  98/* should probably go in elf.h */
  99#ifndef ELIBBAD
 100#define ELIBBAD 80
 101#endif
 102
 103#ifdef TARGET_WORDS_BIGENDIAN
 104#define ELF_DATA        ELFDATA2MSB
 105#else
 106#define ELF_DATA        ELFDATA2LSB
 107#endif
 108
 109#ifdef TARGET_ABI_MIPSN32
 110typedef abi_ullong      target_elf_greg_t;
 111#define tswapreg(ptr)   tswap64(ptr)
 112#else
 113typedef abi_ulong       target_elf_greg_t;
 114#define tswapreg(ptr)   tswapal(ptr)
 115#endif
 116
 117#ifdef USE_UID16
 118typedef abi_ushort      target_uid_t;
 119typedef abi_ushort      target_gid_t;
 120#else
 121typedef abi_uint        target_uid_t;
 122typedef abi_uint        target_gid_t;
 123#endif
 124typedef abi_int         target_pid_t;
 125
 126#ifdef TARGET_I386
 127
 128#define ELF_PLATFORM get_elf_platform()
 129
 130static const char *get_elf_platform(void)
 131{
 132    static char elf_platform[] = "i386";
 133    int family = object_property_get_int(OBJECT(thread_cpu), "family", NULL);
 134    if (family > 6)
 135        family = 6;
 136    if (family >= 3)
 137        elf_platform[1] = '0' + family;
 138    return elf_platform;
 139}
 140
 141#define ELF_HWCAP get_elf_hwcap()
 142
 143static uint32_t get_elf_hwcap(void)
 144{
 145    X86CPU *cpu = X86_CPU(thread_cpu);
 146
 147    return cpu->env.features[FEAT_1_EDX];
 148}
 149
 150#ifdef TARGET_X86_64
 151#define ELF_START_MMAP 0x2aaaaab000ULL
 152
 153#define ELF_CLASS      ELFCLASS64
 154#define ELF_ARCH       EM_X86_64
 155
 156static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
 157{
 158    regs->rax = 0;
 159    regs->rsp = infop->start_stack;
 160    regs->rip = infop->entry;
 161}
 162
 163#define ELF_NREG    27
 164typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
 165
 166/*
 167 * Note that ELF_NREG should be 29 as there should be place for
 168 * TRAPNO and ERR "registers" as well but linux doesn't dump
 169 * those.
 170 *
 171 * See linux kernel: arch/x86/include/asm/elf.h
 172 */
 173static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env)
 174{
 175    (*regs)[0] = env->regs[15];
 176    (*regs)[1] = env->regs[14];
 177    (*regs)[2] = env->regs[13];
 178    (*regs)[3] = env->regs[12];
 179    (*regs)[4] = env->regs[R_EBP];
 180    (*regs)[5] = env->regs[R_EBX];
 181    (*regs)[6] = env->regs[11];
 182    (*regs)[7] = env->regs[10];
 183    (*regs)[8] = env->regs[9];
 184    (*regs)[9] = env->regs[8];
 185    (*regs)[10] = env->regs[R_EAX];
 186    (*regs)[11] = env->regs[R_ECX];
 187    (*regs)[12] = env->regs[R_EDX];
 188    (*regs)[13] = env->regs[R_ESI];
 189    (*regs)[14] = env->regs[R_EDI];
 190    (*regs)[15] = env->regs[R_EAX]; /* XXX */
 191    (*regs)[16] = env->eip;
 192    (*regs)[17] = env->segs[R_CS].selector & 0xffff;
 193    (*regs)[18] = env->eflags;
 194    (*regs)[19] = env->regs[R_ESP];
 195    (*regs)[20] = env->segs[R_SS].selector & 0xffff;
 196    (*regs)[21] = env->segs[R_FS].selector & 0xffff;
 197    (*regs)[22] = env->segs[R_GS].selector & 0xffff;
 198    (*regs)[23] = env->segs[R_DS].selector & 0xffff;
 199    (*regs)[24] = env->segs[R_ES].selector & 0xffff;
 200    (*regs)[25] = env->segs[R_FS].selector & 0xffff;
 201    (*regs)[26] = env->segs[R_GS].selector & 0xffff;
 202}
 203
 204#else
 205
 206#define ELF_START_MMAP 0x80000000
 207
 208/*
 209 * This is used to ensure we don't load something for the wrong architecture.
 210 */
 211#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
 212
 213/*
 214 * These are used to set parameters in the core dumps.
 215 */
 216#define ELF_CLASS       ELFCLASS32
 217#define ELF_ARCH        EM_386
 218
 219static inline void init_thread(struct target_pt_regs *regs,
 220                               struct image_info *infop)
 221{
 222    regs->esp = infop->start_stack;
 223    regs->eip = infop->entry;
 224
 225    /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
 226       starts %edx contains a pointer to a function which might be
 227       registered using `atexit'.  This provides a mean for the
 228       dynamic linker to call DT_FINI functions for shared libraries
 229       that have been loaded before the code runs.
 230
 231       A value of 0 tells we have no such handler.  */
 232    regs->edx = 0;
 233}
 234
 235#define ELF_NREG    17
 236typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
 237
 238/*
 239 * Note that ELF_NREG should be 19 as there should be place for
 240 * TRAPNO and ERR "registers" as well but linux doesn't dump
 241 * those.
 242 *
 243 * See linux kernel: arch/x86/include/asm/elf.h
 244 */
 245static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *env)
 246{
 247    (*regs)[0] = env->regs[R_EBX];
 248    (*regs)[1] = env->regs[R_ECX];
 249    (*regs)[2] = env->regs[R_EDX];
 250    (*regs)[3] = env->regs[R_ESI];
 251    (*regs)[4] = env->regs[R_EDI];
 252    (*regs)[5] = env->regs[R_EBP];
 253    (*regs)[6] = env->regs[R_EAX];
 254    (*regs)[7] = env->segs[R_DS].selector & 0xffff;
 255    (*regs)[8] = env->segs[R_ES].selector & 0xffff;
 256    (*regs)[9] = env->segs[R_FS].selector & 0xffff;
 257    (*regs)[10] = env->segs[R_GS].selector & 0xffff;
 258    (*regs)[11] = env->regs[R_EAX]; /* XXX */
 259    (*regs)[12] = env->eip;
 260    (*regs)[13] = env->segs[R_CS].selector & 0xffff;
 261    (*regs)[14] = env->eflags;
 262    (*regs)[15] = env->regs[R_ESP];
 263    (*regs)[16] = env->segs[R_SS].selector & 0xffff;
 264}
 265#endif
 266
 267#define USE_ELF_CORE_DUMP
 268#define ELF_EXEC_PAGESIZE       4096
 269
 270#endif
 271
 272#ifdef TARGET_ARM
 273
 274#ifndef TARGET_AARCH64
 275/* 32 bit ARM definitions */
 276
 277#define ELF_START_MMAP 0x80000000
 278
 279#define ELF_ARCH        EM_ARM
 280#define ELF_CLASS       ELFCLASS32
 281
 282static inline void init_thread(struct target_pt_regs *regs,
 283                               struct image_info *infop)
 284{
 285    abi_long stack = infop->start_stack;
 286    memset(regs, 0, sizeof(*regs));
 287
 288    regs->uregs[16] = ARM_CPU_MODE_USR;
 289    if (infop->entry & 1) {
 290        regs->uregs[16] |= CPSR_T;
 291    }
 292    regs->uregs[15] = infop->entry & 0xfffffffe;
 293    regs->uregs[13] = infop->start_stack;
 294    /* FIXME - what to for failure of get_user()? */
 295    get_user_ual(regs->uregs[2], stack + 8); /* envp */
 296    get_user_ual(regs->uregs[1], stack + 4); /* envp */
 297    /* XXX: it seems that r0 is zeroed after ! */
 298    regs->uregs[0] = 0;
 299    /* For uClinux PIC binaries.  */
 300    /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
 301    regs->uregs[10] = infop->start_data;
 302
 303    /* Support ARM FDPIC.  */
 304    if (info_is_fdpic(infop)) {
 305        /* As described in the ABI document, r7 points to the loadmap info
 306         * prepared by the kernel. If an interpreter is needed, r8 points
 307         * to the interpreter loadmap and r9 points to the interpreter
 308         * PT_DYNAMIC info. If no interpreter is needed, r8 is zero, and
 309         * r9 points to the main program PT_DYNAMIC info.
 310         */
 311        regs->uregs[7] = infop->loadmap_addr;
 312        if (infop->interpreter_loadmap_addr) {
 313            /* Executable is dynamically loaded.  */
 314            regs->uregs[8] = infop->interpreter_loadmap_addr;
 315            regs->uregs[9] = infop->interpreter_pt_dynamic_addr;
 316        } else {
 317            regs->uregs[8] = 0;
 318            regs->uregs[9] = infop->pt_dynamic_addr;
 319        }
 320    }
 321}
 322
 323#define ELF_NREG    18
 324typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
 325
 326static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUARMState *env)
 327{
 328    (*regs)[0] = tswapreg(env->regs[0]);
 329    (*regs)[1] = tswapreg(env->regs[1]);
 330    (*regs)[2] = tswapreg(env->regs[2]);
 331    (*regs)[3] = tswapreg(env->regs[3]);
 332    (*regs)[4] = tswapreg(env->regs[4]);
 333    (*regs)[5] = tswapreg(env->regs[5]);
 334    (*regs)[6] = tswapreg(env->regs[6]);
 335    (*regs)[7] = tswapreg(env->regs[7]);
 336    (*regs)[8] = tswapreg(env->regs[8]);
 337    (*regs)[9] = tswapreg(env->regs[9]);
 338    (*regs)[10] = tswapreg(env->regs[10]);
 339    (*regs)[11] = tswapreg(env->regs[11]);
 340    (*regs)[12] = tswapreg(env->regs[12]);
 341    (*regs)[13] = tswapreg(env->regs[13]);
 342    (*regs)[14] = tswapreg(env->regs[14]);
 343    (*regs)[15] = tswapreg(env->regs[15]);
 344
 345    (*regs)[16] = tswapreg(cpsr_read((CPUARMState *)env));
 346    (*regs)[17] = tswapreg(env->regs[0]); /* XXX */
 347}
 348
 349#define USE_ELF_CORE_DUMP
 350#define ELF_EXEC_PAGESIZE       4096
 351
 352enum
 353{
 354    ARM_HWCAP_ARM_SWP       = 1 << 0,
 355    ARM_HWCAP_ARM_HALF      = 1 << 1,
 356    ARM_HWCAP_ARM_THUMB     = 1 << 2,
 357    ARM_HWCAP_ARM_26BIT     = 1 << 3,
 358    ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
 359    ARM_HWCAP_ARM_FPA       = 1 << 5,
 360    ARM_HWCAP_ARM_VFP       = 1 << 6,
 361    ARM_HWCAP_ARM_EDSP      = 1 << 7,
 362    ARM_HWCAP_ARM_JAVA      = 1 << 8,
 363    ARM_HWCAP_ARM_IWMMXT    = 1 << 9,
 364    ARM_HWCAP_ARM_CRUNCH    = 1 << 10,
 365    ARM_HWCAP_ARM_THUMBEE   = 1 << 11,
 366    ARM_HWCAP_ARM_NEON      = 1 << 12,
 367    ARM_HWCAP_ARM_VFPv3     = 1 << 13,
 368    ARM_HWCAP_ARM_VFPv3D16  = 1 << 14,
 369    ARM_HWCAP_ARM_TLS       = 1 << 15,
 370    ARM_HWCAP_ARM_VFPv4     = 1 << 16,
 371    ARM_HWCAP_ARM_IDIVA     = 1 << 17,
 372    ARM_HWCAP_ARM_IDIVT     = 1 << 18,
 373    ARM_HWCAP_ARM_VFPD32    = 1 << 19,
 374    ARM_HWCAP_ARM_LPAE      = 1 << 20,
 375    ARM_HWCAP_ARM_EVTSTRM   = 1 << 21,
 376};
 377
 378enum {
 379    ARM_HWCAP2_ARM_AES      = 1 << 0,
 380    ARM_HWCAP2_ARM_PMULL    = 1 << 1,
 381    ARM_HWCAP2_ARM_SHA1     = 1 << 2,
 382    ARM_HWCAP2_ARM_SHA2     = 1 << 3,
 383    ARM_HWCAP2_ARM_CRC32    = 1 << 4,
 384};
 385
 386/* The commpage only exists for 32 bit kernels */
 387
 388#define ARM_COMMPAGE (intptr_t)0xffff0f00u
 389
 390static bool init_guest_commpage(void)
 391{
 392    void *want = g2h_untagged(ARM_COMMPAGE & -qemu_host_page_size);
 393    void *addr = mmap(want, qemu_host_page_size, PROT_READ | PROT_WRITE,
 394                      MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);
 395
 396    if (addr == MAP_FAILED) {
 397        perror("Allocating guest commpage");
 398        exit(EXIT_FAILURE);
 399    }
 400    if (addr != want) {
 401        return false;
 402    }
 403
 404    /* Set kernel helper versions; rest of page is 0.  */
 405    __put_user(5, (uint32_t *)g2h_untagged(0xffff0ffcu));
 406
 407    if (mprotect(addr, qemu_host_page_size, PROT_READ)) {
 408        perror("Protecting guest commpage");
 409        exit(EXIT_FAILURE);
 410    }
 411    return true;
 412}
 413
 414#define ELF_HWCAP get_elf_hwcap()
 415#define ELF_HWCAP2 get_elf_hwcap2()
 416
 417static uint32_t get_elf_hwcap(void)
 418{
 419    ARMCPU *cpu = ARM_CPU(thread_cpu);
 420    uint32_t hwcaps = 0;
 421
 422    hwcaps |= ARM_HWCAP_ARM_SWP;
 423    hwcaps |= ARM_HWCAP_ARM_HALF;
 424    hwcaps |= ARM_HWCAP_ARM_THUMB;
 425    hwcaps |= ARM_HWCAP_ARM_FAST_MULT;
 426
 427    /* probe for the extra features */
 428#define GET_FEATURE(feat, hwcap) \
 429    do { if (arm_feature(&cpu->env, feat)) { hwcaps |= hwcap; } } while (0)
 430
 431#define GET_FEATURE_ID(feat, hwcap) \
 432    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)
 433
 434    /* EDSP is in v5TE and above, but all our v5 CPUs are v5TE */
 435    GET_FEATURE(ARM_FEATURE_V5, ARM_HWCAP_ARM_EDSP);
 436    GET_FEATURE(ARM_FEATURE_IWMMXT, ARM_HWCAP_ARM_IWMMXT);
 437    GET_FEATURE(ARM_FEATURE_THUMB2EE, ARM_HWCAP_ARM_THUMBEE);
 438    GET_FEATURE(ARM_FEATURE_NEON, ARM_HWCAP_ARM_NEON);
 439    GET_FEATURE(ARM_FEATURE_V6K, ARM_HWCAP_ARM_TLS);
 440    GET_FEATURE(ARM_FEATURE_LPAE, ARM_HWCAP_ARM_LPAE);
 441    GET_FEATURE_ID(aa32_arm_div, ARM_HWCAP_ARM_IDIVA);
 442    GET_FEATURE_ID(aa32_thumb_div, ARM_HWCAP_ARM_IDIVT);
 443    GET_FEATURE_ID(aa32_vfp, ARM_HWCAP_ARM_VFP);
 444
 445    if (cpu_isar_feature(aa32_fpsp_v3, cpu) ||
 446        cpu_isar_feature(aa32_fpdp_v3, cpu)) {
 447        hwcaps |= ARM_HWCAP_ARM_VFPv3;
 448        if (cpu_isar_feature(aa32_simd_r32, cpu)) {
 449            hwcaps |= ARM_HWCAP_ARM_VFPD32;
 450        } else {
 451            hwcaps |= ARM_HWCAP_ARM_VFPv3D16;
 452        }
 453    }
 454    GET_FEATURE_ID(aa32_simdfmac, ARM_HWCAP_ARM_VFPv4);
 455
 456    return hwcaps;
 457}
 458
 459static uint32_t get_elf_hwcap2(void)
 460{
 461    ARMCPU *cpu = ARM_CPU(thread_cpu);
 462    uint32_t hwcaps = 0;
 463
 464    GET_FEATURE_ID(aa32_aes, ARM_HWCAP2_ARM_AES);
 465    GET_FEATURE_ID(aa32_pmull, ARM_HWCAP2_ARM_PMULL);
 466    GET_FEATURE_ID(aa32_sha1, ARM_HWCAP2_ARM_SHA1);
 467    GET_FEATURE_ID(aa32_sha2, ARM_HWCAP2_ARM_SHA2);
 468    GET_FEATURE_ID(aa32_crc32, ARM_HWCAP2_ARM_CRC32);
 469    return hwcaps;
 470}
 471
 472#undef GET_FEATURE
 473#undef GET_FEATURE_ID
 474
 475#define ELF_PLATFORM get_elf_platform()
 476
 477static const char *get_elf_platform(void)
 478{
 479    CPUARMState *env = thread_cpu->env_ptr;
 480
 481#ifdef TARGET_WORDS_BIGENDIAN
 482# define END  "b"
 483#else
 484# define END  "l"
 485#endif
 486
 487    if (arm_feature(env, ARM_FEATURE_V8)) {
 488        return "v8" END;
 489    } else if (arm_feature(env, ARM_FEATURE_V7)) {
 490        if (arm_feature(env, ARM_FEATURE_M)) {
 491            return "v7m" END;
 492        } else {
 493            return "v7" END;
 494        }
 495    } else if (arm_feature(env, ARM_FEATURE_V6)) {
 496        return "v6" END;
 497    } else if (arm_feature(env, ARM_FEATURE_V5)) {
 498        return "v5" END;
 499    } else {
 500        return "v4" END;
 501    }
 502
 503#undef END
 504}
 505
 506#else
 507/* 64 bit ARM definitions */
 508#define ELF_START_MMAP 0x80000000
 509
 510#define ELF_ARCH        EM_AARCH64
 511#define ELF_CLASS       ELFCLASS64
 512#ifdef TARGET_WORDS_BIGENDIAN
 513# define ELF_PLATFORM    "aarch64_be"
 514#else
 515# define ELF_PLATFORM    "aarch64"
 516#endif
 517
 518static inline void init_thread(struct target_pt_regs *regs,
 519                               struct image_info *infop)
 520{
 521    abi_long stack = infop->start_stack;
 522    memset(regs, 0, sizeof(*regs));
 523
 524    regs->pc = infop->entry & ~0x3ULL;
 525    regs->sp = stack;
 526}
 527
 528#define ELF_NREG    34
 529typedef target_elf_greg_t  target_elf_gregset_t[ELF_NREG];
 530
 531static void elf_core_copy_regs(target_elf_gregset_t *regs,
 532                               const CPUARMState *env)
 533{
 534    int i;
 535
 536    for (i = 0; i < 32; i++) {
 537        (*regs)[i] = tswapreg(env->xregs[i]);
 538    }
 539    (*regs)[32] = tswapreg(env->pc);
 540    (*regs)[33] = tswapreg(pstate_read((CPUARMState *)env));
 541}
 542
 543#define USE_ELF_CORE_DUMP
 544#define ELF_EXEC_PAGESIZE       4096
 545
 546enum {
 547    ARM_HWCAP_A64_FP            = 1 << 0,
 548    ARM_HWCAP_A64_ASIMD         = 1 << 1,
 549    ARM_HWCAP_A64_EVTSTRM       = 1 << 2,
 550    ARM_HWCAP_A64_AES           = 1 << 3,
 551    ARM_HWCAP_A64_PMULL         = 1 << 4,
 552    ARM_HWCAP_A64_SHA1          = 1 << 5,
 553    ARM_HWCAP_A64_SHA2          = 1 << 6,
 554    ARM_HWCAP_A64_CRC32         = 1 << 7,
 555    ARM_HWCAP_A64_ATOMICS       = 1 << 8,
 556    ARM_HWCAP_A64_FPHP          = 1 << 9,
 557    ARM_HWCAP_A64_ASIMDHP       = 1 << 10,
 558    ARM_HWCAP_A64_CPUID         = 1 << 11,
 559    ARM_HWCAP_A64_ASIMDRDM      = 1 << 12,
 560    ARM_HWCAP_A64_JSCVT         = 1 << 13,
 561    ARM_HWCAP_A64_FCMA          = 1 << 14,
 562    ARM_HWCAP_A64_LRCPC         = 1 << 15,
 563    ARM_HWCAP_A64_DCPOP         = 1 << 16,
 564    ARM_HWCAP_A64_SHA3          = 1 << 17,
 565    ARM_HWCAP_A64_SM3           = 1 << 18,
 566    ARM_HWCAP_A64_SM4           = 1 << 19,
 567    ARM_HWCAP_A64_ASIMDDP       = 1 << 20,
 568    ARM_HWCAP_A64_SHA512        = 1 << 21,
 569    ARM_HWCAP_A64_SVE           = 1 << 22,
 570    ARM_HWCAP_A64_ASIMDFHM      = 1 << 23,
 571    ARM_HWCAP_A64_DIT           = 1 << 24,
 572    ARM_HWCAP_A64_USCAT         = 1 << 25,
 573    ARM_HWCAP_A64_ILRCPC        = 1 << 26,
 574    ARM_HWCAP_A64_FLAGM         = 1 << 27,
 575    ARM_HWCAP_A64_SSBS          = 1 << 28,
 576    ARM_HWCAP_A64_SB            = 1 << 29,
 577    ARM_HWCAP_A64_PACA          = 1 << 30,
 578    ARM_HWCAP_A64_PACG          = 1UL << 31,
 579
 580    ARM_HWCAP2_A64_DCPODP       = 1 << 0,
 581    ARM_HWCAP2_A64_SVE2         = 1 << 1,
 582    ARM_HWCAP2_A64_SVEAES       = 1 << 2,
 583    ARM_HWCAP2_A64_SVEPMULL     = 1 << 3,
 584    ARM_HWCAP2_A64_SVEBITPERM   = 1 << 4,
 585    ARM_HWCAP2_A64_SVESHA3      = 1 << 5,
 586    ARM_HWCAP2_A64_SVESM4       = 1 << 6,
 587    ARM_HWCAP2_A64_FLAGM2       = 1 << 7,
 588    ARM_HWCAP2_A64_FRINT        = 1 << 8,
 589    ARM_HWCAP2_A64_SVEI8MM      = 1 << 9,
 590    ARM_HWCAP2_A64_SVEF32MM     = 1 << 10,
 591    ARM_HWCAP2_A64_SVEF64MM     = 1 << 11,
 592    ARM_HWCAP2_A64_SVEBF16      = 1 << 12,
 593    ARM_HWCAP2_A64_I8MM         = 1 << 13,
 594    ARM_HWCAP2_A64_BF16         = 1 << 14,
 595    ARM_HWCAP2_A64_DGH          = 1 << 15,
 596    ARM_HWCAP2_A64_RNG          = 1 << 16,
 597    ARM_HWCAP2_A64_BTI          = 1 << 17,
 598    ARM_HWCAP2_A64_MTE          = 1 << 18,
 599};
 600
 601#define ELF_HWCAP   get_elf_hwcap()
 602#define ELF_HWCAP2  get_elf_hwcap2()
 603
 604#define GET_FEATURE_ID(feat, hwcap) \
 605    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)
 606
 607static uint32_t get_elf_hwcap(void)
 608{
 609    ARMCPU *cpu = ARM_CPU(thread_cpu);
 610    uint32_t hwcaps = 0;
 611
 612    hwcaps |= ARM_HWCAP_A64_FP;
 613    hwcaps |= ARM_HWCAP_A64_ASIMD;
 614    hwcaps |= ARM_HWCAP_A64_CPUID;
 615
 616    /* probe for the extra features */
 617
 618    GET_FEATURE_ID(aa64_aes, ARM_HWCAP_A64_AES);
 619    GET_FEATURE_ID(aa64_pmull, ARM_HWCAP_A64_PMULL);
 620    GET_FEATURE_ID(aa64_sha1, ARM_HWCAP_A64_SHA1);
 621    GET_FEATURE_ID(aa64_sha256, ARM_HWCAP_A64_SHA2);
 622    GET_FEATURE_ID(aa64_sha512, ARM_HWCAP_A64_SHA512);
 623    GET_FEATURE_ID(aa64_crc32, ARM_HWCAP_A64_CRC32);
 624    GET_FEATURE_ID(aa64_sha3, ARM_HWCAP_A64_SHA3);
 625    GET_FEATURE_ID(aa64_sm3, ARM_HWCAP_A64_SM3);
 626    GET_FEATURE_ID(aa64_sm4, ARM_HWCAP_A64_SM4);
 627    GET_FEATURE_ID(aa64_fp16, ARM_HWCAP_A64_FPHP | ARM_HWCAP_A64_ASIMDHP);
 628    GET_FEATURE_ID(aa64_atomics, ARM_HWCAP_A64_ATOMICS);
 629    GET_FEATURE_ID(aa64_rdm, ARM_HWCAP_A64_ASIMDRDM);
 630    GET_FEATURE_ID(aa64_dp, ARM_HWCAP_A64_ASIMDDP);
 631    GET_FEATURE_ID(aa64_fcma, ARM_HWCAP_A64_FCMA);
 632    GET_FEATURE_ID(aa64_sve, ARM_HWCAP_A64_SVE);
 633    GET_FEATURE_ID(aa64_pauth, ARM_HWCAP_A64_PACA | ARM_HWCAP_A64_PACG);
 634    GET_FEATURE_ID(aa64_fhm, ARM_HWCAP_A64_ASIMDFHM);
 635    GET_FEATURE_ID(aa64_jscvt, ARM_HWCAP_A64_JSCVT);
 636    GET_FEATURE_ID(aa64_sb, ARM_HWCAP_A64_SB);
 637    GET_FEATURE_ID(aa64_condm_4, ARM_HWCAP_A64_FLAGM);
 638    GET_FEATURE_ID(aa64_dcpop, ARM_HWCAP_A64_DCPOP);
 639    GET_FEATURE_ID(aa64_rcpc_8_3, ARM_HWCAP_A64_LRCPC);
 640    GET_FEATURE_ID(aa64_rcpc_8_4, ARM_HWCAP_A64_ILRCPC);
 641
 642    return hwcaps;
 643}
 644
 645static uint32_t get_elf_hwcap2(void)
 646{
 647    ARMCPU *cpu = ARM_CPU(thread_cpu);
 648    uint32_t hwcaps = 0;
 649
 650    GET_FEATURE_ID(aa64_dcpodp, ARM_HWCAP2_A64_DCPODP);
 651    GET_FEATURE_ID(aa64_condm_5, ARM_HWCAP2_A64_FLAGM2);
 652    GET_FEATURE_ID(aa64_frint, ARM_HWCAP2_A64_FRINT);
 653    GET_FEATURE_ID(aa64_rndr, ARM_HWCAP2_A64_RNG);
 654    GET_FEATURE_ID(aa64_bti, ARM_HWCAP2_A64_BTI);
 655    GET_FEATURE_ID(aa64_mte, ARM_HWCAP2_A64_MTE);
 656
 657    return hwcaps;
 658}
 659
 660#undef GET_FEATURE_ID
 661
 662#endif /* not TARGET_AARCH64 */
 663#endif /* TARGET_ARM */
 664
 665#ifdef TARGET_SPARC
 666#ifdef TARGET_SPARC64
 667
 668#define ELF_START_MMAP 0x80000000
 669#define ELF_HWCAP  (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
 670                    | HWCAP_SPARC_MULDIV | HWCAP_SPARC_V9)
 671#ifndef TARGET_ABI32
 672#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
 673#else
 674#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
 675#endif
 676
 677#define ELF_CLASS   ELFCLASS64
 678#define ELF_ARCH    EM_SPARCV9
 679
 680#define STACK_BIAS              2047
 681
 682static inline void init_thread(struct target_pt_regs *regs,
 683                               struct image_info *infop)
 684{
 685#ifndef TARGET_ABI32
 686    regs->tstate = 0;
 687#endif
 688    regs->pc = infop->entry;
 689    regs->npc = regs->pc + 4;
 690    regs->y = 0;
 691#ifdef TARGET_ABI32
 692    regs->u_regs[14] = infop->start_stack - 16 * 4;
 693#else
 694    if (personality(infop->personality) == PER_LINUX32)
 695        regs->u_regs[14] = infop->start_stack - 16 * 4;
 696    else
 697        regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
 698#endif
 699}
 700
 701#else
 702#define ELF_START_MMAP 0x80000000
 703#define ELF_HWCAP  (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | HWCAP_SPARC_SWAP \
 704                    | HWCAP_SPARC_MULDIV)
 705
 706#define ELF_CLASS   ELFCLASS32
 707#define ELF_ARCH    EM_SPARC
 708
 709static inline void init_thread(struct target_pt_regs *regs,
 710                               struct image_info *infop)
 711{
 712    regs->psr = 0;
 713    regs->pc = infop->entry;
 714    regs->npc = regs->pc + 4;
 715    regs->y = 0;
 716    regs->u_regs[14] = infop->start_stack - 16 * 4;
 717}
 718
 719#endif
 720#endif
 721
 722#ifdef TARGET_PPC
 723
 724#define ELF_MACHINE    PPC_ELF_MACHINE
 725#define ELF_START_MMAP 0x80000000
 726
 727#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
 728
 729#define elf_check_arch(x) ( (x) == EM_PPC64 )
 730
 731#define ELF_CLASS       ELFCLASS64
 732
 733#else
 734
 735#define ELF_CLASS       ELFCLASS32
 736
 737#endif
 738
 739#define ELF_ARCH        EM_PPC
 740
 741/* Feature masks for the Aux Vector Hardware Capabilities (AT_HWCAP).
 742   See arch/powerpc/include/asm/cputable.h.  */
 743enum {
 744    QEMU_PPC_FEATURE_32 = 0x80000000,
 745    QEMU_PPC_FEATURE_64 = 0x40000000,
 746    QEMU_PPC_FEATURE_601_INSTR = 0x20000000,
 747    QEMU_PPC_FEATURE_HAS_ALTIVEC = 0x10000000,
 748    QEMU_PPC_FEATURE_HAS_FPU = 0x08000000,
 749    QEMU_PPC_FEATURE_HAS_MMU = 0x04000000,
 750    QEMU_PPC_FEATURE_HAS_4xxMAC = 0x02000000,
 751    QEMU_PPC_FEATURE_UNIFIED_CACHE = 0x01000000,
 752    QEMU_PPC_FEATURE_HAS_SPE = 0x00800000,
 753    QEMU_PPC_FEATURE_HAS_EFP_SINGLE = 0x00400000,
 754    QEMU_PPC_FEATURE_HAS_EFP_DOUBLE = 0x00200000,
 755    QEMU_PPC_FEATURE_NO_TB = 0x00100000,
 756    QEMU_PPC_FEATURE_POWER4 = 0x00080000,
 757    QEMU_PPC_FEATURE_POWER5 = 0x00040000,
 758    QEMU_PPC_FEATURE_POWER5_PLUS = 0x00020000,
 759    QEMU_PPC_FEATURE_CELL = 0x00010000,
 760    QEMU_PPC_FEATURE_BOOKE = 0x00008000,
 761    QEMU_PPC_FEATURE_SMT = 0x00004000,
 762    QEMU_PPC_FEATURE_ICACHE_SNOOP = 0x00002000,
 763    QEMU_PPC_FEATURE_ARCH_2_05 = 0x00001000,
 764    QEMU_PPC_FEATURE_PA6T = 0x00000800,
 765    QEMU_PPC_FEATURE_HAS_DFP = 0x00000400,
 766    QEMU_PPC_FEATURE_POWER6_EXT = 0x00000200,
 767    QEMU_PPC_FEATURE_ARCH_2_06 = 0x00000100,
 768    QEMU_PPC_FEATURE_HAS_VSX = 0x00000080,
 769    QEMU_PPC_FEATURE_PSERIES_PERFMON_COMPAT = 0x00000040,
 770
 771    QEMU_PPC_FEATURE_TRUE_LE = 0x00000002,
 772    QEMU_PPC_FEATURE_PPC_LE = 0x00000001,
 773
 774    /* Feature definitions in AT_HWCAP2.  */
 775    QEMU_PPC_FEATURE2_ARCH_2_07 = 0x80000000, /* ISA 2.07 */
 776    QEMU_PPC_FEATURE2_HAS_HTM = 0x40000000, /* Hardware Transactional Memory */
 777    QEMU_PPC_FEATURE2_HAS_DSCR = 0x20000000, /* Data Stream Control Register */
 778    QEMU_PPC_FEATURE2_HAS_EBB = 0x10000000, /* Event Base Branching */
 779    QEMU_PPC_FEATURE2_HAS_ISEL = 0x08000000, /* Integer Select */
 780    QEMU_PPC_FEATURE2_HAS_TAR = 0x04000000, /* Target Address Register */
 781    QEMU_PPC_FEATURE2_VEC_CRYPTO = 0x02000000,
 782    QEMU_PPC_FEATURE2_HTM_NOSC = 0x01000000,
 783    QEMU_PPC_FEATURE2_ARCH_3_00 = 0x00800000, /* ISA 3.00 */
 784    QEMU_PPC_FEATURE2_HAS_IEEE128 = 0x00400000, /* VSX IEEE Bin Float 128-bit */
 785    QEMU_PPC_FEATURE2_DARN = 0x00200000, /* darn random number insn */
 786    QEMU_PPC_FEATURE2_SCV = 0x00100000, /* scv syscall */
 787    QEMU_PPC_FEATURE2_HTM_NO_SUSPEND = 0x00080000, /* TM w/o suspended state */
 788};
 789
 790#define ELF_HWCAP get_elf_hwcap()
 791
 792static uint32_t get_elf_hwcap(void)
 793{
 794    PowerPCCPU *cpu = POWERPC_CPU(thread_cpu);
 795    uint32_t features = 0;
 796
 797    /* We don't have to be terribly complete here; the high points are
 798       Altivec/FP/SPE support.  Anything else is just a bonus.  */
 799#define GET_FEATURE(flag, feature)                                      \
 800    do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0)
 801#define GET_FEATURE2(flags, feature) \
 802    do { \
 803        if ((cpu->env.insns_flags2 & flags) == flags) { \
 804            features |= feature; \
 805        } \
 806    } while (0)
 807    GET_FEATURE(PPC_64B, QEMU_PPC_FEATURE_64);
 808    GET_FEATURE(PPC_FLOAT, QEMU_PPC_FEATURE_HAS_FPU);
 809    GET_FEATURE(PPC_ALTIVEC, QEMU_PPC_FEATURE_HAS_ALTIVEC);
 810    GET_FEATURE(PPC_SPE, QEMU_PPC_FEATURE_HAS_SPE);
 811    GET_FEATURE(PPC_SPE_SINGLE, QEMU_PPC_FEATURE_HAS_EFP_SINGLE);
 812    GET_FEATURE(PPC_SPE_DOUBLE, QEMU_PPC_FEATURE_HAS_EFP_DOUBLE);
 813    GET_FEATURE(PPC_BOOKE, QEMU_PPC_FEATURE_BOOKE);
 814    GET_FEATURE(PPC_405_MAC, QEMU_PPC_FEATURE_HAS_4xxMAC);
 815    GET_FEATURE2(PPC2_DFP, QEMU_PPC_FEATURE_HAS_DFP);
 816    GET_FEATURE2(PPC2_VSX, QEMU_PPC_FEATURE_HAS_VSX);
 817    GET_FEATURE2((PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 | PPC2_ATOMIC_ISA206 |
 818                  PPC2_FP_CVT_ISA206 | PPC2_FP_TST_ISA206),
 819                  QEMU_PPC_FEATURE_ARCH_2_06);
 820#undef GET_FEATURE
 821#undef GET_FEATURE2
 822
 823    return features;
 824}
 825
 826#define ELF_HWCAP2 get_elf_hwcap2()
 827
 828static uint32_t get_elf_hwcap2(void)
 829{
 830    PowerPCCPU *cpu = POWERPC_CPU(thread_cpu);
 831    uint32_t features = 0;
 832
 833#define GET_FEATURE(flag, feature)                                      \
 834    do { if (cpu->env.insns_flags & flag) { features |= feature; } } while (0)
 835#define GET_FEATURE2(flag, feature)                                      \
 836    do { if (cpu->env.insns_flags2 & flag) { features |= feature; } } while (0)
 837
 838    GET_FEATURE(PPC_ISEL, QEMU_PPC_FEATURE2_HAS_ISEL);
 839    GET_FEATURE2(PPC2_BCTAR_ISA207, QEMU_PPC_FEATURE2_HAS_TAR);
 840    GET_FEATURE2((PPC2_BCTAR_ISA207 | PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
 841                  PPC2_ISA207S), QEMU_PPC_FEATURE2_ARCH_2_07 |
 842                  QEMU_PPC_FEATURE2_VEC_CRYPTO);
 843    GET_FEATURE2(PPC2_ISA300, QEMU_PPC_FEATURE2_ARCH_3_00 |
 844                 QEMU_PPC_FEATURE2_DARN);
 845
 846#undef GET_FEATURE
 847#undef GET_FEATURE2
 848
 849    return features;
 850}
 851
 852/*
 853 * The requirements here are:
 854 * - keep the final alignment of sp (sp & 0xf)
 855 * - make sure the 32-bit value at the first 16 byte aligned position of
 856 *   AUXV is greater than 16 for glibc compatibility.
 857 *   AT_IGNOREPPC is used for that.
 858 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
 859 *   even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
 860 */
 861#define DLINFO_ARCH_ITEMS       5
 862#define ARCH_DLINFO                                     \
 863    do {                                                \
 864        PowerPCCPU *cpu = POWERPC_CPU(thread_cpu);              \
 865        /*                                              \
 866         * Handle glibc compatibility: these magic entries must \
 867         * be at the lowest addresses in the final auxv.        \
 868         */                                             \
 869        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);        \
 870        NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC);        \
 871        NEW_AUX_ENT(AT_DCACHEBSIZE, cpu->env.dcache_line_size); \
 872        NEW_AUX_ENT(AT_ICACHEBSIZE, cpu->env.icache_line_size); \
 873        NEW_AUX_ENT(AT_UCACHEBSIZE, 0);                 \
 874    } while (0)
 875
 876static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
 877{
 878    _regs->gpr[1] = infop->start_stack;
 879#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
 880    if (get_ppc64_abi(infop) < 2) {
 881        uint64_t val;
 882        get_user_u64(val, infop->entry + 8);
 883        _regs->gpr[2] = val + infop->load_bias;
 884        get_user_u64(val, infop->entry);
 885        infop->entry = val + infop->load_bias;
 886    } else {
 887        _regs->gpr[12] = infop->entry;  /* r12 set to global entry address */
 888    }
 889#endif
 890    _regs->nip = infop->entry;
 891}
 892
 893/* See linux kernel: arch/powerpc/include/asm/elf.h.  */
 894#define ELF_NREG 48
 895typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
 896
 897static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *env)
 898{
 899    int i;
 900    target_ulong ccr = 0;
 901
 902    for (i = 0; i < ARRAY_SIZE(env->gpr); i++) {
 903        (*regs)[i] = tswapreg(env->gpr[i]);
 904    }
 905
 906    (*regs)[32] = tswapreg(env->nip);
 907    (*regs)[33] = tswapreg(env->msr);
 908    (*regs)[35] = tswapreg(env->ctr);
 909    (*regs)[36] = tswapreg(env->lr);
 910    (*regs)[37] = tswapreg(env->xer);
 911
 912    for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
 913        ccr |= env->crf[i] << (32 - ((i + 1) * 4));
 914    }
 915    (*regs)[38] = tswapreg(ccr);
 916}
 917
 918#define USE_ELF_CORE_DUMP
 919#define ELF_EXEC_PAGESIZE       4096
 920
 921#endif
 922
 923#ifdef TARGET_MIPS
 924
 925#define ELF_START_MMAP 0x80000000
 926
 927#ifdef TARGET_MIPS64
 928#define ELF_CLASS   ELFCLASS64
 929#else
 930#define ELF_CLASS   ELFCLASS32
 931#endif
 932#define ELF_ARCH    EM_MIPS
 933
 934#define elf_check_arch(x) ((x) == EM_MIPS || (x) == EM_NANOMIPS)
 935
 936#ifdef TARGET_ABI_MIPSN32
 937#define elf_check_abi(x) ((x) & EF_MIPS_ABI2)
 938#else
 939#define elf_check_abi(x) (!((x) & EF_MIPS_ABI2))
 940#endif
 941
 942static inline void init_thread(struct target_pt_regs *regs,
 943                               struct image_info *infop)
 944{
 945    regs->cp0_status = 2 << CP0St_KSU;
 946    regs->cp0_epc = infop->entry;
 947    regs->regs[29] = infop->start_stack;
 948}
 949
 950/* See linux kernel: arch/mips/include/asm/elf.h.  */
 951#define ELF_NREG 45
 952typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
 953
 954/* See linux kernel: arch/mips/include/asm/reg.h.  */
 955enum {
 956#ifdef TARGET_MIPS64
 957    TARGET_EF_R0 = 0,
 958#else
 959    TARGET_EF_R0 = 6,
 960#endif
 961    TARGET_EF_R26 = TARGET_EF_R0 + 26,
 962    TARGET_EF_R27 = TARGET_EF_R0 + 27,
 963    TARGET_EF_LO = TARGET_EF_R0 + 32,
 964    TARGET_EF_HI = TARGET_EF_R0 + 33,
 965    TARGET_EF_CP0_EPC = TARGET_EF_R0 + 34,
 966    TARGET_EF_CP0_BADVADDR = TARGET_EF_R0 + 35,
 967    TARGET_EF_CP0_STATUS = TARGET_EF_R0 + 36,
 968    TARGET_EF_CP0_CAUSE = TARGET_EF_R0 + 37
 969};
 970
 971/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
 972static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMIPSState *env)
 973{
 974    int i;
 975
 976    for (i = 0; i < TARGET_EF_R0; i++) {
 977        (*regs)[i] = 0;
 978    }
 979    (*regs)[TARGET_EF_R0] = 0;
 980
 981    for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) {
 982        (*regs)[TARGET_EF_R0 + i] = tswapreg(env->active_tc.gpr[i]);
 983    }
 984
 985    (*regs)[TARGET_EF_R26] = 0;
 986    (*regs)[TARGET_EF_R27] = 0;
 987    (*regs)[TARGET_EF_LO] = tswapreg(env->active_tc.LO[0]);
 988    (*regs)[TARGET_EF_HI] = tswapreg(env->active_tc.HI[0]);
 989    (*regs)[TARGET_EF_CP0_EPC] = tswapreg(env->active_tc.PC);
 990    (*regs)[TARGET_EF_CP0_BADVADDR] = tswapreg(env->CP0_BadVAddr);
 991    (*regs)[TARGET_EF_CP0_STATUS] = tswapreg(env->CP0_Status);
 992    (*regs)[TARGET_EF_CP0_CAUSE] = tswapreg(env->CP0_Cause);
 993}
 994
 995#define USE_ELF_CORE_DUMP
 996#define ELF_EXEC_PAGESIZE        4096
 997
 998/* See arch/mips/include/uapi/asm/hwcap.h.  */
 999enum {
1000    HWCAP_MIPS_R6           = (1 << 0),
1001    HWCAP_MIPS_MSA          = (1 << 1),
1002    HWCAP_MIPS_CRC32        = (1 << 2),
1003    HWCAP_MIPS_MIPS16       = (1 << 3),
1004    HWCAP_MIPS_MDMX         = (1 << 4),
1005    HWCAP_MIPS_MIPS3D       = (1 << 5),
1006    HWCAP_MIPS_SMARTMIPS    = (1 << 6),
1007    HWCAP_MIPS_DSP          = (1 << 7),
1008    HWCAP_MIPS_DSP2         = (1 << 8),
1009    HWCAP_MIPS_DSP3         = (1 << 9),
1010    HWCAP_MIPS_MIPS16E2     = (1 << 10),
1011    HWCAP_LOONGSON_MMI      = (1 << 11),
1012    HWCAP_LOONGSON_EXT      = (1 << 12),
1013    HWCAP_LOONGSON_EXT2     = (1 << 13),
1014    HWCAP_LOONGSON_CPUCFG   = (1 << 14),
1015};
1016
1017#define ELF_HWCAP get_elf_hwcap()
1018
1019#define GET_FEATURE_INSN(_flag, _hwcap) \
1020    do { if (cpu->env.insn_flags & (_flag)) { hwcaps |= _hwcap; } } while (0)
1021
1022#define GET_FEATURE_REG_SET(_reg, _mask, _hwcap) \
1023    do { if (cpu->env._reg & (_mask)) { hwcaps |= _hwcap; } } while (0)
1024
1025#define GET_FEATURE_REG_EQU(_reg, _start, _length, _val, _hwcap) \
1026    do { \
1027        if (extract32(cpu->env._reg, (_start), (_length)) == (_val)) { \
1028            hwcaps |= _hwcap; \
1029        } \
1030    } while (0)
1031
1032static uint32_t get_elf_hwcap(void)
1033{
1034    MIPSCPU *cpu = MIPS_CPU(thread_cpu);
1035    uint32_t hwcaps = 0;
1036
1037    GET_FEATURE_REG_EQU(CP0_Config0, CP0C0_AR, CP0C0_AR_LENGTH,
1038                        2, HWCAP_MIPS_R6);
1039    GET_FEATURE_REG_SET(CP0_Config3, 1 << CP0C3_MSAP, HWCAP_MIPS_MSA);
1040    GET_FEATURE_INSN(ASE_LMMI, HWCAP_LOONGSON_MMI);
1041    GET_FEATURE_INSN(ASE_LEXT, HWCAP_LOONGSON_EXT);
1042
1043    return hwcaps;
1044}
1045
1046#undef GET_FEATURE_REG_EQU
1047#undef GET_FEATURE_REG_SET
1048#undef GET_FEATURE_INSN
1049
1050#endif /* TARGET_MIPS */
1051
1052#ifdef TARGET_MICROBLAZE
1053
1054#define ELF_START_MMAP 0x80000000
1055
1056#define elf_check_arch(x) ( (x) == EM_MICROBLAZE || (x) == EM_MICROBLAZE_OLD)
1057
1058#define ELF_CLASS   ELFCLASS32
1059#define ELF_ARCH    EM_MICROBLAZE
1060
1061static inline void init_thread(struct target_pt_regs *regs,
1062                               struct image_info *infop)
1063{
1064    regs->pc = infop->entry;
1065    regs->r1 = infop->start_stack;
1066
1067}
1068
1069#define ELF_EXEC_PAGESIZE        4096
1070
1071#define USE_ELF_CORE_DUMP
1072#define ELF_NREG 38
1073typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
1074
1075/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
1076static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMBState *env)
1077{
1078    int i, pos = 0;
1079
1080    for (i = 0; i < 32; i++) {
1081        (*regs)[pos++] = tswapreg(env->regs[i]);
1082    }
1083
1084    (*regs)[pos++] = tswapreg(env->pc);
1085    (*regs)[pos++] = tswapreg(mb_cpu_read_msr(env));
1086    (*regs)[pos++] = 0;
1087    (*regs)[pos++] = tswapreg(env->ear);
1088    (*regs)[pos++] = 0;
1089    (*regs)[pos++] = tswapreg(env->esr);
1090}
1091
1092#endif /* TARGET_MICROBLAZE */
1093
1094#ifdef TARGET_NIOS2
1095
1096#define ELF_START_MMAP 0x80000000
1097
1098#define elf_check_arch(x) ((x) == EM_ALTERA_NIOS2)
1099
1100#define ELF_CLASS   ELFCLASS32
1101#define ELF_ARCH    EM_ALTERA_NIOS2
1102
1103static void init_thread(struct target_pt_regs *regs, struct image_info *infop)
1104{
1105    regs->ea = infop->entry;
1106    regs->sp = infop->start_stack;
1107    regs->estatus = 0x3;
1108}
1109
1110#define ELF_EXEC_PAGESIZE        4096
1111
1112#define USE_ELF_CORE_DUMP
1113#define ELF_NREG 49
1114typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
1115
1116/* See linux kernel: arch/mips/kernel/process.c:elf_dump_regs.  */
1117static void elf_core_copy_regs(target_elf_gregset_t *regs,
1118                               const CPUNios2State *env)
1119{
1120    int i;
1121
1122    (*regs)[0] = -1;
1123    for (i = 1; i < 8; i++)    /* r0-r7 */
1124        (*regs)[i] = tswapreg(env->regs[i + 7]);
1125
1126    for (i = 8; i < 16; i++)   /* r8-r15 */
1127        (*regs)[i] = tswapreg(env->regs[i - 8]);
1128
1129    for (i = 16; i < 24; i++)  /* r16-r23 */
1130        (*regs)[i] = tswapreg(env->regs[i + 7]);
1131    (*regs)[24] = -1;    /* R_ET */
1132    (*regs)[25] = -1;    /* R_BT */
1133    (*regs)[26] = tswapreg(env->regs[R_GP]);
1134    (*regs)[27] = tswapreg(env->regs[R_SP]);
1135    (*regs)[28] = tswapreg(env->regs[R_FP]);
1136    (*regs)[29] = tswapreg(env->regs[R_EA]);
1137    (*regs)[30] = -1;    /* R_SSTATUS */
1138    (*regs)[31] = tswapreg(env->regs[R_RA]);
1139
1140    (*regs)[32] = tswapreg(env->regs[R_PC]);
1141
1142    (*regs)[33] = -1; /* R_STATUS */
1143    (*regs)[34] = tswapreg(env->regs[CR_ESTATUS]);
1144
1145    for (i = 35; i < 49; i++)    /* ... */
1146        (*regs)[i] = -1;
1147}
1148
1149#endif /* TARGET_NIOS2 */
1150
1151#ifdef TARGET_OPENRISC
1152
1153#define ELF_START_MMAP 0x08000000
1154
1155#define ELF_ARCH EM_OPENRISC
1156#define ELF_CLASS ELFCLASS32
1157#define ELF_DATA  ELFDATA2MSB
1158
1159static inline void init_thread(struct target_pt_regs *regs,
1160                               struct image_info *infop)
1161{
1162    regs->pc = infop->entry;
1163    regs->gpr[1] = infop->start_stack;
1164}
1165
1166#define USE_ELF_CORE_DUMP
1167#define ELF_EXEC_PAGESIZE 8192
1168
1169/* See linux kernel arch/openrisc/include/asm/elf.h.  */
1170#define ELF_NREG 34 /* gprs and pc, sr */
1171typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
1172
1173static void elf_core_copy_regs(target_elf_gregset_t *regs,
1174                               const CPUOpenRISCState *env)
1175{
1176    int i;
1177
1178    for (i = 0; i < 32; i++) {
1179        (*regs)[i] = tswapreg(cpu_get_gpr(env, i));
1180    }
1181    (*regs)[32] = tswapreg(env->pc);
1182    (*regs)[33] = tswapreg(cpu_get_sr(env));
1183}
1184#define ELF_HWCAP 0
1185#define ELF_PLATFORM NULL
1186
1187#endif /* TARGET_OPENRISC */
1188
1189#ifdef TARGET_SH4
1190
1191#define ELF_START_MMAP 0x80000000
1192
1193#define ELF_CLASS ELFCLASS32
1194#define ELF_ARCH  EM_SH
1195
1196static inline void init_thread(struct target_pt_regs *regs,
1197                               struct image_info *infop)
1198{
1199    /* Check other registers XXXXX */
1200    regs->pc = infop->entry;
1201    regs->regs[15] = infop->start_stack;
1202}
1203
1204/* See linux kernel: arch/sh/include/asm/elf.h.  */
1205#define ELF_NREG 23
1206typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
1207
1208/* See linux kernel: arch/sh/include/asm/ptrace.h.  */
1209enum {
1210    TARGET_REG_PC = 16,
1211    TARGET_REG_PR = 17,
1212    TARGET_REG_SR = 18,
1213    TARGET_REG_GBR = 19,
1214    TARGET_REG_MACH = 20,
1215    TARGET_REG_MACL = 21,
1216    TARGET_REG_SYSCALL = 22
1217};
1218
1219static inline void elf_core_copy_regs(target_elf_gregset_t *regs,
1220                                      const CPUSH4State *env)
1221{
1222    int i;
1223
1224    for (i = 0; i < 16; i++) {
1225        (*regs)[i] = tswapreg(env->gregs[i]);
1226    }
1227
1228    (*regs)[TARGET_REG_PC] = tswapreg(env->pc);
1229    (*regs)[TARGET_REG_PR] = tswapreg(env->pr);
1230    (*regs)[TARGET_REG_SR] = tswapreg(env->sr);
1231    (*regs)[TARGET_REG_GBR] = tswapreg(env->gbr);
1232    (*regs)[TARGET_REG_MACH] = tswapreg(env->mach);
1233    (*regs)[TARGET_REG_MACL] = tswapreg(env->macl);
1234    (*regs)[TARGET_REG_SYSCALL] = 0; /* FIXME */
1235}
1236
1237#define USE_ELF_CORE_DUMP
1238#define ELF_EXEC_PAGESIZE        4096
1239
1240enum {
1241    SH_CPU_HAS_FPU            = 0x0001, /* Hardware FPU support */
1242    SH_CPU_HAS_P2_FLUSH_BUG   = 0x0002, /* Need to flush the cache in P2 area */
1243    SH_CPU_HAS_MMU_PAGE_ASSOC = 0x0004, /* SH3: TLB way selection bit support */
1244    SH_CPU_HAS_DSP            = 0x0008, /* SH-DSP: DSP support */
1245    SH_CPU_HAS_PERF_COUNTER   = 0x0010, /* Hardware performance counters */
1246    SH_CPU_HAS_PTEA           = 0x0020, /* PTEA register */
1247    SH_CPU_HAS_LLSC           = 0x0040, /* movli.l/movco.l */
1248    SH_CPU_HAS_L2_CACHE       = 0x0080, /* Secondary cache / URAM */
1249    SH_CPU_HAS_OP32           = 0x0100, /* 32-bit instruction support */
1250    SH_CPU_HAS_PTEAEX         = 0x0200, /* PTE ASID Extension support */
1251};
1252
1253#define ELF_HWCAP get_elf_hwcap()
1254
1255static uint32_t get_elf_hwcap(void)
1256{
1257    SuperHCPU *cpu = SUPERH_CPU(thread_cpu);
1258    uint32_t hwcap = 0;
1259
1260    hwcap |= SH_CPU_HAS_FPU;
1261
1262    if (cpu->env.features & SH_FEATURE_SH4A) {
1263        hwcap |= SH_CPU_HAS_LLSC;
1264    }
1265
1266    return hwcap;
1267}
1268
1269#endif
1270
1271#ifdef TARGET_CRIS
1272
1273#define ELF_START_MMAP 0x80000000
1274
1275#define ELF_CLASS ELFCLASS32
1276#define ELF_ARCH  EM_CRIS
1277
1278static inline void init_thread(struct target_pt_regs *regs,
1279                               struct image_info *infop)
1280{
1281    regs->erp = infop->entry;
1282}
1283
1284#define ELF_EXEC_PAGESIZE        8192
1285
1286#endif
1287
1288#ifdef TARGET_M68K
1289
1290#define ELF_START_MMAP 0x80000000
1291
1292#define ELF_CLASS       ELFCLASS32
1293#define ELF_ARCH        EM_68K
1294
1295/* ??? Does this need to do anything?
1296   #define ELF_PLAT_INIT(_r) */
1297
1298static inline void init_thread(struct target_pt_regs *regs,
1299                               struct image_info *infop)
1300{
1301    regs->usp = infop->start_stack;
1302    regs->sr = 0;
1303    regs->pc = infop->entry;
1304}
1305
1306/* See linux kernel: arch/m68k/include/asm/elf.h.  */
1307#define ELF_NREG 20
1308typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
1309
1310static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUM68KState *env)
1311{
1312    (*regs)[0] = tswapreg(env->dregs[1]);
1313    (*regs)[1] = tswapreg(env->dregs[2]);
1314    (*regs)[2] = tswapreg(env->dregs[3]);
1315    (*regs)[3] = tswapreg(env->dregs[4]);
1316    (*regs)[4] = tswapreg(env->dregs[5]);
1317    (*regs)[5] = tswapreg(env->dregs[6]);
1318    (*regs)[6] = tswapreg(env->dregs[7]);
1319    (*regs)[7] = tswapreg(env->aregs[0]);
1320    (*regs)[8] = tswapreg(env->aregs[1]);
1321    (*regs)[9] = tswapreg(env->aregs[2]);
1322    (*regs)[10] = tswapreg(env->aregs[3]);
1323    (*regs)[11] = tswapreg(env->aregs[4]);
1324    (*regs)[12] = tswapreg(env->aregs[5]);
1325    (*regs)[13] = tswapreg(env->aregs[6]);
1326    (*regs)[14] = tswapreg(env->dregs[0]);
1327    (*regs)[15] = tswapreg(env->aregs[7]);
1328    (*regs)[16] = tswapreg(env->dregs[0]); /* FIXME: orig_d0 */
1329    (*regs)[17] = tswapreg(env->sr);
1330    (*regs)[18] = tswapreg(env->pc);
1331    (*regs)[19] = 0;  /* FIXME: regs->format | regs->vector */
1332}
1333
1334#define USE_ELF_CORE_DUMP
1335#define ELF_EXEC_PAGESIZE       8192
1336
1337#endif
1338
1339#ifdef TARGET_ALPHA
1340
1341#define ELF_START_MMAP (0x30000000000ULL)
1342
1343#define ELF_CLASS      ELFCLASS64
1344#define ELF_ARCH       EM_ALPHA
1345
1346static inline void init_thread(struct target_pt_regs *regs,
1347                               struct image_info *infop)
1348{
1349    regs->pc = infop->entry;
1350    regs->ps = 8;
1351    regs->usp = infop->start_stack;
1352}
1353
1354#define ELF_EXEC_PAGESIZE        8192
1355
1356#endif /* TARGET_ALPHA */
1357
1358#ifdef TARGET_S390X
1359
1360#define ELF_START_MMAP (0x20000000000ULL)
1361
1362#define ELF_CLASS       ELFCLASS64
1363#define ELF_DATA        ELFDATA2MSB
1364#define ELF_ARCH        EM_S390
1365
1366#include "elf.h"
1367
1368#define ELF_HWCAP get_elf_hwcap()
1369
1370#define GET_FEATURE(_feat, _hwcap) \
1371    do { if (s390_has_feat(_feat)) { hwcap |= _hwcap; } } while (0)
1372
1373static uint32_t get_elf_hwcap(void)
1374{
1375    /*
1376     * Let's assume we always have esan3 and zarch.
1377     * 31-bit processes can use 64-bit registers (high gprs).
1378     */
1379    uint32_t hwcap = HWCAP_S390_ESAN3 | HWCAP_S390_ZARCH | HWCAP_S390_HIGH_GPRS;
1380
1381    GET_FEATURE(S390_FEAT_STFLE, HWCAP_S390_STFLE);
1382    GET_FEATURE(S390_FEAT_MSA, HWCAP_S390_MSA);
1383    GET_FEATURE(S390_FEAT_LONG_DISPLACEMENT, HWCAP_S390_LDISP);
1384    GET_FEATURE(S390_FEAT_EXTENDED_IMMEDIATE, HWCAP_S390_EIMM);
1385    if (s390_has_feat(S390_FEAT_EXTENDED_TRANSLATION_3) &&
1386        s390_has_feat(S390_FEAT_ETF3_ENH)) {
1387        hwcap |= HWCAP_S390_ETF3EH;
1388    }
1389    GET_FEATURE(S390_FEAT_VECTOR, HWCAP_S390_VXRS);
1390
1391    return hwcap;
1392}
1393
1394static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
1395{
1396    regs->psw.addr = infop->entry;
1397    regs->psw.mask = PSW_MASK_64 | PSW_MASK_32;
1398    regs->gprs[15] = infop->start_stack;
1399}
1400
1401#endif /* TARGET_S390X */
1402
1403#ifdef TARGET_RISCV
1404
1405#define ELF_START_MMAP 0x80000000
1406#define ELF_ARCH  EM_RISCV
1407
1408#ifdef TARGET_RISCV32
1409#define ELF_CLASS ELFCLASS32
1410#else
1411#define ELF_CLASS ELFCLASS64
1412#endif
1413
1414static inline void init_thread(struct target_pt_regs *regs,
1415                               struct image_info *infop)
1416{
1417    regs->sepc = infop->entry;
1418    regs->sp = infop->start_stack;
1419}
1420
1421#define ELF_EXEC_PAGESIZE 4096
1422
1423#endif /* TARGET_RISCV */
1424
1425#ifdef TARGET_HPPA
1426
1427#define ELF_START_MMAP  0x80000000
1428#define ELF_CLASS       ELFCLASS32
1429#define ELF_ARCH        EM_PARISC
1430#define ELF_PLATFORM    "PARISC"
1431#define STACK_GROWS_DOWN 0
1432#define STACK_ALIGNMENT  64
1433
1434static inline void init_thread(struct target_pt_regs *regs,
1435                               struct image_info *infop)
1436{
1437    regs->iaoq[0] = infop->entry;
1438    regs->iaoq[1] = infop->entry + 4;
1439    regs->gr[23] = 0;
1440    regs->gr[24] = infop->arg_start;
1441    regs->gr[25] = (infop->arg_end - infop->arg_start) / sizeof(abi_ulong);
1442    /* The top-of-stack contains a linkage buffer.  */
1443    regs->gr[30] = infop->start_stack + 64;
1444    regs->gr[31] = infop->entry;
1445}
1446
1447#endif /* TARGET_HPPA */
1448
1449#ifdef TARGET_XTENSA
1450
1451#define ELF_START_MMAP 0x20000000
1452
1453#define ELF_CLASS       ELFCLASS32
1454#define ELF_ARCH        EM_XTENSA
1455
1456static inline void init_thread(struct target_pt_regs *regs,
1457                               struct image_info *infop)
1458{
1459    regs->windowbase = 0;
1460    regs->windowstart = 1;
1461    regs->areg[1] = infop->start_stack;
1462    regs->pc = infop->entry;
1463}
1464
1465/* See linux kernel: arch/xtensa/include/asm/elf.h.  */
1466#define ELF_NREG 128
1467typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
1468
1469enum {
1470    TARGET_REG_PC,
1471    TARGET_REG_PS,
1472    TARGET_REG_LBEG,
1473    TARGET_REG_LEND,
1474    TARGET_REG_LCOUNT,
1475    TARGET_REG_SAR,
1476    TARGET_REG_WINDOWSTART,
1477    TARGET_REG_WINDOWBASE,
1478    TARGET_REG_THREADPTR,
1479    TARGET_REG_AR0 = 64,
1480};
1481
1482static void elf_core_copy_regs(target_elf_gregset_t *regs,
1483                               const CPUXtensaState *env)
1484{
1485    unsigned i;
1486
1487    (*regs)[TARGET_REG_PC] = tswapreg(env->pc);
1488    (*regs)[TARGET_REG_PS] = tswapreg(env->sregs[PS] & ~PS_EXCM);
1489    (*regs)[TARGET_REG_LBEG] = tswapreg(env->sregs[LBEG]);
1490    (*regs)[TARGET_REG_LEND] = tswapreg(env->sregs[LEND]);
1491    (*regs)[TARGET_REG_LCOUNT] = tswapreg(env->sregs[LCOUNT]);
1492    (*regs)[TARGET_REG_SAR] = tswapreg(env->sregs[SAR]);
1493    (*regs)[TARGET_REG_WINDOWSTART] = tswapreg(env->sregs[WINDOW_START]);
1494    (*regs)[TARGET_REG_WINDOWBASE] = tswapreg(env->sregs[WINDOW_BASE]);
1495    (*regs)[TARGET_REG_THREADPTR] = tswapreg(env->uregs[THREADPTR]);
1496    xtensa_sync_phys_from_window((CPUXtensaState *)env);
1497    for (i = 0; i < env->config->nareg; ++i) {
1498        (*regs)[TARGET_REG_AR0 + i] = tswapreg(env->phys_regs[i]);
1499    }
1500}
1501
1502#define USE_ELF_CORE_DUMP
1503#define ELF_EXEC_PAGESIZE       4096
1504
1505#endif /* TARGET_XTENSA */
1506
1507#ifdef TARGET_HEXAGON
1508
1509#define ELF_START_MMAP 0x20000000
1510
1511#define ELF_CLASS       ELFCLASS32
1512#define ELF_ARCH        EM_HEXAGON
1513
1514static inline void init_thread(struct target_pt_regs *regs,
1515                               struct image_info *infop)
1516{
1517    regs->sepc = infop->entry;
1518    regs->sp = infop->start_stack;
1519}
1520
1521#endif /* TARGET_HEXAGON */
1522
1523#ifndef ELF_PLATFORM
1524#define ELF_PLATFORM (NULL)
1525#endif
1526
1527#ifndef ELF_MACHINE
1528#define ELF_MACHINE ELF_ARCH
1529#endif
1530
1531#ifndef elf_check_arch
1532#define elf_check_arch(x) ((x) == ELF_ARCH)
1533#endif
1534
1535#ifndef elf_check_abi
1536#define elf_check_abi(x) (1)
1537#endif
1538
1539#ifndef ELF_HWCAP
1540#define ELF_HWCAP 0
1541#endif
1542
1543#ifndef STACK_GROWS_DOWN
1544#define STACK_GROWS_DOWN 1
1545#endif
1546
1547#ifndef STACK_ALIGNMENT
1548#define STACK_ALIGNMENT 16
1549#endif
1550
1551#ifdef TARGET_ABI32
1552#undef ELF_CLASS
1553#define ELF_CLASS ELFCLASS32
1554#undef bswaptls
1555#define bswaptls(ptr) bswap32s(ptr)
1556#endif
1557
1558#include "elf.h"
1559
1560/* We must delay the following stanzas until after "elf.h". */
1561#if defined(TARGET_AARCH64)
1562
1563static bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
1564                                    const uint32_t *data,
1565                                    struct image_info *info,
1566                                    Error **errp)
1567{
1568    if (pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND) {
1569        if (pr_datasz != sizeof(uint32_t)) {
1570            error_setg(errp, "Ill-formed GNU_PROPERTY_AARCH64_FEATURE_1_AND");
1571            return false;
1572        }
1573        /* We will extract GNU_PROPERTY_AARCH64_FEATURE_1_BTI later. */
1574        info->note_flags = *data;
1575    }
1576    return true;
1577}
1578#define ARCH_USE_GNU_PROPERTY 1
1579
1580#else
1581
1582static bool arch_parse_elf_property(uint32_t pr_type, uint32_t pr_datasz,
1583                                    const uint32_t *data,
1584                                    struct image_info *info,
1585                                    Error **errp)
1586{
1587    g_assert_not_reached();
1588}
1589#define ARCH_USE_GNU_PROPERTY 0
1590
1591#endif
1592
1593struct exec
1594{
1595    unsigned int a_info;   /* Use macros N_MAGIC, etc for access */
1596    unsigned int a_text;   /* length of text, in bytes */
1597    unsigned int a_data;   /* length of data, in bytes */
1598    unsigned int a_bss;    /* length of uninitialized data area, in bytes */
1599    unsigned int a_syms;   /* length of symbol table data in file, in bytes */
1600    unsigned int a_entry;  /* start address */
1601    unsigned int a_trsize; /* length of relocation info for text, in bytes */
1602    unsigned int a_drsize; /* length of relocation info for data, in bytes */
1603};
1604
1605
1606#define N_MAGIC(exec) ((exec).a_info & 0xffff)
1607#define OMAGIC 0407
1608#define NMAGIC 0410
1609#define ZMAGIC 0413
1610#define QMAGIC 0314
1611
1612/* Necessary parameters */
1613#define TARGET_ELF_EXEC_PAGESIZE \
1614        (((eppnt->p_align & ~qemu_host_page_mask) != 0) ? \
1615         TARGET_PAGE_SIZE : MAX(qemu_host_page_size, TARGET_PAGE_SIZE))
1616#define TARGET_ELF_PAGELENGTH(_v) ROUND_UP((_v), TARGET_ELF_EXEC_PAGESIZE)
1617#define TARGET_ELF_PAGESTART(_v) ((_v) & \
1618                                 ~(abi_ulong)(TARGET_ELF_EXEC_PAGESIZE-1))
1619#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
1620
1621#define DLINFO_ITEMS 16
1622
1623static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
1624{
1625    memcpy(to, from, n);
1626}
1627
1628#ifdef BSWAP_NEEDED
1629static void bswap_ehdr(struct elfhdr *ehdr)
1630{
1631    bswap16s(&ehdr->e_type);            /* Object file type */
1632    bswap16s(&ehdr->e_machine);         /* Architecture */
1633    bswap32s(&ehdr->e_version);         /* Object file version */
1634    bswaptls(&ehdr->e_entry);           /* Entry point virtual address */
1635    bswaptls(&ehdr->e_phoff);           /* Program header table file offset */
1636    bswaptls(&ehdr->e_shoff);           /* Section header table file offset */
1637    bswap32s(&ehdr->e_flags);           /* Processor-specific flags */
1638    bswap16s(&ehdr->e_ehsize);          /* ELF header size in bytes */
1639    bswap16s(&ehdr->e_phentsize);       /* Program header table entry size */
1640    bswap16s(&ehdr->e_phnum);           /* Program header table entry count */
1641    bswap16s(&ehdr->e_shentsize);       /* Section header table entry size */
1642    bswap16s(&ehdr->e_shnum);           /* Section header table entry count */
1643    bswap16s(&ehdr->e_shstrndx);        /* Section header string table index */
1644}
1645
1646static void bswap_phdr(struct elf_phdr *phdr, int phnum)
1647{
1648    int i;
1649    for (i = 0; i < phnum; ++i, ++phdr) {
1650        bswap32s(&phdr->p_type);        /* Segment type */
1651        bswap32s(&phdr->p_flags);       /* Segment flags */
1652        bswaptls(&phdr->p_offset);      /* Segment file offset */
1653        bswaptls(&phdr->p_vaddr);       /* Segment virtual address */
1654        bswaptls(&phdr->p_paddr);       /* Segment physical address */
1655        bswaptls(&phdr->p_filesz);      /* Segment size in file */
1656        bswaptls(&phdr->p_memsz);       /* Segment size in memory */
1657        bswaptls(&phdr->p_align);       /* Segment alignment */
1658    }
1659}
1660
1661static void bswap_shdr(struct elf_shdr *shdr, int shnum)
1662{
1663    int i;
1664    for (i = 0; i < shnum; ++i, ++shdr) {
1665        bswap32s(&shdr->sh_name);
1666        bswap32s(&shdr->sh_type);
1667        bswaptls(&shdr->sh_flags);
1668        bswaptls(&shdr->sh_addr);
1669        bswaptls(&shdr->sh_offset);
1670        bswaptls(&shdr->sh_size);
1671        bswap32s(&shdr->sh_link);
1672        bswap32s(&shdr->sh_info);
1673        bswaptls(&shdr->sh_addralign);
1674        bswaptls(&shdr->sh_entsize);
1675    }
1676}
1677
1678static void bswap_sym(struct elf_sym *sym)
1679{
1680    bswap32s(&sym->st_name);
1681    bswaptls(&sym->st_value);
1682    bswaptls(&sym->st_size);
1683    bswap16s(&sym->st_shndx);
1684}
1685
1686#ifdef TARGET_MIPS
1687static void bswap_mips_abiflags(Mips_elf_abiflags_v0 *abiflags)
1688{
1689    bswap16s(&abiflags->version);
1690    bswap32s(&abiflags->ases);
1691    bswap32s(&abiflags->isa_ext);
1692    bswap32s(&abiflags->flags1);
1693    bswap32s(&abiflags->flags2);
1694}
1695#endif
1696#else
1697static inline void bswap_ehdr(struct elfhdr *ehdr) { }
1698static inline void bswap_phdr(struct elf_phdr *phdr, int phnum) { }
1699static inline void bswap_shdr(struct elf_shdr *shdr, int shnum) { }
1700static inline void bswap_sym(struct elf_sym *sym) { }
1701#ifdef TARGET_MIPS
1702static inline void bswap_mips_abiflags(Mips_elf_abiflags_v0 *abiflags) { }
1703#endif
1704#endif
1705
1706#ifdef USE_ELF_CORE_DUMP
1707static int elf_core_dump(int, const CPUArchState *);
1708#endif /* USE_ELF_CORE_DUMP */
1709static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias);
1710
1711/* Verify the portions of EHDR within E_IDENT for the target.
1712   This can be performed before bswapping the entire header.  */
1713static bool elf_check_ident(struct elfhdr *ehdr)
1714{
1715    return (ehdr->e_ident[EI_MAG0] == ELFMAG0
1716            && ehdr->e_ident[EI_MAG1] == ELFMAG1
1717            && ehdr->e_ident[EI_MAG2] == ELFMAG2
1718            && ehdr->e_ident[EI_MAG3] == ELFMAG3
1719            && ehdr->e_ident[EI_CLASS] == ELF_CLASS
1720            && ehdr->e_ident[EI_DATA] == ELF_DATA
1721            && ehdr->e_ident[EI_VERSION] == EV_CURRENT);
1722}
1723
1724/* Verify the portions of EHDR outside of E_IDENT for the target.
1725   This has to wait until after bswapping the header.  */
1726static bool elf_check_ehdr(struct elfhdr *ehdr)
1727{
1728    return (elf_check_arch(ehdr->e_machine)
1729            && elf_check_abi(ehdr->e_flags)
1730            && ehdr->e_ehsize == sizeof(struct elfhdr)
1731            && ehdr->e_phentsize == sizeof(struct elf_phdr)
1732            && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));
1733}
1734
1735/*
1736 * 'copy_elf_strings()' copies argument/envelope strings from user
1737 * memory to free pages in kernel mem. These are in a format ready
1738 * to be put directly into the top of new user memory.
1739 *
1740 */
1741static abi_ulong copy_elf_strings(int argc, char **argv, char *scratch,
1742                                  abi_ulong p, abi_ulong stack_limit)
1743{
1744    char *tmp;
1745    int len, i;
1746    abi_ulong top = p;
1747
1748    if (!p) {
1749        return 0;       /* bullet-proofing */
1750    }
1751
1752    if (STACK_GROWS_DOWN) {
1753        int offset = ((p - 1) % TARGET_PAGE_SIZE) + 1;
1754        for (i = argc - 1; i >= 0; --i) {
1755            tmp = argv[i];
1756            if (!tmp) {
1757                fprintf(stderr, "VFS: argc is wrong");
1758                exit(-1);
1759            }
1760            len = strlen(tmp) + 1;
1761            tmp += len;
1762
1763            if (len > (p - stack_limit)) {
1764                return 0;
1765            }
1766            while (len) {
1767                int bytes_to_copy = (len > offset) ? offset : len;
1768                tmp -= bytes_to_copy;
1769                p -= bytes_to_copy;
1770                offset -= bytes_to_copy;
1771                len -= bytes_to_copy;
1772
1773                memcpy_fromfs(scratch + offset, tmp, bytes_to_copy);
1774
1775                if (offset == 0) {
1776                    memcpy_to_target(p, scratch, top - p);
1777                    top = p;
1778                    offset = TARGET_PAGE_SIZE;
1779                }
1780            }
1781        }
1782        if (p != top) {
1783            memcpy_to_target(p, scratch + offset, top - p);
1784        }
1785    } else {
1786        int remaining = TARGET_PAGE_SIZE - (p % TARGET_PAGE_SIZE);
1787        for (i = 0; i < argc; ++i) {
1788            tmp = argv[i];
1789            if (!tmp) {
1790                fprintf(stderr, "VFS: argc is wrong");
1791                exit(-1);
1792            }
1793            len = strlen(tmp) + 1;
1794            if (len > (stack_limit - p)) {
1795                return 0;
1796            }
1797            while (len) {
1798                int bytes_to_copy = (len > remaining) ? remaining : len;
1799
1800                memcpy_fromfs(scratch + (p - top), tmp, bytes_to_copy);
1801
1802                tmp += bytes_to_copy;
1803                remaining -= bytes_to_copy;
1804                p += bytes_to_copy;
1805                len -= bytes_to_copy;
1806
1807                if (remaining == 0) {
1808                    memcpy_to_target(top, scratch, p - top);
1809                    top = p;
1810                    remaining = TARGET_PAGE_SIZE;
1811                }
1812            }
1813        }
1814        if (p != top) {
1815            memcpy_to_target(top, scratch, p - top);
1816        }
1817    }
1818
1819    return p;
1820}
1821
1822/* Older linux kernels provide up to MAX_ARG_PAGES (default: 32) of
1823 * argument/environment space. Newer kernels (>2.6.33) allow more,
1824 * dependent on stack size, but guarantee at least 32 pages for
1825 * backwards compatibility.
1826 */
1827#define STACK_LOWER_LIMIT (32 * TARGET_PAGE_SIZE)
1828
1829static abi_ulong setup_arg_pages(struct linux_binprm *bprm,
1830                                 struct image_info *info)
1831{
1832    abi_ulong size, error, guard;
1833
1834    size = guest_stack_size;
1835    if (size < STACK_LOWER_LIMIT) {
1836        size = STACK_LOWER_LIMIT;
1837    }
1838    guard = TARGET_PAGE_SIZE;
1839    if (guard < qemu_real_host_page_size) {
1840        guard = qemu_real_host_page_size;
1841    }
1842
1843    error = target_mmap(0, size + guard, PROT_READ | PROT_WRITE,
1844                        MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1845    if (error == -1) {
1846        perror("mmap stack");
1847        exit(-1);
1848    }
1849
1850    /* We reserve one extra page at the top of the stack as guard.  */
1851    if (STACK_GROWS_DOWN) {
1852        target_mprotect(error, guard, PROT_NONE);
1853        info->stack_limit = error + guard;
1854        return info->stack_limit + size - sizeof(void *);
1855    } else {
1856        target_mprotect(error + size, guard, PROT_NONE);
1857        info->stack_limit = error + size;
1858        return error;
1859    }
1860}
1861
1862/* Map and zero the bss.  We need to explicitly zero any fractional pages
1863   after the data section (i.e. bss).  */
1864static void zero_bss(abi_ulong elf_bss, abi_ulong last_bss, int prot)
1865{
1866    uintptr_t host_start, host_map_start, host_end;
1867
1868    last_bss = TARGET_PAGE_ALIGN(last_bss);
1869
1870    /* ??? There is confusion between qemu_real_host_page_size and
1871       qemu_host_page_size here and elsewhere in target_mmap, which
1872       may lead to the end of the data section mapping from the file
1873       not being mapped.  At least there was an explicit test and
1874       comment for that here, suggesting that "the file size must
1875       be known".  The comment probably pre-dates the introduction
1876       of the fstat system call in target_mmap which does in fact
1877       find out the size.  What isn't clear is if the workaround
1878       here is still actually needed.  For now, continue with it,
1879       but merge it with the "normal" mmap that would allocate the bss.  */
1880
1881    host_start = (uintptr_t) g2h_untagged(elf_bss);
1882    host_end = (uintptr_t) g2h_untagged(last_bss);
1883    host_map_start = REAL_HOST_PAGE_ALIGN(host_start);
1884
1885    if (host_map_start < host_end) {
1886        void *p = mmap((void *)host_map_start, host_end - host_map_start,
1887                       prot, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1888        if (p == MAP_FAILED) {
1889            perror("cannot mmap brk");
1890            exit(-1);
1891        }
1892    }
1893
1894    /* Ensure that the bss page(s) are valid */
1895    if ((page_get_flags(last_bss-1) & prot) != prot) {
1896        page_set_flags(elf_bss & TARGET_PAGE_MASK, last_bss, prot | PAGE_VALID);
1897    }
1898
1899    if (host_start < host_map_start) {
1900        memset((void *)host_start, 0, host_map_start - host_start);
1901    }
1902}
1903
1904#ifdef TARGET_ARM
1905static int elf_is_fdpic(struct elfhdr *exec)
1906{
1907    return exec->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC;
1908}
1909#else
1910/* Default implementation, always false.  */
1911static int elf_is_fdpic(struct elfhdr *exec)
1912{
1913    return 0;
1914}
1915#endif
1916
1917static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong sp)
1918{
1919    uint16_t n;
1920    struct elf32_fdpic_loadseg *loadsegs = info->loadsegs;
1921
1922    /* elf32_fdpic_loadseg */
1923    n = info->nsegs;
1924    while (n--) {
1925        sp -= 12;
1926        put_user_u32(loadsegs[n].addr, sp+0);
1927        put_user_u32(loadsegs[n].p_vaddr, sp+4);
1928        put_user_u32(loadsegs[n].p_memsz, sp+8);
1929    }
1930
1931    /* elf32_fdpic_loadmap */
1932    sp -= 4;
1933    put_user_u16(0, sp+0); /* version */
1934    put_user_u16(info->nsegs, sp+2); /* nsegs */
1935
1936    info->personality = PER_LINUX_FDPIC;
1937    info->loadmap_addr = sp;
1938
1939    return sp;
1940}
1941
1942static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
1943                                   struct elfhdr *exec,
1944                                   struct image_info *info,
1945                                   struct image_info *interp_info)
1946{
1947    abi_ulong sp;
1948    abi_ulong u_argc, u_argv, u_envp, u_auxv;
1949    int size;
1950    int i;
1951    abi_ulong u_rand_bytes;
1952    uint8_t k_rand_bytes[16];
1953    abi_ulong u_platform;
1954    const char *k_platform;
1955    const int n = sizeof(elf_addr_t);
1956
1957    sp = p;
1958
1959    /* Needs to be before we load the env/argc/... */
1960    if (elf_is_fdpic(exec)) {
1961        /* Need 4 byte alignment for these structs */
1962        sp &= ~3;
1963        sp = loader_build_fdpic_loadmap(info, sp);
1964        info->other_info = interp_info;
1965        if (interp_info) {
1966            interp_info->other_info = info;
1967            sp = loader_build_fdpic_loadmap(interp_info, sp);
1968            info->interpreter_loadmap_addr = interp_info->loadmap_addr;
1969            info->interpreter_pt_dynamic_addr = interp_info->pt_dynamic_addr;
1970        } else {
1971            info->interpreter_loadmap_addr = 0;
1972            info->interpreter_pt_dynamic_addr = 0;
1973        }
1974    }
1975
1976    u_platform = 0;
1977    k_platform = ELF_PLATFORM;
1978    if (k_platform) {
1979        size_t len = strlen(k_platform) + 1;
1980        if (STACK_GROWS_DOWN) {
1981            sp -= (len + n - 1) & ~(n - 1);
1982            u_platform = sp;
1983            /* FIXME - check return value of memcpy_to_target() for failure */
1984            memcpy_to_target(sp, k_platform, len);
1985        } else {
1986            memcpy_to_target(sp, k_platform, len);
1987            u_platform = sp;
1988            sp += len + 1;
1989        }
1990    }
1991
1992    /* Provide 16 byte alignment for the PRNG, and basic alignment for
1993     * the argv and envp pointers.
1994     */
1995    if (STACK_GROWS_DOWN) {
1996        sp = QEMU_ALIGN_DOWN(sp, 16);
1997    } else {
1998        sp = QEMU_ALIGN_UP(sp, 16);
1999    }
2000
2001    /*
2002     * Generate 16 random bytes for userspace PRNG seeding.
2003     */
2004    qemu_guest_getrandom_nofail(k_rand_bytes, sizeof(k_rand_bytes));
2005    if (STACK_GROWS_DOWN) {
2006        sp -= 16;
2007        u_rand_bytes = sp;
2008        /* FIXME - check return value of memcpy_to_target() for failure */
2009        memcpy_to_target(sp, k_rand_bytes, 16);
2010    } else {
2011        memcpy_to_target(sp, k_rand_bytes, 16);
2012        u_rand_bytes = sp;
2013        sp += 16;
2014    }
2015
2016    size = (DLINFO_ITEMS + 1) * 2;
2017    if (k_platform)
2018        size += 2;
2019#ifdef DLINFO_ARCH_ITEMS
2020    size += DLINFO_ARCH_ITEMS * 2;
2021#endif
2022#ifdef ELF_HWCAP2
2023    size += 2;
2024#endif
2025    info->auxv_len = size * n;
2026
2027    size += envc + argc + 2;
2028    size += 1;  /* argc itself */
2029    size *= n;
2030
2031    /* Allocate space and finalize stack alignment for entry now.  */
2032    if (STACK_GROWS_DOWN) {
2033        u_argc = QEMU_ALIGN_DOWN(sp - size, STACK_ALIGNMENT);
2034        sp = u_argc;
2035    } else {
2036        u_argc = sp;
2037        sp = QEMU_ALIGN_UP(sp + size, STACK_ALIGNMENT);
2038    }
2039
2040    u_argv = u_argc + n;
2041    u_envp = u_argv + (argc + 1) * n;
2042    u_auxv = u_envp + (envc + 1) * n;
2043    info->saved_auxv = u_auxv;
2044    info->arg_start = u_argv;
2045    info->arg_end = u_argv + argc * n;
2046
2047    /* This is correct because Linux defines
2048     * elf_addr_t as Elf32_Off / Elf64_Off
2049     */
2050#define NEW_AUX_ENT(id, val) do {               \
2051        put_user_ual(id, u_auxv);  u_auxv += n; \
2052        put_user_ual(val, u_auxv); u_auxv += n; \
2053    } while(0)
2054
2055#ifdef ARCH_DLINFO
2056    /*
2057     * ARCH_DLINFO must come first so platform specific code can enforce
2058     * special alignment requirements on the AUXV if necessary (eg. PPC).
2059     */
2060    ARCH_DLINFO;
2061#endif
2062    /* There must be exactly DLINFO_ITEMS entries here, or the assert
2063     * on info->auxv_len will trigger.
2064     */
2065    NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff));
2066    NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
2067    NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
2068    if ((info->alignment & ~qemu_host_page_mask) != 0) {
2069        /* Target doesn't support host page size alignment */
2070        NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
2071    } else {
2072        NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(MAX(TARGET_PAGE_SIZE,
2073                                               qemu_host_page_size)));
2074    }
2075    NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_info ? interp_info->load_addr : 0));
2076    NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
2077    NEW_AUX_ENT(AT_ENTRY, info->entry);
2078    NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
2079    NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
2080    NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
2081    NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
2082    NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
2083    NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
2084    NEW_AUX_ENT(AT_RANDOM, (abi_ulong) u_rand_bytes);
2085    NEW_AUX_ENT(AT_SECURE, (abi_ulong) qemu_getauxval(AT_SECURE));
2086    NEW_AUX_ENT(AT_EXECFN, info->file_string);
2087
2088#ifdef ELF_HWCAP2
2089    NEW_AUX_ENT(AT_HWCAP2, (abi_ulong) ELF_HWCAP2);
2090#endif
2091
2092    if (u_platform) {
2093        NEW_AUX_ENT(AT_PLATFORM, u_platform);
2094    }
2095    NEW_AUX_ENT (AT_NULL, 0);
2096#undef NEW_AUX_ENT
2097
2098    /* Check that our initial calculation of the auxv length matches how much
2099     * we actually put into it.
2100     */
2101    assert(info->auxv_len == u_auxv - info->saved_auxv);
2102
2103    put_user_ual(argc, u_argc);
2104
2105    p = info->arg_strings;
2106    for (i = 0; i < argc; ++i) {
2107        put_user_ual(p, u_argv);
2108        u_argv += n;
2109        p += target_strlen(p) + 1;
2110    }
2111    put_user_ual(0, u_argv);
2112
2113    p = info->env_strings;
2114    for (i = 0; i < envc; ++i) {
2115        put_user_ual(p, u_envp);
2116        u_envp += n;
2117        p += target_strlen(p) + 1;
2118    }
2119    put_user_ual(0, u_envp);
2120
2121    return sp;
2122}
2123
2124#ifndef ARM_COMMPAGE
2125#define ARM_COMMPAGE 0
2126#define init_guest_commpage() true
2127#endif
2128
2129static void pgb_fail_in_use(const char *image_name)
2130{
2131    error_report("%s: requires virtual address space that is in use "
2132                 "(omit the -B option or choose a different value)",
2133                 image_name);
2134    exit(EXIT_FAILURE);
2135}
2136
2137static void pgb_have_guest_base(const char *image_name, abi_ulong guest_loaddr,
2138                                abi_ulong guest_hiaddr, long align)
2139{
2140    const int flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE;
2141    void *addr, *test;
2142
2143    if (!QEMU_IS_ALIGNED(guest_base, align)) {
2144        fprintf(stderr, "Requested guest base %p does not satisfy "
2145                "host minimum alignment (0x%lx)\n",
2146                (void *)guest_base, align);
2147        exit(EXIT_FAILURE);
2148    }
2149
2150    /* Sanity check the guest binary. */
2151    if (reserved_va) {
2152        if (guest_hiaddr > reserved_va) {
2153            error_report("%s: requires more than reserved virtual "
2154                         "address space (0x%" PRIx64 " > 0x%lx)",
2155                         image_name, (uint64_t)guest_hiaddr, reserved_va);
2156            exit(EXIT_FAILURE);
2157        }
2158    } else {
2159#if HOST_LONG_BITS < TARGET_ABI_BITS
2160        if ((guest_hiaddr - guest_base) > ~(uintptr_t)0) {
2161            error_report("%s: requires more virtual address space "
2162                         "than the host can provide (0x%" PRIx64 ")",
2163                         image_name, (uint64_t)guest_hiaddr - guest_base);
2164            exit(EXIT_FAILURE);
2165        }
2166#endif
2167    }
2168
2169    /*
2170     * Expand the allocation to the entire reserved_va.
2171     * Exclude the mmap_min_addr hole.
2172     */
2173    if (reserved_va) {
2174        guest_loaddr = (guest_base >= mmap_min_addr ? 0
2175                        : mmap_min_addr - guest_base);
2176        guest_hiaddr = reserved_va;
2177    }
2178
2179    /* Reserve the address space for the binary, or reserved_va. */
2180    test = g2h_untagged(guest_loaddr);
2181    addr = mmap(test, guest_hiaddr - guest_loaddr, PROT_NONE, flags, -1, 0);
2182    if (test != addr) {
2183        pgb_fail_in_use(image_name);
2184    }
2185}
2186
2187/**
2188 * pgd_find_hole_fallback: potential mmap address
2189 * @guest_size: size of available space
2190 * @brk: location of break
2191 * @align: memory alignment
2192 *
2193 * This is a fallback method for finding a hole in the host address
2194 * space if we don't have the benefit of being able to access
2195 * /proc/self/map. It can potentially take a very long time as we can
2196 * only dumbly iterate up the host address space seeing if the
2197 * allocation would work.
2198 */
2199static uintptr_t pgd_find_hole_fallback(uintptr_t guest_size, uintptr_t brk,
2200                                        long align, uintptr_t offset)
2201{
2202    uintptr_t base;
2203
2204    /* Start (aligned) at the bottom and work our way up */
2205    base = ROUND_UP(mmap_min_addr, align);
2206
2207    while (true) {
2208        uintptr_t align_start, end;
2209        align_start = ROUND_UP(base, align);
2210        end = align_start + guest_size + offset;
2211
2212        /* if brk is anywhere in the range give ourselves some room to grow. */
2213        if (align_start <= brk && brk < end) {
2214            base = brk + (16 * MiB);
2215            continue;
2216        } else if (align_start + guest_size < align_start) {
2217            /* we have run out of space */
2218            return -1;
2219        } else {
2220            int flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE |
2221                MAP_FIXED_NOREPLACE;
2222            void * mmap_start = mmap((void *) align_start, guest_size,
2223                                     PROT_NONE, flags, -1, 0);
2224            if (mmap_start != MAP_FAILED) {
2225                munmap(mmap_start, guest_size);
2226                if (mmap_start == (void *) align_start) {
2227                    return (uintptr_t) mmap_start + offset;
2228                }
2229            }
2230            base += qemu_host_page_size;
2231        }
2232    }
2233}
2234
2235/* Return value for guest_base, or -1 if no hole found. */
2236static uintptr_t pgb_find_hole(uintptr_t guest_loaddr, uintptr_t guest_size,
2237                               long align, uintptr_t offset)
2238{
2239    GSList *maps, *iter;
2240    uintptr_t this_start, this_end, next_start, brk;
2241    intptr_t ret = -1;
2242
2243    assert(QEMU_IS_ALIGNED(guest_loaddr, align));
2244
2245    maps = read_self_maps();
2246
2247    /* Read brk after we've read the maps, which will malloc. */
2248    brk = (uintptr_t)sbrk(0);
2249
2250    if (!maps) {
2251        ret = pgd_find_hole_fallback(guest_size, brk, align, offset);
2252        return ret == -1 ? -1 : ret - guest_loaddr;
2253    }
2254
2255    /* The first hole is before the first map entry. */
2256    this_start = mmap_min_addr;
2257
2258    for (iter = maps; iter;
2259         this_start = next_start, iter = g_slist_next(iter)) {
2260        uintptr_t align_start, hole_size;
2261
2262        this_end = ((MapInfo *)iter->data)->start;
2263        next_start = ((MapInfo *)iter->data)->end;
2264        align_start = ROUND_UP(this_start + offset, align);
2265
2266        /* Skip holes that are too small. */
2267        if (align_start >= this_end) {
2268            continue;
2269        }
2270        hole_size = this_end - align_start;
2271        if (hole_size < guest_size) {
2272            continue;
2273        }
2274
2275        /* If this hole contains brk, give ourselves some room to grow. */
2276        if (this_start <= brk && brk < this_end) {
2277            hole_size -= guest_size;
2278            if (sizeof(uintptr_t) == 8 && hole_size >= 1 * GiB) {
2279                align_start += 1 * GiB;
2280            } else if (hole_size >= 16 * MiB) {
2281                align_start += 16 * MiB;
2282            } else {
2283                align_start = (this_end - guest_size) & -align;
2284                if (align_start < this_start) {
2285                    continue;
2286                }
2287            }
2288        }
2289
2290        /* Record the lowest successful match. */
2291        if (ret < 0) {
2292            ret = align_start - guest_loaddr;
2293        }
2294        /* If this hole contains the identity map, select it. */
2295        if (align_start <= guest_loaddr &&
2296            guest_loaddr + guest_size <= this_end) {
2297            ret = 0;
2298        }
2299        /* If this hole ends above the identity map, stop looking. */
2300        if (this_end >= guest_loaddr) {
2301            break;
2302        }
2303    }
2304    free_self_maps(maps);
2305
2306    return ret;
2307}
2308
2309static void pgb_static(const char *image_name, abi_ulong orig_loaddr,
2310                       abi_ulong orig_hiaddr, long align)
2311{
2312    uintptr_t loaddr = orig_loaddr;
2313    uintptr_t hiaddr = orig_hiaddr;
2314    uintptr_t offset = 0;
2315    uintptr_t addr;
2316
2317    if (hiaddr != orig_hiaddr) {
2318        error_report("%s: requires virtual address space that the "
2319                     "host cannot provide (0x%" PRIx64 ")",
2320                     image_name, (uint64_t)orig_hiaddr);
2321        exit(EXIT_FAILURE);
2322    }
2323
2324    loaddr &= -align;
2325    if (ARM_COMMPAGE) {
2326        /*
2327         * Extend the allocation to include the commpage.
2328         * For a 64-bit host, this is just 4GiB; for a 32-bit host we
2329         * need to ensure there is space bellow the guest_base so we
2330         * can map the commpage in the place needed when the address
2331         * arithmetic wraps around.
2332         */
2333        if (sizeof(uintptr_t) == 8 || loaddr >= 0x80000000u) {
2334            hiaddr = (uintptr_t) 4 << 30;
2335        } else {
2336            offset = -(ARM_COMMPAGE & -align);
2337        }
2338    }
2339
2340    addr = pgb_find_hole(loaddr, hiaddr - loaddr, align, offset);
2341    if (addr == -1) {
2342        /*
2343         * If ARM_COMMPAGE, there *might* be a non-consecutive allocation
2344         * that can satisfy both.  But as the normal arm32 link base address
2345         * is ~32k, and we extend down to include the commpage, making the
2346         * overhead only ~96k, this is unlikely.
2347         */
2348        error_report("%s: Unable to allocate %#zx bytes of "
2349                     "virtual address space", image_name,
2350                     (size_t)(hiaddr - loaddr));
2351        exit(EXIT_FAILURE);
2352    }
2353
2354    guest_base = addr;
2355}
2356
2357static void pgb_dynamic(const char *image_name, long align)
2358{
2359    /*
2360     * The executable is dynamic and does not require a fixed address.
2361     * All we need is a commpage that satisfies align.
2362     * If we do not need a commpage, leave guest_base == 0.
2363     */
2364    if (ARM_COMMPAGE) {
2365        uintptr_t addr, commpage;
2366
2367        /* 64-bit hosts should have used reserved_va. */
2368        assert(sizeof(uintptr_t) == 4);
2369
2370        /*
2371         * By putting the commpage at the first hole, that puts guest_base
2372         * just above that, and maximises the positive guest addresses.
2373         */
2374        commpage = ARM_COMMPAGE & -align;
2375        addr = pgb_find_hole(commpage, -commpage, align, 0);
2376        assert(addr != -1);
2377        guest_base = addr;
2378    }
2379}
2380
2381static void pgb_reserved_va(const char *image_name, abi_ulong guest_loaddr,
2382                            abi_ulong guest_hiaddr, long align)
2383{
2384    int flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE;
2385    void *addr, *test;
2386
2387    if (guest_hiaddr > reserved_va) {
2388        error_report("%s: requires more than reserved virtual "
2389                     "address space (0x%" PRIx64 " > 0x%lx)",
2390                     image_name, (uint64_t)guest_hiaddr, reserved_va);
2391        exit(EXIT_FAILURE);
2392    }
2393
2394    /* Widen the "image" to the entire reserved address space. */
2395    pgb_static(image_name, 0, reserved_va, align);
2396
2397    /* osdep.h defines this as 0 if it's missing */
2398    flags |= MAP_FIXED_NOREPLACE;
2399
2400    /* Reserve the memory on the host. */
2401    assert(guest_base != 0);
2402    test = g2h_untagged(0);
2403    addr = mmap(test, reserved_va, PROT_NONE, flags, -1, 0);
2404    if (addr == MAP_FAILED || addr != test) {
2405        error_report("Unable to reserve 0x%lx bytes of virtual address "
2406                     "space at %p (%s) for use as guest address space (check your"
2407                     "virtual memory ulimit setting, min_mmap_addr or reserve less "
2408                     "using -R option)", reserved_va, test, strerror(errno));
2409        exit(EXIT_FAILURE);
2410    }
2411}
2412
2413void probe_guest_base(const char *image_name, abi_ulong guest_loaddr,
2414                      abi_ulong guest_hiaddr)
2415{
2416    /* In order to use host shmat, we must be able to honor SHMLBA.  */
2417    uintptr_t align = MAX(SHMLBA, qemu_host_page_size);
2418
2419    if (have_guest_base) {
2420        pgb_have_guest_base(image_name, guest_loaddr, guest_hiaddr, align);
2421    } else if (reserved_va) {
2422        pgb_reserved_va(image_name, guest_loaddr, guest_hiaddr, align);
2423    } else if (guest_loaddr) {
2424        pgb_static(image_name, guest_loaddr, guest_hiaddr, align);
2425    } else {
2426        pgb_dynamic(image_name, align);
2427    }
2428
2429    /* Reserve and initialize the commpage. */
2430    if (!init_guest_commpage()) {
2431        /*
2432         * With have_guest_base, the user has selected the address and
2433         * we are trying to work with that.  Otherwise, we have selected
2434         * free space and init_guest_commpage must succeeded.
2435         */
2436        assert(have_guest_base);
2437        pgb_fail_in_use(image_name);
2438    }
2439
2440    assert(QEMU_IS_ALIGNED(guest_base, align));
2441    qemu_log_mask(CPU_LOG_PAGE, "Locating guest address space "
2442                  "@ 0x%" PRIx64 "\n", (uint64_t)guest_base);
2443}
2444
2445enum {
2446    /* The string "GNU\0" as a magic number. */
2447    GNU0_MAGIC = const_le32('G' | 'N' << 8 | 'U' << 16),
2448    NOTE_DATA_SZ = 1 * KiB,
2449    NOTE_NAME_SZ = 4,
2450    ELF_GNU_PROPERTY_ALIGN = ELF_CLASS == ELFCLASS32 ? 4 : 8,
2451};
2452
2453/*
2454 * Process a single gnu_property entry.
2455 * Return false for error.
2456 */
2457static bool parse_elf_property(const uint32_t *data, int *off, int datasz,
2458                               struct image_info *info, bool have_prev_type,
2459                               uint32_t *prev_type, Error **errp)
2460{
2461    uint32_t pr_type, pr_datasz, step;
2462
2463    if (*off > datasz || !QEMU_IS_ALIGNED(*off, ELF_GNU_PROPERTY_ALIGN)) {
2464        goto error_data;
2465    }
2466    datasz -= *off;
2467    data += *off / sizeof(uint32_t);
2468
2469    if (datasz < 2 * sizeof(uint32_t)) {
2470        goto error_data;
2471    }
2472    pr_type = data[0];
2473    pr_datasz = data[1];
2474    data += 2;
2475    datasz -= 2 * sizeof(uint32_t);
2476    step = ROUND_UP(pr_datasz, ELF_GNU_PROPERTY_ALIGN);
2477    if (step > datasz) {
2478        goto error_data;
2479    }
2480
2481    /* Properties are supposed to be unique and sorted on pr_type. */
2482    if (have_prev_type && pr_type <= *prev_type) {
2483        if (pr_type == *prev_type) {
2484            error_setg(errp, "Duplicate property in PT_GNU_PROPERTY");
2485        } else {
2486            error_setg(errp, "Unsorted property in PT_GNU_PROPERTY");
2487        }
2488        return false;
2489    }
2490    *prev_type = pr_type;
2491
2492    if (!arch_parse_elf_property(pr_type, pr_datasz, data, info, errp)) {
2493        return false;
2494    }
2495
2496    *off += 2 * sizeof(uint32_t) + step;
2497    return true;
2498
2499 error_data:
2500    error_setg(errp, "Ill-formed property in PT_GNU_PROPERTY");
2501    return false;
2502}
2503
2504/* Process NT_GNU_PROPERTY_TYPE_0. */
2505static bool parse_elf_properties(int image_fd,
2506                                 struct image_info *info,
2507                                 const struct elf_phdr *phdr,
2508                                 char bprm_buf[BPRM_BUF_SIZE],
2509                                 Error **errp)
2510{
2511    union {
2512        struct elf_note nhdr;
2513        uint32_t data[NOTE_DATA_SZ / sizeof(uint32_t)];
2514    } note;
2515
2516    int n, off, datasz;
2517    bool have_prev_type;
2518    uint32_t prev_type;
2519
2520    /* Unless the arch requires properties, ignore them. */
2521    if (!ARCH_USE_GNU_PROPERTY) {
2522        return true;
2523    }
2524
2525    /* If the properties are crazy large, that's too bad. */
2526    n = phdr->p_filesz;
2527    if (n > sizeof(note)) {
2528        error_setg(errp, "PT_GNU_PROPERTY too large");
2529        return false;
2530    }
2531    if (n < sizeof(note.nhdr)) {
2532        error_setg(errp, "PT_GNU_PROPERTY too small");
2533        return false;
2534    }
2535
2536    if (phdr->p_offset + n <= BPRM_BUF_SIZE) {
2537        memcpy(&note, bprm_buf + phdr->p_offset, n);
2538    } else {
2539        ssize_t len = pread(image_fd, &note, n, phdr->p_offset);
2540        if (len != n) {
2541            error_setg_errno(errp, errno, "Error reading file header");
2542            return false;
2543        }
2544    }
2545
2546    /*
2547     * The contents of a valid PT_GNU_PROPERTY is a sequence
2548     * of uint32_t -- swap them all now.
2549     */
2550#ifdef BSWAP_NEEDED
2551    for (int i = 0; i < n / 4; i++) {
2552        bswap32s(note.data + i);
2553    }
2554#endif
2555
2556    /*
2557     * Note that nhdr is 3 words, and that the "name" described by namesz
2558     * immediately follows nhdr and is thus at the 4th word.  Further, all
2559     * of the inputs to the kernel's round_up are multiples of 4.
2560     */
2561    if (note.nhdr.n_type != NT_GNU_PROPERTY_TYPE_0 ||
2562        note.nhdr.n_namesz != NOTE_NAME_SZ ||
2563        note.data[3] != GNU0_MAGIC) {
2564        error_setg(errp, "Invalid note in PT_GNU_PROPERTY");
2565        return false;
2566    }
2567    off = sizeof(note.nhdr) + NOTE_NAME_SZ;
2568
2569    datasz = note.nhdr.n_descsz + off;
2570    if (datasz > n) {
2571        error_setg(errp, "Invalid note size in PT_GNU_PROPERTY");
2572        return false;
2573    }
2574
2575    have_prev_type = false;
2576    prev_type = 0;
2577    while (1) {
2578        if (off == datasz) {
2579            return true;  /* end, exit ok */
2580        }
2581        if (!parse_elf_property(note.data, &off, datasz, info,
2582                                have_prev_type, &prev_type, errp)) {
2583            return false;
2584        }
2585        have_prev_type = true;
2586    }
2587}
2588
2589/* Load an ELF image into the address space.
2590
2591   IMAGE_NAME is the filename of the image, to use in error messages.
2592   IMAGE_FD is the open file descriptor for the image.
2593
2594   BPRM_BUF is a copy of the beginning of the file; this of course
2595   contains the elf file header at offset 0.  It is assumed that this
2596   buffer is sufficiently aligned to present no problems to the host
2597   in accessing data at aligned offsets within the buffer.
2598
2599   On return: INFO values will be filled in, as necessary or available.  */
2600
2601static void load_elf_image(const char *image_name, int image_fd,
2602                           struct image_info *info, char **pinterp_name,
2603                           char bprm_buf[BPRM_BUF_SIZE])
2604{
2605    struct elfhdr *ehdr = (struct elfhdr *)bprm_buf;
2606    struct elf_phdr *phdr;
2607    abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
2608    int i, retval, prot_exec;
2609    Error *err = NULL;
2610
2611    /* First of all, some simple consistency checks */
2612    if (!elf_check_ident(ehdr)) {
2613        error_setg(&err, "Invalid ELF image for this architecture");
2614        goto exit_errmsg;
2615    }
2616    bswap_ehdr(ehdr);
2617    if (!elf_check_ehdr(ehdr)) {
2618        error_setg(&err, "Invalid ELF image for this architecture");
2619        goto exit_errmsg;
2620    }
2621
2622    i = ehdr->e_phnum * sizeof(struct elf_phdr);
2623    if (ehdr->e_phoff + i <= BPRM_BUF_SIZE) {
2624        phdr = (struct elf_phdr *)(bprm_buf + ehdr->e_phoff);
2625    } else {
2626        phdr = (struct elf_phdr *) alloca(i);
2627        retval = pread(image_fd, phdr, i, ehdr->e_phoff);
2628        if (retval != i) {
2629            goto exit_read;
2630        }
2631    }
2632    bswap_phdr(phdr, ehdr->e_phnum);
2633
2634    info->nsegs = 0;
2635    info->pt_dynamic_addr = 0;
2636
2637    mmap_lock();
2638
2639    /*
2640     * Find the maximum size of the image and allocate an appropriate
2641     * amount of memory to handle that.  Locate the interpreter, if any.
2642     */
2643    loaddr = -1, hiaddr = 0;
2644    info->alignment = 0;
2645    for (i = 0; i < ehdr->e_phnum; ++i) {
2646        struct elf_phdr *eppnt = phdr + i;
2647        if (eppnt->p_type == PT_LOAD) {
2648            abi_ulong a = eppnt->p_vaddr - eppnt->p_offset;
2649            if (a < loaddr) {
2650                loaddr = a;
2651            }
2652            a = eppnt->p_vaddr + eppnt->p_memsz;
2653            if (a > hiaddr) {
2654                hiaddr = a;
2655            }
2656            ++info->nsegs;
2657            info->alignment |= eppnt->p_align;
2658        } else if (eppnt->p_type == PT_INTERP && pinterp_name) {
2659            g_autofree char *interp_name = NULL;
2660
2661            if (*pinterp_name) {
2662                error_setg(&err, "Multiple PT_INTERP entries");
2663                goto exit_errmsg;
2664            }
2665
2666            interp_name = g_malloc(eppnt->p_filesz);
2667
2668            if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
2669                memcpy(interp_name, bprm_buf + eppnt->p_offset,
2670                       eppnt->p_filesz);
2671            } else {
2672                retval = pread(image_fd, interp_name, eppnt->p_filesz,
2673                               eppnt->p_offset);
2674                if (retval != eppnt->p_filesz) {
2675                    goto exit_read;
2676                }
2677            }
2678            if (interp_name[eppnt->p_filesz - 1] != 0) {
2679                error_setg(&err, "Invalid PT_INTERP entry");
2680                goto exit_errmsg;
2681            }
2682            *pinterp_name = g_steal_pointer(&interp_name);
2683        } else if (eppnt->p_type == PT_GNU_PROPERTY) {
2684            if (!parse_elf_properties(image_fd, info, eppnt, bprm_buf, &err)) {
2685                goto exit_errmsg;
2686            }
2687        }
2688    }
2689
2690    if (pinterp_name != NULL) {
2691        /*
2692         * This is the main executable.
2693         *
2694         * Reserve extra space for brk.
2695         * We hold on to this space while placing the interpreter
2696         * and the stack, lest they be placed immediately after
2697         * the data segment and block allocation from the brk.
2698         *
2699         * 16MB is chosen as "large enough" without being so large
2700         * as to allow the result to not fit with a 32-bit guest on
2701         * a 32-bit host.
2702         */
2703        info->reserve_brk = 16 * MiB;
2704        hiaddr += info->reserve_brk;
2705
2706        if (ehdr->e_type == ET_EXEC) {
2707            /*
2708             * Make sure that the low address does not conflict with
2709             * MMAP_MIN_ADDR or the QEMU application itself.
2710             */
2711            probe_guest_base(image_name, loaddr, hiaddr);
2712        } else {
2713            /*
2714             * The binary is dynamic, but we still need to
2715             * select guest_base.  In this case we pass a size.
2716             */
2717            probe_guest_base(image_name, 0, hiaddr - loaddr);
2718        }
2719    }
2720
2721    /*
2722     * Reserve address space for all of this.
2723     *
2724     * In the case of ET_EXEC, we supply MAP_FIXED so that we get
2725     * exactly the address range that is required.
2726     *
2727     * Otherwise this is ET_DYN, and we are searching for a location
2728     * that can hold the memory space required.  If the image is
2729     * pre-linked, LOADDR will be non-zero, and the kernel should
2730     * honor that address if it happens to be free.
2731     *
2732     * In both cases, we will overwrite pages in this range with mappings
2733     * from the executable.
2734     */
2735    load_addr = target_mmap(loaddr, hiaddr - loaddr, PROT_NONE,
2736                            MAP_PRIVATE | MAP_ANON | MAP_NORESERVE |
2737                            (ehdr->e_type == ET_EXEC ? MAP_FIXED : 0),
2738                            -1, 0);
2739    if (load_addr == -1) {
2740        goto exit_mmap;
2741    }
2742    load_bias = load_addr - loaddr;
2743
2744    if (elf_is_fdpic(ehdr)) {
2745        struct elf32_fdpic_loadseg *loadsegs = info->loadsegs =
2746            g_malloc(sizeof(*loadsegs) * info->nsegs);
2747
2748        for (i = 0; i < ehdr->e_phnum; ++i) {
2749            switch (phdr[i].p_type) {
2750            case PT_DYNAMIC:
2751                info->pt_dynamic_addr = phdr[i].p_vaddr + load_bias;
2752                break;
2753            case PT_LOAD:
2754                loadsegs->addr = phdr[i].p_vaddr + load_bias;
2755                loadsegs->p_vaddr = phdr[i].p_vaddr;
2756                loadsegs->p_memsz = phdr[i].p_memsz;
2757                ++loadsegs;
2758                break;
2759            }
2760        }
2761    }
2762
2763    info->load_bias = load_bias;
2764    info->code_offset = load_bias;
2765    info->data_offset = load_bias;
2766    info->load_addr = load_addr;
2767    info->entry = ehdr->e_entry + load_bias;
2768    info->start_code = -1;
2769    info->end_code = 0;
2770    info->start_data = -1;
2771    info->end_data = 0;
2772    info->brk = 0;
2773    info->elf_flags = ehdr->e_flags;
2774
2775    prot_exec = PROT_EXEC;
2776#ifdef TARGET_AARCH64
2777    /*
2778     * If the BTI feature is present, this indicates that the executable
2779     * pages of the startup binary should be mapped with PROT_BTI, so that
2780     * branch targets are enforced.
2781     *
2782     * The startup binary is either the interpreter or the static executable.
2783     * The interpreter is responsible for all pages of a dynamic executable.
2784     *
2785     * Elf notes are backward compatible to older cpus.
2786     * Do not enable BTI unless it is supported.
2787     */
2788    if ((info->note_flags & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)
2789        && (pinterp_name == NULL || *pinterp_name == 0)
2790        && cpu_isar_feature(aa64_bti, ARM_CPU(thread_cpu))) {
2791        prot_exec |= TARGET_PROT_BTI;
2792    }
2793#endif
2794
2795    for (i = 0; i < ehdr->e_phnum; i++) {
2796        struct elf_phdr *eppnt = phdr + i;
2797        if (eppnt->p_type == PT_LOAD) {
2798            abi_ulong vaddr, vaddr_po, vaddr_ps, vaddr_ef, vaddr_em, vaddr_len;
2799            int elf_prot = 0;
2800
2801            if (eppnt->p_flags & PF_R) {
2802                elf_prot |= PROT_READ;
2803            }
2804            if (eppnt->p_flags & PF_W) {
2805                elf_prot |= PROT_WRITE;
2806            }
2807            if (eppnt->p_flags & PF_X) {
2808                elf_prot |= prot_exec;
2809            }
2810
2811            vaddr = load_bias + eppnt->p_vaddr;
2812            vaddr_po = TARGET_ELF_PAGEOFFSET(vaddr);
2813            vaddr_ps = TARGET_ELF_PAGESTART(vaddr);
2814
2815            vaddr_ef = vaddr + eppnt->p_filesz;
2816            vaddr_em = vaddr + eppnt->p_memsz;
2817
2818            /*
2819             * Some segments may be completely empty, with a non-zero p_memsz
2820             * but no backing file segment.
2821             */
2822            if (eppnt->p_filesz != 0) {
2823                vaddr_len = TARGET_ELF_PAGELENGTH(eppnt->p_filesz + vaddr_po);
2824                error = target_mmap(vaddr_ps, vaddr_len, elf_prot,
2825                                    MAP_PRIVATE | MAP_FIXED,
2826                                    image_fd, eppnt->p_offset - vaddr_po);
2827
2828                if (error == -1) {
2829                    goto exit_mmap;
2830                }
2831
2832                /*
2833                 * If the load segment requests extra zeros (e.g. bss), map it.
2834                 */
2835                if (eppnt->p_filesz < eppnt->p_memsz) {
2836                    zero_bss(vaddr_ef, vaddr_em, elf_prot);
2837                }
2838            } else if (eppnt->p_memsz != 0) {
2839                vaddr_len = TARGET_ELF_PAGELENGTH(eppnt->p_memsz + vaddr_po);
2840                error = target_mmap(vaddr_ps, vaddr_len, elf_prot,
2841                                    MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS,
2842                                    -1, 0);
2843
2844                if (error == -1) {
2845                    goto exit_mmap;
2846                }
2847            }
2848
2849            /* Find the full program boundaries.  */
2850            if (elf_prot & PROT_EXEC) {
2851                if (vaddr < info->start_code) {
2852                    info->start_code = vaddr;
2853                }
2854                if (vaddr_ef > info->end_code) {
2855                    info->end_code = vaddr_ef;
2856                }
2857            }
2858            if (elf_prot & PROT_WRITE) {
2859                if (vaddr < info->start_data) {
2860                    info->start_data = vaddr;
2861                }
2862                if (vaddr_ef > info->end_data) {
2863                    info->end_data = vaddr_ef;
2864                }
2865            }
2866            if (vaddr_em > info->brk) {
2867                info->brk = vaddr_em;
2868            }
2869#ifdef TARGET_MIPS
2870        } else if (eppnt->p_type == PT_MIPS_ABIFLAGS) {
2871            Mips_elf_abiflags_v0 abiflags;
2872            if (eppnt->p_filesz < sizeof(Mips_elf_abiflags_v0)) {
2873                error_setg(&err, "Invalid PT_MIPS_ABIFLAGS entry");
2874                goto exit_errmsg;
2875            }
2876            if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
2877                memcpy(&abiflags, bprm_buf + eppnt->p_offset,
2878                       sizeof(Mips_elf_abiflags_v0));
2879            } else {
2880                retval = pread(image_fd, &abiflags, sizeof(Mips_elf_abiflags_v0),
2881                               eppnt->p_offset);
2882                if (retval != sizeof(Mips_elf_abiflags_v0)) {
2883                    goto exit_read;
2884                }
2885            }
2886            bswap_mips_abiflags(&abiflags);
2887            info->fp_abi = abiflags.fp_abi;
2888#endif
2889        }
2890    }
2891
2892    if (info->end_data == 0) {
2893        info->start_data = info->end_code;
2894        info->end_data = info->end_code;
2895    }
2896
2897    if (qemu_log_enabled()) {
2898        load_symbols(ehdr, image_fd, load_bias);
2899    }
2900
2901    mmap_unlock();
2902
2903    close(image_fd);
2904    return;
2905
2906 exit_read:
2907    if (retval >= 0) {
2908        error_setg(&err, "Incomplete read of file header");
2909    } else {
2910        error_setg_errno(&err, errno, "Error reading file header");
2911    }
2912    goto exit_errmsg;
2913 exit_mmap:
2914    error_setg_errno(&err, errno, "Error mapping file");
2915    goto exit_errmsg;
2916 exit_errmsg:
2917    error_reportf_err(err, "%s: ", image_name);
2918    exit(-1);
2919}
2920
2921static void load_elf_interp(const char *filename, struct image_info *info,
2922                            char bprm_buf[BPRM_BUF_SIZE])
2923{
2924    int fd, retval;
2925    Error *err = NULL;
2926
2927    fd = open(path(filename), O_RDONLY);
2928    if (fd < 0) {
2929        error_setg_file_open(&err, errno, filename);
2930        error_report_err(err);
2931        exit(-1);
2932    }
2933
2934    retval = read(fd, bprm_buf, BPRM_BUF_SIZE);
2935    if (retval < 0) {
2936        error_setg_errno(&err, errno, "Error reading file header");
2937        error_reportf_err(err, "%s: ", filename);
2938        exit(-1);
2939    }
2940
2941    if (retval < BPRM_BUF_SIZE) {
2942        memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval);
2943    }
2944
2945    load_elf_image(filename, fd, info, NULL, bprm_buf);
2946}
2947
2948static int symfind(const void *s0, const void *s1)
2949{
2950    target_ulong addr = *(target_ulong *)s0;
2951    struct elf_sym *sym = (struct elf_sym *)s1;
2952    int result = 0;
2953    if (addr < sym->st_value) {
2954        result = -1;
2955    } else if (addr >= sym->st_value + sym->st_size) {
2956        result = 1;
2957    }
2958    return result;
2959}
2960
2961static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
2962{
2963#if ELF_CLASS == ELFCLASS32
2964    struct elf_sym *syms = s->disas_symtab.elf32;
2965#else
2966    struct elf_sym *syms = s->disas_symtab.elf64;
2967#endif
2968
2969    // binary search
2970    struct elf_sym *sym;
2971
2972    sym = bsearch(&orig_addr, syms, s->disas_num_syms, sizeof(*syms), symfind);
2973    if (sym != NULL) {
2974        return s->disas_strtab + sym->st_name;
2975    }
2976
2977    return "";
2978}
2979
2980/* FIXME: This should use elf_ops.h  */
2981static int symcmp(const void *s0, const void *s1)
2982{
2983    struct elf_sym *sym0 = (struct elf_sym *)s0;
2984    struct elf_sym *sym1 = (struct elf_sym *)s1;
2985    return (sym0->st_value < sym1->st_value)
2986        ? -1
2987        : ((sym0->st_value > sym1->st_value) ? 1 : 0);
2988}
2989
2990/* Best attempt to load symbols from this ELF object. */
2991static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
2992{
2993    int i, shnum, nsyms, sym_idx = 0, str_idx = 0;
2994    uint64_t segsz;
2995    struct elf_shdr *shdr;
2996    char *strings = NULL;
2997    struct syminfo *s = NULL;
2998    struct elf_sym *new_syms, *syms = NULL;
2999
3000    shnum = hdr->e_shnum;
3001    i = shnum * sizeof(struct elf_shdr);
3002    shdr = (struct elf_shdr *)alloca(i);
3003    if (pread(fd, shdr, i, hdr->e_shoff) != i) {
3004        return;
3005    }
3006
3007    bswap_shdr(shdr, shnum);
3008    for (i = 0; i < shnum; ++i) {
3009        if (shdr[i].sh_type == SHT_SYMTAB) {
3010            sym_idx = i;
3011            str_idx = shdr[i].sh_link;
3012            goto found;
3013        }
3014    }
3015
3016    /* There will be no symbol table if the file was stripped.  */
3017    return;
3018
3019 found:
3020    /* Now know where the strtab and symtab are.  Snarf them.  */
3021    s = g_try_new(struct syminfo, 1);
3022    if (!s) {
3023        goto give_up;
3024    }
3025
3026    segsz = shdr[str_idx].sh_size;
3027    s->disas_strtab = strings = g_try_malloc(segsz);
3028    if (!strings ||
3029        pread(fd, strings, segsz, shdr[str_idx].sh_offset) != segsz) {
3030        goto give_up;
3031    }
3032
3033    segsz = shdr[sym_idx].sh_size;
3034    syms = g_try_malloc(segsz);
3035    if (!syms || pread(fd, syms, segsz, shdr[sym_idx].sh_offset) != segsz) {
3036        goto give_up;
3037    }
3038
3039    if (segsz / sizeof(struct elf_sym) > INT_MAX) {
3040        /* Implausibly large symbol table: give up rather than ploughing
3041         * on with the number of symbols calculation overflowing
3042         */
3043        goto give_up;
3044    }
3045    nsyms = segsz / sizeof(struct elf_sym);
3046    for (i = 0; i < nsyms; ) {
3047        bswap_sym(syms + i);
3048        /* Throw away entries which we do not need.  */
3049        if (syms[i].st_shndx == SHN_UNDEF
3050            || syms[i].st_shndx >= SHN_LORESERVE
3051            || ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
3052            if (i < --nsyms) {
3053                syms[i] = syms[nsyms];
3054            }
3055        } else {
3056#if defined(TARGET_ARM) || defined (TARGET_MIPS)
3057            /* The bottom address bit marks a Thumb or MIPS16 symbol.  */
3058            syms[i].st_value &= ~(target_ulong)1;
3059#endif
3060            syms[i].st_value += load_bias;
3061            i++;
3062        }
3063    }
3064
3065    /* No "useful" symbol.  */
3066    if (nsyms == 0) {
3067        goto give_up;
3068    }
3069
3070    /* Attempt to free the storage associated with the local symbols
3071       that we threw away.  Whether or not this has any effect on the
3072       memory allocation depends on the malloc implementation and how
3073       many symbols we managed to discard.  */
3074    new_syms = g_try_renew(struct elf_sym, syms, nsyms);
3075    if (new_syms == NULL) {
3076        goto give_up;
3077    }
3078    syms = new_syms;
3079
3080    qsort(syms, nsyms, sizeof(*syms), symcmp);
3081
3082    s->disas_num_syms = nsyms;
3083#if ELF_CLASS == ELFCLASS32
3084    s->disas_symtab.elf32 = syms;
3085#else
3086    s->disas_symtab.elf64 = syms;
3087#endif
3088    s->lookup_symbol = lookup_symbolxx;
3089    s->next = syminfos;
3090    syminfos = s;
3091
3092    return;
3093
3094give_up:
3095    g_free(s);
3096    g_free(strings);
3097    g_free(syms);
3098}
3099
3100uint32_t get_elf_eflags(int fd)
3101{
3102    struct elfhdr ehdr;
3103    off_t offset;
3104    int ret;
3105
3106    /* Read ELF header */
3107    offset = lseek(fd, 0, SEEK_SET);
3108    if (offset == (off_t) -1) {
3109        return 0;
3110    }
3111    ret = read(fd, &ehdr, sizeof(ehdr));
3112    if (ret < sizeof(ehdr)) {
3113        return 0;
3114    }
3115    offset = lseek(fd, offset, SEEK_SET);
3116    if (offset == (off_t) -1) {
3117        return 0;
3118    }
3119
3120    /* Check ELF signature */
3121    if (!elf_check_ident(&ehdr)) {
3122        return 0;
3123    }
3124
3125    /* check header */
3126    bswap_ehdr(&ehdr);
3127    if (!elf_check_ehdr(&ehdr)) {
3128        return 0;
3129    }
3130
3131    /* return architecture id */
3132    return ehdr.e_flags;
3133}
3134
3135int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
3136{
3137    struct image_info interp_info;
3138    struct elfhdr elf_ex;
3139    char *elf_interpreter = NULL;
3140    char *scratch;
3141
3142    memset(&interp_info, 0, sizeof(interp_info));
3143#ifdef TARGET_MIPS
3144    interp_info.fp_abi = MIPS_ABI_FP_UNKNOWN;
3145#endif
3146
3147    info->start_mmap = (abi_ulong)ELF_START_MMAP;
3148
3149    load_elf_image(bprm->filename, bprm->fd, info,
3150                   &elf_interpreter, bprm->buf);
3151
3152    /* ??? We need a copy of the elf header for passing to create_elf_tables.
3153       If we do nothing, we'll have overwritten this when we re-use bprm->buf
3154       when we load the interpreter.  */
3155    elf_ex = *(struct elfhdr *)bprm->buf;
3156
3157    /* Do this so that we can load the interpreter, if need be.  We will
3158       change some of these later */
3159    bprm->p = setup_arg_pages(bprm, info);
3160
3161    scratch = g_new0(char, TARGET_PAGE_SIZE);
3162    if (STACK_GROWS_DOWN) {
3163        bprm->p = copy_elf_strings(1, &bprm->filename, scratch,
3164                                   bprm->p, info->stack_limit);
3165        info->file_string = bprm->p;
3166        bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch,
3167                                   bprm->p, info->stack_limit);
3168        info->env_strings = bprm->p;
3169        bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch,
3170                                   bprm->p, info->stack_limit);
3171        info->arg_strings = bprm->p;
3172    } else {
3173        info->arg_strings = bprm->p;
3174        bprm->p = copy_elf_strings(bprm->argc, bprm->argv, scratch,
3175                                   bprm->p, info->stack_limit);
3176        info->env_strings = bprm->p;
3177        bprm->p = copy_elf_strings(bprm->envc, bprm->envp, scratch,
3178                                   bprm->p, info->stack_limit);
3179        info->file_string = bprm->p;
3180        bprm->p = copy_elf_strings(1, &bprm->filename, scratch,
3181                                   bprm->p, info->stack_limit);
3182    }
3183
3184    g_free(scratch);
3185
3186    if (!bprm->p) {
3187        fprintf(stderr, "%s: %s\n", bprm->filename, strerror(E2BIG));
3188        exit(-1);
3189    }
3190
3191    if (elf_interpreter) {
3192        load_elf_interp(elf_interpreter, &interp_info, bprm->buf);
3193
3194        /* If the program interpreter is one of these two, then assume
3195           an iBCS2 image.  Otherwise assume a native linux image.  */
3196
3197        if (strcmp(elf_interpreter, "/usr/lib/libc.so.1") == 0
3198            || strcmp(elf_interpreter, "/usr/lib/ld.so.1") == 0) {
3199            info->personality = PER_SVR4;
3200
3201            /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
3202               and some applications "depend" upon this behavior.  Since
3203               we do not have the power to recompile these, we emulate
3204               the SVr4 behavior.  Sigh.  */
3205            target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
3206                        MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
3207        }
3208#ifdef TARGET_MIPS
3209        info->interp_fp_abi = interp_info.fp_abi;
3210#endif
3211    }
3212
3213    bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex,
3214                                info, (elf_interpreter ? &interp_info : NULL));
3215    info->start_stack = bprm->p;
3216
3217    /* If we have an interpreter, set that as the program's entry point.
3218       Copy the load_bias as well, to help PPC64 interpret the entry
3219       point as a function descriptor.  Do this after creating elf tables
3220       so that we copy the original program entry point into the AUXV.  */
3221    if (elf_interpreter) {
3222        info->load_bias = interp_info.load_bias;
3223        info->entry = interp_info.entry;
3224        g_free(elf_interpreter);
3225    }
3226
3227#ifdef USE_ELF_CORE_DUMP
3228    bprm->core_dump = &elf_core_dump;
3229#endif
3230
3231    /*
3232     * If we reserved extra space for brk, release it now.
3233     * The implementation of do_brk in syscalls.c expects to be able
3234     * to mmap pages in this space.
3235     */
3236    if (info->reserve_brk) {
3237        abi_ulong start_brk = HOST_PAGE_ALIGN(info->brk);
3238        abi_ulong end_brk = HOST_PAGE_ALIGN(info->brk + info->reserve_brk);
3239        target_munmap(start_brk, end_brk - start_brk);
3240    }
3241
3242    return 0;
3243}
3244
3245#ifdef USE_ELF_CORE_DUMP
3246/*
3247 * Definitions to generate Intel SVR4-like core files.
3248 * These mostly have the same names as the SVR4 types with "target_elf_"
3249 * tacked on the front to prevent clashes with linux definitions,
3250 * and the typedef forms have been avoided.  This is mostly like
3251 * the SVR4 structure, but more Linuxy, with things that Linux does
3252 * not support and which gdb doesn't really use excluded.
3253 *
3254 * Fields we don't dump (their contents is zero) in linux-user qemu
3255 * are marked with XXX.
3256 *
3257 * Core dump code is copied from linux kernel (fs/binfmt_elf.c).
3258 *
3259 * Porting ELF coredump for target is (quite) simple process.  First you
3260 * define USE_ELF_CORE_DUMP in target ELF code (where init_thread() for
3261 * the target resides):
3262 *
3263 * #define USE_ELF_CORE_DUMP
3264 *
3265 * Next you define type of register set used for dumping.  ELF specification
3266 * says that it needs to be array of elf_greg_t that has size of ELF_NREG.
3267 *
3268 * typedef <target_regtype> target_elf_greg_t;
3269 * #define ELF_NREG <number of registers>
3270 * typedef taret_elf_greg_t target_elf_gregset_t[ELF_NREG];
3271 *
3272 * Last step is to implement target specific function that copies registers
3273 * from given cpu into just specified register set.  Prototype is:
3274 *
3275 * static void elf_core_copy_regs(taret_elf_gregset_t *regs,
3276 *                                const CPUArchState *env);
3277 *
3278 * Parameters:
3279 *     regs - copy register values into here (allocated and zeroed by caller)
3280 *     env - copy registers from here
3281 *
3282 * Example for ARM target is provided in this file.
3283 */
3284
3285/* An ELF note in memory */
3286struct memelfnote {
3287    const char *name;
3288    size_t     namesz;
3289    size_t     namesz_rounded;
3290    int        type;
3291    size_t     datasz;
3292    size_t     datasz_rounded;
3293    void       *data;
3294    size_t     notesz;
3295};
3296
3297struct target_elf_siginfo {
3298    abi_int    si_signo; /* signal number */
3299    abi_int    si_code;  /* extra code */
3300    abi_int    si_errno; /* errno */
3301};
3302
3303struct target_elf_prstatus {
3304    struct target_elf_siginfo pr_info;      /* Info associated with signal */
3305    abi_short          pr_cursig;    /* Current signal */
3306    abi_ulong          pr_sigpend;   /* XXX */
3307    abi_ulong          pr_sighold;   /* XXX */
3308    target_pid_t       pr_pid;
3309    target_pid_t       pr_ppid;
3310    target_pid_t       pr_pgrp;
3311    target_pid_t       pr_sid;
3312    struct target_timeval pr_utime;  /* XXX User time */
3313    struct target_timeval pr_stime;  /* XXX System time */
3314    struct target_timeval pr_cutime; /* XXX Cumulative user time */
3315    struct target_timeval pr_cstime; /* XXX Cumulative system time */
3316    target_elf_gregset_t      pr_reg;       /* GP registers */
3317    abi_int            pr_fpvalid;   /* XXX */
3318};
3319
3320#define ELF_PRARGSZ     (80) /* Number of chars for args */
3321
3322struct target_elf_prpsinfo {
3323    char         pr_state;       /* numeric process state */
3324    char         pr_sname;       /* char for pr_state */
3325    char         pr_zomb;        /* zombie */
3326    char         pr_nice;        /* nice val */
3327    abi_ulong    pr_flag;        /* flags */
3328    target_uid_t pr_uid;
3329    target_gid_t pr_gid;
3330    target_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid;
3331    /* Lots missing */
3332    char    pr_fname[16] QEMU_NONSTRING; /* filename of executable */
3333    char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
3334};
3335
3336/* Here is the structure in which status of each thread is captured. */
3337struct elf_thread_status {
3338    QTAILQ_ENTRY(elf_thread_status)  ets_link;
3339    struct target_elf_prstatus prstatus;   /* NT_PRSTATUS */
3340#if 0
3341    elf_fpregset_t fpu;             /* NT_PRFPREG */
3342    struct task_struct *thread;
3343    elf_fpxregset_t xfpu;           /* ELF_CORE_XFPREG_TYPE */
3344#endif
3345    struct memelfnote notes[1];
3346    int num_notes;
3347};
3348
3349struct elf_note_info {
3350    struct memelfnote   *notes;
3351    struct target_elf_prstatus *prstatus;  /* NT_PRSTATUS */
3352    struct target_elf_prpsinfo *psinfo;    /* NT_PRPSINFO */
3353
3354    QTAILQ_HEAD(, elf_thread_status) thread_list;
3355#if 0
3356    /*
3357     * Current version of ELF coredump doesn't support
3358     * dumping fp regs etc.
3359     */
3360    elf_fpregset_t *fpu;
3361    elf_fpxregset_t *xfpu;
3362    int thread_status_size;
3363#endif
3364    int notes_size;
3365    int numnote;
3366};
3367
3368struct vm_area_struct {
3369    target_ulong   vma_start;  /* start vaddr of memory region */
3370    target_ulong   vma_end;    /* end vaddr of memory region */
3371    abi_ulong      vma_flags;  /* protection etc. flags for the region */
3372    QTAILQ_ENTRY(vm_area_struct) vma_link;
3373};
3374
3375struct mm_struct {
3376    QTAILQ_HEAD(, vm_area_struct) mm_mmap;
3377    int mm_count;           /* number of mappings */
3378};
3379
3380static struct mm_struct *vma_init(void);
3381static void vma_delete(struct mm_struct *);
3382static int vma_add_mapping(struct mm_struct *, target_ulong,
3383                           target_ulong, abi_ulong);
3384static int vma_get_mapping_count(const struct mm_struct *);
3385static struct vm_area_struct *vma_first(const struct mm_struct *);
3386static struct vm_area_struct *vma_next(struct vm_area_struct *);
3387static abi_ulong vma_dump_size(const struct vm_area_struct *);
3388static int vma_walker(void *priv, target_ulong start, target_ulong end,
3389                      unsigned long flags);
3390
3391static void fill_elf_header(struct elfhdr *, int, uint16_t, uint32_t);
3392static void fill_note(struct memelfnote *, const char *, int,
3393                      unsigned int, void *);
3394static void fill_prstatus(struct target_elf_prstatus *, const TaskState *, int);
3395static int fill_psinfo(struct target_elf_prpsinfo *, const TaskState *);
3396static void fill_auxv_note(struct memelfnote *, const TaskState *);
3397static void fill_elf_note_phdr(struct elf_phdr *, int, off_t);
3398static size_t note_size(const struct memelfnote *);
3399static void free_note_info(struct elf_note_info *);
3400static int fill_note_info(struct elf_note_info *, long, const CPUArchState *);
3401static void fill_thread_info(struct elf_note_info *, const CPUArchState *);
3402static int core_dump_filename(const TaskState *, char *, size_t);
3403
3404static int dump_write(int, const void *, size_t);
3405static int write_note(struct memelfnote *, int);
3406static int write_note_info(struct elf_note_info *, int);
3407
3408#ifdef BSWAP_NEEDED
3409static void bswap_prstatus(struct target_elf_prstatus *prstatus)
3410{
3411    prstatus->pr_info.si_signo = tswap32(prstatus->pr_info.si_signo);
3412    prstatus->pr_info.si_code = tswap32(prstatus->pr_info.si_code);
3413    prstatus->pr_info.si_errno = tswap32(prstatus->pr_info.si_errno);
3414    prstatus->pr_cursig = tswap16(prstatus->pr_cursig);
3415    prstatus->pr_sigpend = tswapal(prstatus->pr_sigpend);
3416    prstatus->pr_sighold = tswapal(prstatus->pr_sighold);
3417    prstatus->pr_pid = tswap32(prstatus->pr_pid);
3418    prstatus->pr_ppid = tswap32(prstatus->pr_ppid);
3419    prstatus->pr_pgrp = tswap32(prstatus->pr_pgrp);
3420    prstatus->pr_sid = tswap32(prstatus->pr_sid);
3421    /* cpu times are not filled, so we skip them */
3422    /* regs should be in correct format already */
3423    prstatus->pr_fpvalid = tswap32(prstatus->pr_fpvalid);
3424}
3425
3426static void bswap_psinfo(struct target_elf_prpsinfo *psinfo)
3427{
3428    psinfo->pr_flag = tswapal(psinfo->pr_flag);
3429    psinfo->pr_uid = tswap16(psinfo->pr_uid);
3430    psinfo->pr_gid = tswap16(psinfo->pr_gid);
3431    psinfo->pr_pid = tswap32(psinfo->pr_pid);
3432    psinfo->pr_ppid = tswap32(psinfo->pr_ppid);
3433    psinfo->pr_pgrp = tswap32(psinfo->pr_pgrp);
3434    psinfo->pr_sid = tswap32(psinfo->pr_sid);
3435}
3436
3437static void bswap_note(struct elf_note *en)
3438{
3439    bswap32s(&en->n_namesz);
3440    bswap32s(&en->n_descsz);
3441    bswap32s(&en->n_type);
3442}
3443#else
3444static inline void bswap_prstatus(struct target_elf_prstatus *p) { }
3445static inline void bswap_psinfo(struct target_elf_prpsinfo *p) {}
3446static inline void bswap_note(struct elf_note *en) { }
3447#endif /* BSWAP_NEEDED */
3448
3449/*
3450 * Minimal support for linux memory regions.  These are needed
3451 * when we are finding out what memory exactly belongs to
3452 * emulated process.  No locks needed here, as long as
3453 * thread that received the signal is stopped.
3454 */
3455
3456static struct mm_struct *vma_init(void)
3457{
3458    struct mm_struct *mm;
3459
3460    if ((mm = g_malloc(sizeof (*mm))) == NULL)
3461        return (NULL);
3462
3463    mm->mm_count = 0;
3464    QTAILQ_INIT(&mm->mm_mmap);
3465
3466    return (mm);
3467}
3468
3469static void vma_delete(struct mm_struct *mm)
3470{
3471    struct vm_area_struct *vma;
3472
3473    while ((vma = vma_first(mm)) != NULL) {
3474        QTAILQ_REMOVE(&mm->mm_mmap, vma, vma_link);
3475        g_free(vma);
3476    }
3477    g_free(mm);
3478}
3479
3480static int vma_add_mapping(struct mm_struct *mm, target_ulong start,
3481                           target_ulong end, abi_ulong flags)
3482{
3483    struct vm_area_struct *vma;
3484
3485    if ((vma = g_malloc0(sizeof (*vma))) == NULL)
3486        return (-1);
3487
3488    vma->vma_start = start;
3489    vma->vma_end = end;
3490    vma->vma_flags = flags;
3491
3492    QTAILQ_INSERT_TAIL(&mm->mm_mmap, vma, vma_link);
3493    mm->mm_count++;
3494
3495    return (0);
3496}
3497
3498static struct vm_area_struct *vma_first(const struct mm_struct *mm)
3499{
3500    return (QTAILQ_FIRST(&mm->mm_mmap));
3501}
3502
3503static struct vm_area_struct *vma_next(struct vm_area_struct *vma)
3504{
3505    return (QTAILQ_NEXT(vma, vma_link));
3506}
3507
3508static int vma_get_mapping_count(const struct mm_struct *mm)
3509{
3510    return (mm->mm_count);
3511}
3512
3513/*
3514 * Calculate file (dump) size of given memory region.
3515 */
3516static abi_ulong vma_dump_size(const struct vm_area_struct *vma)
3517{
3518    /* if we cannot even read the first page, skip it */
3519    if (!access_ok_untagged(VERIFY_READ, vma->vma_start, TARGET_PAGE_SIZE))
3520        return (0);
3521
3522    /*
3523     * Usually we don't dump executable pages as they contain
3524     * non-writable code that debugger can read directly from
3525     * target library etc.  However, thread stacks are marked
3526     * also executable so we read in first page of given region
3527     * and check whether it contains elf header.  If there is
3528     * no elf header, we dump it.
3529     */
3530    if (vma->vma_flags & PROT_EXEC) {
3531        char page[TARGET_PAGE_SIZE];
3532
3533        if (copy_from_user(page, vma->vma_start, sizeof (page))) {
3534            return 0;
3535        }
3536        if ((page[EI_MAG0] == ELFMAG0) &&
3537            (page[EI_MAG1] == ELFMAG1) &&
3538            (page[EI_MAG2] == ELFMAG2) &&
3539            (page[EI_MAG3] == ELFMAG3)) {
3540            /*
3541             * Mappings are possibly from ELF binary.  Don't dump
3542             * them.
3543             */
3544            return (0);
3545        }
3546    }
3547
3548    return (vma->vma_end - vma->vma_start);
3549}
3550
3551static int vma_walker(void *priv, target_ulong start, target_ulong end,
3552                      unsigned long flags)
3553{
3554    struct mm_struct *mm = (struct mm_struct *)priv;
3555
3556    vma_add_mapping(mm, start, end, flags);
3557    return (0);
3558}
3559
3560static void fill_note(struct memelfnote *note, const char *name, int type,
3561                      unsigned int sz, void *data)
3562{
3563    unsigned int namesz;
3564
3565    namesz = strlen(name) + 1;
3566    note->name = name;
3567    note->namesz = namesz;
3568    note->namesz_rounded = roundup(namesz, sizeof (int32_t));
3569    note->type = type;
3570    note->datasz = sz;
3571    note->datasz_rounded = roundup(sz, sizeof (int32_t));
3572
3573    note->data = data;
3574
3575    /*
3576     * We calculate rounded up note size here as specified by
3577     * ELF document.
3578     */
3579    note->notesz = sizeof (struct elf_note) +
3580        note->namesz_rounded + note->datasz_rounded;
3581}
3582
3583static void fill_elf_header(struct elfhdr *elf, int segs, uint16_t machine,
3584                            uint32_t flags)
3585{
3586    (void) memset(elf, 0, sizeof(*elf));
3587
3588    (void) memcpy(elf->e_ident, ELFMAG, SELFMAG);
3589    elf->e_ident[EI_CLASS] = ELF_CLASS;
3590    elf->e_ident[EI_DATA] = ELF_DATA;
3591    elf->e_ident[EI_VERSION] = EV_CURRENT;
3592    elf->e_ident[EI_OSABI] = ELF_OSABI;
3593
3594    elf->e_type = ET_CORE;
3595    elf->e_machine = machine;
3596    elf->e_version = EV_CURRENT;
3597    elf->e_phoff = sizeof(struct elfhdr);
3598    elf->e_flags = flags;
3599    elf->e_ehsize = sizeof(struct elfhdr);
3600    elf->e_phentsize = sizeof(struct elf_phdr);
3601    elf->e_phnum = segs;
3602
3603    bswap_ehdr(elf);
3604}
3605
3606static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset)
3607{
3608    phdr->p_type = PT_NOTE;
3609    phdr->p_offset = offset;
3610    phdr->p_vaddr = 0;
3611    phdr->p_paddr = 0;
3612    phdr->p_filesz = sz;
3613    phdr->p_memsz = 0;
3614    phdr->p_flags = 0;
3615    phdr->p_align = 0;
3616
3617    bswap_phdr(phdr, 1);
3618}
3619
3620static size_t note_size(const struct memelfnote *note)
3621{
3622    return (note->notesz);
3623}
3624
3625static void fill_prstatus(struct target_elf_prstatus *prstatus,
3626                          const TaskState *ts, int signr)
3627{
3628    (void) memset(prstatus, 0, sizeof (*prstatus));
3629    prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
3630    prstatus->pr_pid = ts->ts_tid;
3631    prstatus->pr_ppid = getppid();
3632    prstatus->pr_pgrp = getpgrp();
3633    prstatus->pr_sid = getsid(0);
3634
3635    bswap_prstatus(prstatus);
3636}
3637
3638static int fill_psinfo(struct target_elf_prpsinfo *psinfo, const TaskState *ts)
3639{
3640    char *base_filename;
3641    unsigned int i, len;
3642
3643    (void) memset(psinfo, 0, sizeof (*psinfo));
3644
3645    len = ts->info->arg_end - ts->info->arg_start;
3646    if (len >= ELF_PRARGSZ)
3647        len = ELF_PRARGSZ - 1;
3648    if (copy_from_user(&psinfo->pr_psargs, ts->info->arg_start, len))
3649        return -EFAULT;
3650    for (i = 0; i < len; i++)
3651        if (psinfo->pr_psargs[i] == 0)
3652            psinfo->pr_psargs[i] = ' ';
3653    psinfo->pr_psargs[len] = 0;
3654
3655    psinfo->pr_pid = getpid();
3656    psinfo->pr_ppid = getppid();
3657    psinfo->pr_pgrp = getpgrp();
3658    psinfo->pr_sid = getsid(0);
3659    psinfo->pr_uid = getuid();
3660    psinfo->pr_gid = getgid();
3661
3662    base_filename = g_path_get_basename(ts->bprm->filename);
3663    /*
3664     * Using strncpy here is fine: at max-length,
3665     * this field is not NUL-terminated.
3666     */
3667    (void) strncpy(psinfo->pr_fname, base_filename,
3668                   sizeof(psinfo->pr_fname));
3669
3670    g_free(base_filename);
3671    bswap_psinfo(psinfo);
3672    return (0);
3673}
3674
3675static void fill_auxv_note(struct memelfnote *note, const TaskState *ts)
3676{
3677    elf_addr_t auxv = (elf_addr_t)ts->info->saved_auxv;
3678    elf_addr_t orig_auxv = auxv;
3679    void *ptr;
3680    int len = ts->info->auxv_len;
3681
3682    /*
3683     * Auxiliary vector is stored in target process stack.  It contains
3684     * {type, value} pairs that we need to dump into note.  This is not
3685     * strictly necessary but we do it here for sake of completeness.
3686     */
3687
3688    /* read in whole auxv vector and copy it to memelfnote */
3689    ptr = lock_user(VERIFY_READ, orig_auxv, len, 0);
3690    if (ptr != NULL) {
3691        fill_note(note, "CORE", NT_AUXV, len, ptr);
3692        unlock_user(ptr, auxv, len);
3693    }
3694}
3695
3696/*
3697 * Constructs name of coredump file.  We have following convention
3698 * for the name:
3699 *     qemu_<basename-of-target-binary>_<date>-<time>_<pid>.core
3700 *
3701 * Returns 0 in case of success, -1 otherwise (errno is set).
3702 */
3703static int core_dump_filename(const TaskState *ts, char *buf,
3704                              size_t bufsize)
3705{
3706    char timestamp[64];
3707    char *base_filename = NULL;
3708    struct timeval tv;
3709    struct tm tm;
3710
3711    assert(bufsize >= PATH_MAX);
3712
3713    if (gettimeofday(&tv, NULL) < 0) {
3714        (void) fprintf(stderr, "unable to get current timestamp: %s",
3715                       strerror(errno));
3716        return (-1);
3717    }
3718
3719    base_filename = g_path_get_basename(ts->bprm->filename);
3720    (void) strftime(timestamp, sizeof (timestamp), "%Y%m%d-%H%M%S",
3721                    localtime_r(&tv.tv_sec, &tm));
3722    (void) snprintf(buf, bufsize, "qemu_%s_%s_%d.core",
3723                    base_filename, timestamp, (int)getpid());
3724    g_free(base_filename);
3725
3726    return (0);
3727}
3728
3729static int dump_write(int fd, const void *ptr, size_t size)
3730{
3731    const char *bufp = (const char *)ptr;
3732    ssize_t bytes_written, bytes_left;
3733    struct rlimit dumpsize;
3734    off_t pos;
3735
3736    bytes_written = 0;
3737    getrlimit(RLIMIT_CORE, &dumpsize);
3738    if ((pos = lseek(fd, 0, SEEK_CUR))==-1) {
3739        if (errno == ESPIPE) { /* not a seekable stream */
3740            bytes_left = size;
3741        } else {
3742            return pos;
3743        }
3744    } else {
3745        if (dumpsize.rlim_cur <= pos) {
3746            return -1;
3747        } else if (dumpsize.rlim_cur == RLIM_INFINITY) {
3748            bytes_left = size;
3749        } else {
3750            size_t limit_left=dumpsize.rlim_cur - pos;
3751            bytes_left = limit_left >= size ? size : limit_left ;
3752        }
3753    }
3754
3755    /*
3756     * In normal conditions, single write(2) should do but
3757     * in case of socket etc. this mechanism is more portable.
3758     */
3759    do {
3760        bytes_written = write(fd, bufp, bytes_left);
3761        if (bytes_written < 0) {
3762            if (errno == EINTR)
3763                continue;
3764            return (-1);
3765        } else if (bytes_written == 0) { /* eof */
3766            return (-1);
3767        }
3768        bufp += bytes_written;
3769        bytes_left -= bytes_written;
3770    } while (bytes_left > 0);
3771
3772    return (0);
3773}
3774
3775static int write_note(struct memelfnote *men, int fd)
3776{
3777    struct elf_note en;
3778
3779    en.n_namesz = men->namesz;
3780    en.n_type = men->type;
3781    en.n_descsz = men->datasz;
3782
3783    bswap_note(&en);
3784
3785    if (dump_write(fd, &en, sizeof(en)) != 0)
3786        return (-1);
3787    if (dump_write(fd, men->name, men->namesz_rounded) != 0)
3788        return (-1);
3789    if (dump_write(fd, men->data, men->datasz_rounded) != 0)
3790        return (-1);
3791
3792    return (0);
3793}
3794
3795static void fill_thread_info(struct elf_note_info *info, const CPUArchState *env)
3796{
3797    CPUState *cpu = env_cpu((CPUArchState *)env);
3798    TaskState *ts = (TaskState *)cpu->opaque;
3799    struct elf_thread_status *ets;
3800
3801    ets = g_malloc0(sizeof (*ets));
3802    ets->num_notes = 1; /* only prstatus is dumped */
3803    fill_prstatus(&ets->prstatus, ts, 0);
3804    elf_core_copy_regs(&ets->prstatus.pr_reg, env);
3805    fill_note(&ets->notes[0], "CORE", NT_PRSTATUS, sizeof (ets->prstatus),
3806              &ets->prstatus);
3807
3808    QTAILQ_INSERT_TAIL(&info->thread_list, ets, ets_link);
3809
3810    info->notes_size += note_size(&ets->notes[0]);
3811}
3812
3813static void init_note_info(struct elf_note_info *info)
3814{
3815    /* Initialize the elf_note_info structure so that it is at
3816     * least safe to call free_note_info() on it. Must be
3817     * called before calling fill_note_info().
3818     */
3819    memset(info, 0, sizeof (*info));
3820    QTAILQ_INIT(&info->thread_list);
3821}
3822
3823static int fill_note_info(struct elf_note_info *info,
3824                          long signr, const CPUArchState *env)
3825{
3826#define NUMNOTES 3
3827    CPUState *cpu = env_cpu((CPUArchState *)env);
3828    TaskState *ts = (TaskState *)cpu->opaque;
3829    int i;
3830
3831    info->notes = g_new0(struct memelfnote, NUMNOTES);
3832    if (info->notes == NULL)
3833        return (-ENOMEM);
3834    info->prstatus = g_malloc0(sizeof (*info->prstatus));
3835    if (info->prstatus == NULL)
3836        return (-ENOMEM);
3837    info->psinfo = g_malloc0(sizeof (*info->psinfo));
3838    if (info->prstatus == NULL)
3839        return (-ENOMEM);
3840
3841    /*
3842     * First fill in status (and registers) of current thread
3843     * including process info & aux vector.
3844     */
3845    fill_prstatus(info->prstatus, ts, signr);
3846    elf_core_copy_regs(&info->prstatus->pr_reg, env);
3847    fill_note(&info->notes[0], "CORE", NT_PRSTATUS,
3848              sizeof (*info->prstatus), info->prstatus);
3849    fill_psinfo(info->psinfo, ts);
3850    fill_note(&info->notes[1], "CORE", NT_PRPSINFO,
3851              sizeof (*info->psinfo), info->psinfo);
3852    fill_auxv_note(&info->notes[2], ts);
3853    info->numnote = 3;
3854
3855    info->notes_size = 0;
3856    for (i = 0; i < info->numnote; i++)
3857        info->notes_size += note_size(&info->notes[i]);
3858
3859    /* read and fill status of all threads */
3860    cpu_list_lock();
3861    CPU_FOREACH(cpu) {
3862        if (cpu == thread_cpu) {
3863            continue;
3864        }
3865        fill_thread_info(info, (CPUArchState *)cpu->env_ptr);
3866    }
3867    cpu_list_unlock();
3868
3869    return (0);
3870}
3871
3872static void free_note_info(struct elf_note_info *info)
3873{
3874    struct elf_thread_status *ets;
3875
3876    while (!QTAILQ_EMPTY(&info->thread_list)) {
3877        ets = QTAILQ_FIRST(&info->thread_list);
3878        QTAILQ_REMOVE(&info->thread_list, ets, ets_link);
3879        g_free(ets);
3880    }
3881
3882    g_free(info->prstatus);
3883    g_free(info->psinfo);
3884    g_free(info->notes);
3885}
3886
3887static int write_note_info(struct elf_note_info *info, int fd)
3888{
3889    struct elf_thread_status *ets;
3890    int i, error = 0;
3891
3892    /* write prstatus, psinfo and auxv for current thread */
3893    for (i = 0; i < info->numnote; i++)
3894        if ((error = write_note(&info->notes[i], fd)) != 0)
3895            return (error);
3896
3897    /* write prstatus for each thread */
3898    QTAILQ_FOREACH(ets, &info->thread_list, ets_link) {
3899        if ((error = write_note(&ets->notes[0], fd)) != 0)
3900            return (error);
3901    }
3902
3903    return (0);
3904}
3905
3906/*
3907 * Write out ELF coredump.
3908 *
3909 * See documentation of ELF object file format in:
3910 * http://www.caldera.com/developers/devspecs/gabi41.pdf
3911 *
3912 * Coredump format in linux is following:
3913 *
3914 * 0   +----------------------+         \
3915 *     | ELF header           | ET_CORE  |
3916 *     +----------------------+          |
3917 *     | ELF program headers  |          |--- headers
3918 *     | - NOTE section       |          |
3919 *     | - PT_LOAD sections   |          |
3920 *     +----------------------+         /
3921 *     | NOTEs:               |
3922 *     | - NT_PRSTATUS        |
3923 *     | - NT_PRSINFO         |
3924 *     | - NT_AUXV            |
3925 *     +----------------------+ <-- aligned to target page
3926 *     | Process memory dump  |
3927 *     :                      :
3928 *     .                      .
3929 *     :                      :
3930 *     |                      |
3931 *     +----------------------+
3932 *
3933 * NT_PRSTATUS -> struct elf_prstatus (per thread)
3934 * NT_PRSINFO  -> struct elf_prpsinfo
3935 * NT_AUXV is array of { type, value } pairs (see fill_auxv_note()).
3936 *
3937 * Format follows System V format as close as possible.  Current
3938 * version limitations are as follows:
3939 *     - no floating point registers are dumped
3940 *
3941 * Function returns 0 in case of success, negative errno otherwise.
3942 *
3943 * TODO: make this work also during runtime: it should be
3944 * possible to force coredump from running process and then
3945 * continue processing.  For example qemu could set up SIGUSR2
3946 * handler (provided that target process haven't registered
3947 * handler for that) that does the dump when signal is received.
3948 */
3949static int elf_core_dump(int signr, const CPUArchState *env)
3950{
3951    const CPUState *cpu = env_cpu((CPUArchState *)env);
3952    const TaskState *ts = (const TaskState *)cpu->opaque;
3953    struct vm_area_struct *vma = NULL;
3954    char corefile[PATH_MAX];
3955    struct elf_note_info info;
3956    struct elfhdr elf;
3957    struct elf_phdr phdr;
3958    struct rlimit dumpsize;
3959    struct mm_struct *mm = NULL;
3960    off_t offset = 0, data_offset = 0;
3961    int segs = 0;
3962    int fd = -1;
3963
3964    init_note_info(&info);
3965
3966    errno = 0;
3967    getrlimit(RLIMIT_CORE, &dumpsize);
3968    if (dumpsize.rlim_cur == 0)
3969        return 0;
3970
3971    if (core_dump_filename(ts, corefile, sizeof (corefile)) < 0)
3972        return (-errno);
3973
3974    if ((fd = open(corefile, O_WRONLY | O_CREAT,
3975                   S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) < 0)
3976        return (-errno);
3977
3978    /*
3979     * Walk through target process memory mappings and
3980     * set up structure containing this information.  After
3981     * this point vma_xxx functions can be used.
3982     */
3983    if ((mm = vma_init()) == NULL)
3984        goto out;
3985
3986    walk_memory_regions(mm, vma_walker);
3987    segs = vma_get_mapping_count(mm);
3988
3989    /*
3990     * Construct valid coredump ELF header.  We also
3991     * add one more segment for notes.
3992     */
3993    fill_elf_header(&elf, segs + 1, ELF_MACHINE, 0);
3994    if (dump_write(fd, &elf, sizeof (elf)) != 0)
3995        goto out;
3996
3997    /* fill in the in-memory version of notes */
3998    if (fill_note_info(&info, signr, env) < 0)
3999        goto out;
4000
4001    offset += sizeof (elf);                             /* elf header */
4002    offset += (segs + 1) * sizeof (struct elf_phdr);    /* program headers */
4003
4004    /* write out notes program header */
4005    fill_elf_note_phdr(&phdr, info.notes_size, offset);
4006
4007    offset += info.notes_size;
4008    if (dump_write(fd, &phdr, sizeof (phdr)) != 0)
4009        goto out;
4010
4011    /*
4012     * ELF specification wants data to start at page boundary so
4013     * we align it here.
4014     */
4015    data_offset = offset = roundup(offset, ELF_EXEC_PAGESIZE);
4016
4017    /*
4018     * Write program headers for memory regions mapped in
4019     * the target process.
4020     */
4021    for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
4022        (void) memset(&phdr, 0, sizeof (phdr));
4023
4024        phdr.p_type = PT_LOAD;
4025        phdr.p_offset = offset;
4026        phdr.p_vaddr = vma->vma_start;
4027        phdr.p_paddr = 0;
4028        phdr.p_filesz = vma_dump_size(vma);
4029        offset += phdr.p_filesz;
4030        phdr.p_memsz = vma->vma_end - vma->vma_start;
4031        phdr.p_flags = vma->vma_flags & PROT_READ ? PF_R : 0;
4032        if (vma->vma_flags & PROT_WRITE)
4033            phdr.p_flags |= PF_W;
4034        if (vma->vma_flags & PROT_EXEC)
4035            phdr.p_flags |= PF_X;
4036        phdr.p_align = ELF_EXEC_PAGESIZE;
4037
4038        bswap_phdr(&phdr, 1);
4039        if (dump_write(fd, &phdr, sizeof(phdr)) != 0) {
4040            goto out;
4041        }
4042    }
4043
4044    /*
4045     * Next we write notes just after program headers.  No
4046     * alignment needed here.
4047     */
4048    if (write_note_info(&info, fd) < 0)
4049        goto out;
4050
4051    /* align data to page boundary */
4052    if (lseek(fd, data_offset, SEEK_SET) != data_offset)
4053        goto out;
4054
4055    /*
4056     * Finally we can dump process memory into corefile as well.
4057     */
4058    for (vma = vma_first(mm); vma != NULL; vma = vma_next(vma)) {
4059        abi_ulong addr;
4060        abi_ulong end;
4061
4062        end = vma->vma_start + vma_dump_size(vma);
4063
4064        for (addr = vma->vma_start; addr < end;
4065             addr += TARGET_PAGE_SIZE) {
4066            char page[TARGET_PAGE_SIZE];
4067            int error;
4068
4069            /*
4070             *  Read in page from target process memory and
4071             *  write it to coredump file.
4072             */
4073            error = copy_from_user(page, addr, sizeof (page));
4074            if (error != 0) {
4075                (void) fprintf(stderr, "unable to dump " TARGET_ABI_FMT_lx "\n",
4076                               addr);
4077                errno = -error;
4078                goto out;
4079            }
4080            if (dump_write(fd, page, TARGET_PAGE_SIZE) < 0)
4081                goto out;
4082        }
4083    }
4084
4085 out:
4086    free_note_info(&info);
4087    if (mm != NULL)
4088        vma_delete(mm);
4089    (void) close(fd);
4090
4091    if (errno != 0)
4092        return (-errno);
4093    return (0);
4094}
4095#endif /* USE_ELF_CORE_DUMP */
4096
4097void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
4098{
4099    init_thread(regs, infop);
4100}
4101