From owner-freebsd-emulation Sat Feb 5 6:19: 3 2000 Delivered-To: freebsd-emulation@freebsd.org Received: from blaubaer.kn-bremen.de (blaubaer.kn-bremen.de [195.37.179.254]) by builder.freebsd.org (Postfix) with ESMTP id 043234577 for ; Sat, 5 Feb 2000 06:18:54 -0800 (PST) Received: from saturn.kn-bremen.de (uucp@localhost) by blaubaer.kn-bremen.de (8.9.1/8.9.1) with UUCP id PAA14506; Sat, 5 Feb 2000 15:14:18 +0100 Received: (from nox@localhost) by saturn.kn-bremen.de (8.9.3/8.8.5) id PAA19881; Sat, 5 Feb 2000 15:02:10 +0100 (CET) From: Juergen Lock Date: Sat, 5 Feb 2000 15:02:10 +0100 To: wine-patches@winehq.com, FreeBSD-emulation@FreeBSD.ORG, alex@big.endian.de Subject: get wine working again on FreeBSD Message-ID: <20000205150209.A18658@saturn.kn-bremen.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 0.95.7i Sender: owner-freebsd-emulation@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org Changelog: * server/context_i386.c: Juergen Lock context functions for FreeBSD * server/request.c, scheduler/client.c: Juergen Lock don't pass bogus lengths to bind/connect so the socket doesn't end up being called "socke" Index: server/context_i386.c =================================================================== RCS file: /home/wine/wine/server/context_i386.c,v retrieving revision 1.5 diff -u -u -r1.5 context_i386.c --- server/context_i386.c 2000/01/30 22:22:23 1.5 +++ server/context_i386.c 2000/02/05 13:28:46 @@ -13,9 +13,10 @@ #ifdef HAVE_SYS_REG_H #include #endif +#include #include +#include #include -#include #include "winbase.h" @@ -35,6 +36,12 @@ #ifndef PTRACE_GETFPREGS #define PTRACE_GETFPREGS PT_GETFPREGS #endif +#ifndef PTRACE_SETREGS +#define PTRACE_SETREGS PT_SETREGS +#endif +#ifndef PTRACE_SETFPREGS +#define PTRACE_SETFPREGS PT_SETFPREGS +#endif #ifdef linux @@ -287,10 +294,118 @@ error: file_set_error(); } + +#elif defined(__FreeBSD__) +#include + +/* retrieve a thread context */ +static void get_thread_context( struct thread *thread, unsigned int flags, CONTEXT *context ) +{ + int pid = thread->unix_pid; + if (flags & CONTEXT_FULL) + { + struct reg regs; + if (ptrace( PTRACE_GETREGS, pid, 0, (int) ®s ) == -1) goto error; + if (flags & CONTEXT_INTEGER) + { + context->Eax = regs.r_eax; + context->Ebx = regs.r_ebx; + context->Ecx = regs.r_ecx; + context->Edx = regs.r_edx; + context->Esi = regs.r_esi; + context->Edi = regs.r_edi; + } + if (flags & CONTEXT_CONTROL) + { + context->Ebp = regs.r_ebp; + context->Esp = regs.r_esp; + context->Eip = regs.r_eip; + context->SegCs = regs.r_cs & 0xffff; + context->SegSs = regs.r_ss & 0xffff; + context->EFlags = regs.r_eflags; + } + if (flags & CONTEXT_SEGMENTS) + { + context->SegDs = regs.r_ds & 0xffff; + context->SegEs = regs.r_es & 0xffff; + context->SegFs = regs.r_fs & 0xffff; + context->SegGs = regs.r_gs & 0xffff; + } + } + if (flags & CONTEXT_DEBUG_REGISTERS) + { + /* FIXME: How is this done on FreeBSD? */ + } + if (flags & CONTEXT_FLOATING_POINT) + { + /* we can use context->FloatSave directly as it is using the */ + /* correct structure (the same as fsave/frstor) */ + if (ptrace( PTRACE_GETFPREGS, pid, 0, (int) &context->FloatSave ) == -1) goto error; + context->FloatSave.Cr0NpxState = 0; /* FIXME */ + } + return; + error: + file_set_error(); +} + + +/* set a thread context */ +static void set_thread_context( struct thread *thread, unsigned int flags, CONTEXT *context ) +{ + int pid = thread->unix_pid; + if (flags & CONTEXT_FULL) + { + struct reg regs; + if ((flags & CONTEXT_FULL) != CONTEXT_FULL) /* need to preserve some registers */ + { + if (ptrace( PTRACE_GETREGS, pid, 0, (int) ®s ) == -1) goto error; + } + if (flags & CONTEXT_INTEGER) + { + regs.r_eax = context->Eax; + regs.r_ebx = context->Ebx; + regs.r_ecx = context->Ecx; + regs.r_edx = context->Edx; + regs.r_esi = context->Esi; + regs.r_edi = context->Edi; + } + if (flags & CONTEXT_CONTROL) + { + regs.r_ebp = context->Ebp; + regs.r_esp = context->Esp; + regs.r_eip = context->Eip; + regs.r_cs = context->SegCs; + regs.r_ss = context->SegSs; + regs.r_eflags = context->EFlags; + } + if (flags & CONTEXT_SEGMENTS) + { + regs.r_ds = context->SegDs; + regs.r_es = context->SegEs; + regs.r_fs = context->SegFs; + regs.r_gs = context->SegGs; + } + if (ptrace( PTRACE_SETREGS, pid, 0, (int) ®s ) == -1) goto error; + } + if (flags & CONTEXT_DEBUG_REGISTERS) + { + /* FIXME: How is this done on FreeBSD? */ + } + if (flags & CONTEXT_FLOATING_POINT) + { + /* we can use context->FloatSave directly as it is using the */ + /* correct structure (the same as fsave/frstor) */ + if (ptrace( PTRACE_SETFPREGS, pid, 0, (int) &context->FloatSave ) == -1) goto error; + context->FloatSave.Cr0NpxState = 0; /* FIXME */ + } + return; + error: + file_set_error(); +} -#else /* linux || __sun__ */ +#else /* linux || __sun__ || __FreeBSD__ */ #error You must implement get/set_thread_context for your platform -#endif /* linux || __sun__*/ +#endif /* linux || __sun__ || __FreeBSD__ */ /* copy a context structure according to the flags */ Index: server/request.c =================================================================== RCS file: /home/wine/wine/server/request.c,v retrieving revision 1.26 diff -u -u -r1.26 request.c --- server/request.c 2000/01/25 01:40:27 1.26 +++ server/request.c 2000/02/05 13:28:46 @@ -350,8 +350,9 @@ create_server_dir(); if ((fd = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" ); addr.sun_family = AF_UNIX; - strcpy( addr.sun_path, "socket" ); - if (bind( fd, &addr, sizeof(addr.sun_family) + strlen(addr.sun_path) ) == -1) + strcpy( addr.sun_path, SOCKETNAME ); + addr.sun_len = sizeof(addr); + if (bind( fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1) { if ((errno == EEXIST) || (errno == EADDRINUSE)) fatal_error( "another server is already running\n" ); @@ -360,7 +361,7 @@ } atexit( socket_cleanup ); - chmod( "socket", 0600 ); /* make sure no other user can connect */ + chmod( SOCKETNAME, 0600 ); /* make sure no other user can connect */ if (listen( fd, 5 ) == -1) fatal_perror( "listen" ); if (!(master_socket = alloc_object( &master_socket_ops, fd ))) Index: scheduler/client.c =================================================================== RCS file: /home/wine/wine/scheduler/client.c,v retrieving revision 1.36 diff -u -u -r1.36 client.c --- scheduler/client.c 2000/01/25 21:19:58 1.36 +++ scheduler/client.c 2000/02/05 13:28:45 @@ -366,7 +366,8 @@ if ((s = socket( AF_UNIX, SOCK_STREAM, 0 )) == -1) fatal_perror( "socket" ); addr.sun_family = AF_UNIX; strcpy( addr.sun_path, SOCKETNAME ); - if (connect( s, &addr, sizeof(addr.sun_family) + strlen(addr.sun_path) ) == -1) + addr.sun_len = sizeof(addr); + if (connect( s, (struct sockaddr *)&addr, sizeof(addr) ) == -1) { close( s ); return -2; -- Juergen Lock (remove dot foo from address to reply) To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-emulation" in the body of the message