6 #define WRITE(x) write(1, x, strlen(x))
7 #define DWRITE(x) do{ \
16 static inline char tohex(char c) {
17 return c>=10?c-10+'a':c+'0';
20 unsigned int fmt_xlong(char *dest,unsigned long i) {
21 register unsigned long len,tmp;
22 /* first count the number of bytes needed */
23 for (len=1, tmp=i; tmp>15; ++len) tmp>>=4;
25 for (tmp=i, dest+=len; ; ) {
26 *--dest = tohex(tmp&15);
27 if (!(tmp>>=4)) break;
33 void printIdtr(const unsigned char* idtr, unsigned size)
36 for(i=0; i<=size; ++i) {
38 fmt_xlong(out, idtr[i]);
44 #if defined (__i386__)
45 int checkVmware(const int debug)
47 unsigned char idtr[6] = {0};
48 asm("sidt %0" : "=m" (idtr));
51 return (0xff==idtr[5]) ? 1 : 0;
55 unsigned int vmaj, vmin, magic, dout;
57 "mov $0x564D5868, %%eax; /* magic number */"
58 "mov $0x3c6cf712, %%ebx; /* random number */"
59 "mov $0x0000000A, %%ecx; /* specifies command */"
60 "mov $0x5658, %%edx; /* VMware I/O port */"
66 : "=r"(vmaj), "=r"(magic), "=r"(vmin), "=r"(dout));
67 return (0x564D5868 == magic) ? 1 : 0;
69 #elif defined (__x86_64__)
70 // only guessed, possible need to check against 0xffff?
71 int checkVmware(const int debug)
73 unsigned char idtr[10];
74 asm("sidt %0" : "=m" (idtr));
77 return (0xff==idtr[9]) ? 1 : 0;
80 // vmware runs only on the archs above
81 int checkVmware(const int) { return 0; }
84 int main(int argc, char* argv[]) {
86 if(argc == 2 && !strcmp(argv[1], "--debug"))
89 // returns 0 if running inside vmware, 1 otherwise
91 a = checkVmware(debug);
99 // never returns if not running under vmware
100 void dummy() { DWRITE("false\n"); exit(1); }
101 signal(SIGSEGV, dummy);
102 DWRITE("ioport-check: ");
110 // vim: foldmethod=marker