Commit e15aadd5 authored by Alexandre Julliard's avatar Alexandre Julliard

Allocate/free the 16-bit thread stack in the kernel dll init routine.

parent fde5ab17
......@@ -38,6 +38,8 @@
#include "miscemu.h"
#include "module.h"
#include "task.h"
#include "thread.h"
#include "stackframe.h"
#include "wincon.h"
#include "console_private.h"
......@@ -64,6 +66,31 @@ static void ldt_unlock(void)
LeaveCriticalSection( &ldt_section );
}
/***********************************************************************
* KERNEL thread initialisation routine
*/
static void thread_attach(void)
{
/* allocate the 16-bit stack (FIXME: should be done lazily) */
HGLOBAL16 hstack = K32WOWGlobalAlloc16( GMEM_FIXED, 0x10000 );
NtCurrentTeb()->stack_sel = GlobalHandleToSel16( hstack );
NtCurrentTeb()->cur_stack = MAKESEGPTR( NtCurrentTeb()->stack_sel,
0x10000 - sizeof(STACK16FRAME) );
}
/***********************************************************************
* KERNEL thread finalisation routine
*/
static void thread_detach(void)
{
/* free the 16-bit stack */
K32WOWGlobalFree16( NtCurrentTeb()->stack_sel );
NtCurrentTeb()->cur_stack = 0;
}
/***********************************************************************
* KERNEL process initialisation routine
*/
......@@ -144,6 +171,7 @@ static BOOL process_attach(void)
if (main_create_flags & CREATE_NEW_PROCESS_GROUP)
SetConsoleCtrlHandler(NULL, TRUE);
thread_attach();
return TRUE;
}
......@@ -156,6 +184,12 @@ BOOL WINAPI MAIN_KernelInit( HINSTANCE hinst, DWORD reason, LPVOID reserved )
{
case DLL_PROCESS_ATTACH:
return process_attach();
case DLL_THREAD_ATTACH:
thread_attach();
break;
case DLL_THREAD_DETACH:
thread_detach();
break;
case DLL_PROCESS_DETACH:
WriteOutProfiles16();
break;
......
......@@ -293,7 +293,6 @@ void SYSDEPS_ExitThread( int status )
struct thread_cleanup_info info;
MEMORY_BASIC_INFORMATION meminfo;
wine_ldt_free_entries( teb->stack_sel, 1 );
VirtualQuery( teb->stack_top, &meminfo, sizeof(meminfo) );
info.stack_base = meminfo.AllocationBase;
info.stack_size = meminfo.RegionSize + ((char *)teb->stack_top - (char *)meminfo.AllocationBase);
......
......@@ -120,7 +120,6 @@ static void THREAD_FreeTEB( TEB *teb )
{
TRACE("(%p) called\n", teb );
/* Free the associated memory */
wine_ldt_free_entries( teb->stack_sel, 1 );
wine_ldt_free_fs( teb->teb_sel );
VirtualFree( teb->stack_base, 0, MEM_RELEASE );
}
......@@ -163,14 +162,12 @@ TEB *THREAD_InitStack( TEB *teb, DWORD stack_size )
* 1 page NOACCESS guard page
* 1 page PAGE_GUARD guard page
* stack_size normal stack
* 64Kb 16-bit stack (optional)
* 1 page TEB (except for initial thread)
* 1 page debug info (except for initial thread)
*/
stack_size = (stack_size + (page_size - 1)) & ~(page_size - 1);
total_size = stack_size + SIGNAL_STACK_SIZE + 3 * page_size;
total_size += 0x10000; /* 16-bit stack */
if (!teb) total_size += 2 * page_size;
if (!(base = VirtualAlloc( NULL, total_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE )))
......@@ -179,7 +176,11 @@ TEB *THREAD_InitStack( TEB *teb, DWORD stack_size )
if (!teb)
{
teb = (TEB *)((char *)base + total_size - 2 * page_size);
if (!THREAD_InitTEB( teb )) goto error;
if (!THREAD_InitTEB( teb ))
{
VirtualFree( base, 0, MEM_RELEASE );
return NULL;
}
teb->debug_info = (char *)teb + page_size;
}
......@@ -194,19 +195,7 @@ TEB *THREAD_InitStack( TEB *teb, DWORD stack_size )
VirtualProtect( (char *)teb->signal_stack + SIGNAL_STACK_SIZE, 1, PAGE_NOACCESS, &old_prot );
VirtualProtect( (char *)teb->signal_stack + SIGNAL_STACK_SIZE + page_size, 1,
PAGE_EXECUTE_READWRITE | PAGE_GUARD, &old_prot );
/* Allocate the 16-bit stack selector */
teb->stack_sel = SELECTOR_AllocBlock( teb->stack_top, 0x10000, WINE_LDT_FLAGS_DATA );
if (!teb->stack_sel) goto error;
teb->cur_stack = MAKESEGPTR( teb->stack_sel, 0x10000 - sizeof(STACK16FRAME) );
return teb;
error:
wine_ldt_free_fs( teb->teb_sel );
VirtualFree( base, 0, MEM_RELEASE );
return NULL;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment