1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright (c) 2014, Joyent, Inc. 14 */ 15 16 #ifndef _PCORE_LINUX_H 17 #define _PCORE_LINUX_H 18 19 /* 20 * Note that these structures can end up in both a 32-bit and 64-bit libproc. 21 * Therefore, one should generally avoid using types whose size change between 22 * ILP32 and LP64 and instead use the correct fixed width type. eg. long should 23 * be int32_t and int64_t as appropriate to whether it's a 32-bit or 64-bit 24 * structure. 25 */ 26 27 #ifdef __cplusplus 28 extern "C" { 29 #endif 30 31 /* Process Information */ 32 typedef struct lx_prpsinfo32 { 33 uint8_t pr_state; /* Numeric process state */ 34 int8_t pr_sname; /* Char for pr_state */ 35 uint8_t pr_zomb; /* Zombie */ 36 int8_t pr_nice; /* Nice value */ 37 uint32_t pr_flag; /* Flags */ 38 uint16_t pr_uid; /* User ID */ 39 uint16_t pr_gid; /* Group ID */ 40 int32_t pr_pid; /* Process ID */ 41 int32_t pr_ppid; /* Parent's process ID */ 42 int32_t pr_pgrp; /* Group ID */ 43 int32_t pr_sid; /* Session ID */ 44 char pr_fname[16]; /* Filename of executable */ 45 char pr_psargs[80]; /* Initial part of arg list */ 46 } lx_prpsinfo32_t; 47 48 typedef struct lx_prpsinfo64 { 49 uint8_t pr_state; /* Numeric process state */ 50 int8_t pr_sname; /* Char for pr_state */ 51 uint8_t pr_zomb; /* Zombie */ 52 int8_t pr_nice; /* Nice value */ 53 uint64_t pr_flag; /* Flags */ 54 uint32_t pr_uid; /* User ID */ 55 uint32_t pr_gid; /* Group ID */ 56 int32_t pr_pid; /* Process ID */ 57 int32_t pr_ppid; /* Parent's process ID */ 58 int32_t pr_pgrp; /* Group ID */ 59 int32_t pr_sid; /* Session ID */ 60 char pr_fname[16]; /* Filename of executable */ 61 char pr_psargs[80]; /* Initial part of arg list */ 62 } lx_prpsinfo64_t; 63 64 typedef struct lx_amd64_regs { 65 uint64_t lxr_r15; 66 uint64_t lxr_r14; 67 uint64_t lxr_r13; 68 uint64_t lxr_r12; 69 uint64_t lxr_rbp; 70 uint64_t lxr_rbx; 71 uint64_t lxr_r11; 72 uint64_t lxr_r10; 73 uint64_t lxr_r9; 74 uint64_t lxr_r8; 75 uint64_t lxr_rax; 76 uint64_t lxr_rcx; 77 uint64_t lxr_rdx; 78 uint64_t lxr_rsi; 79 uint64_t lxr_rdi; 80 uint64_t lxr_orig_rax; 81 uint64_t lxr_rip; 82 uint64_t lxr_cs; 83 uint64_t lxr_eflags; 84 uint64_t lxr_rsp; 85 uint64_t lxr_ss; 86 uint64_t lxr_fs_base; 87 uint64_t lxr_gs_base; 88 uint64_t lxr_ds; 89 uint64_t lxr_es; 90 uint64_t lxr_fs; 91 uint64_t lxr_gs; 92 } lx_amd64_regs_t; 93 94 typedef struct lx_ia32_regs { 95 uint32_t lxr_bx; 96 uint32_t lxr_cx; 97 uint32_t lxr_dx; 98 uint32_t lxr_si; 99 uint32_t lxr_di; 100 uint32_t lxr_bp; 101 uint32_t lxr_ax; 102 uint32_t lxr_ds; 103 uint32_t lxr_es; 104 uint32_t lxr_fs; 105 uint32_t lxr_gs; 106 uint32_t lxr_orig_ax; 107 uint32_t lxr_ip; 108 uint32_t lxr_cs; 109 uint32_t lxr_flags; 110 uint32_t lxr_sp; 111 uint32_t lxr_ss; 112 } lx_ia32_regs_t; 113 114 typedef struct lx_elf_siginfo { 115 int32_t si_signo; /* Signal number */ 116 int32_t si_code; /* Extra code */ 117 int32_t si_errno; /* Errno */ 118 } lx_elf_siginfo_t; 119 120 typedef struct lx_elf_timeval32 { 121 int32_t tv_sec; /* Seconds */ 122 int32_t tv_usec; /* Microseconds */ 123 } lx_elf_timeval32_t; 124 125 typedef struct lx_elf_timeval64 { 126 int64_t tv_sec; /* Seconds */ 127 int64_t tv_usec; /* Microseconds */ 128 } lx_elf_timeval64_t; 129 130 /* Thread Information */ 131 typedef struct lx_prstatus32 { 132 lx_elf_siginfo_t pr_info; /* Singal Info */ 133 uint16_t pr_cursig; /* Current signal */ 134 uint32_t pr_sigpend; /* Set of pending signals */ 135 uint32_t pr_sighold; /* Set of held signals */ 136 int32_t pr_pid; /* Process ID */ 137 int32_t pr_ppid; /* Parent's process ID */ 138 int32_t pr_pgrp; /* Group ID */ 139 int32_t pr_sid; /* Session ID */ 140 lx_elf_timeval32_t pr_utime; /* User time */ 141 lx_elf_timeval32_t pr_stime; /* System time */ 142 lx_elf_timeval32_t pr_cutime; /* Cumulative user time */ 143 lx_elf_timeval32_t pr_cstime; /* Cumulative system time */ 144 lx_ia32_regs_t pr_reg; /* CPU registers */ 145 uint32_t pr_fpvalid; /* True if we have fp state */ 146 } lx_prstatus32_t; 147 148 typedef struct lx_prstatus64 { 149 lx_elf_siginfo_t pr_info; /* Singal Info */ 150 uint16_t pr_cursig; /* Current signal */ 151 uint64_t pr_sigpend; /* Set of pending signals */ 152 uint64_t pr_sighold; /* Set of held signals */ 153 int32_t pr_pid; /* Process ID */ 154 int32_t pr_ppid; /* Parent's process ID */ 155 int32_t pr_pgrp; /* Group ID */ 156 int32_t pr_sid; /* Session ID */ 157 lx_elf_timeval64_t pr_utime; /* User time */ 158 lx_elf_timeval64_t pr_stime; /* System time */ 159 lx_elf_timeval64_t pr_cutime; /* Cumulative user time */ 160 lx_elf_timeval64_t pr_cstime; /* Cumulative system time */ 161 lx_amd64_regs_t pr_reg; /* CPU registers */ 162 uint32_t pr_fpvalid; /* True if we have fp state */ 163 } lx_prstatus64_t; 164 165 #define LTIME_TO_TIMESPEC(dst, src) \ 166 (dst).tv_sec = (src).tv_sec; \ 167 (dst).tv_nsec = (src).tv_usec * 1000; 168 169 #ifdef __cplusplus 170 } 171 #endif 172 173 #endif /* _PCORE_LINUX_H */ 174