From owner-freebsd-hackers Wed Sep 19 23: 3:24 2001 Delivered-To: freebsd-hackers@freebsd.org Received: from peter3.wemm.org (c1315225-a.plstn1.sfba.home.com [24.14.150.180]) by hub.freebsd.org (Postfix) with ESMTP id 390CE37B41A; Wed, 19 Sep 2001 23:03:12 -0700 (PDT) Received: from overcee.netplex.com.au (overcee.wemm.org [10.0.0.3]) by peter3.wemm.org (8.11.0/8.11.0) with ESMTP id f8K63BM01403; Wed, 19 Sep 2001 23:03:11 -0700 (PDT) (envelope-from peter@wemm.org) Received: from wemm.org (localhost [127.0.0.1]) by overcee.netplex.com.au (Postfix) with ESMTP id C6E9B380A; Wed, 19 Sep 2001 23:03:11 -0700 (PDT) (envelope-from peter@wemm.org) X-Mailer: exmh version 2.3.1 01/18/2001 with nmh-1.0.4 To: "Andrew R. Reiter" Cc: Julian Elischer , John Baldwin , hackers@FreeBSD.ORG Subject: Re: JKH Project: x86: pcb_ext In-Reply-To: Date: Wed, 19 Sep 2001 23:03:11 -0700 From: Peter Wemm Message-Id: <20010920060311.C6E9B380A@overcee.netplex.com.au> Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG "Andrew R. Reiter" wrote: > On Wed, 19 Sep 2001, Julian Elischer wrote: > > :> > :> We still would need to sync LDT reloads.. > : > :that's more of a worry for me. > :Do we still have separate a LDT for threads? > : > > LDT is per process therefore, in the patch I made, I moved pcb_ldt out > of struct pcb and into mdproc (which is in struct proc). > > I've asked Peter to take a look at it and jhb, however, it is located at: > http://www.watson.org/~arr/fbsd-patches/ldt-2-mdproc.diff One comment: - cmpl $0, PCB_USERLDT(%edx) /* if there is one */ + movl TD_PROC(%ecx), %eax /* load struct proc from CURTHREAD */ + leal P_MD(%eax), %eax /* get mdproc from proc */ + cmpl $0, MD_LDT(%eax) /* if there is one */ This can be written as: movl TD_PROC(%ecx), %eax cmpl $0, P_MD+MD_LDT(%eax) This is evaluated at assemble time. And this change: movl %eax,PCPU(CURRENTLDT) /* store what we have */ jmp 2f -1: pushl %edx /* call a non-trusting routine */ +1: pushl %eax /* call a non-trusting routine */ call set_user_ldt /* to check and load the ldt */ - popl %edx + popl %eax 2: is not good.. you still need to save %edx since set_user_ldt is free to trash it (%edx is the secondary return value from a C function). eg: 0xc02e75c4 : mov 0x10(%ebx),%edx 0xc02e75c7 : mov %edx,(%eax,%ecx,1) 0xc02e75ca : mov 0x14(%ebx),%edx 0xc02e75cd : mov %edx,0x4(%eax,%ecx,1) The code after this in swtch.s depends on %edx being preserved. Cheers, -Peter -- Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au "All of this is for nothing if we don't go to the stars" - JMS/B5 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message