[PATCH 1/3] Mark certain internal functions, such as
Timothy Pearson
tpearson at raptorengineering.com
Tue Feb 26 04:03:59 CST 2019
wine_server_call(), as potentially crossing DLL module boundaries This is
needed to allow some systems, such as ppc64, to update module-specific
registers (TOC)
Signed-off-by: Timothy Pearson <tpearson at raptorengineering.com>
---
dlls/shell32/shell32_main.c | 2 +-
include/windef.h | 7 +++++++
include/wine/library.h | 18 +++++++++---------
include/wine/server.h | 2 +-
4 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c
index a791966031..71ebe218fb 100644
--- a/dlls/shell32/shell32_main.c
+++ b/dlls/shell32/shell32_main.c
@@ -810,7 +810,7 @@ static INT_PTR CALLBACK AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
{
ABOUT_INFO *info = (ABOUT_INFO *)lParam;
WCHAR template[512], buffer[512], version[64];
- extern const char *wine_get_build_id(void);
+ extern FARCALL const char *wine_get_build_id(void);
if (info)
{
diff --git a/include/windef.h b/include/windef.h
index f9a570d9cd..ea9f32b5a0 100644
--- a/include/windef.h
+++ b/include/windef.h
@@ -50,6 +50,13 @@ extern "C" {
# endif
#endif
+#if defined(__powerpc64__) && defined (__GNUC__)
+ /* ppc64 relies on long calls being generated for calls crossing DLL boundaries (r2 save / restore) */
+# define FARCALL __attribute__((__longcall__))
+#else
+# define FARCALL
+#endif
+
#ifndef __stdcall
# ifdef __i386__
# ifdef __GNUC__
diff --git a/include/wine/library.h b/include/wine/library.h
index 242bb69f17..3c09d89ac9 100644
--- a/include/wine/library.h
+++ b/include/wine/library.h
@@ -37,15 +37,15 @@ extern "C" {
/* configuration */
-extern const char *wine_get_build_dir(void);
-extern const char *wine_get_config_dir(void);
-extern const char *wine_get_data_dir(void);
-extern const char *wine_get_server_dir(void);
-extern const char *wine_get_user_name(void);
-extern const char *wine_get_version(void);
-extern const char *wine_get_build_id(void);
-extern void wine_init_argv0_path( const char *argv0 );
-extern void wine_exec_wine_binary( const char *name, char **argv, const char *env_var );
+extern FARCALL const char *wine_get_build_dir(void);
+extern FARCALL const char *wine_get_config_dir(void);
+extern FARCALL const char *wine_get_data_dir(void);
+extern FARCALL const char *wine_get_server_dir(void);
+extern FARCALL const char *wine_get_user_name(void);
+extern FARCALL const char *wine_get_version(void);
+extern FARCALL const char *wine_get_build_id(void);
+extern FARCALL void wine_init_argv0_path( const char *argv0 );
+extern FARCALL void wine_exec_wine_binary( const char *name, char **argv, const char *env_var );
/* dll loading */
diff --git a/include/wine/server.h b/include/wine/server.h
index d573d1f7ad..509f958a0d 100644
--- a/include/wine/server.h
+++ b/include/wine/server.h
@@ -49,7 +49,7 @@ struct __server_request_info
struct __server_iovec data[__SERVER_MAX_DATA]; /* request variable size data */
};
-extern unsigned int wine_server_call( void *req_ptr );
+extern unsigned int FARCALL wine_server_call( void *req_ptr );
extern void CDECL wine_server_send_fd( int fd );
extern int CDECL wine_server_fd_to_handle( int fd, unsigned int access, unsigned int attributes, HANDLE *handle );
extern int CDECL wine_server_handle_to_fd( HANDLE handle, unsigned int access, int *unix_fd, unsigned int *options );
--
2.20.1
More information about the wine-devel
mailing list