123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by the Free Pascal development team
- SetJmp and LongJmp implementation for exception handling
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$ifdef needsigprocmask}
- const
- JMPSIG_BLOCK = 0;
- JMPSIG_SETMASK = 2;
- {$ifdef FPC_USE_LIBC}
- function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'sigprocmask';
- {$else}
- function JmpSigProcMask(how:longint;nset : pjmpsigset;oset : pjmpsigset):longint; external name 'FPC_SYSC_SIGPROCMASK';
- {$endif}
- procedure savesigmask(var s:jmp_buf);
- begin
- jmpsigprocmask(JMPSIG_BLOCK,nil,@s.sigmask);
- end;
- procedure restoresigmask(var s:jmp_buf);
- begin
- jmpsigprocmask(JMPSIG_SETMASK,@s.sigmask,nil);
- end;
- {$endif needsigprocmask}
- Function SetJmp (Var S : Jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];
- asm
- {$ifndef REGCALL}
- movl 8(%ebp),%eax
- {$endif}
- movl %ebx,(%eax)
- movl %esi,4(%eax)
- movl %edi,8(%eax)
- movl 4(%ebp),%edi
- movl %edi,20(%eax)
- movl (%ebp),%edi
- movl %edi,12(%eax)
- {$ifdef REGCALL}
- leal 8(%ebp),%edi
- {$else}
- leal 12(%ebp),%edi
- {$endif}
- movl %edi,16(%eax)
- movl 8(%eax),%edi
- {$ifdef needsigprocmask}
- call savesigmask
- {$endif needsigprocmask}
- xorl %eax,%eax
- end['EAX'];
- Procedure longJmp (Var S : Jmp_buf; value : longint); assembler;[Public, alias : 'FPC_LONGJMP'];
- asm
- {$ifdef REGCALL}
- {$ifdef needsigprocmask}
- movl %edx, %ebx
- movl %eax, %esi
- call restoresigmask
- movl %ebx, %edx
- movl %esi, %eax
- {$endif needsigprocmask}
- xchgl %edx,%eax
- {$else}
- movl 8(%ebp),%edx
- movl 12(%ebp),%eax
- {$endif}
- movl (%edx),%ebx
- movl 4(%edx),%esi
- movl 8(%edx),%edi
- movl 12(%edx),%ebp
- movl 16(%edx),%esp
- // we should also clear the fpu
- // fninit no must be done elsewhere PM
- // or we should reset the control word also
- jmp 20(%edx)
- end;
- {
- $Log$
- Revision 1.7 2005-02-13 20:01:37 peter
- * include file cleanup
- Revision 1.6 2005/01/20 16:38:28 peter
- * restore sigprocmask for linux
- Revision 1.5 2003/12/04 21:42:07 peter
- * register calling updates
- Revision 1.4 2003/11/11 21:08:17 peter
- * REGCALL define added
- Revision 1.3 2002/09/07 16:01:19 peter
- * old logs removed and tabs fixed
- }
|