| 25 |
|
|
| 26 |
#ifdef TARGET_I386 |
#ifdef TARGET_I386 |
| 27 |
|
|
| 28 |
|
#define ELF_PLATFORM get_elf_platform() |
| 29 |
|
|
| 30 |
|
static const char *get_elf_platform(void) |
| 31 |
|
{ |
| 32 |
|
static char elf_platform[] = "i386"; |
| 33 |
|
int family = (global_env->cpuid_version >> 8) & 0xff; |
| 34 |
|
if (family > 6) |
| 35 |
|
family = 6; |
| 36 |
|
if (family >= 3) |
| 37 |
|
elf_platform[1] = '0' + family; |
| 38 |
|
return elf_platform; |
| 39 |
|
} |
| 40 |
|
|
| 41 |
|
#define ELF_HWCAP get_elf_hwcap() |
| 42 |
|
|
| 43 |
|
static uint32_t get_elf_hwcap(void) |
| 44 |
|
{ |
| 45 |
|
return global_env->cpuid_features; |
| 46 |
|
} |
| 47 |
|
|
| 48 |
#define ELF_START_MMAP 0x80000000 |
#define ELF_START_MMAP 0x80000000 |
| 49 |
|
|
| 50 |
/* |
/* |
| 111 |
#define USE_ELF_CORE_DUMP |
#define USE_ELF_CORE_DUMP |
| 112 |
#define ELF_EXEC_PAGESIZE 4096 |
#define ELF_EXEC_PAGESIZE 4096 |
| 113 |
|
|
|
#define DLINFO_ARCH_ITEMS 1 |
|
| 114 |
enum |
enum |
| 115 |
{ |
{ |
| 116 |
ARM_HWCAP_ARM_SWP = 1 << 0, |
ARM_HWCAP_ARM_SWP = 1 << 0, |
| 123 |
ARM_HWCAP_ARM_EDSP = 1 << 7, |
ARM_HWCAP_ARM_EDSP = 1 << 7, |
| 124 |
}; |
}; |
| 125 |
|
|
| 126 |
#define ARM_HWCAPS (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF \ |
#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF \ |
| 127 |
| ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT \ |
| ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT \ |
| 128 |
| ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP) |
| ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP) |
| 129 |
|
|
|
#define ARCH_DLINFO \ |
|
|
do { \ |
|
|
NEW_AUX_ENT(AT_HWCAP, ARM_HWCAPS); \ |
|
|
} while (0) |
|
|
|
|
| 130 |
#endif |
#endif |
| 131 |
|
|
| 132 |
#ifdef TARGET_SPARC |
#ifdef TARGET_SPARC |
| 247 |
|
|
| 248 |
#endif |
#endif |
| 249 |
|
|
| 250 |
|
#ifndef ELF_PLATFORM |
| 251 |
|
#define ELF_PLATFORM (NULL) |
| 252 |
|
#endif |
| 253 |
|
|
| 254 |
|
#ifndef ELF_HWCAP |
| 255 |
|
#define ELF_HWCAP 0 |
| 256 |
|
#endif |
| 257 |
|
|
| 258 |
#include "elf.h" |
#include "elf.h" |
| 259 |
|
|
| 260 |
/* |
/* |
| 336 |
#define INTERPRETER_AOUT 1 |
#define INTERPRETER_AOUT 1 |
| 337 |
#define INTERPRETER_ELF 2 |
#define INTERPRETER_ELF 2 |
| 338 |
|
|
| 339 |
#define DLINFO_ITEMS 11 |
#define DLINFO_ITEMS 12 |
| 340 |
|
|
| 341 |
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n) |
static inline void memcpy_fromfs(void * to, const void * from, unsigned long n) |
| 342 |
{ |
{ |
| 668 |
{ |
{ |
| 669 |
target_ulong *argv, *envp; |
target_ulong *argv, *envp; |
| 670 |
target_ulong *sp, *csp; |
target_ulong *sp, *csp; |
| 671 |
|
target_ulong *u_platform; |
| 672 |
|
const char *k_platform; |
| 673 |
int v; |
int v; |
| 674 |
|
|
| 675 |
/* |
/* |
| 676 |
* Force 16 byte _final_ alignment here for generality. |
* Force 16 byte _final_ alignment here for generality. |
| 677 |
*/ |
*/ |
| 678 |
sp = (unsigned int *) (~15UL & (unsigned long) p); |
sp = (unsigned int *) (~15UL & (unsigned long) p); |
| 679 |
|
u_platform = NULL; |
| 680 |
|
k_platform = ELF_PLATFORM; |
| 681 |
|
if (k_platform) { |
| 682 |
|
size_t len = strlen(k_platform) + 1; |
| 683 |
|
sp -= (len + sizeof(target_ulong) - 1) / sizeof(target_ulong); |
| 684 |
|
u_platform = (target_ulong *)sp; |
| 685 |
|
__copy_to_user(u_platform, k_platform, len); |
| 686 |
|
} |
| 687 |
csp = sp; |
csp = sp; |
| 688 |
csp -= (DLINFO_ITEMS + 1) * 2; |
csp -= (DLINFO_ITEMS + 1) * 2; |
| 689 |
|
if (k_platform) |
| 690 |
|
csp -= 2; |
| 691 |
#ifdef DLINFO_ARCH_ITEMS |
#ifdef DLINFO_ARCH_ITEMS |
| 692 |
csp -= DLINFO_ARCH_ITEMS*2; |
csp -= DLINFO_ARCH_ITEMS*2; |
| 693 |
#endif |
#endif |
| 715 |
NEW_AUX_ENT(AT_EUID, (target_ulong) geteuid()); |
NEW_AUX_ENT(AT_EUID, (target_ulong) geteuid()); |
| 716 |
NEW_AUX_ENT(AT_GID, (target_ulong) getgid()); |
NEW_AUX_ENT(AT_GID, (target_ulong) getgid()); |
| 717 |
NEW_AUX_ENT(AT_EGID, (target_ulong) getegid()); |
NEW_AUX_ENT(AT_EGID, (target_ulong) getegid()); |
| 718 |
|
NEW_AUX_ENT(AT_HWCAP, (target_ulong) ELF_HWCAP); |
| 719 |
|
if (k_platform) |
| 720 |
|
NEW_AUX_ENT(AT_PLATFORM, (target_ulong) u_platform); |
| 721 |
#ifdef ARCH_DLINFO |
#ifdef ARCH_DLINFO |
| 722 |
/* |
/* |
| 723 |
* ARCH_DLINFO must come last so platform specific code can enforce |
* ARCH_DLINFO must come last so platform specific code can enforce |