root / lab4 / .minix-src / include / i386 / mcontext.h @ 14
History | View | Annotate | Download (4.48 KB)
1 | 13 | up20180614 | /* $NetBSD: mcontext.h,v 1.12 2014/02/15 22:20:42 dsl Exp $ */
|
---|---|---|---|
2 | |||
3 | /*-
|
||
4 | * Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * This code is derived from software contributed to The NetBSD Foundation
|
||
8 | * by Klaus Klein.
|
||
9 | *
|
||
10 | * Redistribution and use in source and binary forms, with or without
|
||
11 | * modification, are permitted provided that the following conditions
|
||
12 | * are met:
|
||
13 | * 1. Redistributions of source code must retain the above copyright
|
||
14 | * notice, this list of conditions and the following disclaimer.
|
||
15 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
16 | * notice, this list of conditions and the following disclaimer in the
|
||
17 | * documentation and/or other materials provided with the distribution.
|
||
18 | *
|
||
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
29 | * POSSIBILITY OF SUCH DAMAGE.
|
||
30 | */
|
||
31 | |||
32 | #ifndef _I386_MCONTEXT_H_
|
||
33 | #define _I386_MCONTEXT_H_
|
||
34 | |||
35 | |||
36 | /*
|
||
37 | * mcontext extensions to handle signal delivery.
|
||
38 | */
|
||
39 | #define _UC_SETSTACK 0x00010000 |
||
40 | #define _UC_CLRSTACK 0x00020000 |
||
41 | #define _UC_VM 0x00040000 |
||
42 | #define _UC_TLSBASE 0x00080000 |
||
43 | |||
44 | /*
|
||
45 | * Layout of mcontext_t according to the System V Application Binary Interface,
|
||
46 | * Intel386(tm) Architecture Processor Supplement, Fourth Edition.
|
||
47 | */
|
||
48 | |||
49 | /*
|
||
50 | * General register state
|
||
51 | */
|
||
52 | #define _NGREG 19 |
||
53 | typedef int __greg_t; |
||
54 | typedef __greg_t __gregset_t[_NGREG];
|
||
55 | |||
56 | #define _REG_GS 0 |
||
57 | #define _REG_FS 1 |
||
58 | #define _REG_ES 2 |
||
59 | #define _REG_DS 3 |
||
60 | #define _REG_EDI 4 |
||
61 | #define _REG_ESI 5 |
||
62 | #define _REG_EBP 6 |
||
63 | #define _REG_ESP 7 |
||
64 | #define _REG_EBX 8 |
||
65 | #define _REG_EDX 9 |
||
66 | #define _REG_ECX 10 |
||
67 | #define _REG_EAX 11 |
||
68 | #define _REG_TRAPNO 12 |
||
69 | #define _REG_ERR 13 |
||
70 | #define _REG_EIP 14 |
||
71 | #define _REG_CS 15 |
||
72 | #define _REG_EFL 16 |
||
73 | #define _REG_UESP 17 |
||
74 | #define _REG_SS 18 |
||
75 | |||
76 | /*
|
||
77 | * Floating point register state
|
||
78 | */
|
||
79 | typedef struct { |
||
80 | union {
|
||
81 | struct {
|
||
82 | int __fp_state[27]; /* Environment and registers */ |
||
83 | } __fpchip_state; /* x87 regs in fsave format */
|
||
84 | struct {
|
||
85 | char __fp_xmm[512]; |
||
86 | } __fp_xmm_state; /* x87 and xmm regs in fxsave format */
|
||
87 | int __fp_fpregs[128]; |
||
88 | } __fp_reg_set; |
||
89 | int __fp_pad[33]; /* Historic padding */ |
||
90 | } __fpregset_t; |
||
91 | __CTASSERT(sizeof (__fpregset_t) == 512 + 33 * 4); |
||
92 | |||
93 | typedef struct { |
||
94 | __gregset_t __gregs; |
||
95 | __fpregset_t __fpregs; |
||
96 | __greg_t _mc_tlsbase; |
||
97 | #ifdef __minix
|
||
98 | int mc_magic;
|
||
99 | int mc_flags;
|
||
100 | #endif
|
||
101 | } mcontext_t; |
||
102 | |||
103 | #define _UC_FXSAVE 0x20 /* FP state is in FXSAVE format in XMM space */ |
||
104 | |||
105 | #define _UC_MACHINE_PAD 4 /* Padding appended to ucontext_t */ |
||
106 | |||
107 | #define _UC_UCONTEXT_ALIGN (~0xf) |
||
108 | |||
109 | #ifdef _KERNEL_OPT
|
||
110 | #include "opt_vm86.h" |
||
111 | #ifdef VM86
|
||
112 | /*#include <machine/psl.h>*/
|
||
113 | #define PSL_VM 0x00020000 |
||
114 | #define _UC_MACHINE_SP(uc) ((uc)->uc_mcontext.__gregs[_REG_UESP] + \
|
||
115 | ((uc)->uc_mcontext.__gregs[_REG_EFL] & PSL_VM ? \ |
||
116 | ((uc)->uc_mcontext.__gregs[_REG_SS] << 4) : 0)) |
||
117 | #endif /* VM86 */ |
||
118 | #endif /* _KERNEL_OPT */ |
||
119 | |||
120 | #ifndef _UC_MACHINE_SP
|
||
121 | #define _UC_MACHINE_SP(uc) ((uc)->uc_mcontext.__gregs[_REG_UESP])
|
||
122 | #endif
|
||
123 | #define _UC_MACHINE_PC(uc) ((uc)->uc_mcontext.__gregs[_REG_EIP])
|
||
124 | #define _UC_MACHINE_INTRV(uc) ((uc)->uc_mcontext.__gregs[_REG_EAX])
|
||
125 | |||
126 | #define _UC_MACHINE_SET_PC(uc, pc) _UC_MACHINE_PC(uc) = (pc)
|
||
127 | |||
128 | #if defined(__minix)
|
||
129 | #define _UC_MACHINE_STACK(uc) ((uc)->uc_mcontext.__gregs[_REG_ESP])
|
||
130 | #define _UC_MACHINE_SET_STACK(uc, esp) _UC_MACHINE_STACK(uc) = (esp)
|
||
131 | |||
132 | #define _UC_MACHINE_EBP(uc) ((uc)->uc_mcontext.__gregs[_REG_EBP])
|
||
133 | #define _UC_MACHINE_SET_EBP(uc, ebp) _UC_MACHINE_EBP(uc) = (ebp)
|
||
134 | |||
135 | #define _UC_MACHINE_ESI(uc) ((uc)->uc_mcontext.__gregs[_REG_ESI])
|
||
136 | #define _UC_MACHINE_SET_ESI(uc, esi) _UC_MACHINE_ESI(uc) = (esi)
|
||
137 | |||
138 | int setmcontext(const mcontext_t *mcp); |
||
139 | int getmcontext(mcontext_t *mcp);
|
||
140 | |||
141 | #define MCF_MAGIC 0xc0ffee |
||
142 | #define _MC_FPU_SAVED 0x001 |
||
143 | |||
144 | #endif /* defined(__minix) */ |
||
145 | |||
146 | #define __UCONTEXT_SIZE 776 |
||
147 | |||
148 | static __inline void * |
||
149 | __lwp_getprivate_fast(void)
|
||
150 | { |
||
151 | void *__tmp;
|
||
152 | |||
153 | __asm volatile("movl %%gs:0, %0" : "=r" (__tmp)); |
||
154 | |||
155 | return __tmp;
|
||
156 | } |
||
157 | |||
158 | #endif /* !_I386_MCONTEXT_H_ */ |