Date: Fri, 9 Jun 2000 11:27:34 -0400 (EDT) From: Luoqi Chen <luoqi@watermarkgroup.com> To: current@freebsd.org, emulation@freebsd.org Subject: VMware detection code in boot loader Message-ID: <200006091527.e59FRYb10540@lor.watermarkgroup.com>
next in thread | raw e-mail | index | archive | help
Would anyone object if I add a ficl word to detect whether we're booting from a vmware virtual machine? I find it extremely useful when I'm running FreeBSD as a guest under NT. Because it is a dual cpu box, I can't use a single kernel to boot both directly or inside the virtual machine. With this new word, I can determine which kernel to use in the loader script, saving me the trouble to unload and reload a new kernel each time I reboot. Here's the patch to the boot loader, Index: boot/ficl/ficl.h =================================================================== RCS file: /home/ncvs/src/sys/boot/ficl/ficl.h,v retrieving revision 1.14 diff -u -r1.14 ficl.h --- boot/ficl/ficl.h 2000/06/01 18:10:43 1.14 +++ boot/ficl/ficl.h 2000/06/07 18:18:38 @@ -860,6 +860,7 @@ #if defined(__i386__) && !defined(TESTMAIN) extern void ficlOutb(FICL_VM *pVM); extern void ficlInb(FICL_VM *pVM); +extern void vmware(FICL_VM *pVM); #endif #ifdef __cplusplus Index: boot/ficl/words.c =================================================================== RCS file: /home/ncvs/src/sys/boot/ficl/words.c,v retrieving revision 1.27 diff -u -r1.27 words.c --- boot/ficl/words.c 2000/06/01 18:10:43 1.27 +++ boot/ficl/words.c 2000/06/07 18:19:13 @@ -4800,6 +4800,7 @@ #ifdef __i386__ dictAppendWord(dp, "outb", ficlOutb, FW_DEFAULT); dictAppendWord(dp, "inb", ficlInb, FW_DEFAULT); + dictAppendWord(dp, "vmware", vmware, FW_DEFAULT); #endif #endif Index: boot/ficl/i386/sysdep.c =================================================================== RCS file: /home/ncvs/src/sys/boot/ficl/i386/sysdep.c,v retrieving revision 1.7 diff -u -r1.7 sysdep.c --- boot/ficl/i386/sysdep.c 1999/09/29 04:43:07 1.7 +++ boot/ficl/i386/sysdep.c 2000/06/07 18:18:13 @@ -111,6 +111,26 @@ c=inb(port); stackPushINT(pVM->pStack,c); } + +/* + * vmware ( -- version ) + * Get vmware version. + */ +void +vmware(FICL_VM *pVM) +{ + int version, magic = 0; + +#define VMWARE_MAGIC 0x564d5868 +#define VMWARE_PORT 0x5658 + + __asm __volatile("inl %%dx, %%eax" + : "=a" (version), "=b" (magic) + : "0" (VMWARE_MAGIC), "d" (VMWARE_PORT), "c" (0xa)); + if (magic != VMWARE_MAGIC) + version = -1; + stackPushINT(pVM->pStack, version); +} #endif #endif To use this feature, you first create a file /boot/vmware.4th: : vmware-conf vmware dup 0> if ." VMware version " . cr ." Loading /boot/vmware.conf..." cr s" /boot/vmware.conf" read-conf else drop then ; then create /boot/vmware.conf which sets the kernel to use: kernel="/kernel.VMWARE" finally, change your /boot/loader.rc to include /boot/loader.4th include /boot/vmware.4th initialize drop vmware-conf boot-conf check-password -lq To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-emulation" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006091527.e59FRYb10540>