pcb.h (216253) | pcb.h (216634) |
---|---|
1/*- 2 * Copyright (c) 2003 Peter Wemm. 3 * Copyright (c) 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * William Jolitz. 8 * --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * from: @(#)pcb.h 5.10 (Berkeley) 5/12/91 | 1/*- 2 * Copyright (c) 2003 Peter Wemm. 3 * Copyright (c) 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * William Jolitz. 8 * --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * from: @(#)pcb.h 5.10 (Berkeley) 5/12/91 |
34 * $FreeBSD: head/sys/amd64/include/pcb.h 216253 2010-12-07 12:17:43Z kib $ | 34 * $FreeBSD: head/sys/amd64/include/pcb.h 216634 2010-12-22 00:18:42Z jkim $ |
35 */ 36 37#ifndef _AMD64_PCB_H_ 38#define _AMD64_PCB_H_ 39 40/* 41 * AMD64 process control block 42 */ --- 18 unchanged lines hidden (view full) --- 61 register_t pcb_cr4; 62 register_t pcb_dr0; 63 register_t pcb_dr1; 64 register_t pcb_dr2; 65 register_t pcb_dr3; 66 register_t pcb_dr6; 67 register_t pcb_dr7; 68 | 35 */ 36 37#ifndef _AMD64_PCB_H_ 38#define _AMD64_PCB_H_ 39 40/* 41 * AMD64 process control block 42 */ --- 18 unchanged lines hidden (view full) --- 61 register_t pcb_cr4; 62 register_t pcb_dr0; 63 register_t pcb_dr1; 64 register_t pcb_dr2; 65 register_t pcb_dr3; 66 register_t pcb_dr6; 67 register_t pcb_dr7; 68 |
69 u_long pcb_flags; | 69 struct region_descriptor pcb_gdt; 70 struct region_descriptor pcb_idt; 71 struct region_descriptor pcb_ldt; 72 uint16_t pcb_tr; 73 74 u_char pcb_flags; 75#define PCB_FULL_IRET 0x01 /* full iret is required */ |
70#define PCB_DBREGS 0x02 /* process using debug registers */ 71#define PCB_KERNFPU 0x04 /* kernel uses fpu */ 72#define PCB_FPUINITDONE 0x08 /* fpu state is initialized */ 73#define PCB_USERFPUINITDONE 0x10 /* fpu user state is initialized */ 74#define PCB_GS32BIT 0x20 /* linux gs switch */ 75#define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */ 76 77 uint16_t pcb_initial_fpucw; 78 | 76#define PCB_DBREGS 0x02 /* process using debug registers */ 77#define PCB_KERNFPU 0x04 /* kernel uses fpu */ 78#define PCB_FPUINITDONE 0x08 /* fpu state is initialized */ 79#define PCB_USERFPUINITDONE 0x10 /* fpu user state is initialized */ 80#define PCB_GS32BIT 0x20 /* linux gs switch */ 81#define PCB_32BIT 0x40 /* process has 32 bit context (segs etc) */ 82 83 uint16_t pcb_initial_fpucw; 84 |
79 caddr_t pcb_onfault; /* copyin/out fault recovery */ | 85 /* copyin/out fault recovery */ 86 caddr_t pcb_onfault; |
80 81 /* 32-bit segment descriptor */ 82 struct user_segment_descriptor pcb_gs32sd; | 87 88 /* 32-bit segment descriptor */ 89 struct user_segment_descriptor pcb_gs32sd; |
90 |
|
83 /* local tss, with i/o bitmap; NULL for common */ 84 struct amd64tss *pcb_tssp; | 91 /* local tss, with i/o bitmap; NULL for common */ 92 struct amd64tss *pcb_tssp; |
85 struct savefpu *pcb_save; 86 char pcb_full_iret; | |
87 | 93 |
88 struct region_descriptor pcb_gdt; 89 struct region_descriptor pcb_idt; 90 struct region_descriptor pcb_ldt; 91 uint16_t pcb_tr; 92 93 struct savefpu pcb_user_save; | 94 struct savefpu *pcb_save; 95 struct savefpu pcb_user_save; |
94}; 95 96#ifdef _KERNEL 97struct trapframe; 98 | 96}; 97 98#ifdef _KERNEL 99struct trapframe; 100 |
101/* 102 * The pcb_flags is only modified by current thread, or by other threads 103 * when current thread is stopped. However, current thread may change it 104 * from the interrupt context in cpu_switch(), or in the trap handler. 105 * When we read-modify-write pcb_flags from C sources, compiler may generate 106 * code that is not atomic regarding the interrupt handler. If a trap or 107 * interrupt happens and any flag is modified from the handler, it can be 108 * clobbered with the cached value later. Therefore, we implement setting 109 * and clearing flags with single-instruction functions, which do not race 110 * with possible modification of the flags from the trap or interrupt context, 111 * because traps and interrupts are executed only on instruction boundary. 112 */ 113static __inline void 114set_pcb_flags(struct pcb *pcb, const u_char flags) 115{ 116 117 __asm __volatile("orb %b1,%0" 118 : "=m" (pcb->pcb_flags) : "iq" (flags), "m" (pcb->pcb_flags) 119 : "cc"); 120} 121 122static __inline void 123clear_pcb_flags(struct pcb *pcb, const u_char flags) 124{ 125 126 __asm __volatile("andb %b1,%0" 127 : "=m" (pcb->pcb_flags) : "iq" (~flags), "m" (pcb->pcb_flags) 128 : "cc"); 129} 130 |
|
99void makectx(struct trapframe *, struct pcb *); 100int savectx(struct pcb *); 101#endif 102 103#endif /* _AMD64_PCB_H_ */ | 131void makectx(struct trapframe *, struct pcb *); 132int savectx(struct pcb *); 133#endif 134 135#endif /* _AMD64_PCB_H_ */ |