diff options
-rw-r--r-- | ChangeLog | 81 | ||||
-rw-r--r-- | NEWS | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sys/ucontext.h | 267 |
4 files changed, 236 insertions, 121 deletions
@@ -1,3 +1,84 @@ +2017-06-29 Joseph Myers <joseph@codesourcery.com> + + [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. + 2017-06-29 Florian Weimer <fweimer@redhat.com> * stdio-common/tst-vfprintf-user-type.c (my_printf_function): @@ -99,8 +99,12 @@ Version 2.26 * On M68k GNU/Linux and MIPS GNU/Linux, the fpregset_t type no longer has the name struct fpregset. On Nios II GNU/Linux, the mcontext_t type no - longer has the name struct mcontext. This changes the C++ name mangling - for interfaces involving those types. + longer has the name struct mcontext. On SPARC GNU/Linux, the struct + mc_fq, struct rwindow, struct fpq and struct fq types are no longer + defined in sys/ucontext.h, the mc_fpu_t type no longer has the name struct + mc_fpu, the gwindows_t type no longer has the name struct gwindows and the + fpregset_t type no longer has the name struct fpu. This changes the C++ + name mangling for interfaces involving those types. * The synchronization that pthread_spin_unlock performs has been changed to now be equivalent to a C11 atomic store with release memory order to diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym index 544030c..8a7cb5a 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym @@ -16,7 +16,6 @@ MC_GREGS offsetof (mcontext_t, gregs) MC_GWINS offsetof (mcontext_t, gwins) MC_FPREGS offsetof (mcontext_t, fpregs) MC_XRS offsetof (mcontext_t, xrs) -MC_FILLER offsetof (mcontext_t, filler) GREG_PSR (REG_PSR * sizeof(greg_t)) GREG_PC (REG_PC * sizeof(greg_t)) GREG_NPC (REG_nPC * sizeof(greg_t)) diff --git a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h index dc0d316..9932ed4 100644 --- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h @@ -27,59 +27,69 @@ #include <bits/wordsize.h> +#ifdef __USE_MISC +# define __ctx(fld) fld +#else +# define __ctx(fld) __ ## fld +#endif + #if __WORDSIZE == 64 -#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 19 +#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]; - -#define MC_MAXFPQ 16 -struct mc_fq { - unsigned long *mcfq_addr; - unsigned int mcfq_insn; +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); }; -struct mc_fpu { +typedef struct { union { - unsigned int sregs[32]; - unsigned long dregs[32]; - long double qregs[16]; - } mcfpu_fregs; - unsigned long mcfpu_fsr; - unsigned long mcfpu_fprs; - unsigned long mcfpu_gsr; - struct mc_fq *mcfpu_fq; - unsigned char mcfpu_qcnt; - unsigned char mcfpu_qentsz; - unsigned char mcfpu_enab; -}; -typedef struct mc_fpu mc_fpu_t; + 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 mc_gregs; - mc_greg_t mc_fp; - mc_greg_t mc_i7; - mc_fpu_t mc_fpregs; + 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 { @@ -97,25 +107,27 @@ typedef struct ucontext_t { * 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]. */ -#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) +#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 @@ -128,20 +140,26 @@ typedef struct ucontext_t { #if __WORDSIZE == 64 -#define REG_ASI (19) -#define REG_FPRS (20) +# define __NGREG 21 +# ifdef __USE_MISC +# define REG_ASI (19) +# define REG_FPRS (20) -#define NGREG 21 +# define NGREG __NGREG +# endif typedef long greg_t; #else /* __WORDSIZE == 32 */ -#define NGREG 19 +# define __NGREG 19 +# ifdef __USE_MISC +# define NGREG __NGREG +# endif typedef int greg_t; #endif /* __WORDSIZE == 32 */ -typedef greg_t gregset_t[NGREG]; +typedef greg_t gregset_t[__NGREG]; /* * The following structures define how a register window can appear on the @@ -150,28 +168,35 @@ typedef greg_t gregset_t[NGREG]; * maximum number of outstanding regiters window defined in the SPARC * architecture (*not* implementation). */ -#define SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */ -struct rwindow +# define __SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */ +#ifdef __USE_MISC +# define SPARC_MAXREGWINDOW __SPARC_MAXREGWINDOW +#endif +struct __rwindow { - greg_t rw_local[8]; /* locals */ - greg_t rw_in[8]; /* ins */ + greg_t __ctx(rw_local)[8]; /* locals */ + greg_t __ctx(rw_in)[8]; /* ins */ }; -#define rw_fp rw_in[6] /* frame pointer */ -#define rw_rtn rw_in[7] /* return address */ +#ifdef __USE_MISC +# define rw_fp __ctx(rw_in)[6] /* frame pointer */ +# define rw_rtn __ctx(rw_in)[7] /* return address */ +#endif -typedef struct gwindows +typedef struct { - int wbcnt; - int *spbuf[SPARC_MAXREGWINDOW]; - struct rwindow wbuf[SPARC_MAXREGWINDOW]; + int __ctx(wbcnt); + int *__ctx(spbuf)[__SPARC_MAXREGWINDOW]; + struct __rwindow __ctx(wbuf)[__SPARC_MAXREGWINDOW]; } gwindows_t; /* * Floating point definitions. */ -#define MAXFPQ 16 /* max # of fpu queue entries currently supported */ +#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 @@ -180,56 +205,58 @@ typedef struct gwindows * conformant system implementation. Any additional fields provided by an * implementation should not be used applications designed to be ABI conformant. */ -struct fpq +struct __fpq { - unsigned long *fpq_addr; /* address */ - unsigned long fpq_instr; /* instruction */ + unsigned long *__ctx(fpq_addr); /* address */ + unsigned long __ctx(fpq_instr); /* instruction */ }; -struct fq +struct __fq { union /* FPU inst/addr queue */ { - double whole; - struct fpq fpq; - } FQu; + double __ctx(whole); + struct __fpq __ctx(fpq); + } __ctx(FQu); }; -#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 +#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 fpu +typedef struct { union { /* FPU floating point regs */ - unsigned fpu_regs[32]; /* 32 singles */ - double fpu_dregs[32]; /* 32 doubles */ - long double fpu_qregs[16]; /* 16 quads */ - } fpu_fr; - struct fq *fpu_q; /* ptr to array of FQ entries */ - unsigned long 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 */ + 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 fpu +typedef struct { union { /* FPU floating point regs */ - __extension__ unsigned long long 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 */ + __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; /* @@ -244,19 +271,23 @@ typedef struct fpu */ typedef struct { - unsigned int xrs_id; /* indicates xrs_ptr validity */ - void * xrs_ptr; /* ptr to extra reg state */ + unsigned int __ctx(xrs_id); /* indicates xrs_ptr validity */ + void * __ctx(xrs_ptr); /* ptr to extra reg state */ } xrs_t; -#define XRS_ID 0x78727300 /* the string "xrs" */ +#ifdef __USE_MISC +# define XRS_ID 0x78727300 /* the string "xrs" */ +#endif typedef struct { - gregset_t gregs; /* general register set */ - gwindows_t *gwins; /* POSSIBLE pointer to register windows */ - fpregset_t fpregs; /* floating point register set */ - xrs_t xrs; /* POSSIBLE extra register state association */ - long filler[19]; + 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; |