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>