virtext.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /* CPU virtualization extensions handling
  2. *
  3. * This should carry the code for handling CPU virtualization extensions
  4. * that needs to live in the kernel core.
  5. *
  6. * Author: Eduardo Habkost <ehabkost@redhat.com>
  7. *
  8. * Copyright (C) 2008, Red Hat Inc.
  9. *
  10. * Contains code from KVM, Copyright (C) 2006 Qumranet, Inc.
  11. *
  12. * This work is licensed under the terms of the GNU GPL, version 2. See
  13. * the COPYING file in the top-level directory.
  14. */
  15. #ifndef _ASM_X86_VIRTEX_H
  16. #define _ASM_X86_VIRTEX_H
  17. #include <asm/processor.h>
  18. #include <asm/system.h>
  19. #include <asm/vmx.h>
  20. /*
  21. * VMX functions:
  22. */
  23. static inline int cpu_has_vmx(void)
  24. {
  25. unsigned long ecx = cpuid_ecx(1);
  26. return test_bit(5, &ecx); /* CPUID.1:ECX.VMX[bit 5] -> VT */
  27. }
  28. /** Disable VMX on the current CPU
  29. *
  30. * vmxoff causes a undefined-opcode exception if vmxon was not run
  31. * on the CPU previously. Only call this function if you know VMX
  32. * is enabled.
  33. */
  34. static inline void cpu_vmxoff(void)
  35. {
  36. asm volatile (ASM_VMX_VMXOFF : : : "cc");
  37. write_cr4(read_cr4() & ~X86_CR4_VMXE);
  38. }
  39. static inline int cpu_vmx_enabled(void)
  40. {
  41. return read_cr4() & X86_CR4_VMXE;
  42. }
  43. /** Disable VMX if it is enabled on the current CPU
  44. *
  45. * You shouldn't call this if cpu_has_vmx() returns 0.
  46. */
  47. static inline void __cpu_emergency_vmxoff(void)
  48. {
  49. if (cpu_vmx_enabled())
  50. cpu_vmxoff();
  51. }
  52. /** Disable VMX if it is supported and enabled on the current CPU
  53. */
  54. static inline void cpu_emergency_vmxoff(void)
  55. {
  56. if (cpu_has_vmx())
  57. __cpu_emergency_vmxoff();
  58. }
  59. #endif /* _ASM_X86_VIRTEX_H */