blob: 93d1e9816f52d92e854769548a0c78e53245d9ad (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_KLWP_H
#define _SYS_KLWP_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <sys/condvar.h>
#include <sys/thread.h>
#include <sys/signal.h>
#include <sys/siginfo.h>
#include <sys/pcb.h>
#include <sys/time.h>
#include <sys/msacct.h>
#include <sys/ucontext.h>
#include <sys/lwp.h>
#include <sys/contract.h>
#if (defined(_KERNEL) || defined(_KMEMUSER)) && defined(_MACHDEP)
#include <sys/machparam.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
* The light-weight process object and the methods by which it
* is accessed.
*/
#define MAXSYSARGS 8 /* Maximum # of arguments passed to a syscall */
/* lwp_eosys values */
#define NORMALRETURN 0 /* normal return; adjusts PC, registers */
#define JUSTRETURN 1 /* just return, leave registers alone */
/*
* Resource usage, per-lwp plus per-process (sum over defunct lwps).
*/
struct lrusage {
u_longlong_t minflt; /* minor page faults */
u_longlong_t majflt; /* major page faults */
u_longlong_t nswap; /* swaps */
u_longlong_t inblock; /* input blocks */
u_longlong_t oublock; /* output blocks */
u_longlong_t msgsnd; /* messages sent */
u_longlong_t msgrcv; /* messages received */
u_longlong_t nsignals; /* signals received */
u_longlong_t nvcsw; /* voluntary context switches */
u_longlong_t nivcsw; /* involuntary context switches */
u_longlong_t sysc; /* system calls */
u_longlong_t ioch; /* chars read and written */
};
typedef struct _klwp *klwp_id_t;
typedef struct _klwp {
/*
* user-mode context
*/
struct pcb lwp_pcb; /* user regs save pcb */
uintptr_t lwp_oldcontext; /* previous user context */
/*
* system-call interface
*/
long *lwp_ap; /* pointer to arglist */
int lwp_errno; /* error for current syscall (private) */
/*
* support for I/O
*/
char lwp_error; /* return error code */
char lwp_eosys; /* special action on end of syscall */
char lwp_argsaved; /* are all args in lwp_arg */
char lwp_watchtrap; /* lwp undergoing watchpoint single-step */
long lwp_arg[MAXSYSARGS]; /* args to current syscall */
void *lwp_regs; /* pointer to saved regs on stack */
void *lwp_fpu; /* pointer to fpu regs */
label_t lwp_qsav; /* longjmp label for quits and interrupts */
/*
* signal handling and debugger (/proc) interface
*/
uchar_t lwp_cursig; /* current signal */
uchar_t lwp_curflt; /* current fault */
uchar_t lwp_sysabort; /* if set, abort syscall */
uchar_t lwp_asleep; /* lwp asleep in syscall */
uchar_t lwp_extsig; /* cursig sent from another contract */
stack_t lwp_sigaltstack; /* alternate signal stack */
struct sigqueue *lwp_curinfo; /* siginfo for current signal */
k_siginfo_t lwp_siginfo; /* siginfo for stop-on-fault */
k_sigset_t lwp_sigoldmask; /* for sigsuspend */
struct lwp_watch { /* used in watchpoint single-stepping */
caddr_t wpaddr;
size_t wpsize;
int wpcode;
int wpmapped;
greg_t wppc;
} lwp_watch[4]; /* one for each of exec/write/read/read */
uint32_t lwp_oweupc; /* profil(2) ticks owed to this lwp */
/*
* Microstate accounting. Timestamps are made at the start and the
* end of each microstate (see <sys/msacct.h> for state definitions)
* and the corresponding accounting info is updated. The current
* microstate is kept in the thread struct, since there are cases
* when one thread must update another thread's state (a no-no
* for an lwp since it may be swapped/paged out). The rest of the
* microstate stuff is kept here to avoid wasting space on things
* like kernel threads that don't have an associated lwp.
*/
struct mstate {
int ms_prev; /* previous running mstate */
hrtime_t ms_start; /* lwp creation time */
hrtime_t ms_term; /* lwp termination time */
hrtime_t ms_state_start; /* start time of this mstate */
hrtime_t ms_acct[NMSTATES]; /* per mstate accounting */
} lwp_mstate;
/*
* Per-lwp resource usage.
*/
struct lrusage lwp_ru;
/*
* Things to keep for real-time (SIGPROF) profiling.
*/
int lwp_lastfault;
caddr_t lwp_lastfaddr;
/*
* timers. Protected by lwp->procp->p_lock
*/
struct itimerval lwp_timer[3];
/*
* used to stop/alert lwps
*/
char lwp_unused;
char lwp_state; /* Running in User/Kernel mode (no lock req) */
ushort_t lwp_nostop; /* Don't stop this lwp (no lock required) */
ushort_t lwp_pad; /* Reserved for future use */
/*
* Last failed privilege.
*/
short lwp_badpriv;
/*
* linkage
*/
struct _kthread *lwp_thread;
struct proc *lwp_procp;
size_t lwp_childstksz; /* kernel stksize for this lwp's descendants */
uintptr_t lwp_ustack; /* current stack bounds */
size_t lwp_old_stk_ctl; /* old stack limit */
/*
* Contracts
*/
struct ct_template *lwp_ct_active[CTT_MAXTYPE]; /* active templates */
struct contract *lwp_ct_latest[CTT_MAXTYPE]; /* last created contract */
void *lwp_brand; /* per-lwp brand data */
} klwp_t;
/* lwp states */
#define LWP_USER 0x01 /* Running in user mode */
#define LWP_SYS 0x02 /* Running in kernel mode */
#if defined(_KERNEL)
extern int lwp_default_stksize;
extern int lwp_reapcnt;
extern struct _kthread *lwp_deathrow;
extern kmutex_t reaplock;
extern struct kmem_cache *lwp_cache;
extern void *segkp_lwp;
extern klwp_t lwp0;
/* where newly-created lwps normally start */
extern void lwp_rtt(void);
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_KLWP_H */
|