1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26#ifndef _SYS_PCB_H
27#define	_SYS_PCB_H
28
29#include <sys/regset.h>
30#include <sys/segments.h>
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36#ifndef _ASM
37typedef struct fpu_ctx {
38	kfpu_t		fpu_regs;	/* kernel save area for FPU */
39	uint64_t	fpu_xsave_mask;	/* xsave mask for FPU/SSE/AVX */
40#if defined(__i386)
41	uint64_t	fpu_padding;	/* fix 32bit libmicro regression */
42#endif
43	uint_t		fpu_flags;	/* FPU state flags */
44} fpu_ctx_t;
45
46typedef struct pcb {
47	fpu_ctx_t	pcb_fpu;	/* fpu state */
48	uint_t		pcb_flags;	/* state flags; cleared on fork */
49	greg_t		pcb_drstat;	/* status debug register (%dr6) */
50	unsigned char	pcb_instr;	/* /proc: instruction at stop */
51#if defined(__amd64)
52	unsigned char	pcb_rupdate;	/* new register values in pcb -> regs */
53	uintptr_t	pcb_fsbase;
54	uintptr_t	pcb_gsbase;
55	selector_t	pcb_ds;
56	selector_t	pcb_es;
57	selector_t	pcb_fs;
58	selector_t	pcb_gs;
59#endif /* __amd64 */
60	user_desc_t	pcb_fsdesc;	/* private per-lwp %fs descriptors */
61	user_desc_t	pcb_gsdesc;	/* private per-lwp %gs descriptors */
62} pcb_t;
63
64#endif /* ! _ASM */
65
66/* pcb_flags */
67#define	DEBUG_PENDING	0x02	/* single-step of lcall for a sys call */
68#define	PRSTOP_CALLED	0x04	/* prstop() has been called for this lwp */
69#define	INSTR_VALID	0x08	/* value in pcb_instr is valid (/proc) */
70#define	NORMAL_STEP	0x10	/* normal debugger-requested single-step */
71#define	WATCH_STEP	0x20	/* single-stepping in watchpoint emulation */
72#define	CPC_OVERFLOW	0x40	/* performance counters overflowed */
73#define	REQUEST_STEP	0x100	/* request pending to single-step this lwp */
74#define	REQUEST_NOSTEP	0x200	/* request pending to disable single-step */
75#define	ASYNC_HWERR	0x400	/* hardware error has corrupted context  */
76
77/* fpu_flags */
78#define	FPU_EN		0x1	/* flag signifying fpu in use */
79#define	FPU_VALID	0x2	/* fpu_regs has valid fpu state */
80#define	FPU_MODIFIED	0x4	/* fpu_regs is modified (/proc) */
81
82#define	FPU_INVALID	0x0	/* fpu context is not in use */
83
84/* fpu_flags */
85
86#ifdef	__cplusplus
87}
88#endif
89
90#endif	/* _SYS_PCB_H */
91