138 строки
3.5 KiB
C
138 строки
3.5 KiB
C
/*
|
|
* IA-32 ELF core dump support.
|
|
*
|
|
* Copyright (C) 2003 Arun Sharma <arun.sharma@intel.com>
|
|
*
|
|
* Derived from the x86_64 version
|
|
*/
|
|
#ifndef _ELFCORE32_H_
|
|
#define _ELFCORE32_H_
|
|
|
|
#include <asm/intrinsics.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
#define USE_ELF_CORE_DUMP 1
|
|
|
|
/* Override elfcore.h */
|
|
#define _LINUX_ELFCORE_H 1
|
|
typedef unsigned int elf_greg_t;
|
|
|
|
#define ELF_NGREG (sizeof (struct user_regs_struct32) / sizeof(elf_greg_t))
|
|
typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
|
|
|
typedef struct ia32_user_i387_struct elf_fpregset_t;
|
|
typedef struct ia32_user_fxsr_struct elf_fpxregset_t;
|
|
|
|
struct elf_siginfo
|
|
{
|
|
int si_signo; /* signal number */
|
|
int si_code; /* extra code */
|
|
int si_errno; /* errno */
|
|
};
|
|
|
|
#define jiffies_to_timeval(a,b) do { (b)->tv_usec = 0; (b)->tv_sec = (a)/HZ; }while(0)
|
|
|
|
struct elf_prstatus
|
|
{
|
|
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 compat_timeval pr_utime; /* User time */
|
|
struct compat_timeval pr_stime; /* System time */
|
|
struct compat_timeval pr_cutime; /* Cumulative user time */
|
|
struct compat_timeval pr_cstime; /* Cumulative system time */
|
|
elf_gregset_t pr_reg; /* GP registers */
|
|
int pr_fpvalid; /* True if math co-processor being used. */
|
|
};
|
|
|
|
#define ELF_PRARGSZ (80) /* Number of chars for args */
|
|
|
|
struct elf_prpsinfo
|
|
{
|
|
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 */
|
|
__u16 pr_uid;
|
|
__u16 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_CORE_COPY_REGS(pr_reg, regs) \
|
|
pr_reg[0] = regs->r11; \
|
|
pr_reg[1] = regs->r9; \
|
|
pr_reg[2] = regs->r10; \
|
|
pr_reg[3] = regs->r14; \
|
|
pr_reg[4] = regs->r15; \
|
|
pr_reg[5] = regs->r13; \
|
|
pr_reg[6] = regs->r8; \
|
|
pr_reg[7] = regs->r16 & 0xffff; \
|
|
pr_reg[8] = (regs->r16 >> 16) & 0xffff; \
|
|
pr_reg[9] = (regs->r16 >> 32) & 0xffff; \
|
|
pr_reg[10] = (regs->r16 >> 48) & 0xffff; \
|
|
pr_reg[11] = regs->r1; \
|
|
pr_reg[12] = regs->cr_iip; \
|
|
pr_reg[13] = regs->r17 & 0xffff; \
|
|
pr_reg[14] = ia64_getreg(_IA64_REG_AR_EFLAG); \
|
|
pr_reg[15] = regs->r12; \
|
|
pr_reg[16] = (regs->r17 >> 16) & 0xffff;
|
|
|
|
static inline void elf_core_copy_regs(elf_gregset_t *elfregs,
|
|
struct pt_regs *regs)
|
|
{
|
|
ELF_CORE_COPY_REGS((*elfregs), regs)
|
|
}
|
|
|
|
static inline int elf_core_copy_task_regs(struct task_struct *t,
|
|
elf_gregset_t* elfregs)
|
|
{
|
|
ELF_CORE_COPY_REGS((*elfregs), task_pt_regs(t));
|
|
return 1;
|
|
}
|
|
|
|
static inline int
|
|
elf_core_copy_task_fpregs(struct task_struct *tsk, struct pt_regs *regs, elf_fpregset_t *fpu)
|
|
{
|
|
struct ia32_user_i387_struct *fpstate = (void*)fpu;
|
|
mm_segment_t old_fs;
|
|
|
|
if (!tsk_used_math(tsk))
|
|
return 0;
|
|
|
|
old_fs = get_fs();
|
|
set_fs(KERNEL_DS);
|
|
save_ia32_fpstate(tsk, (struct ia32_user_i387_struct __user *) fpstate);
|
|
set_fs(old_fs);
|
|
|
|
return 1;
|
|
}
|
|
|
|
#define ELF_CORE_COPY_XFPREGS 1
|
|
static inline int
|
|
elf_core_copy_task_xfpregs(struct task_struct *tsk, elf_fpxregset_t *xfpu)
|
|
{
|
|
struct ia32_user_fxsr_struct *fpxstate = (void*) xfpu;
|
|
mm_segment_t old_fs;
|
|
|
|
if (!tsk_used_math(tsk))
|
|
return 0;
|
|
|
|
old_fs = get_fs();
|
|
set_fs(KERNEL_DS);
|
|
save_ia32_fpxstate(tsk, (struct ia32_user_fxsr_struct __user *) fpxstate);
|
|
set_fs(old_fs);
|
|
|
|
return 1;
|
|
}
|
|
|
|
#endif /* _ELFCORE32_H_ */
|