<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">I have a small snippet of code for accessing the VMware backdoor:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ cat vmw_backdoor.cpp<o:p></o:p></p>
<p class="MsoNormal">#define __STDC_LIMIT_MACROS<o:p></o:p></p>
<p class="MsoNormal">#include <stdint.h><o:p></o:p></p>
<p class="MsoNormal">#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">#include <string.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#define MAX_UINT32              UINT32_MAX<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#define VMW_MAGIC               0x564d5868<o:p></o:p></p>
<p class="MsoNormal">#define VMW_CMD_IOPORT          0x5658<o:p></o:p></p>
<p class="MsoNormal">#define VMW_CMD_GET_VER         0xa<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">struct registers<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    uint32_t eax;<o:p></o:p></p>
<p class="MsoNormal">    uint32_t ebx;<o:p></o:p></p>
<p class="MsoNormal">    uint32_t ecx;<o:p></o:p></p>
<p class="MsoNormal">    uint32_t edx;<o:p></o:p></p>
<p class="MsoNormal">    uint32_t ebp;<o:p></o:p></p>
<p class="MsoNormal">    uint32_t edi;<o:p></o:p></p>
<p class="MsoNormal">    uint32_t esi;<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">static void vmw_backdoor(unsigned cmd, registers* regs)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    __asm__ __volatile__(<o:p></o:p></p>
<p class="MsoNormal">        "inl (%%dx)"<o:p></o:p></p>
<p class="MsoNormal">        : "=a" (regs->eax), "=c" (regs->ecx), "=d" (regs->edx), "=b" (regs->ebx)<o:p></o:p></p>
<p class="MsoNormal">        : "0" (VMW_MAGIC), "1" (cmd), "2" (VMW_CMD_IOPORT), "3" (MAX_UINT32)<o:p></o:p></p>
<p class="MsoNormal">        : "memory");<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int main(void)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">    registers regs;<o:p></o:p></p>
<p class="MsoNormal">    memset(&regs, 0, sizeof regs);<o:p></o:p></p>
<p class="MsoNormal">    vmw_backdoor(VMW_CMD_GET_VER, &regs);<o:p></o:p></p>
<p class="MsoNormal">    printf("VMware version: %d.\n", regs.eax);<o:p></o:p></p>
<p class="MsoNormal">    return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This works in g++:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ g++ vmw_backdoor.cpp<o:p></o:p></p>
<p class="MsoNormal">$ ./a.out<o:p></o:p></p>
<p class="MsoNormal">VMware version: 6.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">It fails to compile in clang:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">$ clang vmw_backdoor.cpp<o:p></o:p></p>
<p class="MsoNormal">vmw_backdoor.cpp:26:9: error: invalid operand for instruction<o:p></o:p></p>
<p class="MsoNormal">        "inl (%%dx)"<o:p></o:p></p>
<p class="MsoNormal">        ^<o:p></o:p></p>
<p class="MsoNormal"><inline asm>:1:6: note: instantiated into assembly here<o:p></o:p></p>
<p class="MsoNormal">        inl (%dx)<o:p></o:p></p>
<p class="MsoNormal">            ^<o:p></o:p></p>
<p class="MsoNormal">1 error generated.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Any ideas how to make this work? Or is this a clang bug – I know the inline assembler is probably the last component anyone really cares about, but any help would be much appreciated.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal">John Calcote<o:p></o:p></p>
</div>
<br><br>
This e-mail (and any attachments) is confidential and may be privileged.  Any unauthorized use, copying, disclosure or dissemination of this communication is prohibited.  If you are not the intended recipient,  please notify the sender immediately and delete all copies of the message and its attachments.
<br>
  ­­  </body>
</html>