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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [arch/] [mips64/] [kernel/] [binfmt_elfo32.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
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/config.h>
58
#include <linux/elfcore.h>
59
 
60
struct timeval32
61
{
62
        int tv_sec, tv_usec;
63
};
64
 
65
#define elf_prstatus elf_prstatus32
66
struct elf_prstatus32
67
{
68
        struct elf_siginfo pr_info;     /* Info associated with signal */
69
        short   pr_cursig;              /* Current signal */
70
        unsigned int pr_sigpend;        /* Set of pending signals */
71
        unsigned int pr_sighold;        /* Set of held signals */
72
        pid_t   pr_pid;
73
        pid_t   pr_ppid;
74
        pid_t   pr_pgrp;
75
        pid_t   pr_sid;
76
        struct timeval32 pr_utime;      /* User time */
77
        struct timeval32 pr_stime;      /* System time */
78
        struct timeval32 pr_cutime;     /* Cumulative user time */
79
        struct timeval32 pr_cstime;     /* Cumulative system time */
80
        elf_gregset_t pr_reg;   /* GP registers */
81
        int pr_fpvalid;         /* True if math co-processor being used.  */
82
};
83
 
84
#define elf_prpsinfo elf_prpsinfo32
85
struct elf_prpsinfo32
86
{
87
        char    pr_state;       /* numeric process state */
88
        char    pr_sname;       /* char for pr_state */
89
        char    pr_zomb;        /* zombie */
90
        char    pr_nice;        /* nice val */
91
        unsigned int pr_flag;   /* flags */
92
        __kernel_uid_t  pr_uid;
93
        __kernel_gid_t  pr_gid;
94
        pid_t   pr_pid, pr_ppid, pr_pgrp, pr_sid;
95
        /* Lots missing */
96
        char    pr_fname[16];   /* filename of executable */
97
        char    pr_psargs[ELF_PRARGSZ]; /* initial part of arg list */
98
};
99
 
100
#define elf_addr_t      u32
101
#define elf_caddr_t     u32
102
#define init_elf_binfmt init_elf32_binfmt
103
 
104
 
105
#undef ELF_CORE_COPY_REGS
106
#define ELF_CORE_COPY_REGS(_dest,_regs) elf32_core_copy_regs(_dest,_regs);
107
 
108
void elf32_core_copy_regs(elf_gregset_t _dest, struct pt_regs *_regs)
109
{
110
        int i;
111
 
112
        memset(_dest, 0, sizeof(elf_gregset_t));
113
 
114
        /* XXXKW the 6 is from EF_REG0 in gdb/gdb/mips-linux-tdep.c, include/asm-mips/reg.h */
115
        for (i=6; i<38; i++)
116
                _dest[i] = (elf_greg_t) _regs->regs[i-6];
117
        _dest[i++] = (elf_greg_t) _regs->lo;
118
        _dest[i++] = (elf_greg_t) _regs->hi;
119
        _dest[i++] = (elf_greg_t) _regs->cp0_epc;
120
        _dest[i++] = (elf_greg_t) _regs->cp0_badvaddr;
121
        _dest[i++] = (elf_greg_t) _regs->cp0_status;
122
        _dest[i++] = (elf_greg_t) _regs->cp0_cause;
123
}
124
 
125
#undef CONFIG_BINFMT_ELF
126
#ifdef CONFIG_BINFMT_ELF32
127
#define CONFIG_BINFMT_ELF CONFIG_BINFMT_ELF32
128
#endif
129
#undef CONFIG_BINFMT_ELF_MODULE
130
#ifdef CONFIG_BINFMT_ELF32_MODULE
131
#define CONFIG_BINFMT_ELF_MODULE CONFIG_BINFMT_ELF32_MODULE
132
#endif
133
 
134
MODULE_DESCRIPTION("Binary format loader for compatibility with o32 Linux/MIPS binaries");
135
MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");
136
 
137
#undef MODULE_DESCRIPTION
138
#undef MODULE_AUTHOR
139
 
140
#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.