Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2772 → Rev 2773

/trunk/uspace/lib/libc/include/setjmp.h
0,0 → 1,49
/*
* Copyright (c) 2008 Josef Cejka
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
/** @addtogroup libc
* @{
*/
/** @file
*/
 
#ifndef LIBC_SETJMP_H_
#define LIBC_SETJMP_H_
 
#include <libarch/fibril.h>
 
typedef context_t jmp_buf;
 
extern int setjmp(jmp_buf env);
extern void longjmp(jmp_buf env,int val) __attribute__((__noreturn__));
 
#endif
 
/** @}
*/
 
/trunk/uspace/lib/libc/include/unistd.h
38,7 → 38,10
#include <sys/types.h>
#include <libarch/config.h>
 
#ifndef NULL
#define NULL 0
#endif
 
#define getpagesize() (PAGE_SIZE)
 
#define SEEK_SET 0
/trunk/uspace/lib/libc/arch/ia32/include/setjmp.h
File deleted
/trunk/uspace/lib/libc/arch/ia32/src/setjmp.S
26,6 → 26,8
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
 
#include <kernel/arch/context_offset.h>
 
.text
.global setjmp
.global longjmp
32,18 → 34,13
 
.type setjmp,@function
setjmp:
movl 0(%esp), %ecx # save current pc
leal 4(%esp), %edx # save stack pointer
movl (%edx), %eax # get jmp_buf pointer
movl 0(%esp),%eax # save pc value into eax
movl 4(%esp),%edx # address of the context variable to save context to
 
# Save registers
movl %ebx, 0(%eax)
movl %esi, 4(%eax)
movl %edi, 8(%eax)
movl %ebp, 12(%eax)
movl %edx, 16(%eax)
# save registers to given structure
CONTEXT_SAVE_ARCH_CORE %edx %eax
 
movl %ecx, 20(%eax) # save pc
xorl %eax,%eax # set_jmp returns 0
ret
 
.type longjmp,@function
52,12 → 49,9
movl 4(%esp), %ecx # put address of jmp_buf into ecx
movl 8(%esp), %eax # put return value into eax
 
# restore all registers
movl 0(%ecx), %ebx
movl 4(%ecx), %esi
movl 8(%ecx), %edi
movl 12(%ecx), %ebp
movl 16(%ecx), %esp
movl 20(%ecx), %edx # saved return address
jmp *%edx
# restore registers from jmp_buf
CONTEXT_RESTORE_ARCH_CORE %ecx %edx
 
movl %edx,0(%esp) # put saved pc on stack
ret