Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Aug 2003 20:10:46 -0400 (EDT)
From:      Daniel Eischen <eischen@vigrid.com>
To:        Julian Elischer <julian@elischer.org>
Cc:        Marcel Moolenaar <marcel@xcllnt.net>
Subject:   Re: NVidia glx stuff dies in sysarch(I386_SET_LDT, ...)
Message-ID:  <Pine.GSO.4.10.10308012007490.9928-100000@pcnet5.pcnet.com>
In-Reply-To: <Pine.BSF.4.21.0308011659270.46065-100000@InterJet.elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 1 Aug 2003, Julian Elischer wrote:
> 
> Here's my first patch..
> I'd suggest this (along with man page change) to go in first
> for a while before we break people's code.
> 
> cvs server: Diffing .
> Index: sys_machdep.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/i386/i386/sys_machdep.c,v
> retrieving revision 1.86
> diff -u -r1.86 sys_machdep.c
> --- sys_machdep.c       31 Jul 2003 08:20:24 -0000      1.86
> +++ sys_machdep.c       1 Aug 2003 23:58:29 -0000
> @@ -410,6 +410,9 @@
>         return(error);
>  }
>  
> +static int ldt_warnings;
> +#define NUM_LDT_WARNINGS 10
> +
>  static int
>  i386_set_ldt(td, args)
>         struct thread *td;
> @@ -441,7 +444,7 @@
>                         uap->start = NLDT;
>                         uap->num = MAX_LD - NLDT;
>                 }
> -               if (uap->start < NLDT || uap->num <= 0)
> +               if (uap->start <= LUDATA_SEL || uap->num <= 0)
>                         return (EINVAL);
>                 mtx_lock_spin(&sched_lock);
>                 pldt = mdp->md_ldt;
> @@ -460,10 +463,16 @@
>         }
>  
>         if (!(uap->start == 0 && uap->num == 1)) {
> +               /* complain a for a while if using old methods */
> +               if (ldt_warnings++ < NUM_LDT_WARNINGS) {
> +                       printf("Warning: pid %d used static ldt
> allocation.\n",
> +                           td->td_proc->p_pid);
> +                       printf("See the i386_set_ldt man page for more
> info\n");
> +               }
>                 /* verify range of descriptors to modify */
>                 largest_ld = uap->start + uap->num;
> -               if (uap->start < NLDT || uap->start >= MAX_LD ||
> uap->num < 0 ||
> -                   largest_ld > MAX_LD) {
> +               if (uap->start <= LUDATA_SEL || uap->start >= MAX_LD ||
> +                   uap->num < 0 || largest_ld > MAX_LD) {
>                         return (EINVAL);
>                 }
>         }
> @@ -562,7 +571,7 @@
>  again:
>                 mtx_lock_spin(&sched_lock);
>                 dp = &((union descriptor *)(pldt->ldt_base))[NLDT];
> -               for (i = NLDT; i < pldt->ldt_len; ++i) {
> +               for (i = LUDATA_SEL + 1; i < pldt->ldt_len; ++i) {

Looks OK, but if we are doing a dynamic allocation, it might be
better to start at NLDT just to avoid the known problem of someone
using 6...  Just a thought.

-- 
Dan Eischen



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.10.10308012007490.9928-100000>