Commit 6e4255f6a65091fbe7d17bfda546e2aa1b72f9a6

Authored by bellard
1 parent 74ffc772

windows support for kqemu (Filip Navara)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1366 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 74 additions and 12 deletions
@@ -20,9 +20,11 @@ @@ -20,9 +20,11 @@
20 #include "config.h" 20 #include "config.h"
21 #ifdef _WIN32 21 #ifdef _WIN32
22 #include <windows.h> 22 #include <windows.h>
  23 +#include <winioctl.h>
23 #else 24 #else
24 #include <sys/types.h> 25 #include <sys/types.h>
25 #include <sys/mman.h> 26 #include <sys/mman.h>
  27 +#include <sys/ioctl.h>
26 #endif 28 #endif
27 #include <stdlib.h> 29 #include <stdlib.h>
28 #include <stdio.h> 30 #include <stdio.h>
@@ -41,13 +43,25 @@ @@ -41,13 +43,25 @@
41 43
42 #include <unistd.h> 44 #include <unistd.h>
43 #include <fcntl.h> 45 #include <fcntl.h>
44 -#include <sys/ioctl.h>  
45 #include "kqemu/kqemu.h" 46 #include "kqemu/kqemu.h"
46 47
  48 +#ifdef _WIN32
  49 +#define KQEMU_DEVICE "\\\\.\\kqemu"
  50 +#else
47 #define KQEMU_DEVICE "/dev/kqemu" 51 #define KQEMU_DEVICE "/dev/kqemu"
  52 +#endif
  53 +
  54 +#ifdef _WIN32
  55 +#define KQEMU_INVALID_FD INVALID_HANDLE_VALUE
  56 +HANDLE kqemu_fd = KQEMU_INVALID_FD;
  57 +#define kqemu_closefd(x) CloseHandle(x)
  58 +#else
  59 +#define KQEMU_INVALID_FD -1
  60 +int kqemu_fd = KQEMU_INVALID_FD;
  61 +#define kqemu_closefd(x) close(x)
  62 +#endif
