2 * x86-64 register context support
4 * Copyright (C) 1999, 2005 Alexandre Julliard
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.
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.
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
30 #define NONAMELESSUNION
38 /* copy a context structure according to the flags */
39 void copy_context( CONTEXT
*to
, const CONTEXT
*from
, unsigned int flags
)
41 flags
&= ~CONTEXT_AMD64
; /* get rid of CPU id */
42 if (flags
& CONTEXT_CONTROL
)
47 to
->SegCs
= from
->SegCs
;
48 to
->SegSs
= from
->SegSs
;
49 to
->EFlags
= from
->EFlags
;
50 to
->MxCsr
= from
->MxCsr
;
52 if (flags
& CONTEXT_INTEGER
)
69 if (flags
& CONTEXT_SEGMENTS
)
71 to
->SegDs
= from
->SegDs
;
72 to
->SegEs
= from
->SegEs
;
73 to
->SegFs
= from
->SegFs
;
74 to
->SegGs
= from
->SegGs
;
76 if (flags
& CONTEXT_FLOATING_POINT
)
78 to
->u
.FltSave
= from
->u
.FltSave
;
80 /* we don't bother copying the debug registers, since they */
81 /* always need to be accessed by ptrace anyway */
82 to
->ContextFlags
|= flags
& ~CONTEXT_DEBUG_REGISTERS
;
85 /* retrieve the current instruction pointer of a context */
86 client_ptr_t
get_context_ip( const CONTEXT
*context
)
91 /* return the context flag that contains the CPU id */
92 unsigned int get_context_cpu_flag(void)
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
)
101 return flags
& (CONTEXT_DEBUG_REGISTERS
& ~CONTEXT_AMD64
);
104 #endif /* __x86_64__ */