ntdll: Add a noexec flag for memory views where we don't want to force exec permission.
[wine] / server / context_i386.c
1 /*
2  * i386 register context support
3  *
4  * Copyright (C) 1999 Alexandre Julliard
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "config.h"
22
23 #ifdef __i386__
24
25 #include <assert.h>
26 #include <errno.h>
27 #include <stdarg.h>
28 #include <unistd.h>
29
30 #include "windef.h"
31
32 #include "file.h"
33 #include "thread.h"
34 #include "request.h"
35
36 /* copy a context structure according to the flags */
37 void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
38 {
39     flags &= ~CONTEXT_i386;  /* get rid of CPU id */
40     if (flags & CONTEXT_CONTROL)
41     {
42         to->Ebp    = from->Ebp;
43         to->Eip    = from->Eip;
44         to->Esp    = from->Esp;
45         to->SegCs  = from->SegCs;
46         to->SegSs  = from->SegSs;
47         to->EFlags = from->EFlags;
48     }
49     if (flags & CONTEXT_INTEGER)
50     {
51         to->Eax = from->Eax;
52         to->Ebx = from->Ebx;
53         to->Ecx = from->Ecx;
54         to->Edx = from->Edx;
55         to->Esi = from->Esi;
56         to->Edi = from->Edi;
57     }
58     if (flags & CONTEXT_SEGMENTS)
59     {
60         to->SegDs = from->SegDs;
61         to->SegEs = from->SegEs;
62         to->SegFs = from->SegFs;
63         to->SegGs = from->SegGs;
64     }
65     if (flags & CONTEXT_FLOATING_POINT)
66     {
67         to->FloatSave = from->FloatSave;
68     }
69     if (flags & CONTEXT_EXTENDED_REGISTERS)
70     {
71         memcpy( to->ExtendedRegisters, from->ExtendedRegisters, sizeof(to->ExtendedRegisters) );
72     }
73     if (flags & CONTEXT_DEBUG_REGISTERS)
74     {
75         to->Dr0 = from->Dr0;
76         to->Dr1 = from->Dr1;
77         to->Dr2 = from->Dr2;
78         to->Dr3 = from->Dr3;
79         to->Dr6 = from->Dr6;
80         to->Dr7 = from->Dr7;
81     }
82     to->ContextFlags |= flags;
83 }
84
85 /* retrieve the current instruction pointer of a context */
86 void *get_context_ip( const CONTEXT *context )
87 {
88     return (void *)context->Eip;
89 }
90
91 /* return the context flag that contains the CPU id */
92 unsigned int get_context_cpu_flag(void)
93 {
94     return CONTEXT_i386;
95 }
96
97 /* return only the context flags that correspond to system regs */
98 /* (system regs are the ones we can't access on the client side) */
99 unsigned int get_context_system_regs( unsigned int flags )
100 {
101     return flags & (CONTEXT_DEBUG_REGISTERS & ~CONTEXT_i386);
102 }
103
104 #endif  /* __i386__ */