48 63
49 int kqemu_allowed = 1; 64 int kqemu_allowed = 1;
50 -int kqemu_fd = -1;  
51 unsigned long *pages_to_flush; 65 unsigned long *pages_to_flush;
52 unsigned int nb_pages_to_flush; 66 unsigned int nb_pages_to_flush;
53 extern uint32_t **l1_phys_map; 67 extern uint32_t **l1_phys_map;
@@ -104,17 +118,32 @@ int kqemu_init(CPUState *env) @@ -104,17 +118,32 @@ int kqemu_init(CPUState *env)
104 { 118 {
105 struct kqemu_init init; 119 struct kqemu_init init;
106 int ret, version; 120 int ret, version;
  121 +#ifdef _WIN32
  122 + DWORD temp;
  123 +#endif
107 124
108 if (!kqemu_allowed) 125 if (!kqemu_allowed)
109 return -1; 126 return -1;
110 127
  128 +#ifdef _WIN32
  129 + kqemu_fd = CreateFile(KQEMU_DEVICE, GENERIC_WRITE | GENERIC_READ,
  130 + FILE_SHARE_READ | FILE_SHARE_WRITE,
  131 + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  132 + NULL);
  133 +#else
111 kqemu_fd = open(KQEMU_DEVICE, O_RDWR); 134 kqemu_fd = open(KQEMU_DEVICE, O_RDWR);
112 - if (kqemu_fd < 0) { 135 +#endif
  136 + if (kqemu_fd == KQEMU_INVALID_FD) {
113 fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated\n", KQEMU_DEVICE); 137 fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated\n", KQEMU_DEVICE);
114 return -1; 138 return -1;
115 } 139 }
116 version = 0; 140 version = 0;
  141 +#ifdef _WIN32
  142 + DeviceIoControl(kqemu_fd, KQEMU_GET_VERSION, NULL, 0,
  143 + &version, sizeof(version), &temp, NULL);
  144 +#else
117 ioctl(kqemu_fd, KQEMU_GET_VERSION, &version); 145 ioctl(kqemu_fd, KQEMU_GET_VERSION, &version);
  146 +#endif
118 if (version != KQEMU_VERSION) { 147 if (version != KQEMU_VERSION) {
119 fprintf(stderr, "Version mismatch between kqemu module and qemu (%08x %08x) - disabling kqemu use\n", 148 fprintf(stderr, "Version mismatch between kqemu module and qemu (%08x %08x) - disabling kqemu use\n",
120 version, KQEMU_VERSION); 149 version, KQEMU_VERSION);
@@ -131,12 +160,17 @@ int kqemu_init(CPUState *env) @@ -131,12 +160,17 @@ int kqemu_init(CPUState *env)
131 init.ram_dirty = phys_ram_dirty; 160 init.ram_dirty = phys_ram_dirty;
132 init.phys_to_ram_map = l1_phys_map; 161 init.phys_to_ram_map = l1_phys_map;
133 init.pages_to_flush = pages_to_flush; 162 init.pages_to_flush = pages_to_flush;
  163 +#ifdef _WIN32
  164 + ret = DeviceIoControl(kqemu_fd, KQEMU_INIT, &init, sizeof(init),
  165 + NULL, 0, &temp, NULL) == TRUE ? 0 : -1;
  166 +#else
134 ret = ioctl(kqemu_fd, KQEMU_INIT, &init); 167 ret = ioctl(kqemu_fd, KQEMU_INIT, &init);
  168 +#endif
135 if (ret < 0) { 169 if (ret < 0) {
136 fprintf(stderr, "Error %d while initializing QEMU acceleration layer - disabling it for now\n", ret); 170 fprintf(stderr, "Error %d while initializing QEMU acceleration layer - disabling it for now\n", ret);
137 fail: 171 fail:
138 - close(kqemu_fd);  
139 - kqemu_fd = -1; 172 + kqemu_closefd(kqemu_fd);
  173 + kqemu_fd = KQEMU_INVALID_FD;
140 return -1; 174 return -1;
141 } 175 }
142 kqemu_update_cpuid(env); 176 kqemu_update_cpuid(env);
@@ -313,6 +347,9 @@ int kqemu_cpu_exec(CPUState *env) @@ -313,6 +347,9 @@ int kqemu_cpu_exec(CPUState *env)
313 { 347 {
314 struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state; 348 struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state;
315 int ret; 349 int ret;
  350 +#ifdef _WIN32
  351 + DWORD temp;
  352 +#endif
316 353
317 #ifdef DEBUG 354 #ifdef DEBUG
318 if (loglevel & CPU_LOG_INT) { 355 if (loglevel & CPU_LOG_INT) {
@@ -354,8 +391,20 @@ int kqemu_cpu_exec(CPUState *env) @@ -354,8 +391,20 @@ int kqemu_cpu_exec(CPUState *env)
354 restore_native_fp_frstor(env); 391 restore_native_fp_frstor(env);
355 } 392 }
356 393
  394 +#ifdef _WIN32
  395 + DeviceIoControl(kqemu_fd, KQEMU_EXEC,
  396 + kenv, sizeof(struct kqemu_cpu_state),
  397 + kenv, sizeof(struct kqemu_cpu_state),
  398 + &temp, NULL);
  399 + ret = kenv->retval;
  400 +#else
  401 +#if KQEMU_VERSION >= 0x010100
  402 + ioctl(kqemu_fd, KQEMU_EXEC, kenv);
  403 + ret = kenv->retval;
  404 +#else
357 ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv); 405 ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv);
358 - 406 +#endif
  407 +#endif
359 if (!(kenv->cr0 & CR0_TS_MASK)) { 408 if (!(kenv->cr0 & CR0_TS_MASK)) {
360 if (env->cpuid_features & CPUID_FXSR) 409 if (env->cpuid_features & CPUID_FXSR)
361 save_native_fp_fxsave(env); 410 save_native_fp_fxsave(env);
@@ -273,15 +273,13 @@ void *get_mmap_addr(unsigned long size) @@ -273,15 +273,13 @@ void *get_mmap_addr(unsigned long size)
273 273
274 #else 274 #else
275 275
276 -#ifdef _BSD 276 +#ifdef _WIN32
  277 +#include <windows.h>
  278 +#elif defined(_BSD)
277 #include <stdlib.h> 279 #include <stdlib.h>
278 #else 280 #else
279 #include <malloc.h> 281 #include <malloc.h>
280 #endif 282 #endif
281 -#ifdef _WIN32  
282 -/* XXX: find a solution to have page aligned data */  
283 -#define memalign(align, size) malloc(size)  
284 -#endif  
285 283
286 int qemu_write(int fd, const void *buf, size_t n) 284 int qemu_write(int fd, const void *buf, size_t n)
287 { 285 {
@@ -308,7 +306,22 @@ void *qemu_malloc(size_t size) @@ -308,7 +306,22 @@ void *qemu_malloc(size_t size)
308 return malloc(size); 306 return malloc(size);
309 } 307 }
310 308
311 -#if defined(USE_KQEMU) 309 +#if defined(_WIN32)
  310 +
  311 +void *qemu_vmalloc(size_t size)
  312 +{
  313 + /* FIXME: this is not exactly optimal solution since VirtualAlloc
  314 + has 64Kb granularity, but at least it guarantees us that the
  315 + memory is page aligned. */
  316 + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
  317 +}
  318 +
  319 +void qemu_vfree(void *ptr)
  320 +{
  321 + VirtualFree(ptr, 0, MEM_RELEASE);
  322 +}
  323 +
  324 +#elif defined(USE_KQEMU)
312 325
313 #include <sys/mman.h> 326 #include <sys/mman.h>
314 #include <fcntl.h> 327 #include <fcntl.h>