Date: Wed, 13 Apr 2005 16:32:17 -0700 From: Peter Wemm <peter@overcee.wemm.org> To: Peter Wemm <peter@FreeBSD.org> Cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/i386/i386 genassym.c machdep.c mp_machdep.c swtch.s sys_machdep.c src/sys/i386/include pcb.h pcpu.h segments.h sysarch.h Message-ID: <20050413233217.GA21723@overcee.wemm.org> In-Reply-To: <200504132257.j3DMvHha095246@repoman.freebsd.org> References: <200504132257.j3DMvHha095246@repoman.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Apr 13, 2005 at 10:57:17PM +0000, Peter Wemm wrote: > peter 2005-04-13 22:57:17 UTC > > FreeBSD src repository > > Modified files: > sys/i386/i386 genassym.c machdep.c mp_machdep.c swtch.s > sys_machdep.c > sys/i386/include pcb.h pcpu.h segments.h sysarch.h > Log: > Change the segment limits to 4GB, we set the user accessible bit on all > of the kernel address space already. Intel recommend this anyway, because > using a non-4GB limit adds an additional clock cycle to address generation. > We were able to install 4GB segments into the LDT, so any limits we imposed > on %cs and %ds were academic anyway. More importantly, this allows us to > make a page in the kernel readable to user applications, for holding things > like the signal trampoline and other fun things. > > Move the user %cs/%ds segments from the LDT to the GDT. There was no good > reason for them to be there anyway. The old LDT entries are still there > but we can now relax the restriction that prevented users from emptying > the default LDT entries. > > Putting user and kernel %cs and %ds together allows us to access the fast > sysenter/sysexit/syscall/sysret instructions. syscall/sysret in particular > require that the user/kernel segments be laid out this way. Reserve a slot > specifically for NDIS while here. > > Create two user controllable slots in the GDT that are context switched > with the (kernel) thread. This allows user applications to set two > user privilige selectors to arbitary values. Create > i386_set_fsbase(void *base) and friends. (get/set, fs/gs). For i386, > %gs is used by tls and the thread libraries and this means that user > processes no longer have to have the cost of having a custom LDT, and > we will no longer to do a ldt switch when activating a kthread/ithread in > the usual case any more. > > In other words, we can now set the base address for %fs and %gs to arbitary > addresses without the pain of messing with ldt segments. Please note that I have not tested this with SMP yet, but I am 99.9% sure that it will work. I have a bunch of patches for userland that will use this stuff. It does fall back to the old ldt method if you boot a kernel.old, so it should be safe to commit these shortly. I have patches for ld.so, libc and libpthread. I have not tried libthr yet. -Peter
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050413233217.GA21723>