[Spice-devel] Qemu with Spice support on Windows10 host: a report

Helge Konetzka helge at konetzka.de
Tue Mar 23 20:27:31 UTC 2021


Hello!

Please excuse my english - I am no natural speaker!

Thank you very much for providing spice! I use it in my daily work on a 
qemu/kvm debian host.

I am trying to run my debian qemu setup on windows10.
For windows a qemu distribution exists in https://qemu.weilnetz.de/, but 
it is missing spice support.
While reading the changelog of spice 0.14.3 I happily realized that the 
integration is possible now!

Intention of this posting is to document the issues on my way to a 
working install and the first steps
testing it. I hope, this is the correct list to send it to...

Using a cygwin64 environment I built qemu with x86_64-w64-mingw32 
toolchain.
Resulting qemu seems to work as good as the distribution version.

To integrate spice support into qemu, I used spice-protocol-0.14.3.tar.xz
and spice-0.14.3.tar.bz2 as well as spice-0.14.91.tar.bz2

I was able to build and deploy spice-protocol and spice-server to the 
x86_64-w64-mingw32
sys-root. For the spice-server build I created a patch and added a 
compiler flag to get rid of compile
and link errors. After a rebuild of qemu spice-support was enabled.

Starting qemu with "-vga qxl -spice 
port=5905,addr=127.0.0.1,disable-ticketing" works well!
I start spicy having a xserver in background with
spicy -h 127.0.0.1 -p 5905
and I am able to connect to qemu and my VM desktop is visible.

The mouse seems to act strange when trying to enter the spicy window, 
but the host mouse pointer
just stays visible, the guest mouse pointer is working.

Sadly problems occur after adding more spice with:
"-device virtio-serial-pci -device 
virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev 
spicevmc,id=spicechannel0,name=vdagent"
qemu starts logging warnings in a loop and is no longer usable:
D:\cygwin64\x86_64-w64-mingw32\qemu-5.2.0\qemu-system-x86_64.exe: 
warning: GLib: Too many handles to wait for!

It seems to me this is a problem of qemu which I found independent from 
spice in the distributed version, too.
It occurs when option "-device virtio-serial-pci" is added.

Below I attach my build path, my patch and reasons for the used compiler 
flags.
I hope it is useful for improving the ease of build for spice on windows.

Regards, Helge Konetzka.

--------------------------

I deployed spice-protocol and spice-server this way:

spice-protocol-0.14.3$ meson setup builddir
spice-protocol-0.14.3$ meson configure --prefix 
/usr/x86_64-w64-mingw32/sys-root/mingw builddir
spice-protocol-0.14.3$ meson install -C builddir

# Add -fstack-protector to automatically added FLAGS
spice-0.14.91$ export CFLAGS="-g -O2 -fstack-protector"
spice-0.14.91$ export CXXFLAGS="-g -O2 -fno-exceptions -fno-check-new 
-fstack-protector"
# Patch to include red-common.h before jpeglib.h
spice-0.14.91$ patch -p1 < ../spice-0.14.3-cygwin64.patch
spice-0.14.91$ ./configure --host=x86_64-w64-mingw32 
--prefix=/usr/x86_64-w64-mingw32/sys-root/mingw \
                 --without-sasl --enable-extra-checks --disable-silent-rules
spice-0.14.91$ make -j4
spice-0.14.91$ make install

--------------------------

Patch is necessary, because INT32 is defined twice - in 
/usr/x86_64-w64-mingw32/sys-root/mingw/include/basetsd.h
and /usr/x86_64-w64-mingw32/sys-root/mingw/include/jmorecfg.h

