OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [mips/] [kernel/] [binfmt_elfo32.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * Support for o32 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
 
24
typedef unsigned int elf_greg_t;
25
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
26
 
27
typedef double elf_fpreg_t;
28
typedef 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
                __res = 0;                                               \
44
        if (((__h->e_flags & EF_MIPS_ABI) != 0) &&                       \
45
            ((__h->e_flags & EF_MIPS_ABI) != EF_MIPS_ABI_O32))          \
46
                __res = 0;                                               \
47
                                                                        \
48
        __res;                                                          \
49
})
50
 
51
#define TASK32_SIZE             0x7fff8000UL
52
#undef ELF_ET_DYN_BASE
53
#define ELF_ET_DYN_BASE         (TASK32_SIZE / 3 * 2)
54
 
55
#include <asm/processor.h>
56
#include <linux/module.h>
57
#include <linux/elfcore.h>
58
#include <linux/compat.h>
59
 
60
#define elf_prstatus elf_prstatus32
61
struct elf_prstatus32
62
{
63
        struct elf_siginfo pr_info;     /* Info associated with signal */
64
        short   pr_cursig;              /* Current signal */
65
        unsigned int pr_sigpend;        /* Set of pending signals */
66
        unsigned int pr_sighold;        /* Set of held signals */
67
        pid_t   pr_pid;
68
        pid_t   pr_ppid;
69
        pid_t   pr_pgrp;
70
        pid_t   pr_sid;
71
        struct compat_timeval pr_utime; /* User time */
72
        struct compat_timeval pr_stime; /* System time */
73
        struct compat_timeval pr_cutime;/* Cumulative user time */
74
        struct compat_timeval pr_cstime;/* Cumulative system time */
75
        elf_gregset_t pr_reg;   /* GP registers */
76
        int pr_fpvalid;         /* True if math co-processor being used.  */
77
};
78
 
79
#define elf_prpsinfo elf_prpsinfo32
80
struct elf_prpsinfo32
81
{
82
        char    pr_state;       /* numeric process state */
83
        char    pr_sname;       /* char for pr_state */
84
        char    pr_zomb;        /* zombie */
85
        char    pr_nice;        /* nice val */
86
        unsigned int pr_flag;   /* flags */
87
        __kernel_uid_t  pr_uid;
88
        __kernel_gid_t  pr_gid;
89
        pid_t   pr_pid, pr_ppid, pr_pgrp, pr_sid;
90
        /* Lots missing */
91
        char    pr_fname[16];   /* filename of executable */
92
        char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
93
};
94
 
95
#define elf_caddr_t     u32
96
#define init_elf_binfmt init_elf32_binfmt
97
 
98
#define jiffies_to_timeval jiffies_to_compat_timeval
99
static inline void
100
jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
101
{
102
        /*
103
         * Convert jiffies to nanoseconds and seperate with
104
         * one divide.
105
         */
106
        u64 nsec = (u64)jiffies * TICK_NSEC;
107
        long rem;
108
        value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &rem);
109
        value->tv_usec = rem / NSEC_PER_USEC;
110
}
111
 
112
#undef ELF_CORE_COPY_REGS
113
#define ELF_CORE_COPY_REGS(_dest, _regs) elf32_core_copy_regs(_dest, _regs);
114
 
115
void elf32_core_copy_regs(elf_gregset_t grp, struct pt_regs *regs)
116
{
117
        int i;
118
 
119
        for (i = 0; i < EF_R0; i++)
120
                grp[i] = 0;
121
        grp[EF_R0] = 0;
122
        for (i = 1; i <= 31; i++)
123
                grp[EF_R0 + i] = (elf_greg_t) regs->regs[i];
124
        grp[EF_R26] = 0;
125
        grp[EF_R27] = 0;
126
        grp[EF_LO] = (elf_greg_t) regs->lo;
127
        grp[EF_HI] = (elf_greg_t) regs->hi;
128
        grp[EF_CP0_EPC] = (elf_greg_t) regs->cp0_epc;
129
        grp[EF_CP0_BADVADDR] = (elf_greg_t) regs->cp0_badvaddr;
130
        grp[EF_CP0_STATUS] = (elf_greg_t) regs->cp0_status;
131
        grp[EF_CP0_CAUSE] = (elf_greg_t) regs->cp0_cause;
132
#ifdef EF_UNUSED0
133
        grp[EF_UNUSED0] = 0;
134
#endif
135
}
136
 
137
MODULE_DESCRIPTION("Binary format loader for compatibility with o32 Linux/MIPS binaries");
138
MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");
139
 
140
#undef MODULE_DESCRIPTION
141
#undef MODULE_AUTHOR
142
 
143
#undef TASK_SIZE
144
#define TASK_SIZE TASK_SIZE32
145
 
146
#include "../../../fs/binfmt_elf.c"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.