NVidia glx stuff dies in sysarch(I386_SET_LDT, ...)
Julian Elischer
julian at elischer.org
Fri Aug 1 15:17:18 PDT 2003
On Fri, 1 Aug 2003, Daniel Eischen wrote:
> On Fri, 1 Aug 2003, Thorsten Greiner wrote:
>
> > * Thorsten Greiner <thorsten.greiner at web.de> [2003-08-01 23:47]:
> > > I will test wether the problem still occurs with version 1.84 of
> > > sys_machdep.c and let you know.
> >
> > Yup, reverting to 1.84 unbreaks this for me. Looking at the changes
> > made it appears to me that the check
> >
> > if (uap->start < NLDT || uap->num <= 0)
> > return (EINVAL);i
> >
> > causes this, because NLDT is 6 and the NVidia stuff passes
> > uap->start == 6 to this call.
>
> It can't use 6. FreeBSD reserves 0-16 for its own use.
>
> I think the bug was in the old code allowing this to
> happen...
Looking at segments.h.....
/*
* Entries in the Local Descriptor Table (LDT)
*/
#define LSYS5CALLS_SEL 0 /* forced by intel BCS */
#define LSYS5SIGR_SEL 1
#define L43BSDCALLS_SEL 2 /* notyet */
#define LUCODE_SEL 3
#define LSOL26CALLS_SEL 4 /* Solaris >= 2.6 system call gate */
#define LUDATA_SEL 5
/* separate stack, es,fs,gs sels ? */
/* #define LPOSIXCALLS_SEL 5*/ /* notyet */
#define LBSDICALLS_SEL 16 /* BSDI system call gate */
#define NLDT (LBSDICALLS_SEL + 1)
it looks like NLDT should be save between from 6 to 15
(though I wish they'd chosen a different value)
so we could add:
if ((uap->start == LBSDICALLS_SEL) || (uap->start <= LUDATA_SEL)) ||
(uap->num <= 0))
...
What do you think?
>
> --
> Dan Eischen
>
>
More information about the freebsd-current
mailing list