linux/arch/mips/kernel/binfmt_elfn32.c
<<
>>
Prefs
   1/*
   2 * Support for n32 Linux/MIPS ELF binaries.
   3 *
   4 * Copyright (C) 1999, 2001 Ralf Baechle
   5 * Copyright (C) 1999, 2001 Silicon Graphics, Inc.
   6 *
   7 * Heavily inspired by the 32-bit Sparc compat code which is
   8 * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (davem@redhat.com)
   9 * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek   (jj@ultra.linux.cz)
  10 */
  11
  12#define ELF_ARCH                EM_MIPS
  13#define ELF_CLASS               ELFCLASS32
  14#ifdef __MIPSEB__
  15#define ELF_DATA                ELFDATA2MSB;
  16#else /* __MIPSEL__ */
  17#define ELF_DATA                ELFDATA2LSB;
  18#endif
  19
  20/* ELF register definitions */
  21#define ELF_NGREG       45
  22#define ELF_NFPREG      33
  23
  24typedef unsigned long elf_greg_t;
  25typedef elf_greg_t elf_gregset_t[ELF_NGREG];
  26
  27typedef double elf_fpreg_t;
  28typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
  29
  30/*
  31 * This is used to ensure we don't load something for the wrong architecture.
  32 */
  33#define elf_check_arch(hdr)                                             \
  34({                                                                      \
  35        int __res = 1;                                                  \
  36        struct elfhdr *__h = (hdr);                                     \
  37                                                                        \
  38        if (__h->e_machine != EM_MIPS)                                  \
  39                __res = 0;                                              \
  40        if (__h->e_ident[EI_CLASS] != ELFCLASS32)                       \
  41                __res = 0;                                              \
  42        if (((__h->e_flags & EF_MIPS_ABI2) == 0) ||                     \
  43            ((__h->e_flags & EF_MIPS_ABI) != 0))                        \
  44                __res = 0;                                              \
  45                                                                        \
  46        __res;                                                          \
  47})
  48
  49#define TASK32_SIZE             0x7fff8000UL
  50#undef ELF_ET_DYN_BASE
  51#define ELF_ET_DYN_BASE         (TASK32_SIZE / 3 * 2)
  52
  53#include <asm/processor.h>
  54#include <linux/module.h>
  55#include <linux/elfcore.h>
  56#include <linux/compat.h>
  57#include <linux/math64.h>
  58
  59#define elf_prstatus elf_prstatus32
  60struct elf_prstatus32
  61{
  62        struct elf_siginfo pr_info;     /* Info associated with signal */
  63        short   pr_cursig;              /* Current signal */
  64        unsigned int pr_sigpend;        /* Set of pending signals */
  65        unsigned int pr_sighold;        /* Set of held signals */
  66        pid_t   pr_pid;
  67        pid_t   pr_ppid;
  68        pid_t   pr_pgrp;
  69        pid_t   pr_sid;
  70        struct compat_timeval pr_utime; /* User time */
  71        struct compat_timeval pr_stime; /* System time */
  72        struct compat_timeval pr_cutime;/* Cumulative user time */
  73        struct compat_timeval pr_cstime;/* Cumulative system time */
  74        elf_gregset_t pr_reg;   /* GP registers */
  75        int pr_fpvalid;         /* True if math co-processor being used.  */
  76};
  77
  78#define elf_prpsinfo elf_prpsinfo32
  79struct elf_prpsinfo32
  80{
  81        char    pr_state;       /* numeric process state */
  82        char    pr_sname;       /* char for pr_state */
  83        char    pr_zomb;        /* zombie */
  84        char    pr_nice;        /* nice val */
  85        unsigned int pr_flag;   /* flags */
  86        __kernel_uid_t  pr_uid;
  87        __kernel_gid_t  pr_gid;
  88        pid_t   pr_pid, pr_ppid, pr_pgrp, pr_sid;
  89        /* Lots missing */
  90        char    pr_fname[16];   /* filename of executable */
  91        char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
  92};
  93
  94#define elf_caddr_t     u32
  95#define init_elf_binfmt init_elfn32_binfmt
  96
  97#define jiffies_to_timeval jiffies_to_compat_timeval
  98static __inline__ void
  99jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
 100{
 101        /*
 102         * Convert jiffies to nanoseconds and separate with
 103         * one divide.
 104         */
 105        u64 nsec = (u64)jiffies * TICK_NSEC;
 106        u32 rem;
 107        value->tv_sec = div_u64_rem(nsec, NSEC_PER_SEC, &rem);
 108        value->tv_usec = rem / NSEC_PER_USEC;
 109}
 110
 111#define ELF_CORE_EFLAGS EF_MIPS_ABI2
 112
 113MODULE_DESCRIPTION("Binary format loader for compatibility with n32 Linux/MIPS binaries");
 114MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");
 115
 116#undef MODULE_DESCRIPTION
 117#undef MODULE_AUTHOR
 118
 119#undef TASK_SIZE
 120#define TASK_SIZE TASK_SIZE32
 121
 122#undef cputime_to_timeval
 123#define cputime_to_timeval cputime_to_compat_timeval
 124static __inline__ void
 125cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value)
 126{
 127        unsigned long jiffies = cputime_to_jiffies(cputime);
 128
 129        value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
 130        value->tv_sec = jiffies / HZ;
 131}
 132
 133#include "../../../fs/binfmt_elf.c"
 134