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