[PATCH 1/3] ntdll: For Mac 64-bit, poke the TEB address to %gs:0x30 and re-enable the inlining of NtCurrentTeb().

Ken Thomases ken at codeweavers.com
Wed Jul 27 11:30:16 CDT 2016


On Jul 27, 2016, at 11:08 AM, Sebastian Lackner <sebastian at fds-team.de> wrote:
> 
> On 27.07.2016 17:42, Ken Thomases wrote:
>> 64-bit Windows apps have hard-coded accesses to %gs:0x30 baked into them.  They
>> need to find the TEB self pointer there.
>> 
>> Technically, the gsbase register and the memory it points to belong to the
>> pthread implementation on macOS.  It's used for the pthread TLS implementation.
>> However, study of the sources and experimentation reveal that TLS slot 6
>> (offset 0x30) is not currently used.  Furthermore, Apple has promised to not
>> use that slot in the future.  So, we hijack it for our purposes.
>> 
>> This removes the implementation of NtCurrentTeb() based on pthread_key_create()
>> and pthread_set/getspecific().
>> 
>> Signed-off-by: Ken Thomases <ken at codeweavers.com>
>> ---
>> dlls/ntdll/ntdll.spec      |  2 +-
>> dlls/ntdll/signal_x86_64.c | 34 +++-------------------------------
>> include/winnt.h            |  2 +-
>> 3 files changed, 5 insertions(+), 33 deletions(-)
> 
> Nice to hear that Apple agreed to keep that slot reserved. Would it make sense to
> keep the NtCurrentTeb export neverthless, for compatibility with libraries compiled
> against old Wine?

Hmm.  I don't know.  I hadn't considered it.  What sorts of libraries?  Did you have some use case in mind?  I guess I'd be surprised if there were such libraries around.

-Ken




More information about the wine-devel mailing list