mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	This patch fixes various miscellaneous namespace issues in the SPARC sys/ucontext.h header. These are similar to changes made previous to other sys/ucontext.h headers, where the SPARC header was excluded from those previous patches because of its complexity. Tested for SPARC with build-many-glibcs.py. [BZ #21457] * sysdeps/unix/sysv/linux/sparc/sys/ucontext.h (__ctx): New macro. [__WORDSIZE == 64] (MC_TSTATE): Define only for [__USE_MISC]. [__WORDSIZE == 64] (MC_PC): Likewise. [__WORDSIZE == 64] (MC_NPC): Likewise. [__WORDSIZE == 64] (MC_Y): Likewise. [__WORDSIZE == 64] (MC_G1): Likewise. [__WORDSIZE == 64] (MC_G2): Likewise. [__WORDSIZE == 64] (MC_G3): Likewise. [__WORDSIZE == 64] (MC_G4): Likewise. [__WORDSIZE == 64] (MC_G5): Likewise. [__WORDSIZE == 64] (MC_G6): Likewise. [__WORDSIZE == 64] (MC_G7): Likewise. [__WORDSIZE == 64] (MC_O0): Likewise. [__WORDSIZE == 64] (MC_O1): Likewise. [__WORDSIZE == 64] (MC_O2): Likewise. [__WORDSIZE == 64] (MC_O3): Likewise. [__WORDSIZE == 64] (MC_O4): Likewise. [__WORDSIZE == 64] (MC_O5): Likewise. [__WORDSIZE == 64] (MC_O6): Likewise. [__WORDSIZE == 64] (MC_O7): Likewise. [__WORDSIZE == 64] (MC_NGREG): Rename to __MC_NGREG and define to __MC_NGREG if [__USE_MISC]. [__WORDSIZE == 64] (MC_MAXFPQ): Define only for [__USE_MISC]. [__WORDSIZE == 64] (mc_gregset_t): Define using __MC_NGREG. [__WORDSIZE == 64] (struct mc_fq): Rename to struct __mc_fq. Define fields using __ctx. [__WORDSIZE == 64] (mc_fpu_t): Remove struct tag. Define fields using __ctx. [__WORDSIZE == 64] (mcontext_t): Define fields using __ctx. (REG_PSR): Define only for [__USE_MISC]. (REG_PC): Likewise. (REG_nPC): Likewise. (REG_Y): Likewise. (REG_G1): Likewise. (REG_G2): Likewise. (REG_G3): Likewise. (REG_G4): Likewise. (REG_G5): Likewise. (REG_G6): Likewise. (REG_G7): Likewise. (REG_O0): Likewise. (REG_O1): Likewise. (REG_O2): Likewise. (REG_O3): Likewise. (REG_O4): Likewise. (REG_O5): Likewise. (REG_O6): Likewise. (REG_O7): Likewise. [__WORDSIZE == 64] (REG_ASI): Define only for [__USE_MISC]. [__WORDSIZE == 64] (REG_FPRS): Likewise. (NGREG): Rename to __NGREG and define to __NGREG if [__USE_MISC]. (gregset_t): Define using __NGREG. (SPARC_MAXREGWINDOW): Rename to __SPARC_MAXREGWINDOW and define to __SPARC_MAXREGWINDOW if [__USE_MISC]. (struct rwindow): Rename to struct __rwindow. Define fields using __ctx. (rw_fp): Define only for [__USE_MISC]. (rw_rtn): Likewise. (gwindows_t): Remove struct tag. Define fields using __ctx and __SPARC_MAXREGWINDOW. (MAXFPQ): Define only for [__USE_MISC]. (struct fpq): Rename to struct __fpq. Define fields using __ctx. (struct fq): Rename to struct __fq. Define fields using __ctx. (FPU_REGS_TYPE): Define only for [__USE_MISC]. (FPU_DREGS_TYPE): Likewise. (V7_FPU_FSR_TYPE): Likewise. (V9_FPU_FSR_TYPE): Likewise. (V9_FPU_FPRS_TYPE): Likewise. [__WORDSIZE == 64] (fpregset_t): Remove struct tag. Define fields using __ctx. [__WORDSIZE != 64] (fpregset_t): Likewise. [__WORDSIZE != 64] (xrs_t): Define fields using __ctx. [__WORDSIZE != 64] (XRS_ID): Define only for [__USE_MISC]. [__WORDSIZE != 64] (mcontext_t): Define fields using __ctx. Rename field filler to __glibc_reserved1. * sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym (MC_FILLER): Remove.
		
			
				
	
	
		
			306 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (C) 1998-2017 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#ifndef _SYS_UCONTEXT_H
 | 
						|
#define _SYS_UCONTEXT_H	1
 | 
						|
 | 
						|
#include <features.h>
 | 
						|
 | 
						|
#include <bits/types/sigset_t.h>
 | 
						|
#include <bits/sigcontext.h>
 | 
						|
#include <bits/types/stack_t.h>
 | 
						|
 | 
						|
#include <bits/wordsize.h>
 | 
						|
 | 
						|
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define __ctx(fld) fld
 | 
						|
#else
 | 
						|
# define __ctx(fld) __ ## fld
 | 
						|
#endif
 | 
						|
 | 
						|
#if __WORDSIZE == 64
 | 
						|
 | 
						|
#define __MC_NGREG	19
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define MC_TSTATE	0
 | 
						|
# define MC_PC		1
 | 
						|
# define MC_NPC		2
 | 
						|
# define MC_Y		3
 | 
						|
# define MC_G1		4
 | 
						|
# define MC_G2		5
 | 
						|
# define MC_G3		6
 | 
						|
# define MC_G4		7
 | 
						|
# define MC_G5		8
 | 
						|
# define MC_G6		9
 | 
						|
# define MC_G7		10
 | 
						|
# define MC_O0		11
 | 
						|
# define MC_O1		12
 | 
						|
# define MC_O2		13
 | 
						|
# define MC_O3		14
 | 
						|
# define MC_O4		15
 | 
						|
# define MC_O5		16
 | 
						|
# define MC_O6		17
 | 
						|
# define MC_O7		18
 | 
						|
# define MC_NGREG	__MC_NGREG
 | 
						|
#endif
 | 
						|
 | 
						|
typedef unsigned long mc_greg_t;
 | 
						|
typedef mc_greg_t mc_gregset_t[__MC_NGREG];
 | 
						|
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define MC_MAXFPQ	16
 | 
						|
#endif
 | 
						|
struct __mc_fq {
 | 
						|
	unsigned long	*__ctx(mcfq_addr);
 | 
						|
	unsigned int	__ctx(mcfq_insn);
 | 
						|
};
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	union {
 | 
						|
		unsigned int	__ctx(sregs)[32];
 | 
						|
		unsigned long	__ctx(dregs)[32];
 | 
						|
		long double	__ctx(qregs)[16];
 | 
						|
	} __ctx(mcfpu_fregs);
 | 
						|
	unsigned long	__ctx(mcfpu_fsr);
 | 
						|
	unsigned long	__ctx(mcfpu_fprs);
 | 
						|
	unsigned long	__ctx(mcfpu_gsr);
 | 
						|
	struct __mc_fq	*__ctx(mcfpu_fq);
 | 
						|
	unsigned char	__ctx(mcfpu_qcnt);
 | 
						|
	unsigned char	__ctx(mcfpu_qentsz);
 | 
						|
	unsigned char	__ctx(mcfpu_enab);
 | 
						|
} mc_fpu_t;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	mc_gregset_t	__ctx(mc_gregs);
 | 
						|
	mc_greg_t	__ctx(mc_fp);
 | 
						|
	mc_greg_t	__ctx(mc_i7);
 | 
						|
	mc_fpu_t	__ctx(mc_fpregs);
 | 
						|
} mcontext_t;
 | 
						|
 | 
						|
