1*0Sstevel@tonic-gate/* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate/* 23*0Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24*0Sstevel@tonic-gate * Use is subject to license terms. 25*0Sstevel@tonic-gate */ 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate#pragma ident "%Z%%M% %I% %E% SMI" 28*0Sstevel@tonic-gate 29*0Sstevel@tonic-gate#if defined(__lint) 30*0Sstevel@tonic-gate#include <setjmp.h> 31*0Sstevel@tonic-gate#endif 32*0Sstevel@tonic-gate 33*0Sstevel@tonic-gate#include <sys/asm_linkage.h> 34*0Sstevel@tonic-gate 35*0Sstevel@tonic-gate/* 36*0Sstevel@tonic-gate * longjmp(env, val) 37*0Sstevel@tonic-gate * will generate a "return(val)" from 38*0Sstevel@tonic-gate * the last call to 39*0Sstevel@tonic-gate * setjmp(env) 40*0Sstevel@tonic-gate * by restoring registers rip rsp rbp rbx r12 r13 r14 r15 from 'env' 41*0Sstevel@tonic-gate * and doing a return. 42*0Sstevel@tonic-gate * 43*0Sstevel@tonic-gate * entry reg offset 44*0Sstevel@tonic-gate * env[0] = %rbx 0 register variables 45*0Sstevel@tonic-gate * env[1] = %r12 8 46*0Sstevel@tonic-gate * env[2] = %r13 16 47*0Sstevel@tonic-gate * env[3] = %r14 24 48*0Sstevel@tonic-gate * env[4] = %r15 32 49*0Sstevel@tonic-gate * env[5] = %rbp 40 stack frame 50*0Sstevel@tonic-gate * env[6] = %rsp 48 51*0Sstevel@tonic-gate * env[7] = %rip 56 52*0Sstevel@tonic-gate */ 53*0Sstevel@tonic-gate 54*0Sstevel@tonic-gate#if defined(__lint) 55*0Sstevel@tonic-gate/*ARGSUSED*/ 56*0Sstevel@tonic-gateint 57*0Sstevel@tonic-gatesetjmp(jmp_buf env) 58*0Sstevel@tonic-gate{ 59*0Sstevel@tonic-gate return (0); 60*0Sstevel@tonic-gate} 61*0Sstevel@tonic-gate 62*0Sstevel@tonic-gate/*ARGSUSED*/ 63*0Sstevel@tonic-gateint 64*0Sstevel@tonic-gatesigsetjmp(sigjmp_buf env, int savemask) 65*0Sstevel@tonic-gate{ 66*0Sstevel@tonic-gate return (0); 67*0Sstevel@tonic-gate} 68*0Sstevel@tonic-gate#else /* __lint */ 69*0Sstevel@tonic-gate 70*0Sstevel@tonic-gate ENTRY(setjmp) 71*0Sstevel@tonic-gate ALTENTRY(sigsetjmp) 72*0Sstevel@tonic-gate movq %rbx, 0(%rdi) 73*0Sstevel@tonic-gate movq %r12, 8(%rdi) 74*0Sstevel@tonic-gate movq %r13, 16(%rdi) 75*0Sstevel@tonic-gate movq %r14, 24(%rdi) 76*0Sstevel@tonic-gate movq %r15, 32(%rdi) 77*0Sstevel@tonic-gate movq %rbp, 40(%rdi) 78*0Sstevel@tonic-gate popq %rdx /* return address */ 79*0Sstevel@tonic-gate movq %rsp, 48(%rdi) 80*0Sstevel@tonic-gate movq %rdx, 56(%rdi) 81*0Sstevel@tonic-gate xorl %eax, %eax /* return 0 */ 82*0Sstevel@tonic-gate jmp *%rdx 83*0Sstevel@tonic-gate SET_SIZE(sigsetjmp) 84*0Sstevel@tonic-gate SET_SIZE(setjmp) 85*0Sstevel@tonic-gate 86*0Sstevel@tonic-gate#endif /* __lint */ 87*0Sstevel@tonic-gate 88*0Sstevel@tonic-gate#if defined(__lint) 89*0Sstevel@tonic-gate/*ARGSUSED*/ 90*0Sstevel@tonic-gatevoid 91*0Sstevel@tonic-gatelongjmp(jmp_buf env, int val) 92*0Sstevel@tonic-gate{ 93*0Sstevel@tonic-gate} 94*0Sstevel@tonic-gate 95*0Sstevel@tonic-gate/*ARGSUSED*/ 96*0Sstevel@tonic-gatevoid 97*0Sstevel@tonic-gatesiglongjmp(sigjmp_buf env, int val) 98*0Sstevel@tonic-gate{ 99*0Sstevel@tonic-gate} 100*0Sstevel@tonic-gate#else /* __lint */ 101*0Sstevel@tonic-gate 102*0Sstevel@tonic-gate ENTRY(longjmp) 103*0Sstevel@tonic-gate ALTENTRY(siglongjmp) 104*0Sstevel@tonic-gate movq 0(%rdi), %rbx 105*0Sstevel@tonic-gate movq 8(%rdi), %r12 106*0Sstevel@tonic-gate movq 16(%rdi), %r13 107*0Sstevel@tonic-gate movq 24(%rdi), %r14 108*0Sstevel@tonic-gate movq 32(%rdi), %r15 109*0Sstevel@tonic-gate movq 40(%rdi), %rbp 110*0Sstevel@tonic-gate movq 48(%rdi), %rsp 111*0Sstevel@tonic-gate movl %esi, %eax 112*0Sstevel@tonic-gate test %eax, %eax /* if val != 0 */ 113*0Sstevel@tonic-gate jnz 1f /* return val */ 114*0Sstevel@tonic-gate incl %eax /* else return 1 */ 115*0Sstevel@tonic-gate1: 116*0Sstevel@tonic-gate movq 56(%rdi), %rdx /* return to caller of setjmp */ 117*0Sstevel@tonic-gate jmp *%rdx 118*0Sstevel@tonic-gate SET_SIZE(siglongjmp) 119*0Sstevel@tonic-gate SET_SIZE(longjmp) 120*0Sstevel@tonic-gate 121*0Sstevel@tonic-gate#endif /* __lint */ 122