qvm86-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[qvm86-devel] [patch] More WinNT host fixes


From: Filip Navara
Subject: [qvm86-devel] [patch] More WinNT host fixes
Date: Tue, 19 Apr 2005 14:25:40 +0200
User-agent: Mozilla Thunderbird 0.9 (Windows/20041103)

Hi,

this patch fixes a very stupid bug which was propably causing the host crashes for Mike (as reported in other thread on the ML). Now I'm able to boot ReactOS just fine with QVM86 on Windows XP SP2.

Regards,
Filip
2005-04-19  Filip Navara  <address@hidden>

        * patch.qvm86: Remove WinNT specific patches that were commited to
        QEMU CVS.
        * qvm86-win32.c (host_map_user): Return correct physical memory
        address.

Index: patch.qvm86
===================================================================
RCS file: /cvsroot/qvm86/qvm86/patch.qvm86,v
retrieving revision 1.5
diff -u -p -r1.5 patch.qvm86
--- patch.qvm86 10 Apr 2005 23:41:14 -0000      1.5
+++ patch.qvm86 19 Apr 2005 12:20:45 -0000
@@ -4,7 +4,7 @@ RCS file: /cvsroot/qemu/qemu/Makefile,v
 retrieving revision 1.82
 diff -u -p -r1.82 Makefile
 --- Makefile   10 Feb 2005 21:48:51 -0000      1.82
-+++ Makefile   10 Apr 2005 23:34:04 -0000
++++ Makefile   19 Apr 2005 12:09:31 -0000
 @@ -20,6 +20,13 @@ all: dyngen$(EXESUF) $(TOOLS) $(DOCS)
  ifdef CONFIG_KQEMU
        $(MAKE) -C kqemu
@@ -19,17 +19,21 @@ diff -u -p -r1.82 Makefile
  
  qemu-img$(EXESUF): qemu-img.c block.c block-cow.c block-qcow.c aes.c 
block-vmdk.c block-cloop.c block-dmg.c
        $(CC) -DQEMU_TOOL $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $@ $^ -lz $(LIBS)
-@@ -38,6 +45,9 @@ clean:
+@@ -38,6 +45,13 @@ clean:
  ifdef CONFIG_KQEMU
        $(MAKE) -C kqemu clean
  endif
 +ifdef CONFIG_QVM86
++ifdef CONFIG_WIN32
++      $(MAKE) -C qvm86 -f Makefile.winnt clean
++else
 +      $(MAKE) -C qvm86 clean
 +endif
++endif
  
  distclean: clean
        rm -f config-host.mak config-host.h
-@@ -72,6 +82,9 @@ endif
+@@ -72,6 +86,9 @@ endif
  ifdef CONFIG_KQEMU
        cd kqemu ; ./install.sh
  endif
@@ -45,7 +49,7 @@ RCS file: /cvsroot/qemu/qemu/configure,v
 retrieving revision 1.61
 diff -u -p -r1.61 configure
 --- configure  13 Mar 2005 16:51:53 -0000      1.61
-+++ configure  10 Apr 2005 23:34:04 -0000
++++ configure  19 Apr 2005 12:09:31 -0000
 @@ -82,6 +82,8 @@ fmod_lib=""
  fmod_inc=""
  linux="no"
@@ -210,223 +214,52 @@ diff -u -p -r1.61 configure
      echo "#define USE_KQEMU 1" >> $config_h
    fi
  elif test "$target_cpu" = "arm" -o "$target_cpu" = "armeb" ; then
-Index: exec-all.h
-===================================================================
-RCS file: /cvsroot/qemu/qemu/exec-all.h,v
-retrieving revision 1.30
-diff -u -p -r1.30 exec-all.h
---- exec-all.h 7 Apr 2005 22:20:28 -0000       1.30
-+++ exec-all.h 10 Apr 2005 23:34:04 -0000
-@@ -601,7 +601,6 @@ static inline target_ulong get_phys_addr
- 
- 
- #ifdef USE_KQEMU
--extern int kqemu_fd;
- extern int kqemu_flushed;
- 
- int kqemu_init(CPUState *env);
 Index: kqemu.c
 ===================================================================
 RCS file: /cvsroot/qemu/qemu/kqemu.c,v
-retrieving revision 1.1
-diff -u -p -r1.1 kqemu.c
---- kqemu.c    10 Feb 2005 22:02:59 -0000      1.1
-+++ kqemu.c    10 Apr 2005 23:34:05 -0000
-@@ -20,9 +20,11 @@
- #include "config.h"
- #ifdef _WIN32
- #include <windows.h>
-+#include <winioctl.h>
- #else
- #include <sys/types.h>
- #include <sys/mman.h>
-+#include <sys/ioctl.h>
- #endif
- #include <stdlib.h>
- #include <stdio.h>
-@@ -41,13 +43,24 @@
+retrieving revision 1.2
+diff -u -p -r1.2 kqemu.c
+--- kqemu.c    17 Apr 2005 18:33:47 -0000      1.2
++++ kqemu.c    19 Apr 2005 12:13:41 -0000
+@@ -43,12 +43,12 @@
  
  #include <unistd.h>
  #include <fcntl.h>
--#include <sys/ioctl.h>
 -#include "kqemu/kqemu.h"
 +#include "qvm86/kqemu.h"
  
--#define KQEMU_DEVICE "/dev/kqemu"
-+#ifdef _WIN32
+ #ifdef _WIN32
+-#define KQEMU_DEVICE "\\\\.\\kqemu"
 +#define KQEMU_DEVICE "\\\\.\\qvm86"
-+#else
+ #else
+-#define KQEMU_DEVICE "/dev/kqemu"
 +#define KQEMU_DEVICE "/dev/qvm86"
