Deleted Added
full compact
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_ */