"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 <set_user_ldt+36>: mov 0x10(%ebx),%edx
0xc02e75c7 <set_user_ldt+39>: mov %edx,(%eax,%ecx,1)
0xc02e75ca <set_user_ldt+42>: mov 0x14(%ebx),%edx
0xc02e75cd <set_user_ldt+45>: mov %edx,0x4(%eax,%ecx,1)
The code after this in swtch.s depends on %edx being preserved.
Cheers,
-Peter
--
Peter Wemm - [EMAIL PROTECTED]; [EMAIL PROTECTED]; [EMAIL PROTECTED]
"All of this is for nothing if we don't go to the stars" - JMS/B5
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message