typedef struct ucontext_t {
 | 
						|
	struct ucontext_t	*uc_link;
 | 
						|
	unsigned long		uc_flags;
 | 
						|
	unsigned long		__uc_sigmask;
 | 
						|
	mcontext_t		uc_mcontext;
 | 
						|
	stack_t			uc_stack;
 | 
						|
	sigset_t		uc_sigmask;
 | 
						|
} ucontext_t;
 | 
						|
 | 
						|
#endif /* __WORDISIZE == 64 */
 | 
						|
 | 
						|
/*
 | 
						|
 * Location of the users' stored registers relative to R0.
 | 
						|
 * Usage is as an index into a gregset_t array or as u.u_ar0[XX].
 | 
						|
 */
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define REG_PSR (0)
 | 
						|
# define REG_PC  (1)
 | 
						|
# define REG_nPC (2)
 | 
						|
# define REG_Y   (3)
 | 
						|
# define REG_G1  (4)
 | 
						|
# define REG_G2  (5)
 | 
						|
# define REG_G3  (6)
 | 
						|
# define REG_G4  (7)
 | 
						|
# define REG_G5  (8)
 | 
						|
# define REG_G6  (9)
 | 
						|
# define REG_G7  (10)
 | 
						|
# define REG_O0  (11)
 | 
						|
