しばらくお蔵に入っていた VMware を ports を使ってインストールしよう
としてハマってしまいました。

  どこかから正しく VMware-2.0.4-1142.tar.gz を入手する or ちゃんと動く 
vmmon_up.ko を作る方法はないものでしょうか。

  現在手元にあるのは

VMware-2.0.3-799.dl.tar.gz(ライセンスとともに購入した CD-ROM に入っていた)
VMware-2.0.4-1235.tar.gz(ダウンロードできた)

です。しかし ports の vmware2 が要求するのは

VMware-2.0.4-1142.tar.gz

です。Makefile と distinfo を 1235 に対応するよう書き替えて make をし
かけたところ work/vmware-distrib/vmmon-only/common/task.c への patch 
が一部 rej ってエラーなります。そこでさらに work/vmmon-freebsd.diff を
末尾のように一部書き換えたところ make patch, make, make install が通り
ました。

  ところがこれを実行しようとすると

# /usr/local/etc/rc.d/vmware.sh start
kldload: can't load /usr/local/lib/vmware/lib/modules/vmmon_up.ko: Exec format error
 VMware

と表示されて vmmon_up.ko がロードできません。もちろん

% kldstat 
Id Refs Address    Size     Name
 1   12 0xc0100000 41e6bc   kernel
 2    1 0xc29dc000 7000     linprocfs.ko
 3    1 0xc29ed000 6000     ipfw.ko
 4    1 0xc2a59000 2000     green_saver.ko
 5    2 0xc2a5d000 15000    linux.ko
 6    1 0xc2a97000 4d000    msdos_ja.ko
 7    1 0xc2af8000 2000     rtc.ko
 9    1 0xc2aff000 4000     if_tap.ko
10    4 0xc2b05000 9000     netgraph.ko
11    1 0xc2b12000 3000     ng_ether.ko
12    1 0xc2b16000 4000     ng_bridge.ko
13    1 0xc2b1c000 3000     ng_socket.ko

となっておりロードできていません。vmmon_up.ko 自体は

% file /usr/local/lib/vmware/lib/modules/vmmon_up.ko
/usr/local/lib/vmware/lib/modules/vmmon_up.ko: ELF 32-bit LSB shared object, Intel 80386, version 1 (FreeBSD), not stripped

ということになっています。vmmon_up.ko がちゃんと作れていないのだと思う
のですが、これを何とかする方法は無いでしょうか…。

# この状態で VMware 自体は起動できますが、power on すると vmmon が動い
# てないもんね(Could not open Please make sure that kernel module
# `vmmon' is loaded. (/dev/vmmon).)というエラーのウィンドウが開いて先
# に進めません。

--- vmmon-freebsd.diff-dist     Mon Jul 31 09:49:46 2000
+++ vmmon-freebsd.diff  Wed Jul 30 19:53:36 2003
@@ -165,8 +165,8 @@
 retrieving revision 1.1.1.4
 retrieving revision 1.8
 diff -u -u -r1.1.1.4 -r1.8
---- vmmon-only/common/task.c   2000/01/22 17:17:27     1.1.1.4
-+++ vmmon-only/common/task.c   2000/01/23 22:29:16     1.8
+--- task.c.orig        Tue Jun 26 10:03:07 2001
++++ task.c     Wed Jul 30 19:51:30 2003
 @@ -37,7 +37,7 @@
  
  #include "vm_types.h"
@@ -176,8 +176,8 @@
  #include "modulecall.h"
  #include "vm_assert.h"
  #include "vmx86.h"
-@@ -66,7 +66,7 @@
- 
+@@ -67,7 +67,7 @@
+ static int sysenterMSR=0;
  int 
  Task_InitCrosspage(VMDriver *vm,
 -                   InitBlock *initParams) // Initial params from the VM 
@@ -185,7 +185,7 @@
  {
     LA baseLinearAddr = HOST_KERNEL_VA_2_LA(0);
     uint32 cr3reg;
-@@ -88,7 +88,7 @@
+@@ -89,7 +89,7 @@
     { 
       DTR idtrReg;
       GET_IDT(idtrReg);
@@ -194,7 +194,7 @@
     }
  
     {    
-@@ -138,7 +138,8 @@
+@@ -139,7 +139,8 @@
  #define APIC_LINT0_REG(_apic)    (_apic[APICR_LVT0][0])
  #define APIC_LINT1_REG(_apic)          (_apic[APICR_LVT1][0])
  
@@ -204,7 +204,7 @@
  {
     uint32 reg;
  
-@@ -158,7 +159,8 @@
+@@ -159,7 +160,8 @@
     }
  }
  
@@ -214,7 +214,7 @@
  {
     uint32 reg;
  
-@@ -240,7 +242,19 @@
+@@ -242,6 +244,19 @@
       SET_CR4(new_cr4);
     }
  #endif
@@ -226,15 +226,15 @@
 +      */
 +     uint32 new_cr4 = CR4_PSE;
 +     SET_CR4(new_cr4);
- 
++
 +     /* Clear GS, beacause it have invalid value (0x1F ? ? ) */
 +     SET_GS(0);
 +   }
 +#endif
-    /*
-     * Mark our task descriptor as unused, or we won't be
-     * able to come back to it (SET_TR set the busy bit)
-@@ -304,8 +318,8 @@
+    /* Unnecessary initialization, but it pacifies the compiler warnings
+     * about possible uninitialized use.
+     */
+@@ -317,8 +332,8 @@
         */
        #define IRQ_INT(_x) case _x: RAISE_INTERRUPT(_x); break 
        switch (crosspage->args[0]) {
--
--
笹部 哲郎(ささべ てつろう)