提交 6e4255f6 编写于 作者: B bellard

windows support for kqemu (Filip Navara)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1366 c046a42c-6fe2-441c-8c8c-71466251a162
上级 74ffc772
...@@ -20,9 +20,11 @@ ...@@ -20,9 +20,11 @@
#include "config.h" #include "config.h"
#ifdef _WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#include <winioctl.h>
#else #else
#include <sys/types.h> #include <sys/types.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/ioctl.h>
#endif #endif
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
...@@ -41,13 +43,25 @@ ...@@ -41,13 +43,25 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h>
#include "kqemu/kqemu.h" #include "kqemu/kqemu.h"
#ifdef _WIN32
#define KQEMU_DEVICE "\\\\.\\kqemu"
#else
#define KQEMU_DEVICE "/dev/kqemu" #define KQEMU_DEVICE "/dev/kqemu"
#endif
#ifdef _WIN32
#define KQEMU_INVALID_FD INVALID_HANDLE_VALUE
HANDLE kqemu_fd = KQEMU_INVALID_FD;
#define kqemu_closefd(x) CloseHandle(x)
#else
#define KQEMU_INVALID_FD -1
int kqemu_fd = KQEMU_INVALID_FD;
#define kqemu_closefd(x) close(x)
#endif
int kqemu_allowed = 1; int kqemu_allowed = 1;
int kqemu_fd = -1;
unsigned long *pages_to_flush; unsigned long *pages_to_flush;
unsigned int nb_pages_to_flush; unsigned int nb_pages_to_flush;
extern uint32_t **l1_phys_map; extern uint32_t **l1_phys_map;
...@@ -104,17 +118,32 @@ int kqemu_init(CPUState *env) ...@@ -104,17 +118,32 @@ int kqemu_init(CPUState *env)
{ {
struct kqemu_init init; struct kqemu_init init;
int ret, version; int ret, version;
#ifdef _WIN32
DWORD temp;
#endif
if (!kqemu_allowed) if (!kqemu_allowed)
return -1; return -1;
#ifdef _WIN32
kqemu_fd = CreateFile(KQEMU_DEVICE, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL);
#else
kqemu_fd = open(KQEMU_DEVICE, O_RDWR); kqemu_fd = open(KQEMU_DEVICE, O_RDWR);
if (kqemu_fd < 0) { #endif
if (kqemu_fd == KQEMU_INVALID_FD) {
fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated\n", KQEMU_DEVICE); fprintf(stderr, "Could not open '%s' - QEMU acceleration layer not activated\n", KQEMU_DEVICE);
return -1; return -1;
} }
version = 0; version = 0;
#ifdef _WIN32
DeviceIoControl(kqemu_fd, KQEMU_GET_VERSION, NULL, 0,
&version, sizeof(version), &temp, NULL);
#else
ioctl(kqemu_fd, KQEMU_GET_VERSION, &version); ioctl(kqemu_fd, KQEMU_GET_VERSION, &version);
#endif
if (version != KQEMU_VERSION) { if (version != KQEMU_VERSION) {
fprintf(stderr, "Version mismatch between kqemu module and qemu (%08x %08x) - disabling kqemu use\n", fprintf(stderr, "Version mismatch between kqemu module and qemu (%08x %08x) - disabling kqemu use\n",
version, KQEMU_VERSION); version, KQEMU_VERSION);
...@@ -131,12 +160,17 @@ int kqemu_init(CPUState *env) ...@@ -131,12 +160,17 @@ int kqemu_init(CPUState *env)
init.ram_dirty = phys_ram_dirty; init.ram_dirty = phys_ram_dirty;
init.phys_to_ram_map = l1_phys_map; init.phys_to_ram_map = l1_phys_map;
init.pages_to_flush = pages_to_flush; init.pages_to_flush = pages_to_flush;
#ifdef _WIN32
ret = DeviceIoControl(kqemu_fd, KQEMU_INIT, &init, sizeof(init),
NULL, 0, &temp, NULL) == TRUE ? 0 : -1;
#else
ret = ioctl(kqemu_fd, KQEMU_INIT, &init); ret = ioctl(kqemu_fd, KQEMU_INIT, &init);
#endif
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Error %d while initializing QEMU acceleration layer - disabling it for now\n", ret); fprintf(stderr, "Error %d while initializing QEMU acceleration layer - disabling it for now\n", ret);
fail: fail:
close(kqemu_fd); kqemu_closefd(kqemu_fd);
kqemu_fd = -1; kqemu_fd = KQEMU_INVALID_FD;
return -1; return -1;
} }
kqemu_update_cpuid(env); kqemu_update_cpuid(env);
...@@ -313,6 +347,9 @@ int kqemu_cpu_exec(CPUState *env) ...@@ -313,6 +347,9 @@ int kqemu_cpu_exec(CPUState *env)
{ {
struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state; struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state;
int ret; int ret;
#ifdef _WIN32
DWORD temp;
#endif
#ifdef DEBUG #ifdef DEBUG
if (loglevel & CPU_LOG_INT) { 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)
restore_native_fp_frstor(env); restore_native_fp_frstor(env);
} }
#ifdef _WIN32
DeviceIoControl(kqemu_fd, KQEMU_EXEC,
kenv, sizeof(struct kqemu_cpu_state),
kenv, sizeof(struct kqemu_cpu_state),
&temp, NULL);
ret = kenv->retval;
#else
#if KQEMU_VERSION >= 0x010100
ioctl(kqemu_fd, KQEMU_EXEC, kenv);
ret = kenv->retval;
#else
ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv); ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv);
#endif
#endif
if (!(kenv->cr0 & CR0_TS_MASK)) { if (!(kenv->cr0 & CR0_TS_MASK)) {
if (env->cpuid_features & CPUID_FXSR) if (env->cpuid_features & CPUID_FXSR)
save_native_fp_fxsave(env); 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)
#else #else
#ifdef _BSD #ifdef _WIN32
#include <windows.h>
#elif defined(_BSD)
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <malloc.h> #include <malloc.h>
#endif #endif
#ifdef _WIN32
/* XXX: find a solution to have page aligned data */
#define memalign(align, size) malloc(size)
#endif
int qemu_write(int fd, const void *buf, size_t n) int qemu_write(int fd, const void *buf, size_t n)
{ {
...@@ -308,7 +306,22 @@ void *qemu_malloc(size_t size) ...@@ -308,7 +306,22 @@ void *qemu_malloc(size_t size)
return malloc(size); return malloc(size);
} }
#if defined(USE_KQEMU) #if defined(_WIN32)
void *qemu_vmalloc(size_t size)
{
/* FIXME: this is not exactly optimal solution since VirtualAlloc
has 64Kb granularity, but at least it guarantees us that the
memory is page aligned. */
return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
}
void qemu_vfree(void *ptr)
{
VirtualFree(ptr, 0, MEM_RELEASE);
}
#elif defined(USE_KQEMU)
#include <sys/mman.h> #include <sys/mman.h>
#include <fcntl.h> #include <fcntl.h>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册