Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / i386 / mcontext.h @ 14

History | View | Annotate | Download (4.48 KB)

1
/*        $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_ */