A while back someone asked about setjmp /longjmp in RT linux here setjmp.[Sh] from newlib fixed up a bit and sti/cli removed cause i didn't had time to figure out how to call a inline C function thats a header file from inside a assembler file. Simple test it seems to work, see if it is usefull to you. - Erwin
/* This is file is a merger of SETJMP.S and LONGJMP.S */ /* * This file was modified to use the __USER_LABEL_PREFIX__ and * __REGISTER_PREFIX__ macros defined by later versions of GNU cpp by * Joel Sherrill ([EMAIL PROTECTED]) * Slight change: now includes i386mach.h for this (Werner Almesberger) * * Copyright (C) 1991 DJ Delorie * All rights reserved. * * Redistribution and use in source and binary forms is permitted * provided that the above copyright notice and following paragraph are * duplicated in all such forms. * * This file is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ /* ** jmp_buf: ** eax ebx ecx edx esi edi ebp esp eip ** 0 4 8 12 16 20 24 28 32 */ .section .rodata .text .weak setjmp setjmp: .globl __setjmp __setjmp: pushl %ebp movl %esp,%ebp pushl %edi movl 8 (%ebp),%edi movl %eax,0 (%edi) movl %ebx,4 (%edi) movl %ecx,8 (%edi) movl %edx,12 (%edi) movl %esi,16 (%edi) movl -4 (%ebp),%eax movl %eax,20 (%edi) movl 0 (%ebp),%eax movl %eax,24 (%edi) movl %esp,%eax addl $12,%eax movl %eax,28 (%edi) movl 4 (%ebp),%eax movl %eax,32 (%edi) popl %edi movl $0,%eax leave ret .text .global __longjmp longjmp: __longjmp: pushl %ebp movl %esp,%ebp movl 8(%ebp),%edi /* get jmp_buf */ movl 12(%ebp),%eax /* store retval in j->eax */ movl %eax,0(%edi) movl 24(%edi),%ebp // __CLI movl 28(%edi),%esp pushl 32(%edi) movl 0(%edi),%eax movl 4(%edi),%ebx movl 8(%edi),%ecx movl 12(%edi),%edx movl 16(%edi),%esi movl 20(%edi),%edi // __STI ret
/* * Copyright (C) 1991 DJ Delorie * All rights reserved. * * Redistribution and use in source and binary forms is permitted * provided that the above copyright notice and following paragraph are * duplicated in all such forms. * * This file is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ /* Modified to use SETJMP_DJ_H rather than SETJMP_H to avoid conflicting with setjmp.h. Ian Taylor, Cygnus support, April, 1993. */ /* Modified to be setjmp.h again for use with RTAI Erwin Rol 16-03-2001 */ #ifndef __SETJMP_H__ #define __SETJMP_H__ #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned long eax; unsigned long ebx; unsigned long ecx; unsigned long edx; unsigned long esi; unsigned long edi; unsigned long ebp; unsigned long esp; unsigned long eip; } jmp_buf[1]; extern int setjmp(jmp_buf); extern void longjmp(jmp_buf, int); #ifdef __cplusplus } #endif #endif