X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/5b2abdfbf4211b6592cdd02b9507555a0ecbb04b..1f2f436a38f7ae2d39a943ad2898d8fed4ed2e58:/ppc/sys/longjmp.s diff --git a/ppc/sys/longjmp.s b/ppc/sys/longjmp.s index 63d6806..44ef495 100644 --- a/ppc/sys/longjmp.s +++ b/ppc/sys/longjmp.s @@ -3,19 +3,20 @@ * * @APPLE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * * @APPLE_LICENSE_HEADER_END@ */ @@ -33,8 +34,13 @@ * Created. Derived from _setjmp.s, setjmp.c and setjmp.s */ -#include "SYS.h" -#include +/* We use mode-independent "g" opcodes such as "stg", and/or + * mode-independent macros such as MI_GET_ADDRESS. These expand + * into word operations when targeting __ppc__, and into doubleword + * operations when targeting __ppc64__. + */ +#include + #include "_setjmp.h" /* @@ -43,21 +49,35 @@ /* void siglongjmp(sigjmp_buf env, int val); */ -LEAF(_siglongjmp) - lwz r0, JMP_SIGFLAG(r3) ; load sigflag saved by siglongjmp() - cmpwi cr1,r0,0 ; this changes cr1[EQ] which is volatile - beq- cr1, L__longjmp ; if r0 == 0 do _longjmp() +MI_ENTRY_POINT(_siglongjmp) + lg r0, JMP_SIGFLAG(r3) ; load sigflag saved by siglongjmp() + cmpgi cr1,r0,0 ; this changes cr1 which is volatile + mr r30, r3 ; preserve args across _sigsetmask + mr r31, r4 + beq-- cr1, L__exit ; if r0 == 0 do _longjmp() ; else *** fall through *** to longjmp() /* void longjmp(jmp_buf env, int val); */ -LEAF(_longjmp) -L_longjmp: - mr r30, r3 - mr r31, r4 - lwz r3, JMP_sig(r3) ; restore the signal mask - CALL_EXTERN(_sigsetmask) - mr r4, r31 - mr r3, r30 -L__longjmp: - BRANCH_EXTERN(__longjmp) +MI_ENTRY_POINT(_longjmp) + mr r30, r3 ; preserve args across _sigsetmask + mr r31, r4 + + /* NB: this code assumes the signal mask is an int. Change the "lwz" below + * if not. The JMP_sig field is already 8 bytes in the jmpbuf. + */ + lwz r3, JMP_sig(r3) ; restore the signal mask + MI_CALL_EXTERNAL(_sigsetmask) // make a (deprecated!) syscall to set the mask +L__exit: + lwz r3,JMP_ss_flags(r30) + MI_CALL_EXTERNAL(__sigunaltstack) +L__exit2: + mr r3, r30 + mr r4, r31 + MI_BRANCH_EXTERNAL(__longjmp) + + + + + +