qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] KQEMU on Win32 (+patch)
@ 2005-07-27 22:04 Filip Navara
  2005-07-27 22:18 ` Hetz Ben Hamo
  2005-07-28  0:33 ` Elefterios Stamatogiannakis
  0 siblings, 2 replies; 15+ messages in thread
From: Filip Navara @ 2005-07-27 22:04 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1843 bytes --]

Hi,

as there were recently few questions about KQEMU I decided to dedicate 
few minutes at answering them and to post a few comments.

 > I'm trying to find out why qvm86 crashes the host (instant reboot 
when right clicking on some icons on the guest desktop).
 > So i thought if it is possible to use some code from kqemu-win32.c to 
update qvm86-win32.c

No, I wrote both of the files and I can honestly tell you that copying 
between them will not help. There is one known case where QVM86 on WinNT 
platforms crashes the host machine and that's when NOEXECUTE support is 
enabled (see boot.ini). The method QVM86 uses for executing the code 
involves copying executable code into an allocated page which 
unfortunately has the NX bit set. I have an experimental fix for this, 
but I need someone with adequate environment (AMD64 and Win XP SP2+) to 
test it... Of course host crash can be caused by other bug.

(Also note that this may apply to KQEMU too though I have no proof.)

 > The changelog mentions that the KQEMU accelerator is now available as
 > a preliminary executable for Windows. I've not been able to find a
 > link to that version anywhere. Should I pull down the sources and
 > compile on my Linux machine, or is there a pre-compiled version about?

You can compile it yourself on either Windows machine with MinGW or on 
linux machine with MinGW cross-compiler. I'm temporary hosting a set of 
QEMU / KQEMU 0.7.1 for Windows binaries here: 
http://www.volny.cz/xnavara/qemu-0.7.1.zip. If anyone can offer me 
hosting for these binaries I would be glad.

As a final note (especially for Fabrice), attached are patches for KQEMU 
for easier driver installation (quite not there yet, but a bit closer) 
and implementation of kqemu_schedule (as requested). I'm planing to port 
this to QVM86 shortly.

Best regards,
Filip

[-- Attachment #2: kqemu-qemu.diff --]
[-- Type: text/x-patch, Size: 2344 bytes --]

Index: exec-all.h
===================================================================
RCS file: /cvsroot/qemu/qemu/exec-all.h,v
retrieving revision 1.34
diff -u -p -r1.34 exec-all.h
--- exec-all.h	24 Jul 2005 14:14:53 -0000	1.34
+++ exec-all.h	27 Jul 2005 20:53:43 -0000
@@ -607,6 +607,7 @@ int kqemu_init(CPUState *env);
 int kqemu_cpu_exec(CPUState *env);
 void kqemu_flush_page(CPUState *env, target_ulong addr);
 void kqemu_flush(CPUState *env, int global);
+void kqemu_cpu_interrupt(CPUState *env);
 
 static inline int kqemu_is_ok(CPUState *env)
 {
Index: kqemu.c
===================================================================
RCS file: /cvsroot/qemu/qemu/kqemu.c,v
retrieving revision 1.4
diff -u -p -r1.4 kqemu.c
--- kqemu.c	24 Apr 2005 18:03:37 -0000	1.4
+++ kqemu.c	27 Jul 2005 20:53:24 -0000
@@ -456,11 +456,14 @@ int kqemu_cpu_exec(CPUState *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;
+    if (DeviceIoControl(kqemu_fd, KQEMU_EXEC,
+                        kenv, sizeof(struct kqemu_cpu_state),
+                        kenv, sizeof(struct kqemu_cpu_state),
+                        &temp, NULL)) {
+        ret = kenv->retval;
+    } else {
+        ret = -1;
+    }
 #else
 #if KQEMU_VERSION >= 0x010100
     ioctl(kqemu_fd, KQEMU_EXEC, kenv);
@@ -544,6 +547,15 @@ int kqemu_cpu_exec(CPUState *env)
         exit(1);
     }
     return 0;
+}
+
+void kqemu_cpu_interrupt(CPUState *env)
+{
+#if defined(_WIN32) && KQEMU_VERSION >= 0x010101
+    /* cancelling the I/O request causes KQEMU to finish executing the 
+       current block and successfully returning. */
+    CancelIo(kqemu_fd);
+#endif
 }
 
 #endif
Index: vl.c
===================================================================
RCS file: /cvsroot/qemu/qemu/vl.c,v
retrieving revision 1.133
diff -u -p -r1.133 vl.c
--- vl.c	24 Jul 2005 18:44:55 -0000	1.133
+++ vl.c	27 Jul 2005 20:54:26 -0000
@@ -875,6 +875,9 @@ static void host_alarm_handler(int host_
                            qemu_get_clock(rt_clock))) {
         /* stop the cpu because a timer occured */
         cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
+#ifdef USE_KQEMU
+        kqemu_cpu_interrupt(global_env);
+#endif
     }
 }
 

