qemu 0.11.0-rc1 Win32 でもうすこし

やってみた。

そのまま MinGWコンパイルすると Windows2000 未対応のバイナリができあがる。手っ取り早く Win2K 対応バイナリを作るには、

  1. Platform SDKインスコする。
  2. include フォルダにある WSPiApi.hmingw の include にコピー。
  3. qemu_socket.h を変更し、# include <WSPiApi.h> 追加+若干の修正。diff 風に書くとこんな感じ
--- qemu-0.11.0-rc1-org/qemu_socket.h
+++ qemu-0.11.0-rc1/qemu_socket.h
@@ -3,9 +3,22 @@
 #define QEMU_SOCKET_H
 
 #ifdef _WIN32
+# ifdef NO_IPV6
+#  if defined(WINVER) && WINVER > 0x500
+#   undef WINVER
+#  endif
+#  if !defined(WINVER)
+#   define WINVER 0x500
+#  endif
+# endif
 #include <windows.h>
 #include <winsock2.h>
 #include <ws2tcpip.h>
+# if WINVER <= 0x500
+#  define _inline inline static
+#  define __inline inline static
+#  include <WSPiApi.h>
+# endif
 
 #define socket_error() WSAGetLastError()
 #undef EINTR

あー上の例の場合、NO_IPV6 を自前で CFLAGS に設定しないといけなかった。

その他もろもろ:

  • qemu-system-x86_64 が(どうやら Win32 でだけ)落ちてしまう件。さらにちょいちょい試していたら、translate-all.c 内にある宣言 uint16_t gen_opc_buf[OPC_BUF_SIZE];uint16_t gen_opc_buf[OPC_BUF_SIZE+1]; にするだけで DSLDebian Live (AMD64) が起動してしまった…えー? 逆に困惑。
  • まあ -enable-kqemu したらどっちも落ちたけどね!(i386 向けの qemu ではふつうにDSL が動いたようです)
  • あら、古めの Windows でほんとに CL-GD5446 ドライバ使った表示ができなくなってる。(3.1 と初代 95 で確認した。さすがに OS/2 は試してない)。
  • んでまあ久しぶりに qemu-devel 読んだけど…読もうと思ったんだけど…いや読んではいないんですよ。というか相変わらずどころか昔以上のパッチの洪水ぶりに読むことを早々に諦めた。
  • えーと、0.12 からは kqemu のサポートが外される可能性が高い、ということでいいんだろうか。
    つまりですね、とりあえずこれ
    kqemu は i386ターゲットにいくつかの制約をもたらしている。一番ダメなのは大容量メモリでの動作を阻害すること。

    そのうえいささか根本的な問題を抱えている。(実行)時間のソースを TSC に頼っているがこれはマルチプロセッサシステムのユーザ空間では当てにならない。いまどきのプロセッサはマルチコアなので kqemu の有効性はかなりの制限をうける。

    qemu の高速化を求める人にとって kvm はあてになる選択肢であり、上流の Linux カーネルでのサポートを受けている。keqmu による制約を誰か取り除いてくれる人がいるなら喜んでこのパッチをひっこめたい。(以下略)

    んでこれ
    kqemu が壊れ気味のままこれほど長く放置されてきたことが、アクティブな開発者が興味を無くしていることの証明になると思う。なんとかしたい人はいつでも git のヒストリから取り出してそこから始めればいい。
    翻訳クオリティはあんまり信用しないでください…。
    んー kvm か。Linux 使ってて CPU が VT-x とか AMD-V サポートしてればいいんだろうけどさ…。(余談だけど Paul Brook 氏は kqemu 互換のカーネルドライバ qvm86 の開発者でもあった。そう考えると感慨深い発言ではある)