From 8f61df817aa2d6f254ab5f118f569b826079806d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A1roly=20Balogh?= Date: Wed, 14 Apr 2021 14:59:08 +0000 Subject: [PATCH] atari: implemented stacktop for working stacktraces, implemented stacksize dependent stackmargin, and a system specific backtracestr. however, offs display still doesn't work properly, due to a linker issue (reported) git-svn-id: trunk@49203 - --- rtl/atari/si_prc.pp | 2 +- rtl/atari/sysos.inc | 19 +++++++++++++++++++ rtl/atari/system.pp | 7 +++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/rtl/atari/si_prc.pp b/rtl/atari/si_prc.pp index 41c0297e0d..11b6609447 100644 --- a/rtl/atari/si_prc.pp +++ b/rtl/atari/si_prc.pp @@ -24,7 +24,7 @@ implementation var procdesc: PPD; public name '__base'; tpasize: longint; - stacktop: pointer; + stacktop: pointer; public name '__stktop'; stklen: longint; external name '__stklen'; diff --git a/rtl/atari/sysos.inc b/rtl/atari/sysos.inc index 88aee6157b..7630103b8c 100644 --- a/rtl/atari/sysos.inc +++ b/rtl/atari/sysos.inc @@ -42,3 +42,22 @@ begin end; end; end; + +var + stackpointer_on_entry: pointer; external name '__stktop'; + +function StackTop: Pointer; +begin + StackTop:=stackpointer_on_entry; +end; + +var + basepage: PPD; external name '__base'; + +function SysBackTraceStr (Addr: CodePointer): ShortString; +begin + if (addrpointer(basepage^.p_tbase+basepage^.p_tlen)) then + SysBackTraceStr:=' Addr $'+hexstr(addr) + else + SysBackTraceStr:=' Offs $'+hexstr(pointer(addr-basepage^.p_tbase)); +end; diff --git a/rtl/atari/system.pp b/rtl/atari/system.pp index 83de56f7ef..ce0e4c6fdb 100644 --- a/rtl/atari/system.pp +++ b/rtl/atari/system.pp @@ -76,6 +76,9 @@ var implementation + {$define FPC_SYSTEM_HAS_STACKTOP} + {$define FPC_SYSTEM_HAS_BACKTRACESTR} + {$if defined(FPUSOFT)} {$define fpc_softfpu_implementation} @@ -104,8 +107,6 @@ var {$endif FPC_ATARI_USE_TINYHEAP} {$i syspara.inc} - var - basepage: PPD; external name '__base'; function GetProcessID:SizeUInt; @@ -160,6 +161,8 @@ end; begin StackLength := CheckInitialStkLen (InitialStkLen); + StackBottom := StackTop - StackLength; + StackMargin := min(align(StackLength div 20,2),STACK_MARGIN_MAX); { Initialize ExitProc } ExitProc:=Nil; {$ifndef FPC_ATARI_USE_TINYHEAP}