diff --git a/rtl/inc/system.inc b/rtl/inc/system.inc index acfebd611f..101fd788dc 100644 --- a/rtl/inc/system.inc +++ b/rtl/inc/system.inc @@ -44,7 +44,11 @@ const var { widechar, because also used by widestring -> pwidechar conversions } emptychar : widechar;public name 'FPC_EMPTYCHAR'; +{$ifndef FPC_NO_GENERIC_STACK_CHECK} + { if the OS does the stack checking, we don't need any stklen from the + main program } initialstklen : SizeUint;external name '__stklen'; +{$endif FPC_NO_GENERIC_STACK_CHECK} { checks whether the given suggested size for the stack of the current thread is acceptable. If this is the case, returns it unaltered. diff --git a/rtl/win32/system.pp b/rtl/win32/system.pp index 264d262876..22da670824 100644 --- a/rtl/win32/system.pp +++ b/rtl/win32/system.pp @@ -1083,7 +1083,7 @@ begin end; end; -(* ProcessID cached to avoid repeated calls to GetCurrentProcess. *) +{ ProcessID cached to avoid repeated calls to GetCurrentProcess. } var ProcessID: SizeUInt; @@ -1093,9 +1093,10 @@ begin GetProcessID := ProcessID; end; -function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt; -begin - result := stklen; +function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;assembler; +asm + movl %fs:(4),%eax + subl %fs:(8),%eax end; { @@ -1105,7 +1106,8 @@ const } begin - StackLength := CheckInitialStkLen(InitialStkLen); + { pass dummy value } + StackLength := CheckInitialStkLen($1000000); StackBottom := StackTop - StackLength; { get some helpful informations } GetStartupInfo(@startupinfo); diff --git a/rtl/win64/system.pp b/rtl/win64/system.pp index 1bb190ce6e..a40cfb9e52 100644 --- a/rtl/win64/system.pp +++ b/rtl/win64/system.pp @@ -1136,17 +1136,19 @@ begin end; -function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt; -begin - result := stklen; +function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;assembler; +asm + movq %gs:(8),%rax + subq %gs:(16),%rax end; begin - SysResetFPU; + SysResetFPU; if not(IsLibrary) then SysInitFPU; - StackLength := CheckInitialStkLen(InitialStkLen); + { pass dummy value } + StackLength := CheckInitialStkLen($1000000); StackBottom := StackTop - StackLength; { get some helpful informations } GetStartupInfo(@startupinfo);