check.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright 2016 Yann Hodique
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package bdoor
  15. // #include <limits.h>
  16. // #include <stdint.h>
  17. // #include <signal.h>
  18. // #include <setjmp.h>
  19. //
  20. // #define VMWARE_BDOOR_MAGIC 0x564D5868
  21. // #define VMWARE_BDOOR_PORT 0x5658
  22. // #define VMWARE_BDOOR_CMD_GETVERSION 10
  23. // #define VMWARE_BDOOR_RUN(cmd, eax, ebx, ecx, edx) \
  24. // __asm__("inl %%dx, %%eax" : \
  25. // "=a"(eax), "=c"(ecx), "=d"(edx), "=b"(ebx) : \
  26. // "0"(VMWARE_BDOOR_MAGIC), \
  27. // "1"(VMWARE_BDOOR_CMD_##cmd), \
  28. // "2"(VMWARE_BDOOR_PORT), \
  29. // "3"(UINT_MAX) : \
  30. // "memory");
  31. //
  32. // static sigjmp_buf env;
  33. //
  34. // void handler(int signal) {
  35. // siglongjmp(env, 1);
  36. // }
  37. //
  38. // int hypervisor_bdoor_check(void) {
  39. // uint32_t eax, ebx, ecx, edx;
  40. // struct sigaction sa, save1, save2;
  41. // int res = 0;
  42. //
  43. // sa.sa_handler = handler;
  44. // sigemptyset(&sa.sa_mask);
  45. // sa.sa_flags = SA_RESTART;
  46. // sigaction(SIGSEGV, &sa, &save1);
  47. // sigaction(SIGILL, &sa, &save2);
  48. //
  49. // if(sigsetjmp(env, 1)==0) {
  50. // VMWARE_BDOOR_RUN(GETVERSION, eax, ebx, ecx, edx);
  51. // if (ebx == VMWARE_BDOOR_MAGIC)
  52. // res = 1;
  53. // }
  54. //
  55. // sa.sa_handler = SIG_DFL;
  56. // sigaction(SIGSEGV, &save1, 0);
  57. // sigaction(SIGILL, &save2, 0);
  58. // return res;
  59. // }
  60. //
  61. import "C"
  62. func HypervisorPortCheck() bool {
  63. return C.hypervisor_bdoor_check() != 0
  64. }