From 624376b403feec39a09247399ca72e80cade7425 Mon Sep 17 00:00:00 2001 From: nickysn Date: Fri, 25 Sep 2015 16:19:56 +0000 Subject: [PATCH] + handle properly win16 "odd bp" stack frames in get_caller_addr and get_caller_frame git-svn-id: trunk@31829 - --- rtl/i8086/i8086.inc | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/rtl/i8086/i8086.inc b/rtl/i8086/i8086.inc index 4e99bdff69..801a93b293 100644 --- a/rtl/i8086/i8086.inc +++ b/rtl/i8086/i8086.inc @@ -225,22 +225,50 @@ asm {$endif FPC_X86_CODE_FAR} {$ifdef FPC_X86_DATA_NEAR} mov ax, ss:[si + 4 + extra_param_offset + extra_param_offset] // framebp + {$ifdef WIN16} + mov cx, ax + and al, $FE + {$endif WIN16} or ax, ax jz @@Lg_a_null xchg ax, bx // 1 byte shorter than a mov mov ax, [bx+2] {$ifdef FPC_X86_CODE_FAR} - mov dx, [bx+4] + {$ifdef WIN16} + test cl, 1 + jnz @@farretaddr + mov dx, ss:[si + 2 + extra_param_offset + extra_param_offset] // Seg(addr^) + jmp @@retsegdone +@@farretaddr: + mov dx, [bx+4] +@@retsegdone: + {$else WIN16} + mov dx, [bx+4] + {$endif WIN16} {$endif FPC_X86_CODE_FAR} {$else FPC_X86_DATA_NEAR} les ax, ss:[si + 4 + extra_param_offset + extra_param_offset] // framebp + {$ifdef WIN16} + mov cx, ax + and al, $FE + {$endif WIN16} mov dx, es or dx, ax jz @@Lg_a_null xchg ax, bx // 1 byte shorter than a mov mov ax, es:[bx+2] {$ifdef FPC_X86_CODE_FAR} - mov dx, es:[bx+4] + {$ifdef WIN16} + test cl, 1 + jnz @@farretaddr + mov dx, ss:[si + 2 + extra_param_offset + extra_param_offset] // Seg(addr^) + jmp @@retsegdone +@@farretaddr: + mov dx, es:[bx+4] +@@retsegdone: + {$else WIN16} + mov dx, es:[bx+4] + {$endif WIN16} {$endif FPC_X86_CODE_FAR} {$endif FPC_X86_DATA_NEAR} @@Lg_a_null: @@ -252,6 +280,9 @@ asm {$ifdef FPC_X86_DATA_NEAR} mov si, sp mov ax, ss:[si + 4 + extra_param_offset + extra_param_offset] // framebp + {$ifdef WIN16} + and al, $FE + {$endif WIN16} or ax, ax jz @@Lgnf_null xchg ax, si // 1 byte shorter than a mov @@ -260,6 +291,9 @@ asm {$else FPC_X86_DATA_NEAR} mov si, sp les ax, ss:[si + 4 + extra_param_offset + extra_param_offset] // framebp + {$ifdef WIN16} + and al, $FE + {$endif WIN16} mov dx, es or dx, ax jz @@Lgnf_null