server: Store the type of CPU that the client is running on.

This commit is contained in:
Alexandre Julliard 2009-04-03 14:49:10 +02:00
parent b06a919c3c
commit 653d2c4a8d
8 changed files with 60 additions and 2 deletions

View File

@ -76,6 +76,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(server);
#define SOCKETNAME "socket" /* name of the socket file */
#define LOCKNAME "lock" /* name of the lock file */
#ifdef __i386__
static const enum cpu_type client_cpu = CPU_x86;
#elif defined(__x86_64__)
static const enum cpu_type client_cpu = CPU_x86_64;
#elif defined(__ALPHA__)
static const enum cpu_type client_cpu = CPU_ALPHA;
#elif defined(__powerpc__)
static const enum cpu_type client_cpu = CPU_POWERPC;
#elif defined(__sparc__)
static const enum cpu_type client_cpu = CPU_SPARC;
#else
#error Unsupported CPU
#endif
#ifndef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS
/* data structure used to pass an fd with sendmsg/recvmsg */
struct cmsg_fd
@ -1030,6 +1044,7 @@ size_t server_init_thread( void *entry_point )
req->reply_fd = reply_pipe[1];
req->wait_fd = ntdll_get_thread_data()->wait_fd[1];
req->debug_level = (TRACE_ON(server) != 0);
req->cpu = client_cpu;
ret = wine_server_call( req );
NtCurrentTeb()->ClientId.UniqueProcess = ULongToHandle(reply->pid);
NtCurrentTeb()->ClientId.UniqueThread = ULongToHandle(reply->tid);

View File

@ -128,6 +128,13 @@ typedef union
} debug_event_t;
enum cpu_type
{
CPU_x86, CPU_x86_64, CPU_ALPHA, CPU_POWERPC, CPU_SPARC
};
typedef int cpu_type_t;
struct send_fd
{
thread_id_t tid;
@ -567,6 +574,7 @@ struct init_thread_request
client_ptr_t entry;
int reply_fd;
int wait_fd;
cpu_type_t cpu;
};
struct init_thread_reply
{
@ -5214,6 +5222,6 @@ union generic_reply
struct set_window_layered_info_reply set_window_layered_info_reply;
};
#define SERVER_PROTOCOL_VERSION 382
#define SERVER_PROTOCOL_VERSION 383
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -58,6 +58,7 @@ struct process
process_id_t id; /* id of the process */
process_id_t group_id; /* group id of the process */
struct timeout_user *sigkill_timeout; /* timeout for final SIGKILL */
enum cpu_type cpu; /* client CPU type */
int unix_pid; /* Unix pid for final SIGKILL */
int exit_code; /* process exit code */
int running_threads; /* number of threads running in this process */

View File

@ -143,6 +143,13 @@ typedef union
} rip_info;
} debug_event_t;
/* supported CPU types */
enum cpu_type
{
CPU_x86, CPU_x86_64, CPU_ALPHA, CPU_POWERPC, CPU_SPARC
};
typedef int cpu_type_t;
/* structure used in sending an fd from client to server */
struct send_fd
{
@ -554,6 +561,7 @@ typedef union
client_ptr_t entry; /* entry point or PEB if initial thread (in thread address space) */
int reply_fd; /* fd for reply pipe */
int wait_fd; /* fd for blocking calls pipe */
cpu_type_t cpu; /* CPU that this thread is running on */
@REPLY
process_id_t pid; /* process id of the new thread's process */
thread_id_t tid; /* thread id of the new thread */

View File

@ -600,6 +600,7 @@ C_ASSERT( sizeof(atom_t) == 4 );
C_ASSERT( sizeof(char) == 1 );
C_ASSERT( sizeof(char_info_t) == 4 );
C_ASSERT( sizeof(client_ptr_t) == 8 );
C_ASSERT( sizeof(cpu_type_t) == 4 );
C_ASSERT( sizeof(data_size_t) == 4 );
C_ASSERT( sizeof(file_pos_t) == 8 );
C_ASSERT( sizeof(int) == 4 );
@ -663,6 +664,7 @@ C_ASSERT( FIELD_OFFSET(struct init_thread_request, teb) == 24 );
C_ASSERT( FIELD_OFFSET(struct init_thread_request, entry) == 32 );
C_ASSERT( FIELD_OFFSET(struct init_thread_request, reply_fd) == 40 );
C_ASSERT( FIELD_OFFSET(struct init_thread_request, wait_fd) == 44 );
C_ASSERT( FIELD_OFFSET(struct init_thread_request, cpu) == 48 );
C_ASSERT( FIELD_OFFSET(struct init_thread_reply, pid) == 8 );
C_ASSERT( FIELD_OFFSET(struct init_thread_reply, tid) == 12 );
C_ASSERT( FIELD_OFFSET(struct init_thread_reply, server_start) == 16 );

View File

@ -1045,10 +1045,16 @@ DECL_HANDLER(init_thread)
{
process->unix_pid = current->unix_pid;
process->peb = req->entry;
process->cpu = req->cpu;
reply->info_size = init_process( current );
}
else
{
if (req->cpu != process->cpu)
{
set_error( STATUS_INVALID_PARAMETER );
return;
}
if (process->unix_pid != current->unix_pid)
process->unix_pid = -1; /* can happen with linuxthreads */
if (current->suspend + process->suspend > 0) stop_thread( current );

View File

@ -105,6 +105,21 @@ static void dump_ioctl_code( const ioctl_code_t *code )
}
}
static void dump_cpu_type( const cpu_type_t *code )
{
switch (*code)
{
#define CASE(c) case CPU_##c: fputs( #c, stderr ); break
CASE(x86);
CASE(x86_64);
CASE(ALPHA);
CASE(POWERPC);
CASE(SPARC);
default: fprintf( stderr, "%u", *code ); break;
#undef CASE
}
}
static void dump_apc_call( const apc_call_t *call )
{
fputc( '{', stderr );
@ -991,7 +1006,9 @@ static void dump_init_thread_request( const struct init_thread_request *req )
dump_uint64( &req->entry );
fprintf( stderr, "," );
fprintf( stderr, " reply_fd=%d,", req->reply_fd );
fprintf( stderr, " wait_fd=%d", req->wait_fd );
fprintf( stderr, " wait_fd=%d,", req->wait_fd );
fprintf( stderr, " cpu=" );
dump_cpu_type( &req->cpu );
}
static void dump_init_thread_reply( const struct init_thread_reply *req )

View File

@ -50,6 +50,7 @@ my %formats =
"async_data_t" => [ 40, 8, "&dump_async_data" ],
"luid_t" => [ 8, 4, "&dump_luid" ],
"ioctl_code_t" => [ 4, 4, "&dump_ioctl_code" ],
"cpu_type_t" => [ 4, 4, "&dump_cpu_type" ],
);
my @requests = ();