#include #include #include typedef __uint32_t __u32; typedef __uint64_t __u64; typedef __uint16_t __u16; typedef __uint8_t __u8; typedef uid_t __kernel_uid_t; typedef gid_t __kernel_gid_t; typedef Elf_Note Elf32_Nhdr; typedef Elf_Note Elf64_Nhdr; #if __FreeBSD_version < 500000 #define ELFMAG "\177ELF" #define SELFMAG 4 #endif #ifndef NT_TASKSTRUCT #define NT_TASKSTRUCT 4 #endif #ifdef LEGACY_UNUSED struct elf_siginfo { int si_signo; /* signal number */ int si_code; /* extra code */ int si_errno; /* errno */ }; typedef unsigned long elf_greg_t; struct user_regs_struct { long ebx, ecx, edx, esi, edi, ebp, eax; unsigned short ds, __ds, es, __es; unsigned short fs, __fs, gs, __gs; long orig_eax, eip; unsigned short cs, __cs; long eflags, esp; unsigned short ss, __ss; }; #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t)) typedef elf_greg_t elf_gregset_t[ELF_NGREG]; struct elf_prstatus { #if 0 long pr_flags; /* XXX Process flags */ short pr_why; /* XXX Reason for process halt */ short pr_what; /* XXX More detailed reason */ #endif struct elf_siginfo pr_info; /* Info associated with signal */ short pr_cursig; /* Current signal */ unsigned long pr_sigpend; /* Set of pending signals */ unsigned long pr_sighold; /* Set of held signals */ #if 0 struct sigaltstack pr_altstack; /* Alternate stack info */ struct sigaction pr_action; /* Signal action for current sig */ #endif pid_t pr_pid; pid_t pr_ppid; pid_t pr_pgrp; pid_t pr_sid; struct timeval pr_utime; /* User time */ struct timeval pr_stime; /* System time */ struct timeval pr_cutime; /* Cumulative user time */ struct timeval pr_cstime; /* Cumulative system time */ #if 0 long pr_instr; /* Current instruction */ #endif elf_gregset_t pr_reg; /* GP registers */ int pr_fpvalid; /* True if math co-processor being used. */ }; #endif /* LEGACY_UNUSED */ #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 long 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 */ }; /* * Host-platform independent data */ #define CLIENT_BYTE_ORDER(client) \ ((client->machine_type == EM_386 || \ client->machine_type == EM_X86_64 || \ client->machine_type == EM_IA_64) ? LITTLE_ENDIAN : BIG_ENDIAN) #define BYTE_SWAP_REQUIRED(client) (BYTE_ORDER != CLIENT_BYTE_ORDER(client)) typedef unsigned short u16; #undef min #define min(x,y) ((x) < (y) ? x : y) /* * 32-bit vs. 64-bit versions. */ struct elf_prpsinfo_32 { char pr_state; /* numeric process state */ char pr_sname; /* char for pr_state */ char pr_zomb; /* zombie */ char pr_nice; /* nice val */ __u32 pr_flag; /* flags */ __u16 pr_uid; __u16 pr_gid; __u32 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 */ }; struct elf_prpsinfo_64 { char pr_state; /* numeric process state */ char pr_sname; /* char for pr_state */ char pr_zomb; /* zombie */ char pr_nice; /* nice val */ __u64 pr_flag; /* flags */ __u32 pr_uid; __u32 pr_gid; __u32 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 */ }; /* * i386 specific */ struct user_regs_struct_i386 { __u32 ebx, ecx, edx, esi, edi, ebp, eax; __u16 ds, __ds, es, __es; __u16 fs, __fs, gs, __gs; __u32 orig_eax, eip; __u16 cs, __cs; __u32 eflags, esp; __u16 ss, __ss; }; #define ELF_NGREG_I386 (sizeof (struct user_regs_struct_i386) / sizeof(__u32)) typedef __u32 elf_gregset_i386_t[ELF_NGREG_I386]; struct elf_prstatus_i386 { char pad[72]; elf_gregset_i386_t pr_reg; /* GP registers */ __u32 pr_fpvalid; /* True if math co-processor being used. */ }; /* * x86_64 specific */ struct user_regs_struct_x86_64 { __u64 r15,r14,r13,r12,rbp,rbx,r11,r10; __u64 r9,r8,rax,rcx,rdx,rsi,rdi,orig_rax; __u64 rip,cs,eflags; __u64 rsp,ss; __u64 fs_base, gs_base; __u64 ds,es,fs,gs; }; #define ELF_NGREG_X86_64 (sizeof (struct user_regs_struct_x86_64) / sizeof(__u64)) typedef __u64 elf_gregset_x86_64_t[ELF_NGREG_X86_64]; struct elf_prstatus_x86_64 { char pad[112]; elf_gregset_x86_64_t pr_reg; /* GP registers */ __u32 pr_fpvalid; /* True if math co-processor being used. */ }; /* * ppc64 specific */ struct user_regs_struct_ppc64 { __u64 gpr[32]; __u64 nip; __u64 msr; __u64 orig_gpr3; __u64 ctr; __u64 link; __u64 xer; __u64 ccr; __u64 softe; __u64 trap; __u64 dar; __u64 dsisr; __u64 result; }; #define ELF_NGREG_PPC64 (sizeof (struct user_regs_struct_ppc64) / sizeof(__u64)) typedef __u64 elf_gregset_ppc64_t[ELF_NGREG_PPC64]; struct elf_prstatus_ppc64 { char pad[112]; elf_gregset_ppc64_t pr_reg; /* GP registers */ __u32 pr_fpvalid; /* True if math co-processor being used. */ }; /* * ia64 specific */ struct ia64_fpreg { union { __u64 bits[2]; } u; } __attribute__ ((aligned (16))); struct user_regs_struct_ia64 { /* The following registers are saved by SAVE_MIN: */ __u64 b6; /* scratch */ __u64 b7; /* scratch */ __u64 ar_csd; /* used by cmp8xchg16 (scratch) */ __u64 ar_ssd; /* reserved for future use (scratch) */ __u64 r8; /* scratch (return value register 0) */ __u64 r9; /* scratch (return value register 1) */ __u64 r10; /* scratch (return value register 2) */ __u64 r11; /* scratch (return value register 3) */ __u64 cr_ipsr; /* interrupted task's psr */ __u64 cr_iip; /* interrupted task's instruction pointer */ __u64 cr_ifs; /* interrupted task's function state */ __u64 ar_unat; /* interrupted task's NaT register (preserved) */ __u64 ar_pfs; /* prev function state */ __u64 ar_rsc; /* RSE configuration */ /* The following two are valid only if cr_ipsr.cpl > 0: */ __u64 ar_rnat; /* RSE NaT */ __u64 ar_bspstore; /* RSE bspstore */ __u64 pr; /* 64 predicate registers (1 bit each) */ __u64 b0; /* return pointer (bp) */ __u64 loadrs; /* size of dirty partition << 16 */ __u64 r1; /* the gp pointer */ __u64 r12; /* interrupted task's memory stack pointer */ __u64 r13; /* thread pointer */ __u64 ar_fpsr; /* floating point status (preserved) */ __u64 r15; /* scratch */ /* The remaining registers are NOT saved for system calls. */ __u64 r14; /* scratch */ __u64 r2; /* scratch */ __u64 r3; /* scratch */ /* The following registers are saved by SAVE_REST: */ __u64 r16; /* scratch */ __u64 r17; /* scratch */ __u64 r18; /* scratch */ __u64 r19; /* scratch */ __u64 r20; /* scratch */ __u64 r21; /* scratch */ __u64 r22; /* scratch */ __u64 r23; /* scratch */ __u64 r24; /* scratch */ __u64 r25; /* scratch */ __u64 r26; /* scratch */ __u64 r27; /* scratch */ __u64 r28; /* scratch */ __u64 r29; /* scratch */ __u64 r30; /* scratch */ __u64 r31; /* scratch */ __u64 ar_ccv; /* compare/exchange value (scratch) */ /* * Floating point registers that the kernel considers scratch: */ struct ia64_fpreg f6; /* scratch */ struct ia64_fpreg f7; /* scratch */ struct ia64_fpreg f8; /* scratch */ struct ia64_fpreg f9; /* scratch */ struct ia64_fpreg f10; /* scratch */ struct ia64_fpreg f11; /* scratch */ }; #define ELF_NGREG_IA64 (sizeof (struct user_regs_struct_ia64) / sizeof(__u64)) typedef __u64 elf_gregset_ia64_t[ELF_NGREG_IA64]; struct elf_prstatus_ia64 { char pad[112]; elf_gregset_ia64_t pr_reg; /* GP registers */ __u32 pr_fpvalid; /* True if math co-processor being used. */ };