sync with latest
[sdk/emulator/qemu.git] / oslib-win32.c
index ab29eae..dc7adba 100644 (file)
 #include <windows.h>
 #include "config-host.h"
 #include "sysemu.h"
+#include "main-loop.h"
 #include "trace.h"
 #include "qemu_socket.h"
 
+#ifdef CONFIG_MARU
+#include "../tizen/src/skin/maruskin_client.h"
+
+#ifdef CONFIG_WIN32
+typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
+LPFN_ISWOW64PROCESS fnIsWow64Process;
+
+int is_wow64_temp(void)
+{
+    int result = 0;
+
+    //IsWow64Process is not available on all supported versions of Windows.
+    //Use GetModuleHandle to get a handle to the DLL that contains the function
+    //and GetProcAddress to get a pointer to the function if available.
+
+    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
+        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
+
+    if(NULL != fnIsWow64Process)
+    {
+        if (!fnIsWow64Process(GetCurrentProcess(),&result))
+        {
+            //handle error
+                       //INFO("Can not find 'IsWow64Process'\n");
+        }
+    }
+    return result;
+}
+
+int get_java_path_temp(char** java_path)
+{
+       HKEY hKeyNew;
+       HKEY hKey;
+       //char strJavaRuntimePath[JAVA_MAX_COMMAND_LENGTH] = {0};
+       char strChoosenName[JAVA_MAX_COMMAND_LENGTH] = {0};
+       char strSubKeyName[JAVA_MAX_COMMAND_LENGTH] = {0};
+       char strJavaHome[JAVA_MAX_COMMAND_LENGTH] = {0};
+       int index;
+       DWORD dwSubKeyNameMax = JAVA_MAX_COMMAND_LENGTH;
+       DWORD dwBufLen = JAVA_MAX_COMMAND_LENGTH;
+
+    RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\JavaSoft\\Java Runtime Environment", 0,
+                                     KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | MY_KEY_WOW64_64KEY, &hKey);
+    RegEnumKeyEx(hKey, 0, (LPSTR)strSubKeyName, &dwSubKeyNameMax, NULL, NULL, NULL, NULL);
+    strcpy(strChoosenName, strSubKeyName);
+
+       index = 1;
+       while (ERROR_SUCCESS == RegEnumKeyEx(hKey, index, (LPSTR)strSubKeyName, &dwSubKeyNameMax,
+                       NULL, NULL, NULL, NULL)) {
+        if (strcmp(strChoosenName, strSubKeyName) < 0) {
+            strcpy(strChoosenName, strSubKeyName);
+        }
+        index++;
+       }
+
+       RegOpenKeyEx(hKey, strChoosenName, 0, KEY_QUERY_VALUE | MY_KEY_WOW64_64KEY, &hKeyNew);
+       RegQueryValueEx(hKeyNew, "JavaHome", NULL, NULL, (LPBYTE)strJavaHome, &dwBufLen);
+       RegCloseKey(hKey);
+       if (strJavaHome[0] != '\0') {
+        sprintf(*java_path, "\"%s\\bin\\java\"", strJavaHome);
+               //strcpy(*java_path, strJavaHome);
+               //strcat(*java_path, "\\bin\\java");
+    } else {
+               return 0;
+       }
+    return 1;
+}
+#endif
+#endif // CONFIG_MARU
+
 void *qemu_oom_check(void *ptr)
 {
     if (ptr == NULL) {
         fprintf(stderr, "Failed to allocate memory: %lu\n", GetLastError());
+
+#ifdef CONFIG_MARU
+        char _msg[] = "Failed to allocate memory in qemu.";
+        char cmd[JAVA_MAX_COMMAND_LENGTH] = { 0, };
+
+#ifdef CONFIG_WIN32
+        char* JAVA_EXEFILE_PATH = malloc(JAVA_MAX_COMMAND_LENGTH);
+        memset(JAVA_EXEFILE_PATH, 0, JAVA_MAX_COMMAND_LENGTH);
+        if (is_wow64_temp()) {            
+            if (!get_java_path_temp(&JAVA_EXEFILE_PATH)) {
+                               strcpy(JAVA_EXEFILE_PATH, "java");
+                   }
+        } else {
+            strcpy(JAVA_EXEFILE_PATH, "java");
+        }
+#endif
+        int len = strlen(JAVA_EXEFILE_PATH) + strlen(JAVA_EXEOPTION) + strlen(JAR_SKINFILE) +
+           strlen(JAVA_SIMPLEMODE_OPTION) + strlen(_msg) + 7;
+        if (len > JAVA_MAX_COMMAND_LENGTH) {
+            len = JAVA_MAX_COMMAND_LENGTH;
+        }
+
+        snprintf(cmd, len, "%s %s %s %s=\"%s\"",
+            JAVA_EXEFILE_PATH, JAVA_EXEOPTION, JAR_SKINFILE, JAVA_SIMPLEMODE_OPTION, _msg);
+        int ret = WinExec(cmd, SW_SHOW);
+#ifdef CONFIG_WIN32
+           // for 64bit windows
+           free(JAVA_EXEFILE_PATH);
+           JAVA_EXEFILE_PATH=0;
+#endif
+#endif
+
         abort();
     }
     return ptr;
@@ -73,10 +176,18 @@ void qemu_vfree(void *ptr)
     VirtualFree(ptr, 0, MEM_RELEASE);
 }
 
+void socket_set_block(int fd)
+{
+    unsigned long opt = 0;
+    WSAEventSelect(fd, NULL, 0);
+    ioctlsocket(fd, FIONBIO, &opt);
+}
+
 void socket_set_nonblock(int fd)
 {
     unsigned long opt = 1;
     ioctlsocket(fd, FIONBIO, &opt);
+    qemu_fd_register(fd);
 }
 
 int inet_aton(const char *cp, struct in_addr *ia)
@@ -93,13 +204,6 @@ void qemu_set_cloexec(int fd)
 {
 }
 
-/* mingw32 needs ffs for compilations without optimization. */
-int ffs(int i)
-{
-    /* Use gcc's builtin ffs. */
-    return __builtin_ffs(i);
-}
-
 /* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */
 #define _W32_FT_OFFSET (116444736000000000ULL)
 
@@ -119,3 +223,8 @@ int qemu_gettimeofday(qemu_timeval *tp)
      Do not set errno on error.  */
   return 0;
 }
+
+int qemu_get_thread_id(void)
+{
+    return GetCurrentThreadId();
+}