$ grep "^\s*typedef.*\bINT32\b" 
/usr/x86_64-w64-mingw32/sys-root/mingw/include/* 2>/dev/null
/usr/x86_64-w64-mingw32/sys-root/mingw/include/basetsd.h:  typedef 
signed int INT32,*PINT32;
/usr/x86_64-w64-mingw32/sys-root/mingw/include/jmorecfg.h:typedef long 
INT32;
Both header files are included transitionally. jpeglib.h includes 
jmorecfg.h, red-common.h includes basetsd.h
If basetsd.h is processed first (via red-common.h), "#ifndef 
_BASETSD_H_" in jmorecfg.h prevents second definition of INT32

$ cat spice-0.14.3-cygwin64.patch
diff -Naur spice-0.14.91.orig/server/jpeg-encoder.c 
spice-0.14.91.patched/server/jpeg-encoder.c
--- spice-0.14.91.orig/server/jpeg-encoder.c    2020-10-26 
13:18:53.000000000 +0100
+++ spice-0.14.91.patched/server/jpeg-encoder.c    2021-03-23 
12:27:18.696134500 +0100
@@ -17,9 +17,9 @@
  #include <config.h>

  #include <stdio.h>
+#include "red-common.h"
  #include <jpeglib.h>

-#include "red-common.h"
  #include "jpeg-encoder.h"

  struct JpegEncoderContext {
diff -Naur spice-0.14.91.orig/server/mjpeg-encoder.c 
spice-0.14.91.patched/server/mjpeg-encoder.c
--- spice-0.14.91.orig/server/mjpeg-encoder.c    2020-10-26 
13:18:53.000000000 +0100
+++ spice-0.14.91.patched/server/mjpeg-encoder.c    2021-03-23 
12:27:22.501484000 +0100
@@ -20,9 +20,9 @@
  #include <stdio.h>
  #include <inttypes.h>
  #include <jerror.h>
+#include "red-common.h"
  #include <jpeglib.h>

-#include "red-common.h"
  #include "video-encoder.h"
  #include "utils.h"

---------------------------

Additional Compiler-Flag -fstack-protector is necessary in CFLAGS and 
CXXFLAGS to get rid of linker errors
see
https://sourceforge.net/p/mingw-w64/mailman/message/36764708/
https://github.com/msys2/MINGW-packages/issues/5803

/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(sys-socket.o): in function `socket_newpair':
/mnt/d/Qemu/src/spice-0.14.91/server/sys-socket.c:284: undefined 
reference to `__stack_chk_fail'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(sys-socket.o): in function `socket_win32_init':
/mnt/d/Qemu/src/spice-0.14.91/server/sys-socket.c:209: undefined 
reference to `__stack_chk_fail'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(sys-socket.o):sys-socket.c:(.rdata$.refptr.__stack_chk_guard[.refptr.__stack_chk_guard]+0x0): 
undefined reference to `__stack_chk_guard'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(tree.o):/usr/x86_64-w64-mingw32/sys-root/mingw/include/string.h:208: 
undefined reference to `__memset_chk'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(utils.o): in function `red_dump_openssl_errors':
/mnt/d/Qemu/src/spice-0.14.91/server/utils.c:128: undefined reference to 
`__stack_chk_fail'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(websocket.o): in function `websocket_read':
/mnt/d/Qemu/src/spice-0.14.91/server/websocket.c:447: undefined 
reference to `__stack_chk_fail'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(websocket.o): in function `memcpy':
/usr/x86_64-w64-mingw32/sys-root/mingw/include/string.h:202: undefined 
reference to `__memcpy_chk'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(websocket.o): in function `sprintf':
/usr/x86_64-w64-mingw32/sys-root/mingw/include/stdio.h:372: undefined 
reference to `__chk_fail'
/usr/lib/gcc/x86_64-w64-mingw32/10/../../../../x86_64-w64-mingw32/bin/ld: 
./.libs/libserver.a(websocket.o): in function `websocket_new':
/mnt/d/Qemu/src/spice-0.14.91/server/websocket.c:792: undefined 
reference to `__stack_chk_fail'
collect2: error: ld returned 1 exit status
make[4]: *** [Makefile:790: libspice-server.la] Error 1
make[4]: Leaving directory '/cygdrive/d/Qemu/src/spice-0.14.91/server'
make[3]: *** [Makefile:942: all-recursive] Error 1
make[3]: Leaving directory '/cygdrive/d/Qemu/src/spice-0.14.91/server'
make[2]: *** [Makefile:704: all] Error 2
make[2]: Leaving directory '/cygdrive/d/Qemu/src/spice-0.14.91/server'
make[1]: *** [Makefile:539: all-recursive] Error 1
make[1]: Leaving directory '/cygdrive/d/Qemu/src/spice



More information about the Spice-devel mailing list