diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2004-07-24 09:41:34 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2004-07-24 09:41:34 +0000 |
commit | 65c5aa77fbd14e8571ffcefb731748954bc2f4df (patch) | |
tree | 1b00e362d620e645a61f54541a4154ee6233ff2a /winsup/cygwin | |
parent | 61e6420f325111a3b596a324c6adddfebd7d53d1 (diff) | |
download | newlib-65c5aa77fbd14e8571ffcefb731748954bc2f4df.zip newlib-65c5aa77fbd14e8571ffcefb731748954bc2f4df.tar.gz newlib-65c5aa77fbd14e8571ffcefb731748954bc2f4df.tar.bz2 |
* autoload.cc (GetNativeSystemInfo): Add.
(IsWow64Process): Add.
* init.cc (respawn_wow64_process): New function.
(dll_entry): If process has been started from a 64 bit
process, call respawn_wow64_process.
* uname.cc (uname): On 64 bit systems, use GetNativeSystemInfo.
Show actual CPU type.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 11 | ||||
-rw-r--r-- | winsup/cygwin/autoload.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/init.cc | 27 | ||||
-rw-r--r-- | winsup/cygwin/uname.cc | 14 | ||||
-rw-r--r-- | winsup/cygwin/winsup.h | 2 |
5 files changed, 54 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ecc4de1..bb6d297 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2004-07-24 Corinna Vinschen <corinna@vinschen.de> + Christopher Faylor <cgf@timesys.com> + + * autoload.cc (GetNativeSystemInfo): Add. + (IsWow64Process): Add. + * init.cc (respawn_wow64_process): New function. + (dll_entry): If process has been started from a 64 bit + process, call respawn_wow64_process. + * uname.cc (uname): On 64 bit systems, use GetNativeSystemInfo. + Show actual CPU type. + 2004-07-23 Corinna Vinschen <corinna@vinschen.de> * dtable.cc (dtable::get_debugger_info): Make stderr r/w according diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc index 6062f7e..7b1a569 100644 --- a/winsup/cygwin/autoload.cc +++ b/winsup/cygwin/autoload.cc @@ -501,9 +501,11 @@ LoadDLLfuncEx (CreateToolhelp32Snapshot, 8, kernel32, 1) LoadDLLfuncEx2 (GetCompressedFileSizeA, 8, kernel32, 1, 0xffffffff) LoadDLLfuncEx (GetConsoleWindow, 0, kernel32, 1) LoadDLLfuncEx (GetDiskFreeSpaceEx, 16, kernel32, 1) +LoadDLLfuncEx (GetNativeSystemInfo, 4, kernel32, 1) LoadDLLfuncEx (GetSystemTimes, 12, kernel32, 1) LoadDLLfuncEx2 (IsDebuggerPresent, 0, kernel32, 1, 1) LoadDLLfunc (IsProcessorFeaturePresent, 4, kernel32); +LoadDLLfuncEx (IsWow64Process, 8, kernel32, 1); LoadDLLfuncEx (Process32First, 8, kernel32, 1) LoadDLLfuncEx (Process32Next, 8, kernel32, 1) LoadDLLfuncEx (RegisterServiceProcess, 8, kernel32, 1) diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index e42698e..c1e98a8 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -87,14 +87,41 @@ munge_threadfunc () } } +static void __attribute__ ((noreturn)) +respawn_wow64_process () +{ + PROCESS_INFORMATION pi; + STARTUPINFO si; + GetStartupInfo (&si); + if (!CreateProcessA (NULL, GetCommandLineA (), NULL, NULL, TRUE, + CREATE_DEFAULT_ERROR_MODE + | GetPriorityClass (GetCurrentProcess ()), + NULL, NULL, &si, &pi)) + api_fatal ("Failed to create process <%s>: %E", GetCommandLineA ()); + CloseHandle (pi.hThread); + if (WaitForSingleObject (pi.hProcess, INFINITE) == WAIT_FAILED) + api_fatal ("Waiting for process %d failed: %E", pi.dwProcessId); + CloseHandle (pi.hProcess); + ExitProcess (0); +} + extern void __stdcall dll_crt0_0 (); extern "C" int WINAPI dll_entry (HANDLE h, DWORD reason, void *static_load) { + BOOL is_64bit_machine = FALSE; + switch (reason) { case DLL_PROCESS_ATTACH: + /* Is the stack at an unusual high address? Check if we're running on + a 64 bit machine. If so, respawn. */ + if (&is_64bit_machine >= (PBOOL) 0x400000 + && IsWow64Process (hMainProc, &is_64bit_machine) + && is_64bit_machine) + respawn_wow64_process (); + prime_threads (); dynamically_loaded = (static_load == NULL); dll_crt0_0 (); diff --git a/winsup/cygwin/uname.cc b/winsup/cygwin/uname.cc index 2774409..65708f0 100644 --- a/winsup/cygwin/uname.cc +++ b/winsup/cygwin/uname.cc @@ -29,7 +29,11 @@ uname (struct utsname *name) memset (name, 0, sizeof (*name)); __small_sprintf (name->sysname, "CYGWIN_%s", wincap.osname ()); - GetSystemInfo (&sysinfo); + BOOL is_64bit_machine = FALSE; + if (IsWow64Process (hMainProc, &is_64bit_machine) && is_64bit_machine) + GetNativeSystemInfo (&sysinfo); + else + GetSystemInfo (&sysinfo); /* Computer name */ cygwin_gethostname (name->nodename, sizeof (name->nodename) - 1); @@ -74,6 +78,14 @@ uname (struct utsname *name) } __small_sprintf (name->machine, "i%d86", ptype); break; + case PROCESSOR_ARCHITECTURE_IA64: + strcpy (name->machine, "ia64"); + break; + case PROCESSOR_ARCHITECTURE_AMD64: + strcpy (name->machine, "amd64"); + break; + case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: + strcpy (name->machine, "ia32-win64"); case PROCESSOR_ARCHITECTURE_ALPHA: strcpy (name->machine, "alpha"); break; diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 49a880e..2c89ef4 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -37,7 +37,7 @@ details. */ #endif #ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 +#define _WIN32_WINNT 0x0501 #endif #include <sys/types.h> |