Commit 6e4255f6a65091fbe7d17bfda546e2aa1b72f9a6
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
kqemu.c
@@ -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); |
osdep.c
@@ -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> |