/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/
/*
* Copyright (c) 2014, Joyent, Inc.
*/
#ifndef _PCORE_LINUX_H
#define _PCORE_LINUX_H
/*
* Note that these structures can end up in both a 32-bit and 64-bit libproc.
* Therefore, one should generally avoid using types whose size change between
* ILP32 and LP64 and instead use the correct fixed width type. eg. long should
* be int32_t and int64_t as appropriate to whether it's a 32-bit or 64-bit
* structure.
*/
#ifdef __cplusplus
extern "C" {
#endif
/* Process Information */
typedef struct lx_prpsinfo32 {
uint8_t pr_state; /* Numeric process state */
int8_t pr_sname; /* Char for pr_state */
uint8_t pr_zomb; /* Zombie */
int8_t pr_nice; /* Nice value */
uint32_t pr_flag; /* Flags */
uint16_t pr_uid; /* User ID */
uint16_t pr_gid; /* Group ID */
int32_t pr_pid; /* Process ID */
int32_t pr_ppid; /* Parent's process ID */
int32_t pr_pgrp; /* Group ID */
int32_t pr_sid; /* Session ID */
char pr_fname[16]; /* Filename of executable */
char pr_psargs[80]; /* Initial part of arg list */
} lx_prpsinfo32_t;
typedef struct lx_prpsinfo64 {
uint8_t pr_state; /* Numeric process state */
int8_t pr_sname; /* Char for pr_state */
uint8_t pr_zomb; /* Zombie */
int8_t pr_nice; /* Nice value */
uint64_t pr_flag; /* Flags */
uint32_t pr_uid; /* User ID */
uint32_t pr_gid; /* Group ID */
int32_t pr_pid; /* Process ID */
int32_t pr_ppid; /* Parent's process ID */
int32_t pr_pgrp; /* Group ID */
int32_t pr_sid; /* Session ID */
char pr_fname[16]; /* Filename of executable */
char pr_psargs[80]; /* Initial part of arg list */
} lx_prpsinfo64_t;
typedef struct lx_amd64_regs {
uint64_t lxr_r15;
uint64_t lxr_r14;
uint64_t lxr_r13;
uint64_t lxr_r12;
uint64_t lxr_rbp;
uint64_t lxr_rbx;
uint64_t lxr_r11;
uint64_t lxr_r10;
uint64_t lxr_r9;
uint64_t lxr_r8;
uint64_t lxr_rax;
uint64_t lxr_rcx;
uint64_t lxr_rdx;
uint64_t lxr_rsi;
uint64_t lxr_rdi;
uint64_t lxr_orig_rax;
uint64_t lxr_rip;
uint64_t lxr_cs;
uint64_t lxr_eflags;
uint64_t lxr_rsp;
uint64_t lxr_ss;
uint64_t lxr_fs_base;
uint64_t lxr_gs_base;
uint64_t lxr_ds;
uint64_t lxr_es;
uint64_t lxr_fs;
uint64_t lxr_gs;
} lx_amd64_regs_t;
typedef struct lx_ia32_regs {
uint32_t lxr_bx;
uint32_t lxr_cx;
uint32_t lxr_dx;
uint32_t lxr_si;
uint32_t lxr_di;
uint32_t lxr_bp;
uint32_t lxr_ax;
uint32_t lxr_ds;
uint32_t lxr_es;
uint32_t lxr_fs;
uint32_t lxr_gs;
uint32_t lxr_orig_ax;
uint32_t lxr_ip;
uint32_t lxr_cs;
uint32_t lxr_flags;
uint32_t lxr_sp;
uint32_t lxr_ss;
} lx_ia32_regs_t;
typedef struct lx_elf_siginfo {
int32_t si_signo; /* Signal number */
int32_t si_code; /* Extra code */
int32_t si_errno; /* Errno */
} lx_elf_siginfo_t;
typedef struct lx_elf_timeval32 {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */
} lx_elf_timeval32_t;
typedef struct lx_elf_timeval64 {
int64_t tv_sec; /* Seconds */
int64_t tv_usec; /* Microseconds */
} lx_elf_timeval64_t;
/* Thread Information */
typedef struct lx_prstatus32 {
lx_elf_siginfo_t pr_info; /* Singal Info */
uint16_t pr_cursig; /* Current signal */
uint32_t pr_sigpend; /* Set of pending signals */
uint32_t pr_sighold; /* Set of held signals */
int32_t pr_pid; /* Process ID */
int32_t pr_ppid; /* Parent's process ID */
int32_t pr_pgrp; /* Group ID */
int32_t pr_sid; /* Session ID */
lx_elf_timeval32_t pr_utime; /* User time */
lx_elf_timeval32_t pr_stime; /* System time */
lx_elf_timeval32_t pr_cutime; /* Cumulative user time */
lx_elf_timeval32_t pr_cstime; /* Cumulative system time */
lx_ia32_regs_t pr_reg; /* CPU registers */
uint32_t pr_fpvalid; /* True if we have fp state */
} lx_prstatus32_t;
typedef struct lx_prstatus64 {
lx_elf_siginfo_t pr_info; /* Singal Info */
uint16_t pr_cursig; /* Current signal */
uint64_t pr_sigpend; /* Set of pending signals */
uint64_t pr_sighold; /* Set of held signals */
int32_t pr_pid; /* Process ID */
int32_t pr_ppid; /* Parent's process ID */
int32_t pr_pgrp; /* Group ID */
int32_t pr_sid; /* Session ID */
lx_elf_timeval64_t pr_utime; /* User time */
lx_elf_timeval64_t pr_stime; /* System time */
lx_elf_timeval64_t pr_cutime; /* Cumulative user time */
lx_elf_timeval64_t pr_cstime; /* Cumulative system time */
lx_amd64_regs_t pr_reg; /* CPU registers */
uint32_t pr_fpvalid; /* True if we have fp state */
} lx_prstatus64_t;
#define LTIME_TO_TIMESPEC(dst, src) \
(dst).tv_sec = (src).tv_sec; \
(dst).tv_nsec = (src).tv_usec * 1000;
#ifdef __cplusplus
}
#endif
#endif /* _PCORE_LINUX_H */