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 | 20 | #include "config.h" |
| 21 | 21 | #ifdef _WIN32 |
| 22 | 22 | #include <windows.h> |
| 23 | +#include <winioctl.h> | |
| 23 | 24 | #else |
| 24 | 25 | #include <sys/types.h> |
| 25 | 26 | #include <sys/mman.h> |
| 27 | +#include <sys/ioctl.h> | |
| 26 | 28 | #endif |
| 27 | 29 | #include <stdlib.h> |
| 28 | 30 | #include <stdio.h> |
| ... | ... | @@ -41,13 +43,25 @@ |
| 41 | 43 | |
| 42 | 44 | #include <unistd.h> |
| 43 | 45 | #include <fcntl.h> |
| 44 | -#include <sys/ioctl.h> | |
| 45 | 46 | #include "kqemu/kqemu.h" |
| 46 | 47 | |
| 48 | +#ifdef _WIN32 | |
| 49 | +#define KQEMU_DEVICE "\\\\.\\kqemu" | |
| 50 | +#else | |
| 47 | 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 | 64 | int kqemu_allowed = 1; |
| 50 | -int kqemu_fd = -1; | |
| 51 | 65 | unsigned long *pages_to_flush; |
| 52 | 66 | unsigned int nb_pages_to_flush; |
| 53 | 67 | extern uint32_t **l1_phys_map; |
| ... | ... | @@ -104,17 +118,32 @@ int kqemu_init(CPUState *env) |
| 104 | 118 | { |
| 105 | 119 | struct kqemu_init init; |
| 106 | 120 | int ret, version; |
| 121 | +#ifdef _WIN32 | |
| 122 | + DWORD temp; | |
| 123 | +#endif | |
| 107 | 124 | |
| 108 | 125 | if (!kqemu_allowed) |
| 109 | 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 | 134 | kqemu_fd = open(KQEMU_DEVICE, O_RDWR); |
| 112 | - if (kqemu_fd < 0) { | |
| 135 | +#endif | |
| 136 | + if (kqemu_fd == KQEMU_INVALID_FD) { | |
| 113 | 137 | fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated\n", KQEMU_DEVICE); |
| 114 | 138 | return -1; |
| 115 | 139 | } |
| 116 | 140 | version = 0; |
| 141 | +#ifdef _WIN32 | |
| 142 | + DeviceIoControl(kqemu_fd, KQEMU_GET_VERSION, NULL, 0, | |
| 143 | + &version, sizeof(version), &temp, NULL); | |
| 144 | +#else | |
| 117 | 145 | ioctl(kqemu_fd, KQEMU_GET_VERSION, &version); |
| 146 | +#endif | |
| 118 | 147 | if (version != KQEMU_VERSION) { |
| 119 | 148 | fprintf(stderr, "Version mismatch between kqemu module and qemu (%08x %08x) - disabling kqemu use\n", |
| 120 | 149 | version, KQEMU_VERSION); |
| ... | ... | @@ -131,12 +160,17 @@ int kqemu_init(CPUState *env) |
| 131 | 160 | init.ram_dirty = phys_ram_dirty; |
| 132 | 161 | init.phys_to_ram_map = l1_phys_map; |
| 133 | 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 | 167 | ret = ioctl(kqemu_fd, KQEMU_INIT, &init); |
| 168 | +#endif | |
| 135 | 169 | if (ret < 0) { |
| 136 | 170 | fprintf(stderr, "Error %d while initializing QEMU acceleration layer - disabling it for now\n", ret); |
| 137 | 171 | fail: |
| 138 | - close(kqemu_fd); | |
| 139 | - kqemu_fd = -1; | |
| 172 | + kqemu_closefd(kqemu_fd); | |
| 173 | + kqemu_fd = KQEMU_INVALID_FD; | |
| 140 | 174 | return -1; |
| 141 | 175 | } |
| 142 | 176 | kqemu_update_cpuid(env); |
| ... | ... | @@ -313,6 +347,9 @@ int kqemu_cpu_exec(CPUState *env) |
| 313 | 347 | { |
| 314 | 348 | struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state; |
| 315 | 349 | int ret; |
| 350 | +#ifdef _WIN32 | |
| 351 | + DWORD temp; | |
| 352 | +#endif | |
| 316 | 353 | |
| 317 | 354 | #ifdef DEBUG |
| 318 | 355 | if (loglevel & CPU_LOG_INT) { |
| ... | ... | @@ -354,8 +391,20 @@ int kqemu_cpu_exec(CPUState *env) |
| 354 | 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 | 405 | ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv); |
| 358 | - | |
| 406 | +#endif | |
| 407 | +#endif | |
| 359 | 408 | if (!(kenv->cr0 & CR0_TS_MASK)) { |
| 360 | 409 | if (env->cpuid_features & CPUID_FXSR) |
| 361 | 410 | save_native_fp_fxsave(env); | ... | ... |
osdep.c
| ... | ... | @@ -273,15 +273,13 @@ void *get_mmap_addr(unsigned long size) |
| 273 | 273 | |
| 274 | 274 | #else |
| 275 | 275 | |
| 276 | -#ifdef _BSD | |
| 276 | +#ifdef _WIN32 | |
| 277 | +#include <windows.h> | |
| 278 | +#elif defined(_BSD) | |
| 277 | 279 | #include <stdlib.h> |
| 278 | 280 | #else |
| 279 | 281 | #include <malloc.h> |
| 280 | 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 | 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 | 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 | 326 | #include <sys/mman.h> |
| 314 | 327 | #include <fcntl.h> | ... | ... |