123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #ifndef _IPXE_VMWARE_H
- #define _IPXE_VMWARE_H
-
- /** @file
- *
- * VMware backdoor mechanism
- *
- */
-
- FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
- #include <stdint.h>
-
- /** VMware backdoor I/O port */
- #define VMW_PORT 0x5658
-
- /** VMware backdoor magic value */
- #define VMW_MAGIC 0x564d5868 /* "VMXh" */
-
- /** VMware backdoor magic instruction */
- #define VMW_BACKDOOR "inl %%dx, %%eax"
-
- /** Get VMware version */
- #define VMW_CMD_GET_VERSION 0x0a
-
- /** Issue GuestRPC command */
- #define VMW_CMD_GUESTRPC 0x1e
-
- /**
- * Get VMware version
- *
- * @ret version VMware version(?)
- * @ret magic VMware magic number, if present
- * @ret product_type VMware product type
- */
- static inline __attribute__ (( always_inline )) void
- vmware_cmd_get_version ( uint32_t *version, uint32_t *magic,
- uint32_t *product_type ) {
- uint32_t discard_d;
-
- /* Perform backdoor call */
- __asm__ __volatile__ ( VMW_BACKDOOR
- : "=a" ( *version ), "=b" ( *magic ),
- "=c" ( *product_type ), "=d" ( discard_d )
- : "0" ( VMW_MAGIC ), "1" ( 0 ),
- "2" ( VMW_CMD_GET_VERSION ),
- "3" ( VMW_PORT ) );
- }
-
- /**
- * Issue GuestRPC command
- *
- * @v channel Channel number
- * @v subcommand GuestRPC subcommand
- * @v parameter Subcommand-specific parameter
- * @ret edxhi Subcommand-specific result
- * @ret ebx Subcommand-specific result
- * @ret status Command status
- */
- static inline __attribute__ (( always_inline )) uint32_t
- vmware_cmd_guestrpc ( int channel, uint16_t subcommand, uint32_t parameter,
- uint16_t *edxhi, uint32_t *ebx ) {
- uint32_t discard_a;
- uint32_t status;
- uint32_t edx;
-
- /* Perform backdoor call */
- __asm__ __volatile__ ( VMW_BACKDOOR
- : "=a" ( discard_a ), "=b" ( *ebx ),
- "=c" ( status ), "=d" ( edx )
- : "0" ( VMW_MAGIC ), "1" ( parameter ),
- "2" ( VMW_CMD_GUESTRPC | ( subcommand << 16 )),
- "3" ( VMW_PORT | ( channel << 16 ) ) );
- *edxhi = ( edx >> 16 );
-
- return status;
- }
-
- extern int vmware_present ( void );
-
- #endif /* _IPXE_VMWARE_H */
|