Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
bab6ece6
Commit
bab6ece6
authored
Jul 26, 2017
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Set thread context directly in assembly instead of using generated code.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
8f54e203
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
57 additions
and
4 deletions
+57
-4
signal_i386.c
dlls/ntdll/signal_i386.c
+57
-4
No files found.
dlls/ntdll/signal_i386.c
View file @
bab6ece6
...
@@ -480,8 +480,6 @@ static wine_signal_handler handlers[256];
...
@@ -480,8 +480,6 @@ static wine_signal_handler handlers[256];
static
BOOL
fpux_support
;
/* whether the CPU supports extended fpu context */
static
BOOL
fpux_support
;
/* whether the CPU supports extended fpu context */
extern
void
DECLSPEC_NORETURN
__wine_restore_regs
(
const
CONTEXT
*
context
);
enum
i386_trap_code
enum
i386_trap_code
{
{
TRAP_x86_UNKNOWN
=
-
1
,
/* Unknown fault (TRAP_sig not defined) */
TRAP_x86_UNKNOWN
=
-
1
,
/* Unknown fault (TRAP_sig not defined) */
...
@@ -1252,6 +1250,61 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 4,
...
@@ -1252,6 +1250,61 @@ __ASM_STDCALL_FUNC( RtlCaptureContext, 4,
__ASM_CFI
(
".cfi_adjust_cfa_offset -4
\n\t
"
)
__ASM_CFI
(
".cfi_adjust_cfa_offset -4
\n\t
"
)
"ret $4"
)
"ret $4"
)
/***********************************************************************
* set_full_cpu_context
*
* Set the new CPU context.
*/
extern
void
set_full_cpu_context
(
const
CONTEXT
*
context
);
__ASM_GLOBAL_FUNC
(
set_full_cpu_context
,
"movl 4(%esp),%ecx
\n\t
"
"movw 0x8c(%ecx),%gs
\n\t
"
/* SegGs */
"movw 0x90(%ecx),%fs
\n\t
"
/* SegFs */
"movw 0x94(%ecx),%es
\n\t
"
/* SegEs */
"movl 0x9c(%ecx),%edi
\n\t
"
/* Edi */
"movl 0xa0(%ecx),%esi
\n\t
"
/* Esi */
"movl 0xa4(%ecx),%ebx
\n\t
"
/* Ebx */
"movl 0xb4(%ecx),%ebp
\n\t
"
/* Ebp */
"movw %ss,%ax
\n\t
"
"cmpw 0xc8(%ecx),%ax
\n\t
"
/* SegSs */
"jne 1f
\n\t
"
/* As soon as we have switched stacks the context structure could
* be invalid (when signal handlers are executed for example). Copy
* values on the target stack before changing ESP. */
"movl 0xc4(%ecx),%eax
\n\t
"
/* Esp */
"leal -4*4(%eax),%eax
\n\t
"
"movl 0xc0(%ecx),%edx
\n\t
"
/* EFlags */
"movl %edx,3*4(%eax)
\n\t
"
"movl 0xbc(%ecx),%edx
\n\t
"
/* SegCs */
"movl %edx,2*4(%eax)
\n\t
"
"movl 0xb8(%ecx),%edx
\n\t
"
/* Eip */
"movl %edx,1*4(%eax)
\n\t
"
"movl 0xb0(%ecx),%edx
\n\t
"
/* Eax */
"movl %edx,0*4(%eax)
\n\t
"
"pushl 0x98(%ecx)
\n\t
"
/* SegDs */
"movl 0xa8(%ecx),%edx
\n\t
"
/* Edx */
"movl 0xac(%ecx),%ecx
\n\t
"
/* Ecx */
"popl %ds
\n\t
"
"movl %eax,%esp
\n\t
"
"popl %eax
\n\t
"
"iret
\n
"
/* Restore the context when the stack segment changes. We can't use
* the same code as above because we do not know if the stack segment
* is 16 or 32 bit, and 'movl' will throw an exception when we try to
* access memory above the limit. */
"1:
\n\t
"
"movl 0xa8(%ecx),%edx
\n\t
"
/* Edx */
"movl 0xb0(%ecx),%eax
\n\t
"
/* Eax */
"movw 0xc8(%ecx),%ss
\n\t
"
/* SegSs */
"movl 0xc4(%ecx),%esp
\n\t
"
/* Esp */
"pushl 0xc0(%ecx)
\n\t
"
/* EFlags */
"pushl 0xbc(%ecx)
\n\t
"
/* SegCs */
"pushl 0xb8(%ecx)
\n\t
"
/* Eip */
"pushl 0x98(%ecx)
\n\t
"
/* SegDs */
"movl 0xac(%ecx),%ecx
\n\t
"
/* Ecx */
"popl %ds
\n\t
"
"iret"
)
/***********************************************************************
/***********************************************************************
* set_cpu_context
* set_cpu_context
...
@@ -1279,7 +1332,7 @@ static void set_cpu_context( const CONTEXT *context )
...
@@ -1279,7 +1332,7 @@ static void set_cpu_context( const CONTEXT *context )
if
(
!
(
flags
&
CONTEXT_CONTROL
))
if
(
!
(
flags
&
CONTEXT_CONTROL
))
FIXME
(
"setting partial context (%x) not supported
\n
"
,
flags
);
FIXME
(
"setting partial context (%x) not supported
\n
"
,
flags
);
else
if
(
flags
&
CONTEXT_SEGMENTS
)
else
if
(
flags
&
CONTEXT_SEGMENTS
)
__wine_restore_regs
(
context
);
set_full_cpu_context
(
context
);
else
else
{
{
CONTEXT
newcontext
=
*
context
;
CONTEXT
newcontext
=
*
context
;
...
@@ -1287,7 +1340,7 @@ static void set_cpu_context( const CONTEXT *context )
...
@@ -1287,7 +1340,7 @@ static void set_cpu_context( const CONTEXT *context )
newcontext
.
SegEs
=
wine_get_es
();
newcontext
.
SegEs
=
wine_get_es
();
newcontext
.
SegFs
=
wine_get_fs
();
newcontext
.
SegFs
=
wine_get_fs
();
newcontext
.
SegGs
=
wine_get_gs
();
newcontext
.
SegGs
=
wine_get_gs
();
__wine_restore_regs
(
&
newcontext
);
set_full_cpu_context
(
&
newcontext
);
}
}
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment