Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
13fbba68
Commit
13fbba68
authored
Jul 08, 2008
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Always restore the %gs register from the saved value in thread data.
parent
4ea173ef
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
6 additions
and
19 deletions
+6
-19
signal_i386.c
dlls/ntdll/signal_i386.c
+6
-19
No files found.
dlls/ntdll/signal_i386.c
View file @
13fbba68
...
...
@@ -582,10 +582,10 @@ typedef void (WINAPI *raise_func)( EXCEPTION_RECORD *rec, CONTEXT *context );
* init_handler
*
* Handler initialization when the full context is not needed.
* Return the stack pointer to use for pushing the exception data.
*/
static
inline
void
*
init_handler
(
const
SIGCONTEXT
*
sigcontext
,
WORD
*
fs
,
WORD
*
gs
)
{
void
*
stack
=
(
void
*
)(
ESP_sig
(
sigcontext
)
&
~
3
);
TEB
*
teb
=
get_current_teb
();
struct
ntdll_thread_data
*
thread_data
=
(
struct
ntdll_thread_data
*
)
teb
->
SystemReserved2
;
...
...
@@ -602,8 +602,8 @@ static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD *
#endif
wine_set_fs
(
thread_data
->
fs
);
wine_set_gs
(
thread_data
->
gs
);
/* now restore a proper %gs for the fault handler */
if
(
!
wine_ldt_is_system
(
CS_sig
(
sigcontext
))
||
!
wine_ldt_is_system
(
SS_sig
(
sigcontext
)))
/* 16-bit mode */
{
...
...
@@ -614,24 +614,9 @@ static inline void *init_handler( const SIGCONTEXT *sigcontext, WORD *fs, WORD *
* SS is still non-system segment. This is why both CS and SS
* are checked.
*/
wine_set_gs
(
thread_data
->
gs
);
stack
=
teb
->
WOW32Reserved
;
return
teb
->
WOW32Reserved
;
}
#ifdef __HAVE_VM86
else
if
((
void
*
)
EIP_sig
(
sigcontext
)
==
vm86_return
)
/* vm86 mode */
{
unsigned
int
*
int_stack
=
stack
;
/* fetch the saved %gs from the stack */
wine_set_gs
(
int_stack
[
0
]
);
}
#endif
else
/* 32-bit mode */
{
#ifdef GS_sig
wine_set_gs
(
GS_sig
(
sigcontext
)
);
#endif
}
return
stack
;
return
(
void
*
)(
ESP_sig
(
sigcontext
)
&
~
3
);
}
...
...
@@ -1553,6 +1538,8 @@ void signal_init_thread(void)
ss
.
ss_flags
=
0
;
if
(
sigaltstack
(
&
ss
,
NULL
)
==
-
1
)
perror
(
"sigaltstack"
);
#endif
/* HAVE_SIGALTSTACK */
ntdll_get_thread_data
()
->
gs
=
wine_get_gs
();
}
/**********************************************************************
...
...
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