[ 1832340 ] undefined reference to `_NtCurrentTeb'. git-svn-id: svn+ssh://svn.code.sf.net/p/mingw-w64/code/trunk@199 4407c894-4637-0410-b4f5-ada5f102cad1
diff --git a/mingw-w64-crt/ChangeLog b/mingw-w64-crt/ChangeLog index 90f02c6..1e31361 100755 --- a/mingw-w64-crt/ChangeLog +++ b/mingw-w64-crt/ChangeLog
@@ -1,3 +1,7 @@ +2007-11-15 Kai Tietz <kai.tietz@onevision.com> + + * misc/wininterlocked.c: Add NtCurrentTeb function. PR/1832340. + 2007-10-22 20-40 <20-40@annonymous> * crtexe.c: Add _pei386_runtime_relocator.
diff --git a/mingw-w64-crt/misc/wininterlocked.c b/mingw-w64-crt/misc/wininterlocked.c index 8e2aad2..377637d 100755 --- a/mingw-w64-crt/misc/wininterlocked.c +++ b/mingw-w64-crt/misc/wininterlocked.c
@@ -315,3 +315,80 @@ return Value; } #endif + +#ifdef _WIN64 +#if defined(__x86_64) + struct _TEB *NtCurrentTeb(VOID) + { + return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB,Self)); + } + + PVOID GetCurrentFiber(VOID) + { + return(PVOID)__readgsqword(FIELD_OFFSET(NT_TIB,FiberData)); + } + + PVOID GetFiberData(VOID) + { + return *(PVOID *)GetCurrentFiber(); + } + + BYTE __readgsbyte(DWORD Offset) + { + BYTE ret; + __asm__ volatile ("movb %%gs:%1,%0" + : "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + return ret; + } + WORD __readgsword(DWORD Offset) + { + WORD ret; + __asm__ volatile ("movw %%gs:%1,%0" + : "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + return ret; + } + + DWORD __readgsdword(DWORD Offset) + { + DWORD ret; + __asm__ volatile ("movl %%gs:%1,%0" + : "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + return ret; + } + DWORD64 __readgsqword(DWORD Offset) + { + void *ret; + __asm__ volatile ("movq %%gs:%1,%0" + : "=r" (ret) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + return (DWORD64) ret; + } + VOID __writegsbyte(DWORD Offset,BYTE Data) + { + __asm__ volatile ("movb %0,%%gs:%1" + : "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + } + VOID __writegsword(DWORD Offset,WORD Data) + { + __asm__ volatile ("movw %0,%%gs:%1" + : "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + } + VOID __writegsdword(DWORD Offset,DWORD Data) + { + __asm__ volatile ("movl %0,%%gs:%1" + : "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + } + VOID __writegsqword(DWORD Offset,DWORD64 Data) + { + __asm__ volatile ("movq %0,%%gs:%1" + : "=r" (Data) ,"=m" ((*(volatile long *) (DWORD64) Offset))); + } +#endif +#else + struct _TEB *NtCurrentTeb(void) + { + struct _TEB *ret; + __asm__ volatile ("movl %%fs:0x18,%0" + : "=r" (ret)); + return ret; + } +#endif