/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #pragma ident "%Z%%M% %I% %E% SMI" /* * This file contains all the type definitions necessary to * define the equivalent of SVR4 struct ucontext. */ /* Definition for alternate stack */ typedef struct sigaltstack { char *ss_sp; int ss_size; int ss_flags; } stack_t; /* Register window */ struct rwindow { int rw_local[8]; /* locals */ int rw_in[8]; /* ins */ }; #define SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */ struct gwindows { int wbcnt; int *spbuf[SPARC_MAXREGWINDOW]; struct rwindow wbuf[SPARC_MAXREGWINDOW]; }; typedef struct gwindows gwindows_t; /* Floating point registers */ struct fpq { unsigned long *fpq_addr; /* address */ unsigned long fpq_instr; /* instruction */ }; struct fq { union { /* FPU inst/addr queue */ double whole; struct fpq fpq; } FQu; }; struct fpu { union { /* FPU floating point regs */ unsigned fpu_regs[32]; /* 32 singles */ double fpu_dregs[16]; /* 16 doubles */ } fpu_fr; struct fq *fpu_q; /* ptr to array of FQ entries */ unsigned fpu_fsr; /* FPU status register */ unsigned char fpu_qcnt; /* # of entries in saved FQ */ unsigned char fpu_q_entrysize; /* # of bytes per FQ entry */ unsigned char fpu_en; /* flag signifying fpu in use */ }; typedef struct fpu fpregset_t; /* Register set */ #define NGREG 19 typedef int gregset_t[NGREG]; typedef struct mcontext{ gregset_t gregs; /* general register set */ gwindows_t *gwins; /* POSSIBLE pointer to register windows */ fpregset_t fpregs; /* floating point register set */ long filler[21]; } mcontext_t; typedef struct ucontext{ unsigned long uc_flags; struct ucontext *uc_link; unsigned long uc_sigmask[4]; stack_t uc_stack; mcontext_t uc_mcontext; long uc_filler[23]; } ucontext_t; /* The following is needed by the setjmp/longjmp routines */ #define _ABI_JBLEN 12 /* _JBLEN from base */ /* * The following structure MUST match the ABI size specifier _SIGJBLEN. * This is 19 (words). The ABI value for _JBLEN is 12 (words). * A sigset_t is 16 bytes and a stack_t is 12 bytes. The layout must * match sigjmp_struct_t, defined in usr/src/lib/libc/inc/sigjmp_struct.h */ typedef struct setjmp_struct_t { int sjs_flags; /* JBUF[ 0] */ int sjs_sp; /* JBUF[ 1] */ int sjs_pc; /* JBUF[ 2] */ int sjs_fp; /* JBUF[ 3] */ int sjs_i7; /* JBUF[ 4] */ void *sjs_uclink; unsigned long sjs_pad[_ABI_JBLEN - 6]; unsigned long sjs_sigmask[4]; stack_t sjs_stack; } setjmp_struct_t; typedef struct o_setjmp_struct_t { int sjs_flags; /* JBUF[ 0] */ int sjs_sp; /* JBUF[ 1] */ int sjs_pc; /* JBUF[ 2] */ unsigned long sjs_sigmask[3]; stack_t sjs_stack; } o_setjmp_struct_t; #define JB_SAVEMASK 0x1 #define UC_SIGMASK 001 #define UC_STACK 002