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 * Copyright 2020 Joyent, Inc. 25 */ 26 27 #ifndef _SYS_PCB_H 28 #define _SYS_PCB_H 29 30 #include <sys/regset.h> 31 #include <sys/segments.h> 32 #ifndef _ASM 33 #include <sys/fp.h> /* kfpu_t */ 34 #endif 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #ifndef _ASM 41 typedef struct fpu_ctx { 42 kfpu_t fpu_regs; /* kernel save area for FPU */ 43 uint64_t fpu_xsave_mask; /* xsave mask for FPU/SSE/AVX */ 44 uint_t fpu_flags; /* FPU state flags */ 45 void *fpu_signal; /* copyin area for signal handling */ 46 } fpu_ctx_t; 47 48 typedef struct pcb { 49 fpu_ctx_t pcb_fpu; /* fpu state */ 50 uint_t pcb_flags; /* state flags; cleared on fork */ 51 greg_t pcb_drstat; /* status debug register (%dr6) */ 52 unsigned char pcb_instr; /* /proc: instruction at stop */ 53 unsigned char pcb_rupdate; /* new register values in pcb -> regs */ 54 uintptr_t pcb_fsbase; 55 uintptr_t pcb_gsbase; 56 selector_t pcb_ds; 57 selector_t pcb_es; 58 selector_t pcb_fs; 59 selector_t pcb_gs; 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 /* pcb_rupdate values */ 78 #define PCB_UPDATE_SEGS 0x01 /* Update segment registers */ 79 #define PCB_UPDATE_FPU 0x02 /* Update FPU registers */ 80 81 #define PCB_SET_UPDATE_SEGS(pcb) ((pcb)->pcb_rupdate |= PCB_UPDATE_SEGS) 82 #define PCB_SET_UPDATE_FPU(pcb) ((pcb)->pcb_rupdate |= PCB_UPDATE_FPU) 83 #define PCB_NEED_UPDATE_SEGS(pcb) \ 84 (((pcb)->pcb_rupdate & PCB_UPDATE_SEGS) != 0) 85 #define PCB_NEED_UPDATE_FPU(pcb) \ 86 (((pcb)->pcb_rupdate & PCB_UPDATE_FPU) != 0) 87 #define PCB_NEED_UPDATE(pcb) \ 88 (PCB_NEED_UPDATE_FPU(pcb) || PCB_NEED_UPDATE_SEGS(pcb)) 89 #define PCB_CLEAR_UPDATE_SEGS(pcb) ((pcb)->pcb_rupdate &= ~PCB_UPDATE_SEGS) 90 #define PCB_CLEAR_UPDATE_FPU(pcb) ((pcb)->pcb_rupdate &= ~PCB_UPDATE_FPU) 91 92 /* fpu_flags */ 93 #define FPU_EN 0x01 /* FPU in use (user or kernel) */ 94 #define FPU_VALID 0x02 /* fpu_regs has valid fpu state */ 95 #define FPU_MODIFIED 0x04 /* fpu_regs is modified (/proc) */ 96 #define FPU_KERNEL 0x08 /* Kernel is using the FPU */ 97 98 #define FPU_INVALID 0x0 /* fpu context is not in use */ 99 100 /* fpu_flags */ 101 102 #ifdef __cplusplus 103 } 104 #endif 105 106 #endif /* _SYS_PCB_H */ 107