binfmt_elfo32.c

来自「linux-2.4.29操作系统的源码」· C语言 代码 · 共 141 行

C
141
字号
/* * Support for o32 Linux/MIPS ELF binaries. * * Copyright (C) 1999, 2001 Ralf Baechle * Copyright (C) 1999, 2001 Silicon Graphics, Inc. * * Heavily inspired by the 32-bit Sparc compat code which is * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (davem@redhat.com) * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek   (jj@ultra.linux.cz) */#define ELF_ARCH		EM_MIPS#define ELF_CLASS		ELFCLASS32#ifdef __MIPSEB__#define ELF_DATA		ELFDATA2MSB;#else /* __MIPSEL__ */#define ELF_DATA		ELFDATA2LSB;#endif/* ELF register definitions */#define ELF_NGREG	45#define ELF_NFPREG	33typedef unsigned int elf_greg_t;typedef elf_greg_t elf_gregset_t[ELF_NGREG];typedef double elf_fpreg_t;typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];/* * This is used to ensure we don't load something for the wrong architecture. */#define elf_check_arch(hdr)						\({									\	int __res = 1;							\	struct elfhdr *__h = (hdr);					\									\	if (__h->e_machine != EM_MIPS)					\		__res = 0;						\	if (__h->e_ident[EI_CLASS] != ELFCLASS32)			\		__res = 0;						\	if ((__h->e_flags & EF_MIPS_ABI2) != 0)				\		__res = 0;						\	if (((__h->e_flags & EF_MIPS_ABI) != 0) &&			\	    ((__h->e_flags & EF_MIPS_ABI) != EF_MIPS_ABI_O32))		\		__res = 0;						\									\	__res;								\})#define TASK32_SIZE		0x7fff8000UL#undef ELF_ET_DYN_BASE#define ELF_ET_DYN_BASE         (TASK32_SIZE / 3 * 2)#include <asm/processor.h>#include <linux/module.h>#include <linux/config.h>#include <linux/elfcore.h>struct timeval32{	int tv_sec, tv_usec;};#define elf_prstatus elf_prstatus32struct elf_prstatus32{	struct elf_siginfo pr_info;	/* Info associated with signal */	short	pr_cursig;		/* Current signal */	unsigned int pr_sigpend;	/* Set of pending signals */	unsigned int pr_sighold;	/* Set of held signals */	pid_t	pr_pid;	pid_t	pr_ppid;	pid_t	pr_pgrp;	pid_t	pr_sid;	struct timeval32 pr_utime;	/* User time */	struct timeval32 pr_stime;	/* System time */	struct timeval32 pr_cutime;	/* Cumulative user time */	struct timeval32 pr_cstime;	/* Cumulative system time */	elf_gregset_t pr_reg;	/* GP registers */	int pr_fpvalid;		/* True if math co-processor being used.  */};#define elf_prpsinfo elf_prpsinfo32struct elf_prpsinfo32{	char	pr_state;	/* numeric process state */	char	pr_sname;	/* char for pr_state */	char	pr_zomb;	/* zombie */	char	pr_nice;	/* nice val */	unsigned int pr_flag;	/* flags */	__kernel_uid_t	pr_uid;	__kernel_gid_t	pr_gid;	pid_t	pr_pid, pr_ppid, pr_pgrp, pr_sid;	/* Lots missing */	char	pr_fname[16];	/* filename of executable */	char	pr_psargs[ELF_PRARGSZ];	/* initial part of arg list */};#define elf_addr_t	u32#define elf_caddr_t	u32#define init_elf_binfmt init_elf32_binfmt#undef ELF_CORE_COPY_REGS#define ELF_CORE_COPY_REGS(_dest,_regs) elf32_core_copy_regs(_dest,_regs);void elf32_core_copy_regs(elf_gregset_t _dest, struct pt_regs *_regs){	int i;	memset(_dest, 0, sizeof(elf_gregset_t));	/* XXXKW the 6 is from EF_REG0 in gdb/gdb/mips-linux-tdep.c, include/asm-mips/reg.h */	for (i=6; i<38; i++)		_dest[i] = (elf_greg_t) _regs->regs[i-6];	_dest[i++] = (elf_greg_t) _regs->lo;	_dest[i++] = (elf_greg_t) _regs->hi;	_dest[i++] = (elf_greg_t) _regs->cp0_epc;	_dest[i++] = (elf_greg_t) _regs->cp0_badvaddr;	_dest[i++] = (elf_greg_t) _regs->cp0_status;	_dest[i++] = (elf_greg_t) _regs->cp0_cause;}#undef CONFIG_BINFMT_ELF#ifdef CONFIG_BINFMT_ELF32#define CONFIG_BINFMT_ELF CONFIG_BINFMT_ELF32#endif#undef CONFIG_BINFMT_ELF_MODULE#ifdef CONFIG_BINFMT_ELF32_MODULE#define CONFIG_BINFMT_ELF_MODULE CONFIG_BINFMT_ELF32_MODULE#endifMODULE_DESCRIPTION("Binary format loader for compatibility with o32 Linux/MIPS binaries");MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");#undef MODULE_DESCRIPTION#undef MODULE_AUTHOR#include "../../../fs/binfmt_elf.c"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?