nvidia machdep.c patch still useful ?

David Rhodus drhodus at machdep.com
Wed Apr 7 11:22:31 PDT 2004


On Apr 7, 2004, at 1:47 AM, Matthew Dillon wrote:

:Hrm.  What is the FS segment standardly used for, if anything?
:
:I'm familiar with Win32's use of it as a per-thread data area.  For
:example, "mov eax, fs:[0]" is a common instruction emitted by Win32
:compilers when setting up exception handlers.  This caused some 
problems
:with WINE when some (versions of) OSes would trash FS.

    %fs cannot be set to anything useful by userland, at least I don't
    think it can.  %gs can be set to a user-defined custom segment.
A lot of this is a problem from nvidia because their driver makes
use of the %gs register but without saving and restoring it. This
is because they are also using the %gs register to maintain their
internal thread state. Segment registers generally belong to the
operating system. I personally think we should not allow the
nvidia driver to use the %gs register, at least until they start doing
things a little better and save and restore the %gs inside their
driver. I know there are system which they can't grab the %gs
segment register on right now.
We are exporting the %fs register to userland using the same
method as %gs right now. So, yes, userland applications can
come along and muck with it. Examples of applications that
make use of the %fs register are WINE and OpenGL. One
somewhat particular item is you will have a time running an
OpenGL program inside WINE as one will end up self
corrupting the other by trashing the %fs register.
src/sys/i386/include/segments.h

    233 #define LSYS5CALLS_SEL  0       /* forced by intel BCS */
    234 #define LSYS5SIGR_SEL   1
    235 #define L43BSDCALLS_SEL 2       /* notyet */
    236 #define LUCODE_SEL      3
    237 #define LSOL26CALLS_SEL 4       /* Solaris >= 2.6 system call 
gate */
    238 #define LUDATA_SEL      5
    239 /* separate stack, es,fs,gs sels ? */
    240 /* #define      LPOSIXCALLS_SEL 5*/     /* notyet */
    241 #define LBSDICALLS_SEL  16      /* BSDI system call gate */
    242 #define NLDT            (LBSDICALLS_SEL + 1)

LUCODE_SEL is used by kernel to load _ucodesel to user %cs
LUDATA_SEL is used by kernel to load _udatasel to user %ds, %es, %fs, 
%gs.

-DR






More information about the Kernel mailing list