-+#endif
- 
- int kqemu_allowed = 1;
--int kqemu_fd = -1;
-+#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
- unsigned long *pages_to_flush;
- unsigned int nb_pages_to_flush;
- extern uint32_t **l1_phys_map;
-@@ -104,17 +117,32 @@ int kqemu_init(CPUState *env)
- {
-     struct kqemu_init init;
-     int ret, version;
-+#ifdef _WIN32
-+    DWORD temp;
-+#endif
- 
-     if (!kqemu_allowed)
-         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);
--    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);
-         return -1;
-     }
-     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);
-+#endif
-     if (version != KQEMU_VERSION) {
-         fprintf(stderr, "Version mismatch between kqemu module and qemu (%08x 
%08x) - disabling kqemu use\n",
-                 version, KQEMU_VERSION);
-@@ -131,17 +159,23 @@ int kqemu_init(CPUState *env)
-     init.ram_dirty = phys_ram_dirty;
-     init.phys_to_ram_map = l1_phys_map;
-     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);
-+#endif
-     if (ret < 0) {
-         fprintf(stderr, "Error %d while initializing QEMU acceleration layer 
- disabling it for now\n", ret);
-     fail:
--        close(kqemu_fd);
--        kqemu_fd = -1;
-+        kqemu_closefd(kqemu_fd);
-+        kqemu_fd = KQEMU_INVALID_FD;
-         return -1;
-     }
-     kqemu_update_cpuid(env);
-     env->kqemu_enabled = 1;
-     nb_pages_to_flush = 0;
-+    printf ("QEMU acceleration layer enabled\n");
-     return 0;
- }
- 
-@@ -313,6 +347,9 @@ int kqemu_cpu_exec(CPUState *env)
- {
-     struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state;
-     int ret;
-+#ifdef _WIN32
-+    DWORD temp;
-+#endif
- 
- #ifdef DEBUG
-     if (loglevel & CPU_LOG_INT) {
-@@ -354,7 +391,15 @@ int kqemu_cpu_exec(CPUState *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
-     ret = ioctl(kqemu_fd, KQEMU_EXEC, kenv);
-+#endif
+ #endif
  
-     if (!(kenv->cr0 & CR0_TS_MASK)) {
-         if (env->cpuid_features & CPUID_FXSR)
+ #ifdef _WIN32
 Index: osdep.c
 ===================================================================
 RCS file: /cvsroot/qemu/qemu/osdep.c,v
-retrieving revision 1.8
-diff -u -p -r1.8 osdep.c
---- osdep.c    21 Feb 2005 20:10:36 -0000      1.8
-+++ osdep.c    10 Apr 2005 23:34:05 -0000
-@@ -273,15 +273,13 @@ void *get_mmap_addr(unsigned long size)
- 
- #else
- 
--#ifdef _BSD
-+#ifdef _WIN32
-+#include <windows.h>
-+#elif defined(_BSD)
- #include <stdlib.h>
- #else
- #include <malloc.h>
- #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)
- {
-@@ -308,7 +306,7 @@ void *qemu_malloc(size_t size)
-     return malloc(size);
+retrieving revision 1.9
+diff -u -p -r1.9 osdep.c
+--- osdep.c    17 Apr 2005 18:33:47 -0000      1.9
++++ osdep.c    19 Apr 2005 12:10:21 -0000
+@@ -321,7 +321,7 @@ void qemu_vfree(void *ptr)
+     VirtualFree(ptr, 0, MEM_RELEASE);
  }
  
--#if defined(USE_KQEMU)
-+#if 0 && defined(USE_KQEMU)
+-#elif defined(USE_KQEMU)
++#elif 0 && defined(USE_KQEMU)
  
  #include <sys/mman.h>
  #include <fcntl.h>
-@@ -373,7 +371,12 @@ void qemu_vfree(void *ptr)
- /* alloc shared memory pages */
- void *qemu_vmalloc(size_t size)
- {
--#ifdef _BSD
-+#ifdef _WIN32
-+    /* 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);
-+#elif defined (_BSD)
-     return valloc(size);
- #else
-     return memalign(4096, size);
-@@ -382,7 +385,11 @@ void *qemu_vmalloc(size_t size)
- 
- void qemu_vfree(void *ptr)
- {
-+#ifdef _WIN32
-+    VirtualFree(ptr, 0, MEM_RELEASE);
-+#else
-     free(ptr);
-+#endif
- }
- 
- #endif
 Index: target-i386/helper2.c
 ===================================================================
 RCS file: /cvsroot/qemu/qemu/target-i386/helper2.c,v
 retrieving revision 1.32
 diff -u -p -r1.32 helper2.c
 --- target-i386/helper2.c      10 Feb 2005 22:06:29 -0000      1.32
-+++ target-i386/helper2.c      10 Apr 2005 23:34:05 -0000
++++ target-i386/helper2.c      19 Apr 2005 12:09:31 -0000
 @@ -103,11 +103,11 @@ CPUX86State *cpu_x86_init(void)
  #endif
  #endif
Index: qvm86-win32.c
===================================================================
RCS file: /cvsroot/qvm86/qvm86/qvm86-win32.c,v
retrieving revision 1.2
diff -u -p -r1.2 qvm86-win32.c
--- qvm86-win32.c       10 Apr 2005 10:48:14 -0000      1.2
+++ qvm86-win32.c       19 Apr 2005 11:14:50 -0000
@@ -104,7 +104,7 @@ host_map_user(unsigned long useraddr, qv
         return;
     }
     map->hostdata = mdl;
-    map->phys = mdl_pages[0];
+    map->phys = mdl_pages[0] << PAGE_SHIFT;
     map->refcount = 1;
 }
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]