# define REG_O1  (12)
 | 
						|
# define REG_O2  (13)
 | 
						|
# define REG_O3  (14)
 | 
						|
# define REG_O4  (15)
 | 
						|
# define REG_O5  (16)
 | 
						|
# define REG_O6  (17)
 | 
						|
# define REG_O7  (18)
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * A gregset_t is defined as an array type for compatibility with the reference
 | 
						|
 * source. This is important due to differences in the way the C language
 | 
						|
 * treats arrays and structures as parameters.
 | 
						|
 *
 | 
						|
 * Note that NGREG is really (sizeof (struct regs) / sizeof (greg_t)),
 | 
						|
 * but that the ABI defines it absolutely to be 21 (resp. 19).
 | 
						|
 */
 | 
						|
 | 
						|
#if __WORDSIZE == 64
 | 
						|
 | 
						|
# define __NGREG   21
 | 
						|
# ifdef __USE_MISC
 | 
						|
#  define REG_ASI	(19)
 | 
						|
#  define REG_FPRS (20)
 | 
						|
 | 
						|
#  define NGREG   __NGREG
 | 
						|
# endif
 | 
						|
typedef long greg_t;
 | 
						|
 | 
						|
#else /* __WORDSIZE == 32 */
 | 
						|
 | 
						|
# define __NGREG   19
 | 
						|
# ifdef __USE_MISC
 | 
						|
#  define NGREG   __NGREG
 | 
						|
# endif
 | 
						|
typedef int greg_t;
 | 
						|
 | 
						|
#endif /* __WORDSIZE == 32 */
 | 
						|
 | 
						|
typedef greg_t  gregset_t[__NGREG];
 | 
						|
 | 
						|
/*
 | 
						|
 * The following structures define how a register window can appear on the
 | 
						|
 * stack. This structure is available (when required) through the `gwins'
 | 
						|
 * field of an mcontext (nested within ucontext). SPARC_MAXWINDOW is the
 | 
						|
 * maximum number of outstanding regiters window defined in the SPARC
 | 
						|
 * architecture (*not* implementation).
 | 
						|
 */
 | 
						|
# define __SPARC_MAXREGWINDOW	31	/* max windows in SPARC arch. */
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define SPARC_MAXREGWINDOW	__SPARC_MAXREGWINDOW
 | 
						|
#endif
 | 
						|
struct  __rwindow
 | 
						|
  {
 | 
						|
    greg_t __ctx(rw_local)[8];			/* locals */
 | 
						|
    greg_t __ctx(rw_in)[8];			/* ins */
 | 
						|
  };
 | 
						|
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define rw_fp   __ctx(rw_in)[6]		/* frame pointer */
 | 
						|
# define rw_rtn  __ctx(rw_in)[7]		/* return address */
 | 
						|
#endif
 | 
						|
 | 
						|
typedef struct
 | 
						|
  {
 | 
						|
    int            __ctx(wbcnt);
 | 
						|
    int           *__ctx(spbuf)[__SPARC_MAXREGWINDOW];
 | 
						|
    struct __rwindow __ctx(wbuf)[__SPARC_MAXREGWINDOW];
 | 
						|
  } gwindows_t;
 | 
						|
 | 
						|
/*
 | 
						|
 * Floating point definitions.
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define MAXFPQ	16	/* max # of fpu queue entries currently supported */
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
 * struct fq defines the minimal format of a floating point instruction queue
 | 
						|
 * entry. The size of entries in the floating point queue are implementation
 | 
						|
 * dependent. The union FQu is guarenteed to be the first field in any ABI
 | 
						|
 * conformant system implementation. Any additional fields provided by an
 | 
						|
 * implementation should not be used applications designed to be ABI conformant. */
 | 
						|
 | 
						|
struct __fpq
 | 
						|
  {
 | 
						|
    unsigned long *__ctx(fpq_addr);		/* address */
 | 
						|
    unsigned long __ctx(fpq_instr);		/* instruction */
 | 
						|
  };
 | 
						|
 | 
						|
struct __fq
 | 
						|
  {
 | 
						|
    union				/* FPU inst/addr queue */
 | 
						|
      {
 | 
						|
        double __ctx(whole);
 | 
						|
        struct __fpq __ctx(fpq);
 | 
						|
      } __ctx(FQu);
 | 
						|
  };
 | 
						|
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define FPU_REGS_TYPE           unsigned
 | 
						|
# define FPU_DREGS_TYPE          unsigned long long
 | 
						|
# define V7_FPU_FSR_TYPE         unsigned
 | 
						|
