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
60069454
Commit
60069454
authored
Apr 01, 2008
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Moved stack allocation for thread and process to a common routine in virtual.c.
parent
2d1cf6ce
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
57 additions
and
55 deletions
+57
-55
loader.c
dlls/ntdll/loader.c
+5
-40
ntdll_misc.h
dlls/ntdll/ntdll_misc.h
+1
-0
thread.c
dlls/ntdll/thread.c
+1
-15
virtual.c
dlls/ntdll/virtual.c
+50
-0
No files found.
dlls/ntdll/loader.c
View file @
60069454
...
...
@@ -27,9 +27,6 @@
#ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h>
#endif
#ifdef HAVE_VALGRIND_MEMCHECK_H
# include <valgrind/memcheck.h>
#endif
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
...
...
@@ -2320,42 +2317,6 @@ PIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE hModule)
/***********************************************************************
* alloc_process_stack
*
* Allocate the stack of new process.
*/
static
NTSTATUS
alloc_process_stack
(
IMAGE_NT_HEADERS
*
nt
)
{
NTSTATUS
status
;
void
*
base
=
NULL
;
SIZE_T
stack_size
,
page_size
=
getpagesize
();
stack_size
=
max
(
nt
->
OptionalHeader
.
SizeOfStackReserve
,
nt
->
OptionalHeader
.
SizeOfStackCommit
);
stack_size
+=
page_size
;
/* for the guard page */
stack_size
=
(
stack_size
+
0xffff
)
&
~
0xffff
;
/* round to 64K boundary */
if
(
stack_size
<
1024
*
1024
)
stack_size
=
1024
*
1024
;
/* Xlib needs a large stack */
if
((
status
=
NtAllocateVirtualMemory
(
GetCurrentProcess
(),
&
base
,
16
,
&
stack_size
,
MEM_COMMIT
,
PAGE_READWRITE
)))
return
status
;
/* note: limit is lower than base since the stack grows down */
NtCurrentTeb
()
->
DeallocationStack
=
base
;
NtCurrentTeb
()
->
Tib
.
StackBase
=
(
char
*
)
base
+
stack_size
;
NtCurrentTeb
()
->
Tib
.
StackLimit
=
(
char
*
)
base
+
page_size
;
#ifdef VALGRIND_STACK_REGISTER
/* no need to de-register the stack as it's the one of the main thread */
VALGRIND_STACK_REGISTER
(
NtCurrentTeb
()
->
Tib
.
StackLimit
,
NtCurrentTeb
()
->
Tib
.
StackBase
);
#endif
/* setup guard page */
NtProtectVirtualMemory
(
GetCurrentProcess
(),
&
base
,
&
page_size
,
PAGE_NOACCESS
,
NULL
);
return
STATUS_SUCCESS
;
}
/***********************************************************************
* attach_process_dlls
*
* Initial attach to all the dlls loaded by the process.
...
...
@@ -2387,6 +2348,7 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
NTSTATUS
status
;
WINE_MODREF
*
wm
;
LPCWSTR
load_path
;
SIZE_T
stack_size
;
PEB
*
peb
=
NtCurrentTeb
()
->
Peb
;
IMAGE_NT_HEADERS
*
nt
=
RtlImageNtHeader
(
peb
->
ImageBaseAddress
);
...
...
@@ -2409,7 +2371,10 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
RemoveEntryList
(
&
wm
->
ldr
.
InLoadOrderModuleList
);
InsertHeadList
(
&
peb
->
LdrData
->
InLoadOrderModuleList
,
&
wm
->
ldr
.
InLoadOrderModuleList
);
if
((
status
=
alloc_process_stack
(
nt
))
!=
STATUS_SUCCESS
)
goto
error
;
stack_size
=
max
(
nt
->
OptionalHeader
.
SizeOfStackReserve
,
nt
->
OptionalHeader
.
SizeOfStackCommit
);
if
(
stack_size
<
1024
*
1024
)
stack_size
=
1024
*
1024
;
/* Xlib needs a large stack */
if
((
status
=
virtual_alloc_thread_stack
(
NULL
,
stack_size
))
!=
STATUS_SUCCESS
)
goto
error
;
if
((
status
=
server_init_process_done
())
!=
STATUS_SUCCESS
)
goto
error
;
actctx_init
();
...
...
dlls/ntdll/ntdll_misc.h
View file @
60069454
...
...
@@ -133,6 +133,7 @@ extern NTSTATUS DIR_get_unix_cwd( char **cwd );
extern
unsigned
int
DIR_get_drives_info
(
struct
drive_info
info
[
MAX_DOS_DRIVES
]
);
/* virtual memory */
extern
NTSTATUS
virtual_alloc_thread_stack
(
void
*
base
,
SIZE_T
stack_size
);
extern
NTSTATUS
VIRTUAL_HandleFault
(
LPCVOID
addr
);
extern
void
VIRTUAL_SetForceExec
(
BOOL
enable
);
extern
void
VIRTUAL_UseLargeAddressSpace
(
void
);
...
...
dlls/ntdll/thread.c
View file @
60069454
...
...
@@ -418,7 +418,6 @@ static void start_thread( struct wine_pthread_thread_info *info )
PRTL_THREAD_START_ROUTINE
func
=
startup_info
->
entry_point
;
void
*
arg
=
startup_info
->
entry_arg
;
struct
debug_info
debug_info
;
SIZE_T
size
,
page_size
=
getpagesize
();
debug_info
.
str_pos
=
debug_info
.
strings
;
debug_info
.
out_pos
=
debug_info
.
output
;
...
...
@@ -428,20 +427,7 @@ static void start_thread( struct wine_pthread_thread_info *info )
SIGNAL_Init
();
server_init_thread
(
info
->
pid
,
info
->
tid
,
func
);
pthread_functions
.
init_thread
(
info
);
/* allocate a memory view for the stack */
size
=
info
->
stack_size
;
teb
->
DeallocationStack
=
info
->
stack_base
;
NtAllocateVirtualMemory
(
NtCurrentProcess
(),
&
teb
->
DeallocationStack
,
0
,
&
size
,
MEM_SYSTEM
,
PAGE_READWRITE
);
/* limit is lower than base since the stack grows down */
teb
->
Tib
.
StackBase
=
(
char
*
)
info
->
stack_base
+
info
->
stack_size
;
teb
->
Tib
.
StackLimit
=
(
char
*
)
info
->
stack_base
+
page_size
;
/* setup the guard page */
size
=
page_size
;
NtProtectVirtualMemory
(
NtCurrentProcess
(),
&
teb
->
DeallocationStack
,
&
size
,
PAGE_NOACCESS
,
NULL
);
virtual_alloc_thread_stack
(
info
->
stack_base
,
info
->
stack_size
);
pthread_functions
.
sigprocmask
(
SIG_UNBLOCK
,
&
server_block_set
,
NULL
);
RtlAcquirePebLock
();
...
...
dlls/ntdll/virtual.c
View file @
60069454
...
...
@@ -41,6 +41,9 @@
#ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h>
#endif
#ifdef HAVE_VALGRIND_MEMCHECK_H
# include <valgrind/memcheck.h>
#endif
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
...
...
@@ -1253,6 +1256,53 @@ void virtual_init_threading(void)
/***********************************************************************
* virtual_alloc_thread_stack
*/
NTSTATUS
virtual_alloc_thread_stack
(
void
*
base
,
SIZE_T
size
)
{
FILE_VIEW
*
view
;
NTSTATUS
status
;
sigset_t
sigset
;
server_enter_uninterrupted_section
(
&
csVirtual
,
&
sigset
);
if
(
base
)
/* already allocated, create a system view */
{
size
=
ROUND_SIZE
(
base
,
size
);
base
=
ROUND_ADDR
(
base
,
page_mask
);
if
((
status
=
create_view
(
&
view
,
base
,
size
,
VPROT_READ
|
VPROT_WRITE
|
VPROT_COMMITTED
))
!=
STATUS_SUCCESS
)
goto
done
;
view
->
flags
|=
VFLAG_VALLOC
|
VFLAG_SYSTEM
;
}
else
{
size
=
(
size
+
0xffff
)
&
~
0xffff
;
/* round to 64K boundary */
if
((
status
=
map_view
(
&
view
,
NULL
,
size
,
0xffff
,
0
,
VPROT_READ
|
VPROT_WRITE
|
VPROT_COMMITTED
))
!=
STATUS_SUCCESS
)
goto
done
;
view
->
flags
|=
VFLAG_VALLOC
;
#ifdef VALGRIND_STACK_REGISTER
/* no need to de-register the stack as it's the one of the main thread */
VALGRIND_STACK_REGISTER
(
view
->
base
,
(
char
*
)
view
->
base
+
view
->
size
);
#endif
}
/* setup no access guard page */
VIRTUAL_SetProt
(
view
,
view
->
base
,
page_size
,
VPROT_COMMITTED
);
/* note: limit is lower than base since the stack grows down */
NtCurrentTeb
()
->
DeallocationStack
=
view
->
base
;
NtCurrentTeb
()
->
Tib
.
StackBase
=
(
char
*
)
view
->
base
+
view
->
size
;
NtCurrentTeb
()
->
Tib
.
StackLimit
=
(
char
*
)
view
->
base
+
page_size
;
done:
server_leave_uninterrupted_section
(
&
csVirtual
,
&
sigset
);
return
status
;
}
/***********************************************************************
* VIRTUAL_HandleFault
*/
NTSTATUS
VIRTUAL_HandleFault
(
LPCVOID
addr
)
...
...
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