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

Reply via email to