# define V9_FPU_FSR_TYPE         unsigned long long
 | 
						|
# define V9_FPU_FPRS_TYPE        unsigned
 | 
						|
#endif
 | 
						|
 | 
						|
#if __WORDSIZE == 64
 | 
						|
 | 
						|
typedef struct
 | 
						|
  {
 | 
						|
    union {				/* FPU floating point regs */
 | 
						|
      unsigned		__ctx(fpu_regs)[32];	/* 32 singles */
 | 
						|
      double            __ctx(fpu_dregs)[32];	/* 32 doubles */
 | 
						|
      long double	__ctx(fpu_qregs)[16];  /* 16 quads */
 | 
						|
    } __ctx(fpu_fr);
 | 
						|
    struct __fq     *__ctx(fpu_q);		/* ptr to array of FQ entries */
 | 
						|
    unsigned long   __ctx(fpu_fsr);		/* FPU status register */
 | 
						|
    unsigned char   __ctx(fpu_qcnt);		/* # of entries in saved FQ */
 | 
						|
    unsigned char   __ctx(fpu_q_entrysize);	/* # of bytes per FQ entry */
 | 
						|
    unsigned char   __ctx(fpu_en);		/* flag signifying fpu in use */
 | 
						|
  } fpregset_t;
 | 
						|
 | 
						|
#else /* __WORDSIZE == 32 */
 | 
						|
 | 
						|
typedef struct
 | 
						|
  {
 | 
						|
    union {				/* FPU floating point regs */
 | 
						|
      __extension__ unsigned long long __ctx(fpu_regs)[32];	/* 32 singles */
 | 
						|
      double             __ctx(fpu_dregs)[16];	/* 16 doubles */
 | 
						|
    } __ctx(fpu_fr);
 | 
						|
    struct __fq     *__ctx(fpu_q);		/* ptr to array of FQ entries */
 | 
						|
    unsigned        __ctx(fpu_fsr);		/* FPU status register */
 | 
						|
    unsigned char   __ctx(fpu_qcnt);		/* # of entries in saved FQ */
 | 
						|
    unsigned char   __ctx(fpu_q_entrysize);	/* # of bytes per FQ entry */
 | 
						|
    unsigned char   __ctx(fpu_en);		/* flag signifying fpu in use */
 | 
						|
  } fpregset_t;
 | 
						|
 | 
						|
/*
 | 
						|
 * The following structure is for associating extra register state with
 | 
						|
 * the ucontext structure and is kept within the uc_mcontext filler area.
 | 
						|
 *
 | 
						|
 * If (xrs_id == XRS_ID) then the xrs_ptr field is a valid pointer to
 | 
						|
 * extra register state. The exact format of the extra register state
 | 
						|
 * pointed to by xrs_ptr is platform-dependent.
 | 
						|
 *
 | 
						|
 * Note: a platform may or may not manage extra register state.
 | 
						|
 */
 | 
						|
typedef struct
 | 
						|
  {
 | 
						|
    unsigned int __ctx(xrs_id);		/* indicates xrs_ptr validity */
 | 
						|
    void *       __ctx(xrs_ptr);		/* ptr to extra reg state */
 | 
						|
  } xrs_t;
 | 
						|
 | 
						|
#ifdef __USE_MISC
 | 
						|
# define XRS_ID	0x78727300		/* the string "xrs" */
 | 
						|
#endif
 | 
						|
 | 
						|
typedef struct
 | 
						|
  {
 | 
						|
    gregset_t   __ctx(gregs);		/* general register set */
 | 
						|
    gwindows_t  *__ctx(gwins);		/* POSSIBLE pointer to register
 | 
						|
					   windows */
 | 
						|
    fpregset_t  __ctx(fpregs);		/* floating point register set */
 | 
						|
    xrs_t       __ctx(xrs);		/* POSSIBLE extra register state
 | 
						|
					   association */
 | 
						|
    long        __glibc_reserved1[19];
 | 
						|
  } mcontext_t;
 | 
						|
 | 
						|
 | 
						|
/* Userlevel context.  */
 | 
						|
typedef struct ucontext_t
 | 
						|
  {
 | 
						|
    unsigned long   uc_flags;
 | 
						|
    struct ucontext_t *uc_link;
 | 
						|
    sigset_t	    uc_sigmask;
 | 
						|
    stack_t         uc_stack;
 | 
						|
    mcontext_t      uc_mcontext;
 | 
						|
  } ucontext_t;
 | 
						|
 | 
						|
#endif /* __WORDSIZE == 32 */
 | 
						|
#endif /* sys/ucontext.h */
 |