This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: [patch] userspace mcontext_t doesn't match what kernel returns
On Sun, Sep 15, 2002 at 03:16:13PM -0400, Daniel Jacobowitz wrote:
> > I choose to fix the kernel instead which will keep as closer to the MIPS
> > ABI and also prevent having to recompile zillions of user apps. Below my
> > working version of <asm/ucontext.h>.
>
> What are the gregset_t/fpregset_t types in your working tree? There
> aren't any definitions of them in the only copy of the MIPS code that I
> have here, and they've had various bad definitions in glibc until
> recently. They also recently changed...
By the time I sent my previous mail I didn't yet have any. Below the
changes I've made to libc but the kernel changes are identical.
> [Although I think your kernel change is the right way to go, here.
> Just being cautious.]
I'm not yet finished. The libc definitions for gregset_t and fpregset_t
are not what they're expected to be (coincidentally I got a related bug
report just a few days ago, so that issue is also itching a bit ...) and
I'd like to change them to as below.
This is a binary incompatible change but since so far just one person has
complained about the non-matching definitions of struct ucontext, it seems
there are very few users of the affected data type?
/* Type for general register. */
typedef unsigned long int greg_t;
/* Number of general registers. */
#define NGREG 36
typedef greg_t gregset_t[NGREG];
/* Container for all FPU registers. */
typedef struct fpregset {
union {
double fp_dregs[16];
float fp_fregs[32];
unsigned int fp_regs[32];
} fp_r;
unsigned int fp_csr;
unsigned int fp_pad;
} fpregset_t;
/* Context to describe whole processor state. */
typedef struct
{
gregset_t gregs;
fpregset_t fpregs;
} mcontext_t;
/* Userlevel context. */
typedef struct ucontext
{
unsigned long int uc_flags;
struct ucontext *uc_link;
stack_t uc_stack;
mcontext_t uc_mcontext;
__sigset_t uc_sigmask;
} ucontext_t;