aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-07-24 09:41:34 +0000
committerCorinna Vinschen <corinna@vinschen.de>2004-07-24 09:41:34 +0000
commit65c5aa77fbd14e8571ffcefb731748954bc2f4df (patch)
tree1b00e362d620e645a61f54541a4154ee6233ff2a /winsup/cygwin
parent61e6420f325111a3b596a324c6adddfebd7d53d1 (diff)
downloadnewlib-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/ChangeLog11
-rw-r--r--winsup/cygwin/autoload.cc2
-rw-r--r--winsup/cygwin/init.cc27
-rw-r--r--winsup/cygwin/uname.cc14
-rw-r--r--winsup/cygwin/winsup.h2
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>