/* * Copyright (C) 2002-2003, George Thanos * Yannis Mitsos * Copyright (C) 2000-2006 Erik Andersen * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ #include #include #include #include #define __NR_e1newSP 224 static __inline__ _syscall1(int, e1newSP, unsigned long, SavedSP ) unsigned long jmpbuf_ptr; void longjmp(jmp_buf state, int value ) { if(!value) state->__jmpbuf->ReturnValue = 1; else state->__jmpbuf->ReturnValue = value; jmpbuf_ptr = (unsigned long)state; e1newSP(state->__jmpbuf->SavedSP); #define _state_ ((struct __jmp_buf_tag*)jmpbuf_ptr) __asm__ __volatile__("mov L0, %0\n\t" "mov L1, %1\n\t" "mov L2, %2\n\t" "mov G3, %3\n\t" "mov G4, %4\n\t" "ret PC, L1\n\t" :/*no output*/ :"l"(_state_->__jmpbuf->ReturnValue), "l"(_state_->__jmpbuf->SavedPC), "l"(_state_->__jmpbuf->SavedSR), "l"(_state_->__jmpbuf->G3), "l"(_state_->__jmpbuf->G4) :"%G3", "%G4", "%L0", "%L1" ); #undef _state_ } libc_hidden_proto(sigprocmask) void siglongjmp(sigjmp_buf state, int value ) { if( state->__mask_was_saved ) sigprocmask(SIG_SETMASK, &state->__saved_mask, NULL); if(!value) state->__jmpbuf->ReturnValue = 1; else state->__jmpbuf->ReturnValue = value; jmpbuf_ptr = (unsigned long)state; e1newSP(state->__jmpbuf->SavedSP); #define _state_ ((struct __jmp_buf_tag*)jmpbuf_ptr) __asm__ __volatile__("mov L0, %0\n\t" "mov L1, %1\n\t" "mov L2, %2\n\t" "mov G3, %3\n\t" "mov G4, %4\n\t" "ret PC, L1\n\t" :/*no output*/ :"l"(_state_->__jmpbuf->ReturnValue), "l"(_state_->__jmpbuf->SavedPC), "l"(_state_->__jmpbuf->SavedSR), "l"(_state_->__jmpbuf->G3), "l"(_state_->__jmpbuf->G4) :"%G3", "%G4", "%L0", "%L1" ); #undef _state_ }