i386/84842: i386_set_ioperm(2) timing issue

John Baldwin jhb at FreeBSD.org
Tue Aug 16 18:20:22 GMT 2005


The following reply was made to PR i386/84842; it has been noted by GNATS.

From: John Baldwin <jhb at FreeBSD.org>
To: bug-followup at FreeBSD.org,
 arundel at h3c.de
Cc: bde at FreeBSD.org
Subject: Re: i386/84842: i386_set_ioperm(2) timing issue
Date: Tue, 16 Aug 2005 14:12:09 -0400

 What about replacing the setting of TDF_NEEDRESCHED() in i386_extend_pcb() 
 with a call to ltr()?  Actually, it takes more work than a ltr() as you have 
 to update the TSS descriptor in the GDT for the current CPU before you do the 
 ltr().  Maybe something like this:
 
 Index: i386/sys_machdep.c
 ===================================================================
 RCS file: /usr/cvs/src/sys/i386/i386/sys_machdep.c,v
 retrieving revision 1.102
 diff -u -r1.102 sys_machdep.c
 --- i386/sys_machdep.c	23 Jun 2005 21:56:45 -0000	1.102
 +++ i386/sys_machdep.c	16 Aug 2005 18:08:49 -0000
 @@ -267,9 +267,11 @@
  	KASSERT(td->td_pcb->pcb_ext == 0, ("already have a TSS!"));
  	mtx_lock_spin(&sched_lock);
  	td->td_pcb->pcb_ext = ext;
 -	
 -	/* switch to the new TSS after syscall completes */
 -	td->td_flags |= TDF_NEEDRESCHED;
 +
 +	/* Switch to the new TSS. */
 +	private_tss |= PCPU_GET(cpumask);
 +	*PCPU_GET(tss_gdt) = ext->ext_tssd;
 +	ltr(GSEL(GPROC0_SEL, SEL_KPL));
  	mtx_unlock_spin(&sched_lock);
  
  	return 0;
 Index: include/pcb_ext.h
 ===================================================================
 RCS file: /usr/cvs/src/sys/i386/include/pcb_ext.h,v
 retrieving revision 1.9
 diff -u -r1.9 pcb_ext.h
 --- include/pcb_ext.h	20 Mar 2002 05:48:58 -0000	1.9
 +++ include/pcb_ext.h	16 Aug 2005 18:10:11 -0000
 @@ -44,6 +44,7 @@
  };
  
  #ifdef _KERNEL
 +int private_tss;
  
  int i386_extend_pcb(struct thread *);
  
 
 -- 
 John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
 "Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-i386 mailing list