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