[-- Attachment #3: kqemu.diff --]
[-- Type: text/x-patch, Size: 5686 bytes --]

--- kqemu/kqemu-doc.html	Sun Jul 24 20:02:14 2005
+++ kqemu/kqemu-doc.html	Wed Jul 27 23:20:28 2005
@@ -173,16 +173,7 @@ the option <CODE>major=N</CODE> to set a
 <H2><A NAME="SEC5" HREF="kqemu-doc.html#TOC5">2.3 QEMU Accelerator Installation for Windows</A></H2>
 
 <P>
-Copy the kqemu driver <TT>`kqemu.sys'</TT> to
-<TT>`c:\winnt\system32\drivers'</TT>.  Then do:
-
-<PRE>
-regedit kqemu.reg 
-</PRE>
-
-<P>
-Now kqemu is installed and you must restart your system.
-
+Right click on <TT>`kqemu.inf'</TT> in Explorer and choose Install.
 
 <P>
 In order to start kqemu, you must do:
--- kqemu/kqemu-doc.texi	Sun Jul 24 20:02:12 2005
+++ kqemu/kqemu-doc.texi	Wed Jul 27 23:19:38 2005
@@ -112,13 +112,7 @@ the option @code{major=N} to set an alte
 
 @section QEMU Accelerator Installation for Windows
 
-Copy the kqemu driver @file{kqemu.sys} to
-@file{c:\winnt\system32\drivers}.  Then do:
-@example
-regedit kqemu.reg 
-@end example
-
-Now kqemu is installed and you must restart your system.
+Right click on @file{kqemu.inf} in Explorer and choose Install.
 
 In order to start kqemu, you must do:
 @example
--- kqemu/kqemu-win32.c	Sun Jul 24 19:39:55 2005
+++ kqemu/kqemu-win32.c	Wed Jul 27 23:16:21 2005
@@ -36,6 +36,14 @@ typedef unsigned long long uint64_t;
 /* XXX: make it dynamic according to available RAM */
 #define MAX_LOCKED_PAGES (16386 / 4)
 
+struct kqemu_instance {
+    struct kqemu_state *state;
+    PIRP current_irp;
+};
+
+FAST_MUTEX instance_lock;
+struct kqemu_instance *active_instance;
+
 /* lock the page at virtual address 'user_addr' and return its
    page index. Return -1 if error */
 struct kqemu_user_page *CDECL kqemu_lock_user_page(unsigned long *ppage_index,
@@ -150,19 +158,19 @@ void CDECL kqemu_io_unmap(void *ptr, uns
    execution) */
 int CDECL kqemu_schedule(void)
 {
-    /* XXX: do it */
-    return TRUE;
+    return active_instance->current_irp->Cancel;
 }
 
 void CDECL kqemu_log(const char *fmt, ...)
 {
-    /* XXX: format parameters */
-    DbgPrint("%s", fmt);
-}
+    char log_buf[1024];
+    va_list ap;
 
-struct kqemu_instance {
-    struct kqemu_state *state;
-};
+    va_start(ap, fmt);
+    _vsnprintf(log_buf, sizeof(log_buf), fmt, ap);
+    DbgPrint("kqemu: %s", log_buf);
+    va_end(ap);
+}
 
 NTSTATUS STDCALL
 KQemuCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
@@ -256,12 +264,19 @@ KQemuDeviceControl(PDEVICE_OBJECT Device
                     break;
                 }
                 
+                ExAcquireFastMutex(&instance_lock);
+                active_instance = State;
+                State->current_irp = Irp;
+
                 ctx = kqemu_get_cpu_state(State->state);
                 
                 RtlCopyMemory(ctx, Irp->AssociatedIrp.SystemBuffer, 
                               sizeof(*ctx));
                 ret = kqemu_exec(State->state);
                 RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, ctx, sizeof(*ctx));
+
+                ExReleaseFastMutex(&instance_lock);
+                
                 Irp->IoStatus.Information = sizeof(*ctx);
                 Status = STATUS_SUCCESS;
             }
@@ -311,6 +326,8 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
              (KQEMU_VERSION) & 0xff);
 
     MmLockPagableCodeSection(DriverEntry);
+
+    ExInitializeFastMutex(&instance_lock);
 
     DriverObject->MajorFunction[IRP_MJ_CREATE] = KQemuCreate;
     DriverObject->MajorFunction[IRP_MJ_CLOSE] = KQemuClose;
--- kqemu/kqemu.h	Sun Jul 24 19:38:27 2005
+++ kqemu/kqemu.h	Wed Jul 27 23:07:48 2005
@@ -1,7 +1,7 @@
 #ifndef KQEMU_H
 #define KQEMU_H
 
-#define KQEMU_VERSION 0x010100
+#define KQEMU_VERSION 0x010101
 
 struct kqemu_segment_cache {
     uint32_t selector;
--- kqemu/kqemu.inf	Thu Jan  1 01:00:00 1970
+++ kqemu/kqemu.inf	Wed Jul 27 22:34:39 2005
@@ -0,0 +1,64 @@
+; Copyright (C) 2005 Filip Navara, Damien Mascord
+
+[Version]
+Signature   = "$Windows NT$"
+Class       = System
+ClassGuid   = {4D36E97D-E325-11CE-BFC1-08002BE10318}
+Provider    = %Author%
+DriverVer   = 04/28/2005,1.0
+
+[DestinationDirs]
+DefaultDestDir    = 12
+KQemu.DriverFiles = 12
+KQemu.InfFiles    = 10,inf
+
+[SourceDisksNames]
+1 = %InstDisk%
+   
+[SourceDisksFiles]
+kqemu.sys = 1
+
+[Manufacturer]
+%Author% = KQemu.Manufacturer
+
+[KQemu.Manufacturer]
+%Description% = DefaultInstall,kqemu
+
+[DefaultInstall.NT]
+CopyFiles = KQemu.DriverFiles, KQemu.InfFiles
+AddReg = KQemu.UninstallRegistry
+
+[DefaultInstall.NT.Services]
+AddService = kqemu,,KQemuService_Inst
+
+[Uninstall.NT]
+DelFiles = KQemu.DriverFiles, KQemu.InfFiles
+DelReg = KQemu.UninstallRegistry
+
+[Uninstall.NT.Services]
+DelService = kqemu,0x00000200
+
+[KQemu.DriverFiles]
+kqemu.sys
+
+[KQemu.InfFiles]
+kqemu.inf
+
+[KQemu.UninstallRegistry]
+HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KQEMU,"DisplayName",,%Description%
+HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\KQEMU,"UninstallString",0x20000,"RunDll32 setupapi.dll,InstallHinfSection Uninstall 132 %SystemRoot%\inf\kqemu.inf"
+
+[KQemuService_Inst]
+DisplayName   = %Description%
+ServiceType   = %SERVICE_KERNEL_DRIVER%
+StartType     = %SERVICE_DEMAND_START%
+ErrorControl  = %SERVICE_ERROR_NORMAL%
+ServiceBinary = %12%\kqemu.sys
+
+[Strings]
+Author = "Fabrice Bellard"
+Description = "KQEMU virtualisation module for QEMU"
+InstDisk = "KQEMU Install Disk"
+SERVICE_KERNEL_DRIVER = 1
+SERVICE_DEMAND_START = 3
+SERVICE_ERROR_NORMAL = 1
--- kqemu/kqemu.reg	Tue Apr 12 23:24:49 2005
+++ /dev/null	Wed Jul 27 23:24:00 2005
@@ -1,7 +0,0 @@
-REGEDIT4
-
-[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kqemu]
-"Type"=dword:00000001
-"Start"=dword:00000003
-"ErrorControl"=dword:00000001
-"DisplayName"="kqemu"

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2005-07-29  7:30 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-07-27 22:04 [Qemu-devel] KQEMU on Win32 (+patch) Filip Navara
2005-07-27 22:18 ` Hetz Ben Hamo
2005-07-28  0:33 ` Elefterios Stamatogiannakis
2005-07-28  9:26   ` Filip Navara
2005-07-28 10:24     ` 姚春林
2005-07-28 12:30       ` Christian MICHON
2005-07-28 12:40         ` Filip Navara
2005-07-28 13:18         ` 姚春林
2005-07-28 13:29           ` Christian MICHON
2005-07-28 13:42             ` Cirrus Emulation (was: [Qemu-devel] KQEMU on Win32 (+patch)) Hetz Ben Hamo
2005-07-28 14:52               ` Christian MICHON
2005-07-29  7:23                 ` Christian MICHON
2005-07-28 14:44             ` [Qemu-devel] KQEMU on Win32 (+patch) Doctor Bill
2005-07-28 15:08               ` Johannes Schindelin
2005-07-28 16:26                 ` Joshua Kugler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).