27c478bdstevel@tonic-gate * CDDL HEADER START
37c478bdstevel@tonic-gate *
47c478bdstevel@tonic-gate * The contents of this file are subject to the terms of the
53cd8a1aRoger A. Faulkner * Common Development and Distribution License (the "License").
63cd8a1aRoger A. Faulkner * You may not use this file except in compliance with the License.
77c478bdstevel@tonic-gate *
87c478bdstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bdstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bdstevel@tonic-gate * See the License for the specific language governing permissions
117c478bdstevel@tonic-gate * and limitations under the License.
127c478bdstevel@tonic-gate *
137c478bdstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bdstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bdstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bdstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bdstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bdstevel@tonic-gate *
197c478bdstevel@tonic-gate * CDDL HEADER END
207c478bdstevel@tonic-gate */
213cd8a1aRoger A. Faulkner
233cd8a1aRoger A. Faulkner * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bdstevel@tonic-gate */
267c478bdstevel@tonic-gate#ifndef _SIGJMP_STRUCT_H
277c478bdstevel@tonic-gate#define	_SIGJMP_STRUCT_H
297c478bdstevel@tonic-gate#ifdef	__cplusplus
307c478bdstevel@tonic-gateextern "C" {
337c478bdstevel@tonic-gate#include <sys/types.h>
347c478bdstevel@tonic-gate#include <sys/stack.h>
356a8fa7eVitaliy Gusev#include <sys/sysmacros.h>
367c478bdstevel@tonic-gate#include <ucontext.h>
377c478bdstevel@tonic-gate#include <setjmp.h>
397c478bdstevel@tonic-gate#if defined(__sparc)
427c478bdstevel@tonic-gate * The following structure MUST match the ABI size specifier _SIGJBLEN.
437c478bdstevel@tonic-gate * This is 19 (longs).  The ABI value for _JBLEN is 12 (longs).
447c478bdstevel@tonic-gate * A greg_t is a long.  A sigset_t is 4 ints and a stack_t is 3 longs.
457c478bdstevel@tonic-gate *
467c478bdstevel@tonic-gate * The layout of this structure must match the layout of the same
477c478bdstevel@tonic-gate * structures defined in usr/src/lib/libbc/libc/sys/common/ucontext.h
487c478bdstevel@tonic-gate * and usr/src/ucblib/libucb/sparc/sys/setjmp.c.  Other than that,
497c478bdstevel@tonic-gate * the layout is private, not known to applications.
507c478bdstevel@tonic-gate *
517c478bdstevel@tonic-gate * We make the first 5 members match the implementations of
527c478bdstevel@tonic-gate * setjmp()/longjmp(), so that an application could (stupidly)
537c478bdstevel@tonic-gate * do sigsetjmp(env) followed by longjmp(env) (but not setjmp(env)
547c478bdstevel@tonic-gate * followed by siglongjmp(env)).
557c478bdstevel@tonic-gate */
567c478bdstevel@tonic-gatetypedef struct {
577c478bdstevel@tonic-gate	int		sjs_flags;	/* JBUF[ 0]	*/
587c478bdstevel@tonic-gate	greg_t		sjs_sp;		/* JBUF[ 1]	*/
597c478bdstevel@tonic-gate	greg_t		sjs_pc;		/* JBUF[ 2]	*/
607c478bdstevel@tonic-gate	greg_t		sjs_fp;		/* JBUF[ 3]	*/
617c478bdstevel@tonic-gate	greg_t		sjs_i7;		/* JBUF[ 4]	*/
627c478bdstevel@tonic-gate	ucontext_t	*sjs_uclink;
637c478bdstevel@tonic-gate	ulong_t		sjs_pad[_JBLEN - 6];
647c478bdstevel@tonic-gate	sigset_t	sjs_sigmask;
657c478bdstevel@tonic-gate#if defined(_LP64)
663cd8a1aRoger A. Faulkner	greg_t		sjs_asi;
673cd8a1aRoger A. Faulkner	greg_t		sjs_fprs;
697c478bdstevel@tonic-gate	stack_t		sjs_stack;
707c478bdstevel@tonic-gate} sigjmp_struct_t;
727c478bdstevel@tonic-gate#define	JB_SAVEMASK	0x1
737c478bdstevel@tonic-gate#define	JB_FRAMEPTR	0x2
757c478bdstevel@tonic-gate#endif	/* __sparc */
776a8fa7eVitaliy Gusev#if defined(__amd64)
786a8fa7eVitaliy Gusev/*
796a8fa7eVitaliy Gusev * The "sigjmp_buf" type is an array of long and thus can have 8-byte alignment
806a8fa7eVitaliy Gusev * on AMD64 systems.  The "ucontext_t" type has a stricter 16-byte alignment
816a8fa7eVitaliy Gusev * requirement, so we must round the pointer up when casting.
826a8fa7eVitaliy Gusev *
836a8fa7eVitaliy Gusev * This is not required on other architectures:
846a8fa7eVitaliy Gusev *  - SPARC does not store the ucontext_t in the sigjmp_buf
856a8fa7eVitaliy Gusev *  - i386 only requires 4-byte alignment for ucontext_t
866a8fa7eVitaliy Gusev */
876a8fa7eVitaliy Gusev#define	SIGJMP2UCONTEXT(x)	\
886a8fa7eVitaliy Gusev	((ucontext_t *)P2ROUNDUP((uintptr_t)(x),  sizeof (upad128_t)))
896a8fa7eVitaliy Gusev#endif
906a8fa7eVitaliy Gusev
917c478bdstevel@tonic-gate#ifdef	__cplusplus
957c478bdstevel@tonic-gate#endif /* _SIGJMP_STRUCT_H */