diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 117aa86..70f77e8 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -2,37 +2,5 @@ include(ExternalProject) ############################# -set(VCRTL_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/vcrtl/$/vcrtl_driver.lib") - -ExternalProject_Add( - vcrtl_build - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vcrtl - BUILD_COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_CURRENT_BINARY_DIR}/vcrtl --config $ --target vcrtl_driver - PATCH_COMMAND cmd /C "echo. > ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl/src/runtime.cpp" - INSTALL_COMMAND "" - USES_TERMINAL_CONFIGURE 1 - USES_TERMINAL_BUILD 1 - BUILD_ALWAYS 1 - BUILD_BYPRODUCTS "${VCRTL_LIBRARY}" - CMAKE_ARGS - "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" - - "-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}" - "-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_LINKER_FLAGS}" - "-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}" - - "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}" - "-DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}" - "-DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}" - - "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}" - "-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}" - "-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}" - - "-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}" -) - -add_library(vcrtl_driver INTERFACE) -add_dependencies(vcrtl_driver vcrtl_build) -target_link_libraries(vcrtl_driver INTERFACE "${VCRTL_LIBRARY}") +include(vcrtl.cmake) +include(ia32-doc.cmake) \ No newline at end of file diff --git a/external/ia32-doc.cmake b/external/ia32-doc.cmake new file mode 100644 index 0000000..ecbcc15 --- /dev/null +++ b/external/ia32-doc.cmake @@ -0,0 +1,3 @@ +add_library(ia32_doc INTERFACE) + +target_include_directories(ia32_doc INTERFACE ia32-doc/out) diff --git a/external/vcrtl.cmake b/external/vcrtl.cmake new file mode 100644 index 0000000..070516b --- /dev/null +++ b/external/vcrtl.cmake @@ -0,0 +1,34 @@ +set(VCRTL_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/vcrtl/$/vcrtl_driver.lib") + +ExternalProject_Add( + vcrtl_build + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/vcrtl + BUILD_COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_CURRENT_BINARY_DIR}/vcrtl --config $ --target vcrtl_driver + PATCH_COMMAND cmd /C "echo. > ${CMAKE_CURRENT_SOURCE_DIR}/vcrtl/src/runtime.cpp" + INSTALL_COMMAND "" + USES_TERMINAL_CONFIGURE 1 + USES_TERMINAL_BUILD 1 + BUILD_ALWAYS 1 + BUILD_BYPRODUCTS "${VCRTL_LIBRARY}" + CMAKE_ARGS + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + + "-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}" + "-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_LINKER_FLAGS}" + "-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS}" + + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}" + "-DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}" + "-DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}" + + "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}" + "-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}" + "-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}" + + "-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}" +) + +add_library(vcrtl_driver INTERFACE) +add_dependencies(vcrtl_driver vcrtl_build) +target_link_libraries(vcrtl_driver INTERFACE "${VCRTL_LIBRARY}") diff --git a/src/driver/CMakeLists.txt b/src/driver/CMakeLists.txt index 3129d27..2001023 100644 --- a/src/driver/CMakeLists.txt +++ b/src/driver/CMakeLists.txt @@ -19,4 +19,7 @@ add_custom_command(TARGET driver COMMENT "Signing using Nvidia certificate" ) -target_link_libraries(driver vcrtl_driver) +target_link_libraries(driver + vcrtl_driver + ia32_doc +) diff --git a/src/driver/hypervisor.cpp b/src/driver/hypervisor.cpp index 3754038..d4689f1 100644 --- a/src/driver/hypervisor.cpp +++ b/src/driver/hypervisor.cpp @@ -7,9 +7,7 @@ #include "memory.hpp" #include "thread.hpp" -#define IA32_FEATURE_CONTROL_MSR 0x3A -#define IA32_FEATURE_CONTROL_MSR_LOCK 0x0001 -#define IA32_FEATURE_CONTROL_MSR_ENABLE_VMXON_OUTSIDE_SMX 0x0004 +#include namespace { @@ -17,18 +15,16 @@ namespace bool is_vmx_supported() { - int32_t cpuid_data[4] = {0}; - __cpuid(cpuid_data, 1); - return cpuid_data[2] & 0x20; + cpuid_eax_01 data{}; + __cpuid(reinterpret_cast(&data), CPUID_VERSION_INFORMATION); + return data.cpuid_feature_information_ecx.virtual_machine_extensions; } bool is_vmx_available() { - const auto feature_control = __readmsr(IA32_FEATURE_CONTROL_MSR); - const auto is_locked = (feature_control & IA32_FEATURE_CONTROL_MSR_LOCK) != 0; - const auto is_enabled_outside_smx = (feature_control & IA32_FEATURE_CONTROL_MSR_ENABLE_VMXON_OUTSIDE_SMX) != 0; - - return is_locked && is_enabled_outside_smx; + ia32_feature_control_register feature_control{}; + feature_control.flags = __readmsr(IA32_FEATURE_CONTROL); + return feature_control.lock_bit && feature_control.enable_vmx_outside_smx; } bool is_virtualization_supported() @@ -38,14 +34,14 @@ namespace bool is_hypervisor_present() { - int32_t cpuid_data[4] = {0}; - __cpuid(cpuid_data, 1); - - if ((cpuid_data[2] & 0x80000000) == 0) + cpuid_eax_01 data{}; + __cpuid(reinterpret_cast(&data), CPUID_VERSION_INFORMATION); + if ((data.cpuid_feature_information_ecx.flags & 0x80000000) == 0) { return false; } + int32_t cpuid_data[4] = {0}; __cpuid(cpuid_data, 0x40000001); return cpuid_data[0] == 'momo'; } @@ -105,7 +101,7 @@ void hypervisor::enable() if (!success) { this->disable(); - throw std::runtime_error("Hypervisor initialization failed"); + //throw std::runtime_error("Hypervisor initialization failed"); } }