Skip to content
Snippets Groups Projects
Commit 59008670 authored by Alexandre Julliard's avatar Alexandre Julliard
Browse files

Moved the selector access functions out of winnt.h into libwine.

parent ff8a62d8
No related branches found
No related tags found
No related merge requests found
......@@ -28,6 +28,7 @@
#include "winbase.h"
#include "wine/winbase16.h"
#include "wine/library.h"
#include "file.h"
#include "global.h"
#include "miscemu.h"
......@@ -66,8 +67,8 @@ static BOOL process_attach(void)
NE_SetEntryPoint( hModule, 178, GetWinFlags16() );
/* Initialize KERNEL.454/455 (__FLATCS/__FLATDS) */
NE_SetEntryPoint( hModule, 454, __get_cs() );
NE_SetEntryPoint( hModule, 455, __get_ds() );
NE_SetEntryPoint( hModule, 454, wine_get_cs() );
NE_SetEntryPoint( hModule, 455, wine_get_ds() );
/* Initialize KERNEL.THHOOK */
TASK_InstallTHHook(MapSL((SEGPTR)GetProcAddress16( hModule, (LPCSTR)332 )));
......
......@@ -30,6 +30,7 @@
#include "wine/winbase16.h"
#include "wine/debug.h"
#include "wine/library.h"
#include "flatthunk.h"
#include "heap.h"
#include "module.h"
......@@ -1049,7 +1050,7 @@ FreeSLCallback(
*/
void WINAPI GetTEBSelectorFS16(void)
{
CURRENT_STACK16->fs = __get_fs();
CURRENT_STACK16->fs = wine_get_fs();
}
/**********************************************************************
......@@ -1295,8 +1296,8 @@ UINT WINAPI ThunkConnect16(
void WINAPI C16ThkSL(CONTEXT86 *context)
{
LPBYTE stub = MapSL(context->Eax), x = stub;
WORD cs = __get_cs();
WORD ds = __get_ds();
WORD cs = wine_get_cs();
WORD ds = wine_get_ds();
/* We produce the following code:
*
......@@ -1347,7 +1348,7 @@ void WINAPI C16ThkSL01(CONTEXT86 *context)
struct ThunkDataSL *td = SL16->fpData;
DWORD procAddress = (DWORD)GetProcAddress16(GetModuleHandle16("KERNEL"), (LPCSTR)631);
WORD cs = __get_cs();
WORD cs = wine_get_cs();
if (!td)
{
......@@ -1913,7 +1914,7 @@ SEGPTR WINAPI Get16DLLAddress(HMODULE handle, LPSTR func_name)
*thunk++ = 0xea;
*(FARPROC *)thunk = GetProcAddress(GetModuleHandleA("KERNEL32"),"QT_Thunk");
thunk += sizeof(FARPROC16);
*(WORD *)thunk = __get_cs();
*(WORD *)thunk = wine_get_cs();
return MAKESEGPTR( code_sel32, (char *)thunk - (char *)ThunkletHeap );
}
......
......@@ -27,6 +27,7 @@
#include <sys/types.h>
#include "winerror.h"
#include "ntddk.h"
#include "wine/library.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
......@@ -119,12 +120,12 @@ NTSTATUS WINAPI RtlpWaitForCriticalSection( RTL_CRITICAL_SECTION *crit )
const char *name = (char *)crit->DebugInfo;
if (!name || IsBadStringPtrA(name,80)) name = "?";
ERR( "section %p %s wait timed out, retrying (60 sec) fs=%04x\n",
crit, debugstr_a(name), __get_fs() );
crit, debugstr_a(name), wine_get_fs() );
res = WaitForSingleObject( sem, 60000L );
if ( res == WAIT_TIMEOUT && TRACE_ON(relay) )
{
ERR( "section %p %s wait timed out, retrying (5 min) fs=%04x\n",
crit, debugstr_a(name), __get_fs() );
crit, debugstr_a(name), wine_get_fs() );
res = WaitForSingleObject( sem, 300000L );
}
}
......
......@@ -50,6 +50,7 @@
#include "ntddk.h"
#include "winnt.h"
#include "wine/library.h"
#include "selectors.h"
......@@ -491,7 +492,7 @@ static void save_context( CONTEXT *context, const SIGCONTEXT *sigcontext )
#ifdef FS_sig
fs = FS_sig(sigcontext);
#else
fs = __get_fs();
fs = wine_get_fs();
#endif
context->SegFs = fs;
......@@ -507,7 +508,7 @@ static void save_context( CONTEXT *context, const SIGCONTEXT *sigcontext )
fs = *(unsigned int *)ESP_sig(sigcontext);
if (EAX_sig(sigcontext) == VM86_EAX) {
struct vm86plus_struct *vm86;
__set_fs(fs);
wine_set_fs(fs);
/* retrieve pointer to vm86plus struct that was stored in vm86_enter
* (but we could also get if from teb->vm86_ptr) */
vm86 = *(struct vm86plus_struct **)(ESP_sig(sigcontext) + sizeof(int));
......@@ -518,7 +519,7 @@ static void save_context( CONTEXT *context, const SIGCONTEXT *sigcontext )
}
#endif /* __HAVE_VM86 */
__set_fs(fs);
wine_set_fs(fs);
context->Eax = EAX_sig(sigcontext);
context->Ebx = EBX_sig(sigcontext);
......@@ -537,7 +538,7 @@ static void save_context( CONTEXT *context, const SIGCONTEXT *sigcontext )
#ifdef GS_sig
context->SegGs = LOWORD(GS_sig(sigcontext));
#else
context->SegGs = __get_gs();
context->SegGs = wine_get_gs();
#endif
}
......@@ -580,12 +581,12 @@ static void restore_context( const CONTEXT *context, SIGCONTEXT *sigcontext )
#ifdef FS_sig
FS_sig(sigcontext) = context->SegFs;
#else
__set_fs( context->SegFs );
wine_set_fs( context->SegFs );
#endif
#ifdef GS_sig
GS_sig(sigcontext) = context->SegGs;
#else
__set_gs( context->SegGs );
wine_set_gs( context->SegGs );
#endif
}
......
......@@ -30,6 +30,7 @@
#include "module.h"
#include "miscemu.h"
#include "stackframe.h"
#include "wine/library.h"
#include "wine/debug.h"
#include "toolhelp.h"
......@@ -58,10 +59,10 @@ inline static void patch_code_segment( void *code_segment )
{
#ifdef __i386__
CALLFROM16 *call = code_segment;
if (call->flatcs == __get_cs()) return; /* nothing to patch */
if (call->flatcs == wine_get_cs()) return; /* nothing to patch */
while (call->pushl == 0x68)
{
call->flatcs = __get_cs();
call->flatcs = wine_get_cs();
call++;
}
#endif
......
......@@ -29,6 +29,7 @@
#include "selectors.h"
#include "builtin16.h"
#include "syslevel.h"
#include "wine/library.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(relay);
......@@ -59,7 +60,7 @@ BOOL RELAY_Init(void)
/* Patch the return addresses for CallTo16 routines */
CallTo16_DataSelector = __get_ds();
CallTo16_DataSelector = wine_get_ds();
CallTo16_RetAddr =
MAKESEGPTR( codesel, (char*)CallTo16_Ret - (char*)Call16_Ret_Start );
CALL32_CBClient_RetAddr =
......
......@@ -113,7 +113,7 @@ SNOOP16_RegisterDLL(NE_MODULE *pModule,LPCSTR name) {
snr[0].realfun = (DWORD)SNOOP16_Entry;
snr[0].lcall = 0x9a;
snr[0].callfromregs = (DWORD)__wine_call_from_16_regs;
snr[0].seg = __get_cs();
snr[0].seg = wine_get_cs();
snr[0].lret = 0xcb66;
snr[1].pushbp = 0x5566;
......@@ -123,7 +123,7 @@ SNOOP16_RegisterDLL(NE_MODULE *pModule,LPCSTR name) {
snr[1].realfun = (DWORD)SNOOP16_Return;
snr[1].lcall = 0x9a;
snr[1].callfromregs = (DWORD)__wine_call_from_16_regs;
snr[1].seg = __get_cs();
snr[1].seg = wine_get_cs();
snr[1].lret = 0xcb66;
}
while (*dll) {
......
......@@ -110,4 +110,39 @@ inline static unsigned char wine_ldt_get_flags( const LDT_ENTRY *ent )
return ret;
}
/* segment register access */
#ifdef __i386__
# ifdef __GNUC__
# define __DEFINE_GET_SEG(seg) \
extern inline unsigned short wine_get_##seg(void) \
{ unsigned short res; __asm__("movw %%" #seg ",%w0" : "=r"(res)); return res; }
# define __DEFINE_SET_SEG(seg) \
extern inline void wine_set_##seg(int val) { __asm__("movw %w0,%%" #seg : : "r" (val)); }
# elif defined(_MSC_VER)
# define __DEFINE_GET_SEG(seg) \
extern inline unsigned short wine_get_##seg(void) \
{ unsigned short res; __asm { mov res, seg } return res; }
# define __DEFINE_SET_SEG(seg) \
extern inline void wine_set_##seg(unsigned short val) { __asm { mov seg, val } }
# else /* __GNUC__ || _MSC_VER */
# define __DEFINE_GET_SEG(seg) extern unsigned short wine_get_##seg(void);
# define __DEFINE_SET_SEG(seg) extern void wine_set_##seg(unsigned int);
# endif /* __GNUC__ || _MSC_VER */
#else /* __i386__ */
# define __DEFINE_GET_SEG(seg) inline static unsigned short wine_get_##seg(void) { return 0; }
# define __DEFINE_SET_SEG(seg) inline static void wine_set_##seg(int val) { /* nothing */ }
#endif /* __i386__ */
__DEFINE_GET_SEG(cs)
__DEFINE_GET_SEG(ds)
__DEFINE_GET_SEG(es)
__DEFINE_GET_SEG(fs)
__DEFINE_GET_SEG(gs)
__DEFINE_GET_SEG(ss)
__DEFINE_SET_SEG(fs)
__DEFINE_SET_SEG(gs)
#undef __DEFINE_GET_SEG
#undef __DEFINE_SET_SEG
#endif /* __WINE_WINE_LIBRARY_H */
......@@ -1233,40 +1233,6 @@ typedef CONTEXT *PCONTEXT;
# endif
#endif /* __GNUC__ */
/* Segment register access */
#ifdef __i386__
# ifdef __GNUC__
# define __DEFINE_GET_SEG(seg) \
extern inline unsigned short __get_##seg(void) \
{ unsigned short res; __asm__("movw %%" #seg ",%w0" : "=r"(res)); return res; }
# define __DEFINE_SET_SEG(seg) \
extern inline void __set_##seg(int val) { __asm__("movw %w0,%%" #seg : : "r" (val)); }
# elif defined(_MSC_VER)
# define __DEFINE_GET_SEG(seg) \
extern inline unsigned short __get_##seg(void) { unsigned short res; __asm { mov res, seg } return res; }
# define __DEFINE_SET_SEG(seg) \
extern inline void __set_##seg(unsigned short val) { __asm { mov seg, val } }
# else /* __GNUC__ || _MSC_VER */
# define __DEFINE_GET_SEG(seg) extern unsigned short __get_##seg(void);
# define __DEFINE_SET_SEG(seg) extern void __set_##seg(unsigned int);
# endif /* __GNUC__ || _MSC_VER */
#else /* __i386__ */
# define __DEFINE_GET_SEG(seg) inline static unsigned short __get_##seg(void) { return 0; }
# define __DEFINE_SET_SEG(seg) /* nothing */
#endif /* __i386__ */
__DEFINE_GET_SEG(cs)
__DEFINE_GET_SEG(ds)
__DEFINE_GET_SEG(es)
__DEFINE_GET_SEG(fs)
__DEFINE_GET_SEG(gs)
__DEFINE_GET_SEG(ss)
__DEFINE_SET_SEG(fs)
__DEFINE_SET_SEG(gs)
#undef __DEFINE_GET_SEG
#undef __DEFINE_SET_SEG
#endif /* __WINE__ */
......
......@@ -20,6 +20,7 @@
*/
#include "config.h"
#include "wine/port.h"
#include <stdlib.h>
#include <stdio.h>
......@@ -186,3 +187,21 @@ int wine_ldt_set_entry( unsigned short sel, const LDT_ENTRY *entry )
}
return ret;
}
/***********************************************************************
* selector access functions
*/
#ifdef __i386__
# ifndef _MSC_VER
/* Nothing needs to be done for MS C, it will do with inline versions from the winnt.h */
__ASM_GLOBAL_FUNC( wine_get_cs, "movw %cs,%ax\n\tret" )
__ASM_GLOBAL_FUNC( wine_get_ds, "movw %ds,%ax\n\tret" )
__ASM_GLOBAL_FUNC( wine_get_es, "movw %es,%ax\n\tret" )
__ASM_GLOBAL_FUNC( wine_get_fs, "movw %fs,%ax\n\tret" )
__ASM_GLOBAL_FUNC( wine_get_gs, "movw %gs,%ax\n\tret" )
__ASM_GLOBAL_FUNC( wine_get_ss, "movw %ss,%ax\n\tret" )
__ASM_GLOBAL_FUNC( wine_set_fs, "movl 4(%esp),%eax\n\tmovw %ax,%fs\n\tret" )
__ASM_GLOBAL_FUNC( wine_set_gs, "movl 4(%esp),%eax\n\tmovw %ax,%gs\n\tret" )
# endif /* defined(_MSC_VER) */
#endif /* defined(__i386__) */
......@@ -119,12 +119,12 @@ WORD WINAPI FreeSelector16( WORD sel )
#ifdef __i386__
/* Check if we are freeing current %fs or %gs selector */
if (!((__get_fs() ^ sel) & ~7))
if (!((wine_get_fs() ^ sel) & ~7))
{
WARN("Freeing %%fs selector (%04x), not good.\n", __get_fs() );
__set_fs( 0 );
WARN("Freeing %%fs selector (%04x), not good.\n", wine_get_fs() );
wine_set_fs( 0 );
}
if (!((__get_gs() ^ sel) & ~7)) __set_gs( 0 );
if (!((wine_get_gs() ^ sel) & ~7)) wine_set_gs( 0 );
#endif /* __i386__ */
wine_ldt_set_entry( sel, &null_entry );
......@@ -140,11 +140,11 @@ WORD WINAPI FreeSelector16( WORD sel )
*/
void SELECTOR_FreeFs(void)
{
WORD fs = __get_fs();
WORD fs = wine_get_fs();
if (fs)
{
wine_ldt_copy.flags[fs >> __AHSHIFT] &= ~WINE_LDT_FLAGS_ALLOCATED;
__set_fs(0);
wine_set_fs(0);
wine_ldt_set_entry( fs, &null_entry );
}
}
......@@ -688,9 +688,9 @@ BOOL WINAPI GetThreadSelectorEntry( HANDLE hthread, DWORD sel, LPLDT_ENTRY ldten
ldtent->HighWord.Bits.Default_Big = 1;
ldtent->HighWord.Bits.Type = 0x12;
/* it has to be one of the system GDT selectors */
if (sel == (__get_ds() & ~3)) return TRUE;
if (sel == (__get_ss() & ~3)) return TRUE;
if (sel == (__get_cs() & ~3))
if (sel == (wine_get_ds() & ~3)) return TRUE;
if (sel == (wine_get_ss() & ~3)) return TRUE;
if (sel == (wine_get_cs() & ~3))
{
ldtent->HighWord.Bits.Type |= 8; /* code segment */
return TRUE;
......@@ -936,28 +936,3 @@ void WINAPI FreeMappedBuffer( CONTEXT86 *context )
GlobalFree(buffer[0]);
}
}
#ifdef __i386__
#ifdef _MSC_VER
/* Nothing needs to be done. MS C make do with inline versions from the winnt.h */
#else /* defined(_MSC_VER) */
#define __DEFINE_GET_SEG(seg) \
__ASM_GLOBAL_FUNC( __get_##seg, "movw %" #seg ",%ax\n\tret" )
#define __DEFINE_SET_SEG(seg) \
__ASM_GLOBAL_FUNC( __set_##seg, "movl 4(%esp),%eax\n\tmovw %ax,%" #seg "\n\tret" )
__DEFINE_GET_SEG(cs)
__DEFINE_GET_SEG(ds)
__DEFINE_GET_SEG(es)
__DEFINE_GET_SEG(fs)
__DEFINE_GET_SEG(gs)
__DEFINE_GET_SEG(ss)
__DEFINE_SET_SEG(fs)
__DEFINE_SET_SEG(gs)
#undef __DEFINE_GET_SEG
#undef __DEFINE_SET_SEG
#endif /* defined(_MSC_VER) */
#endif /* defined(__i386__) */
......@@ -43,6 +43,7 @@
#include "winbase.h"
#include "wine/winbase16.h"
#include "wine/exception.h"
#include "wine/library.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(thread);
......@@ -84,7 +85,7 @@ void SYSDEPS_SetCurThread( TEB *teb )
{
#if defined(__i386__)
/* On the i386, the current thread is in the %fs register */
__set_fs( teb->teb_sel );
wine_set_fs( teb->teb_sel );
#elif defined(HAVE__LWP_CREATE)
/* On non-i386 Solaris, we use the LWP private pointer */
_lwp_setprivate( teb );
......
......@@ -23,6 +23,7 @@
#include "ntddk.h"
#include "syslevel.h"
#include "stackframe.h"
#include "wine/library.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(win32);
......@@ -99,7 +100,7 @@ VOID WINAPI _EnterSysLevel(SYSLEVEL *lock)
teb->sys_count[lock->level] );
if (lock == &Win16Mutex)
SYSLEVEL_Win16CurrentTeb = __get_fs();
SYSLEVEL_Win16CurrentTeb = wine_get_fs();
}
/************************************************************************
......
......@@ -29,21 +29,13 @@
#include <ctype.h>
#include "wine/exception.h"
#include "wine/library.h"
#include "builtin16.h"
#include "module.h"
#include "stackframe.h"
#include "build.h"
#ifdef __i386__
#ifdef _MSC_VER
extern unsigned short __get_cs(void) { unsigned short res; __asm { mov res, cs } return res; }
#else
extern unsigned short __get_cs(void);
__ASM_GLOBAL_FUNC( __get_cs, "movw %cs,%ax\n\tret" );
#endif /* defined(_MSC_VER) */
#endif /* defined(__i386__) */
/*******************************************************************
* output_file_header
......@@ -631,7 +623,7 @@ void BuildSpec16File( FILE *outfile )
int code_offset, data_offset, module_size, res_size;
unsigned char *data;
#ifdef __i386__
unsigned short code_selector = __get_cs();
unsigned short code_selector = wine_get_cs();
#endif
/* File header */
......
......@@ -43,6 +43,7 @@
#include "wingdi.h"
#include "winuser.h"
#include "wine/exception.h"
#include "wine/library.h"
#include "thread.h"
#include "stackframe.h"
#include "wine/server.h"
......@@ -148,7 +149,7 @@ static int format_exception_msg( const EXCEPTION_POINTERS *ptr, char *buffer, in
if ((len<0) || (len>=size))
return -1;
#ifdef __i386__
if (ptr->ContextRecord->SegCs != __get_cs())
if (ptr->ContextRecord->SegCs != wine_get_cs())
len2 = snprintf(buffer+len, size-len,
" at address 0x%04lx:0x%08lx.\nDo you wish to debug it ?",
ptr->ContextRecord->SegCs,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment