/[qemu]/qemu/linux-user/elfload.c
ViewVC logotype

Diff of /qemu/linux-user/elfload.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.28 by bellard, Sun Oct 30 20:58:30 2005 UTC revision 1.29 by bellard, Sat Nov 26 11:41:16 2005 UTC
# Line 25  Line 25 
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  /*  /*
# Line 91  static inline void init_thread(struct ta Line 111  static inline void init_thread(struct ta
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,
# Line 104  enum Line 123  enum
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
# Line 233  static inline void init_thread(struct ta Line 247  static inline void init_thread(struct ta
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  /*  /*
# Line 314  struct exec Line 336  struct exec
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  {  {
# Line 646  static unsigned int * create_elf_tables( Line 668  static unsigned int * create_elf_tables(
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
# Line 681  static unsigned int * create_elf_tables( Line 715  static unsigned int * create_elf_tables(
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

Legend:
Removed from v.1.28  
changed lines
  Added in v.1.29

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26