blob: 4fa0802aae38851d873b62e3fb39331886e6bb91 [file]
/**
* D header file for Solaris sys/procfs.h.
*
* Copyright: Copyright © 2025, The D Language Foundation
* License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
* Authors: Iain Buclaw
*/
module core.sys.solaris.sys.procfs;
version (Solaris):
extern (C):
nothrow:
@nogc:
import core.stdc.config : c_long, c_ulong;
import core.stdc.stdint : uintptr_t;
import core.sys.posix.signal : sigaction_t, siginfo_t, sigset_t, stack_t;
import core.sys.posix.time : timestruc_t;
version (X86) version = X86_Any;
version (X86_64) version = X86_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
version (X86_Any)
{
/*
* Holds one i386 or and64 instruction
*/
alias instr_t = ubyte;
public import core.sys.solaris.sys.regset :
NPRGREG = _NGREG,
prgreg_t = greg_t,
prgregset_t = gregset_t,
prfpregset_t = fpregset_t;
/*
* The following defines are for portability
*/
version (X86_64)
{
public import core.sys.solaris.sys.regset :
R_PC = REG_RIP,
R_PS = REG_RFL,
R_SP = REG_RSP,
R_FP = REG_RBP,
R_R0 = REG_RAX,
R_R1 = REG_RDX;
}
else
{
public import core.sys.solaris.sys.regset :
R_PC = REG_EIP,
R_PS = REG_EFL,
R_SP = REG_UESP,
R_FP = REG_EBP,
R_R0 = REG_EAX,
R_R1 = REG_EDX;
}
}
else version (SPARC_Any)
{
import core.sys.solaris.sys.regset : fq;
/*
* Holds one sparc instruction, both ILP32 and LP64
*/
alias instr_t = uint;
/*
* General register access (sparc).
* Registers are 32 bits for ILP32, 64 bits for LP64.
*/
enum NPRGREG = 38;
version (D_LP64)
alias prgreg_t = c_long;
else
alias prgreg_t = int;
alias prgregset_t = prgreg_t[NPRGREG];
/*
* Floating-point register access (sparc FPU).
*/
version (SPARC64)
{
struct prfpregset_t
{
union
{
uint[32] pr_regs;
double[32] pr_dregs;
real[16] pr_qregs;
}
ulong pr_filler;
ulong pr_fsr;
ubyte pr_qcnt;
ubyte pr_q_entrysize;
ubyte pr_en;
byte[13] pr_pad;
fq[16] pr_q;
}
}
else
{
struct prfpregset_t
{
union
{
uint[32] pr_regs;
double[16] pr_dregs;
}
uint pr_filler;
uint pr_fsr;
ubyte pr_qcnt;
ubyte pr_q_entrysize;
ubyte pr_en;
fq[32] pr_q;
}
}
enum R_G0 = 0;
enum R_G1 = 1;
enum R_G2 = 2;
enum R_G3 = 3;
enum R_G4 = 4;
enum R_G5 = 5;
enum R_G6 = 6;
enum R_G7 = 7;
enum R_O0 = 8;
enum R_O1 = 9;
enum R_O2 = 10;
enum R_O3 = 11;
enum R_O4 = 12;
enum R_O5 = 13;
enum R_O6 = 14;
enum R_O7 = 15;
enum R_L0 = 16;
enum R_L1 = 17;
enum R_L2 = 18;
enum R_L3 = 19;
enum R_L4 = 20;
enum R_L5 = 21;
enum R_L6 = 22;
enum R_L7 = 23;
enum R_I0 = 24;
enum R_I1 = 25;
enum R_I2 = 26;
enum R_I3 = 27;
enum R_I4 = 28;
enum R_I5 = 29;
enum R_I6 = 30;
enum R_I7 = 31;
enum R_PC = 33;
enum R_nPC = 34;
enum R_Y = 35;
version (SPARC64)
{
enum R_CCR = 32;
enum R_ASI = 36;
enum R_FPRS = 37;
enum R_PS = R_CCR;
}
else
{
enum R_PSR = 32;
enum R_WIM = 36;
enum R_TBR = 37;
enum R_PS = R_PSR;
}
enum R_SP = R_O6;
enum R_FP = R_I6;
enum R_R0 = R_O0;
enum R_R1 = R_O1;
}
/*
* lwp status file. /proc/<pid>/lwp/<lwpid>/lwpstatus
*/
private enum PRCLSZ = 8; // maximum size of scheduling class name
private enum PRSYSARGS = 8; // maximum number of syscall arguments
struct lwpstatus_t
{
int pr_flags; // flags (see below)
int pr_lwpid; // specific lwp identifier
short pr_why; // reason for lwp stop, if stopped
short pr_what; // more detailed reason
short pr_cursig; // current signal, if any
ubyte pr_adi;
byte pr_pad1;
siginfo_t pr_info; // info associated with signal or fault
sigset_t pr_lwppend; // set of signals pending to the lwp
sigset_t pr_lwphold; // set of signals blocked by the lwp
sigaction_t pr_action; // signal action for current signal
stack_t pr_altstack; // alternate signal stack info
uintptr_t pr_oldcontext; // address of previous ucontext
short pr_syscall; // system call number (if in syscall)
short pr_nsysarg; // number of arguments to this syscall
int pr_errno; // errno for failed syscall, 0 if successful
c_long[PRSYSARGS] pr_sysarg; // arguments to this syscall
c_long pr_rval1; // primary syscall return value
c_long pr_rval2; // second syscall return value, if any
char[PRCLSZ] pr_clname = void; // scheduling class name
timestruc_t pr_tstamp; // real-time time stamp of stop
timestruc_t pr_utime; // lwp user cpu time
timestruc_t pr_stime; // lwp system cpu time
int[11 - 2 * timestruc_t.sizeof / int.sizeof] pr_filler;
int pr_errpriv; // missing privilege
uintptr_t pr_ustack; // address of stack boundary data (stack_t)
c_ulong pr_instr; // current instruction
prgregset_t pr_reg; // general registers
prfpregset_t pr_fpreg; // floating-point registers
}
/*
* pr_flags (same values appear in both pstatus_t and lwpstatus_t pr_flags).
*
* These flags do *not* apply to psinfo_t.pr_flag or lwpsinfo_t.pr_flag
* (which are both deprecated).
*/
// The following flags apply to the specific or representative lwp
enum PR_STOPPED = 0x00000001; // lwp is stopped
enum PR_ISTOP = 0x00000002; // lwp is stopped on an event of interest
enum PR_DSTOP = 0x00000004; // lwp has a stop directive in effect
enum PR_STEP = 0x00000008; // lwp has a single-step directive in effect
enum PR_ASLEEP = 0x00000010; // lwp is sleeping in a system call
enum PR_PCINVAL = 0x00000020; // contents of pr_instr undefined
enum PR_ASLWP = 0x00000040; // obsolete flag; never set
enum PR_AGENT = 0x00000080; // this lwp is the /proc agent lwp
enum PR_DETACH = 0x00000100; // this is a detached lwp
enum PR_DAEMON = 0x00000200; // this is a daemon lwp
enum PR_IDLE = 0x00000400; // lwp is a cpu's idle thread
// The following flags apply to the process, not to an individual lwp
enum PR_ISSYS = 0x00001000; // this is a system process
enum PR_VFORKP = 0x00002000; // process is the parent of a vfork()d child
enum PR_ORPHAN = 0x00004000; // process's process group is orphaned
enum PR_NOSIGCHLD = 0x00008000; // process will not generate SIGCHLD on exit
enum PR_WAITPID = 0x00010000; // only waitid(P_PID, pid) can reap the child
// The following process flags are modes settable by PCSET/PCUNSET
enum PR_FORK = 0x00100000; // inherit-on-fork is in effect
enum PR_RLC = 0x00200000; // run-on-last-close is in effect
enum PR_KLC = 0x00400000; // kill-on-last-close is in effect
enum PR_ASYNC = 0x00800000; // asynchronous-stop is in effect
enum PR_MSACCT = 0x01000000; // micro-state usage accounting is in effect
enum PR_BPTADJ = 0x02000000; // breakpoint trap pc adjustment is in effect
enum PR_PTRACE = 0x04000000; // ptrace-compatibility mode is in effect
enum PR_MSFORK = 0x08000000; // micro-state accounting inherited on fork