linux-mips
[Top] [All Lists]

Re: [patch] userspace mcontext_t doesn't match what kernel returns

To: Ryan Murray <rmurray@debian.org>, linux-mips@linux-mips.org, libc-alpha@sources.redhat.com
Subject: Re: [patch] userspace mcontext_t doesn't match what kernel returns
From: Ralf Baechle <ralf@linux-mips.org>
Date: Mon, 16 Sep 2002 01:08:57 +0200
In-reply-to: <20020915191613.GA21794@nevyn.them.org>; from dan@debian.org on Sun, Sep 15, 2002 at 03:16:13PM -0400
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20020911032832.GA1500@cyberhqz.com> <20020915210601.A24588@linux-mips.org> <20020915191613.GA21794@nevyn.them.org>
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.2.5.1i
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;

<Prev in Thread] Current Thread [Next in Thread>