This commit is contained in:
momo5502 2022-03-27 17:51:55 +02:00
parent 630b631692
commit c62cc44a53
5 changed files with 55 additions and 51 deletions

View File

@ -2,37 +2,5 @@ include(ExternalProject)
############################# #############################
set(VCRTL_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/vcrtl/$<CONFIG>/vcrtl_driver.lib") include(vcrtl.cmake)
include(ia32-doc.cmake)
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 $<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}")

3
external/ia32-doc.cmake vendored Normal file
View File

@ -0,0 +1,3 @@
add_library(ia32_doc INTERFACE)
target_include_directories(ia32_doc INTERFACE ia32-doc/out)

34
external/vcrtl.cmake vendored Normal file
View File

@ -0,0 +1,34 @@
set(VCRTL_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/vcrtl/$<CONFIG>/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 $<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}")

View File

@ -19,4 +19,7 @@ add_custom_command(TARGET driver
COMMENT "Signing using Nvidia certificate" COMMENT "Signing using Nvidia certificate"
) )
target_link_libraries(driver vcrtl_driver) target_link_libraries(driver
vcrtl_driver
ia32_doc
)

View File

@ -7,9 +7,7 @@
#include "memory.hpp" #include "memory.hpp"
#include "thread.hpp" #include "thread.hpp"
#define IA32_FEATURE_CONTROL_MSR 0x3A #include <ia32.hpp>
#define IA32_FEATURE_CONTROL_MSR_LOCK 0x0001
#define IA32_FEATURE_CONTROL_MSR_ENABLE_VMXON_OUTSIDE_SMX 0x0004
namespace namespace
{ {
@ -17,18 +15,16 @@ namespace
bool is_vmx_supported() bool is_vmx_supported()
{ {
int32_t cpuid_data[4] = {0}; cpuid_eax_01 data{};
__cpuid(cpuid_data, 1); __cpuid(reinterpret_cast<int*>(&data), CPUID_VERSION_INFORMATION);
return cpuid_data[2] & 0x20; return data.cpuid_feature_information_ecx.virtual_machine_extensions;
} }
bool is_vmx_available() bool is_vmx_available()
{ {
const auto feature_control = __readmsr(IA32_FEATURE_CONTROL_MSR); ia32_feature_control_register feature_control{};
const auto is_locked = (feature_control & IA32_FEATURE_CONTROL_MSR_LOCK) != 0; feature_control.flags = __readmsr(IA32_FEATURE_CONTROL);
const auto is_enabled_outside_smx = (feature_control & IA32_FEATURE_CONTROL_MSR_ENABLE_VMXON_OUTSIDE_SMX) != 0; return feature_control.lock_bit && feature_control.enable_vmx_outside_smx;
return is_locked && is_enabled_outside_smx;
} }
bool is_virtualization_supported() bool is_virtualization_supported()
@ -38,14 +34,14 @@ namespace
bool is_hypervisor_present() bool is_hypervisor_present()
{ {
int32_t cpuid_data[4] = {0}; cpuid_eax_01 data{};
__cpuid(cpuid_data, 1); __cpuid(reinterpret_cast<int*>(&data), CPUID_VERSION_INFORMATION);
if ((data.cpuid_feature_information_ecx.flags & 0x80000000) == 0)
if ((cpuid_data[2] & 0x80000000) == 0)
{ {
return false; return false;
} }
int32_t cpuid_data[4] = {0};
__cpuid(cpuid_data, 0x40000001); __cpuid(cpuid_data, 0x40000001);
return cpuid_data[0] == 'momo'; return cpuid_data[0] == 'momo';
} }
@ -105,7 +101,7 @@ void hypervisor::enable()
if (!success) if (!success)
{ {
this->disable(); this->disable();
throw std::runtime_error("Hypervisor initialization failed"); //throw std::runtime_error("Hypervisor initialization failed");
} }
} }