From c69176af34623ef29893a2211db61ba60736174e Mon Sep 17 00:00:00 2001 From: Vishnu Khanth Date: Thu, 16 Oct 2025 14:58:57 +0000 Subject: [PATCH 1/4] fix: segfaults in zer DDI intercepts Signed-off-by: Vishnu Khanth --- scripts/templates/ldrddi_driver_ddi.cpp.mako | 2 +- source/drivers/null/ze_null.cpp | 37 +++++++-- source/drivers/null/ze_null.h | 5 ++ source/loader/zer_ldrddi_driver_ddi.cpp | 8 +- test/CMakeLists.txt | 18 +++++ test/loader_api.cpp | 85 ++++++++++++++++++++ 6 files changed, 144 insertions(+), 11 deletions(-) diff --git a/scripts/templates/ldrddi_driver_ddi.cpp.mako b/scripts/templates/ldrddi_driver_ddi.cpp.mako index c696cf52..b79ce157 100644 --- a/scripts/templates/ldrddi_driver_ddi.cpp.mako +++ b/scripts/templates/ldrddi_driver_ddi.cpp.mako @@ -109,7 +109,7 @@ namespace loader_driver_ddi return ${failure_return}; %endif } - auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { %if ret_type == 'ze_result_t': return ${X}_RESULT_ERROR_UNINITIALIZED; diff --git a/source/drivers/null/ze_null.cpp b/source/drivers/null/ze_null.cpp index 35bea1eb..d022408f 100644 --- a/source/drivers/null/ze_null.cpp +++ b/source/drivers/null/ze_null.cpp @@ -487,17 +487,32 @@ namespace driver { if( nullptr != pExtensionProperties ) { - ze_driver_extension_properties_t driverExtensionProperties = {}; + ze_driver_extension_properties_t tracingExtension = {}; #if defined(_WIN32) - strcpy_s( driverExtensionProperties.name, ZET_API_TRACING_EXP_NAME ); + strcpy_s( tracingExtension.name, ZET_API_TRACING_EXP_NAME ); #else - strcpy( driverExtensionProperties.name, ZET_API_TRACING_EXP_NAME ); + strcpy( tracingExtension.name, ZET_API_TRACING_EXP_NAME ); +#endif + tracingExtension.version = ZET_API_TRACING_EXP_VERSION_1_0; + pExtensionProperties[0] = tracingExtension; + + ze_driver_extension_properties_t ddiHandlesExtension = {}; +#if defined(_WIN32) + strcpy_s( ddiHandlesExtension.name, ZE_DRIVER_DDI_HANDLES_EXT_NAME ); +#else + strcpy( ddiHandlesExtension.name, ZE_DRIVER_DDI_HANDLES_EXT_NAME ); #endif - driverExtensionProperties.version = ZET_API_TRACING_EXP_VERSION_1_0; - *pExtensionProperties = driverExtensionProperties; + auto ddi_version_env = getenv("ZEL_TEST_DDI_HANDLES_EXT_VERSION"); + if (ddi_version_env && strcmp(ddi_version_env, "1_0") == 0) { + ddiHandlesExtension.version = ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_0; + } else { + ddiHandlesExtension.version = ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_1; + } + + pExtensionProperties[1] = ddiHandlesExtension; } - *pCount = 1; + *pCount = 2; return ZE_RESULT_SUCCESS; }; @@ -629,6 +644,16 @@ namespace driver pSysman.Driver = &zesDdiTable.Driver; pSysman.isValidFlag = 1; pSysman.version = ZE_API_VERSION_CURRENT; + + static zer_global_dditable_t runtimeDdiTable; + runtimeDdiTable.pfnGetLastErrorDescription = driver::zerGetLastErrorDescription; + runtimeDdiTable.pfnTranslateDeviceHandleToIdentifier = driver::zerTranslateDeviceHandleToIdentifier; + runtimeDdiTable.pfnTranslateIdentifierToDeviceHandle = driver::zerTranslateIdentifierToDeviceHandle; + runtimeDdiTable.pfnGetDefaultContext = driver::zerGetDefaultContext; + + pRuntime.Global = &runtimeDdiTable; + pRuntime.isValidFlag = 1; + pRuntime.version = ZE_API_VERSION_CURRENT; } char *context_t::setenv_var_with_driver_id(const std::string &key, uint32_t driverId) diff --git a/source/drivers/null/ze_null.h b/source/drivers/null/ze_null.h index f76a7b0b..dedb8c8f 100644 --- a/source/drivers/null/ze_null.h +++ b/source/drivers/null/ze_null.h @@ -64,6 +64,11 @@ namespace driver char *setenv_var_with_driver_id(const std::string &key, uint32_t driverId); }; + ze_result_t ZE_APICALL zerGetLastErrorDescription(const char **ppString); + uint32_t ZE_APICALL zerTranslateDeviceHandleToIdentifier(ze_device_handle_t hDevice); + ze_device_handle_t ZE_APICALL zerTranslateIdentifierToDeviceHandle(uint32_t identifier); + ze_context_handle_t ZE_APICALL zerGetDefaultContext(void); + extern context_t context; } // namespace driver diff --git a/source/loader/zer_ldrddi_driver_ddi.cpp b/source/loader/zer_ldrddi_driver_ddi.cpp index c878e4f5..0d8a4ab4 100644 --- a/source/loader/zer_ldrddi_driver_ddi.cpp +++ b/source/loader/zer_ldrddi_driver_ddi.cpp @@ -31,7 +31,7 @@ namespace loader_driver_ddi if (loader::context->defaultZerDriverHandle == nullptr) { return ZE_RESULT_ERROR_UNINITIALIZED; } - auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { return ZE_RESULT_ERROR_UNINITIALIZED; } @@ -66,7 +66,7 @@ namespace loader_driver_ddi error_state::setErrorDesc("ERROR UNINITIALIZED"); return UINT32_MAX; } - auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { error_state::setErrorDesc("ERROR UNINITIALIZED"); return UINT32_MAX; @@ -105,7 +105,7 @@ namespace loader_driver_ddi error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; } - auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; @@ -144,7 +144,7 @@ namespace loader_driver_ddi error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; } - auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 40651c09..cfe05437 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -596,7 +596,25 @@ set_property(TEST driver_ordering_trim_function PROPERTY ENVIRONMENT "ZE_ENABLE_ add_test(NAME driver_ordering_parse_driver_order COMMAND tests --gtest_filter=DriverOrderingHelperFunctionsTest.ParseDriverOrder_*) set_property(TEST driver_ordering_parse_driver_order PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") +add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_1 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) +set_property(TEST tests_sigle_driver_runtime_api_ddi_ext_v1_1 PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") +add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_1 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) +if (MSVC) + set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_1 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") +else() + set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_1 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") +endif() + +# add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) +# set_property(TEST tests_sigle_driver_runtime_api_ddi_ext_v1_0 PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") + +# add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) +# if (MSVC) +# set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") +# else() +# set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") +# endif() # These tests are currently not supported on Windows. The reason is that the std::cerr is not being redirected to a pipe in Windows to be then checked against the expected output. if(NOT MSVC) diff --git a/test/loader_api.cpp b/test/loader_api.cpp index 965fb91e..07cd38ba 100644 --- a/test/loader_api.cpp +++ b/test/loader_api.cpp @@ -11,6 +11,7 @@ #include "loader/ze_loader.h" #include "ze_api.h" #include "zes_api.h" +#include "zer_api.h" #include @@ -2287,4 +2288,88 @@ TEST_F(DriverOrderingTest, } } + TEST( + RuntimeApiLoaderDriverInteraction, + GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) + { + uint32_t pInitDriversCount = 0; + ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; + desc.flags = UINT32_MAX; + desc.pNext = nullptr; + putenv_safe(const_cast("ZE_ENABLE_LOADER_INTERCEPT=1")); + putenv_safe(const_cast("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=0")); + std::vector drivers; + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); + drivers.resize(pInitDriversCount); + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc)); + EXPECT_GT(pInitDriversCount, 0); + + const char *errorString = nullptr; + uint32_t deviceId = 0; + + ze_result_t result = zerGetLastErrorDescription(&errorString); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_TRUE(compare_env("zerGetLastErrorDescription", "1")); + + deviceId = zerTranslateDeviceHandleToIdentifier(nullptr); + EXPECT_TRUE(compare_env("zerTranslateDeviceHandleToIdentifier", "1")); + + ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId); + EXPECT_TRUE(compare_env("zerTranslateIdentifierToDeviceHandle", "1")); + (void)translatedDevice; + + ze_context_handle_t defaultContext = zerGetDefaultContext(); + EXPECT_TRUE(compare_env("zerGetDefaultContext", "1")); + (void)defaultContext; + } + + /* + TEST( + RuntimeApiLoaderDriverInteraction, + GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) + { + uint32_t pInitDriversCount = 0; + ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; + desc.flags = UINT32_MAX; + desc.pNext = nullptr; + putenv_safe(const_cast("ZE_ENABLE_LOADER_INTERCEPT=1")); + putenv_safe(const_cast("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=0")); + putenv_safe(const_cast("ZEL_TEST_DDI_HANDLES_EXT_VERSION=1_0")); + std::vector drivers; + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); + drivers.resize(pInitDriversCount); + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc)); + EXPECT_GT(pInitDriversCount, 0); + + uint32_t deviceId = 0; + + const char *errorDesc = nullptr; + ze_result_t errorDescResult{}; + + deviceId = zerTranslateDeviceHandleToIdentifier(nullptr); + EXPECT_EQ(UINT32_MAX, deviceId); + + errorDescResult = zerGetLastErrorDescription(&errorDesc); + EXPECT_EQ(ZE_RESULT_SUCCESS, errorDescResult); + EXPECT_NE(errorDesc, nullptr); + EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); + + ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId); + EXPECT_EQ(nullptr, translatedDevice); + + errorDescResult = zerGetLastErrorDescription(&errorDesc); + EXPECT_EQ(ZE_RESULT_SUCCESS, errorDescResult); + EXPECT_NE(errorDesc, nullptr); + EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); + + ze_context_handle_t defaultContext = zerGetDefaultContext(); + EXPECT_EQ(nullptr, defaultContext); + + errorDescResult = zerGetLastErrorDescription(&errorDesc); + EXPECT_EQ(ZE_RESULT_SUCCESS, errorDescResult); + EXPECT_NE(errorDesc, nullptr); + EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); + } + */ + } // namespace From 95117b0d08ada8969441c38d86b3b17a6aa8d0c3 Mon Sep 17 00:00:00 2001 From: Vishnu Khanth Date: Thu, 16 Oct 2025 14:58:57 +0000 Subject: [PATCH 2/4] fix: segfaults in zer DDI intercepts Signed-off-by: Vishnu Khanth --- source/drivers/null/ze_null.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/drivers/null/ze_null.cpp b/source/drivers/null/ze_null.cpp index d022408f..b419b64c 100644 --- a/source/drivers/null/ze_null.cpp +++ b/source/drivers/null/ze_null.cpp @@ -503,8 +503,8 @@ namespace driver strcpy( ddiHandlesExtension.name, ZE_DRIVER_DDI_HANDLES_EXT_NAME ); #endif - auto ddi_version_env = getenv("ZEL_TEST_DDI_HANDLES_EXT_VERSION"); - if (ddi_version_env && strcmp(ddi_version_env, "1_0") == 0) { + auto ddi_version_env = getenv_string("ZEL_TEST_DDI_HANDLES_EXT_VERSION"); + if (!ddi_version_env.empty() && ddi_version_env == "1_0") { ddiHandlesExtension.version = ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_0; } else { ddiHandlesExtension.version = ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_1; From 9621d692f4116af61f18d8b5ae92a1735834162f Mon Sep 17 00:00:00 2001 From: Vishnu Khanth Date: Thu, 16 Oct 2025 14:58:57 +0000 Subject: [PATCH 3/4] fix: segfaults in zer DDI intercepts Signed-off-by: Vishnu Khanth --- scripts/templates/ldrddi.cpp.mako | 8 +++- scripts/templates/ldrddi_driver_ddi.cpp.mako | 2 +- scripts/templates/ze_loader_internal.h.mako | 2 +- source/drivers/null/ze_null.cpp | 15 ++++---- source/drivers/null/ze_null.h | 4 +- source/loader/ze_ldrddi.cpp | 12 +++++- source/loader/ze_loader.cpp | 19 +++++++++- source/loader/ze_loader_internal.h | 2 +- source/loader/zer_ldrddi_driver_ddi.cpp | 8 ++-- test/CMakeLists.txt | 28 +++++++++----- test/loader_api.cpp | 39 +++++++++++++++++++- 11 files changed, 107 insertions(+), 32 deletions(-) diff --git a/scripts/templates/ldrddi.cpp.mako b/scripts/templates/ldrddi.cpp.mako index 2a3ebdca..cbff7446 100644 --- a/scripts/templates/ldrddi.cpp.mako +++ b/scripts/templates/ldrddi.cpp.mako @@ -98,13 +98,13 @@ namespace loader %if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)): std::call_once(loader::context->coreDriverSortOnce, []() { loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false); - loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle; + loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle; loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer; }); %else: std::call_once(loader::context->coreDriverSortOnce, [desc]() { loader::context->driverSorting(&loader::context->zeDrivers, desc, false); - loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle; + loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle; loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer; }); %endif @@ -234,6 +234,10 @@ namespace loader } ${obj['params'][1]['name']}[ driver_index ] = reinterpret_cast<${n}_driver_handle_t>( context->${n}_driver_factory.getInstance( ${obj['params'][1]['name']}[ driver_index ], &drv.dditable ) ); + if (drv.zerDriverHandle != nullptr) { + drv.zerDriverHandle = reinterpret_cast<${n}_driver_handle_t>( + context->${n}_driver_factory.getInstance( drv.zerDriverHandle, &drv.dditable ) ); + } } else if (drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) { if (loader::context->debugTraceEnabled) { std::string message = "Driver DDI Handles Supported for " + drv.name; diff --git a/scripts/templates/ldrddi_driver_ddi.cpp.mako b/scripts/templates/ldrddi_driver_ddi.cpp.mako index b79ce157..c696cf52 100644 --- a/scripts/templates/ldrddi_driver_ddi.cpp.mako +++ b/scripts/templates/ldrddi_driver_ddi.cpp.mako @@ -109,7 +109,7 @@ namespace loader_driver_ddi return ${failure_return}; %endif } - auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { %if ret_type == 'ze_result_t': return ${X}_RESULT_ERROR_UNINITIALIZED; diff --git a/scripts/templates/ze_loader_internal.h.mako b/scripts/templates/ze_loader_internal.h.mako index 03803765..a1d6a18a 100644 --- a/scripts/templates/ze_loader_internal.h.mako +++ b/scripts/templates/ze_loader_internal.h.mako @@ -131,7 +131,7 @@ namespace loader bool instrumentationEnabled = false; dditable_t tracing_dditable = {}; std::shared_ptr zel_logger; - ze_driver_handle_t* defaultZerDriverHandle = nullptr; + ze_driver_handle_t defaultZerDriverHandle = nullptr; }; extern ze_handle_t* loaderDispatch; diff --git a/source/drivers/null/ze_null.cpp b/source/drivers/null/ze_null.cpp index b419b64c..e10da275 100644 --- a/source/drivers/null/ze_null.cpp +++ b/source/drivers/null/ze_null.cpp @@ -22,6 +22,13 @@ namespace driver ////////////////////////////////////////////////////////////////////////// context_t::context_t() { + auto ddi_test_disable = getenv_string( "ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT" ); + #ifndef ZEL_NULL_DRIVER_ID + #define ZEL_NULL_DRIVER_ID 1 + #endif + std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID); + ddiExtensionSupported = (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3"); + zesDdiTable.Driver.pfnGet = []( uint32_t* pCount, ze_driver_handle_t* phDrivers ) @@ -69,15 +76,9 @@ namespace driver { auto pNext = reinterpret_cast(pDriverProperties->pNext); while (pNext) { - auto ddi_test_disable = getenv_string( "ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT" ); - #ifndef ZEL_NULL_DRIVER_ID - #define ZEL_NULL_DRIVER_ID 1 - #endif - std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID); - if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES && (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3")) { + if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES && context.ddiExtensionSupported) { ze_driver_ddi_handles_ext_properties_t *pDdiHandlesExtProperties = reinterpret_cast(pNext); pDdiHandlesExtProperties->flags = ze_driver_ddi_handle_ext_flag_t::ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED; - context.ddiExtensionRequested = true; } pNext = reinterpret_cast(pNext->pNext); } diff --git a/source/drivers/null/ze_null.h b/source/drivers/null/ze_null.h index dedb8c8f..afff2802 100644 --- a/source/drivers/null/ze_null.h +++ b/source/drivers/null/ze_null.h @@ -45,7 +45,7 @@ namespace driver zes_dditable_t zesDdiTable = {}; zer_dditable_t zerDdiTable = {}; std::vector globalBaseNullHandle; - bool ddiExtensionRequested = false; + bool ddiExtensionSupported = false; std::vector env_vars{}; context_t(); ~context_t(); @@ -53,7 +53,7 @@ namespace driver void* get( void ) { static uint64_t count = 0x80800000 >> ZEL_NULL_DRIVER_ID; - if (ddiExtensionRequested) { + if (ddiExtensionSupported) { globalBaseNullHandle.push_back(new BaseNullHandle()); return reinterpret_cast(globalBaseNullHandle.back()); } else { diff --git a/source/loader/ze_ldrddi.cpp b/source/loader/ze_ldrddi.cpp index e4d867b2..39f52e8c 100644 --- a/source/loader/ze_ldrddi.cpp +++ b/source/loader/ze_ldrddi.cpp @@ -63,7 +63,7 @@ namespace loader if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { std::call_once(loader::context->coreDriverSortOnce, []() { loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false); - loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle; + loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle; loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer; }); loader::context->sortingInProgress.store(false); @@ -156,6 +156,10 @@ namespace loader } phDrivers[ driver_index ] = reinterpret_cast( context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) ); + if (drv.zerDriverHandle != nullptr) { + drv.zerDriverHandle = reinterpret_cast( + context->ze_driver_factory.getInstance( drv.zerDriverHandle, &drv.dditable ) ); + } } else if (drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) { if (loader::context->debugTraceEnabled) { std::string message = "Driver DDI Handles Supported for " + drv.name; @@ -208,7 +212,7 @@ namespace loader if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { std::call_once(loader::context->coreDriverSortOnce, [desc]() { loader::context->driverSorting(&loader::context->zeDrivers, desc, false); - loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle; + loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle; loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer; }); loader::context->sortingInProgress.store(false); @@ -303,6 +307,10 @@ namespace loader } phDrivers[ driver_index ] = reinterpret_cast( context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) ); + if (drv.zerDriverHandle != nullptr) { + drv.zerDriverHandle = reinterpret_cast( + context->ze_driver_factory.getInstance( drv.zerDriverHandle, &drv.dditable ) ); + } } else if (drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) { if (loader::context->debugTraceEnabled) { std::string message = "Driver DDI Handles Supported for " + drv.name; diff --git a/source/loader/ze_loader.cpp b/source/loader/ze_loader.cpp index 099eb223..d4bef1bd 100644 --- a/source/loader/ze_loader.cpp +++ b/source/loader/ze_loader.cpp @@ -374,6 +374,23 @@ namespace loader continue; } driver.driverDDIHandleSupportQueried = true; + + if (!(driver.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) || !loader::context->driverDDIPathDefault) { + if (debugTraceEnabled) { + std::string message = "driverSorting: Driver DDI Handles Not Supported for " + driver.name; + debug_trace_message(message, ""); + } + if (driver.zerDriverHandle != nullptr) { + driver.zerDriverHandle = reinterpret_cast( + loader::context->ze_driver_factory.getInstance(driver.zerDriverHandle, &driver.dditable)); + } + } else { + if (debugTraceEnabled) { + std::string message = "driverSorting: Driver DDI Handles Supported for " + driver.name; + debug_trace_message(message, ""); + } + } + uint32_t deviceCount = 0; res = driver.dditable.ze.Device.pfnGet( handle, &deviceCount, nullptr ); if( ZE_RESULT_SUCCESS != res ) { @@ -551,7 +568,7 @@ namespace loader return ZE_RESULT_ERROR_UNINITIALIZED; // Set default driver handle and DDI table to the first driver in the list before sorting. - loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle; + loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle; loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer; return ZE_RESULT_SUCCESS; } diff --git a/source/loader/ze_loader_internal.h b/source/loader/ze_loader_internal.h index a296757f..1c70d65b 100644 --- a/source/loader/ze_loader_internal.h +++ b/source/loader/ze_loader_internal.h @@ -167,7 +167,7 @@ namespace loader bool instrumentationEnabled = false; dditable_t tracing_dditable = {}; std::shared_ptr zel_logger; - ze_driver_handle_t* defaultZerDriverHandle = nullptr; + ze_driver_handle_t defaultZerDriverHandle = nullptr; }; extern ze_handle_t* loaderDispatch; diff --git a/source/loader/zer_ldrddi_driver_ddi.cpp b/source/loader/zer_ldrddi_driver_ddi.cpp index 0d8a4ab4..c878e4f5 100644 --- a/source/loader/zer_ldrddi_driver_ddi.cpp +++ b/source/loader/zer_ldrddi_driver_ddi.cpp @@ -31,7 +31,7 @@ namespace loader_driver_ddi if (loader::context->defaultZerDriverHandle == nullptr) { return ZE_RESULT_ERROR_UNINITIALIZED; } - auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { return ZE_RESULT_ERROR_UNINITIALIZED; } @@ -66,7 +66,7 @@ namespace loader_driver_ddi error_state::setErrorDesc("ERROR UNINITIALIZED"); return UINT32_MAX; } - auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { error_state::setErrorDesc("ERROR UNINITIALIZED"); return UINT32_MAX; @@ -105,7 +105,7 @@ namespace loader_driver_ddi error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; } - auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; @@ -144,7 +144,7 @@ namespace loader_driver_ddi error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; } - auto dditable = reinterpret_cast( *loader::context->defaultZerDriverHandle )->pRuntime; + auto dditable = reinterpret_cast( loader::context->defaultZerDriverHandle )->pRuntime; if (dditable->isValidFlag == 0) { error_state::setErrorDesc("ERROR UNINITIALIZED"); return nullptr; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cfe05437..9678f9a4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -606,15 +606,25 @@ else() set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_1 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") endif() -# add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) -# set_property(TEST tests_sigle_driver_runtime_api_ddi_ext_v1_0 PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") - -# add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) -# if (MSVC) -# set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") -# else() -# set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") -# endif() +add_test(NAME tests_single_driver_runtime_api_ddi_ext_unsupported COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) +set_property(TEST tests_single_driver_runtime_api_ddi_ext_unsupported PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") + +add_test(NAME tests_multi_driver_runtime_api_ddi_ext_unsupported COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) +if (MSVC) + set_property(TEST tests_multi_driver_runtime_api_ddi_ext_unsupported APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") +else() + set_property(TEST tests_multi_driver_runtime_api_ddi_ext_unsupported APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") +endif() + +add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) +set_property(TEST tests_sigle_driver_runtime_api_ddi_ext_v1_0 PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") + +add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) +if (MSVC) + set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") + else() + set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") +endif() # These tests are currently not supported on Windows. The reason is that the std::cerr is not being redirected to a pipe in Windows to be then checked against the expected output. if(NOT MSVC) diff --git a/test/loader_api.cpp b/test/loader_api.cpp index 07cd38ba..f4a9d99f 100644 --- a/test/loader_api.cpp +++ b/test/loader_api.cpp @@ -2323,7 +2323,42 @@ TEST_F(DriverOrderingTest, (void)defaultContext; } - /* + TEST( + RuntimeApiLoaderDriverInteraction, + GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) + { + uint32_t pInitDriversCount = 0; + ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; + desc.flags = UINT32_MAX; + desc.pNext = nullptr; + putenv_safe(const_cast("ZE_ENABLE_LOADER_INTERCEPT=1")); + putenv_safe(const_cast("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=1")); + std::vector drivers; + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); + drivers.resize(pInitDriversCount); + EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc)); + EXPECT_GT(pInitDriversCount, 0); + + const char *errorString = nullptr; + uint32_t deviceId = 0; + + ze_result_t result = zerGetLastErrorDescription(&errorString); + EXPECT_EQ(ZE_RESULT_SUCCESS, result); + EXPECT_TRUE(compare_env("zerGetLastErrorDescription", "1")); + + deviceId = zerTranslateDeviceHandleToIdentifier(nullptr); + EXPECT_TRUE(compare_env("zerTranslateDeviceHandleToIdentifier", "1")); + + ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId); + EXPECT_TRUE(compare_env("zerTranslateIdentifierToDeviceHandle", "1")); + (void)translatedDevice; + + ze_context_handle_t defaultContext = zerGetDefaultContext(); + EXPECT_TRUE(compare_env("zerGetDefaultContext", "1")); + (void)defaultContext; + } + + TEST( RuntimeApiLoaderDriverInteraction, GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) @@ -2370,6 +2405,6 @@ TEST_F(DriverOrderingTest, EXPECT_NE(errorDesc, nullptr); EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); } - */ + } // namespace From 646afeee95c9f8b747db7db84036e9aeceeb6fbe Mon Sep 17 00:00:00 2001 From: Vishnu Khanth Date: Thu, 16 Oct 2025 14:58:57 +0000 Subject: [PATCH 4/4] fix: segfaults in zer DDI intercepts Signed-off-by: Vishnu Khanth --- source/drivers/null/ze_null.cpp | 52 ++++---------- source/drivers/null/ze_null.h | 9 +-- test/CMakeLists.txt | 28 -------- test/loader_api.cpp | 120 -------------------------------- 4 files changed, 15 insertions(+), 194 deletions(-) diff --git a/source/drivers/null/ze_null.cpp b/source/drivers/null/ze_null.cpp index e10da275..35bea1eb 100644 --- a/source/drivers/null/ze_null.cpp +++ b/source/drivers/null/ze_null.cpp @@ -22,13 +22,6 @@ namespace driver ////////////////////////////////////////////////////////////////////////// context_t::context_t() { - auto ddi_test_disable = getenv_string( "ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT" ); - #ifndef ZEL_NULL_DRIVER_ID - #define ZEL_NULL_DRIVER_ID 1 - #endif - std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID); - ddiExtensionSupported = (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3"); - zesDdiTable.Driver.pfnGet = []( uint32_t* pCount, ze_driver_handle_t* phDrivers ) @@ -76,9 +69,15 @@ namespace driver { auto pNext = reinterpret_cast(pDriverProperties->pNext); while (pNext) { - if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES && context.ddiExtensionSupported) { + auto ddi_test_disable = getenv_string( "ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT" ); + #ifndef ZEL_NULL_DRIVER_ID + #define ZEL_NULL_DRIVER_ID 1 + #endif + std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID); + if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES && (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3")) { ze_driver_ddi_handles_ext_properties_t *pDdiHandlesExtProperties = reinterpret_cast(pNext); pDdiHandlesExtProperties->flags = ze_driver_ddi_handle_ext_flag_t::ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED; + context.ddiExtensionRequested = true; } pNext = reinterpret_cast(pNext->pNext); } @@ -488,32 +487,17 @@ namespace driver { if( nullptr != pExtensionProperties ) { - ze_driver_extension_properties_t tracingExtension = {}; -#if defined(_WIN32) - strcpy_s( tracingExtension.name, ZET_API_TRACING_EXP_NAME ); -#else - strcpy( tracingExtension.name, ZET_API_TRACING_EXP_NAME ); -#endif - tracingExtension.version = ZET_API_TRACING_EXP_VERSION_1_0; - pExtensionProperties[0] = tracingExtension; - - ze_driver_extension_properties_t ddiHandlesExtension = {}; + ze_driver_extension_properties_t driverExtensionProperties = {}; #if defined(_WIN32) - strcpy_s( ddiHandlesExtension.name, ZE_DRIVER_DDI_HANDLES_EXT_NAME ); + strcpy_s( driverExtensionProperties.name, ZET_API_TRACING_EXP_NAME ); #else - strcpy( ddiHandlesExtension.name, ZE_DRIVER_DDI_HANDLES_EXT_NAME ); + strcpy( driverExtensionProperties.name, ZET_API_TRACING_EXP_NAME ); #endif + driverExtensionProperties.version = ZET_API_TRACING_EXP_VERSION_1_0; - auto ddi_version_env = getenv_string("ZEL_TEST_DDI_HANDLES_EXT_VERSION"); - if (!ddi_version_env.empty() && ddi_version_env == "1_0") { - ddiHandlesExtension.version = ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_0; - } else { - ddiHandlesExtension.version = ZE_DRIVER_DDI_HANDLES_EXT_VERSION_1_1; - } - - pExtensionProperties[1] = ddiHandlesExtension; + *pExtensionProperties = driverExtensionProperties; } - *pCount = 2; + *pCount = 1; return ZE_RESULT_SUCCESS; }; @@ -645,16 +629,6 @@ namespace driver pSysman.Driver = &zesDdiTable.Driver; pSysman.isValidFlag = 1; pSysman.version = ZE_API_VERSION_CURRENT; - - static zer_global_dditable_t runtimeDdiTable; - runtimeDdiTable.pfnGetLastErrorDescription = driver::zerGetLastErrorDescription; - runtimeDdiTable.pfnTranslateDeviceHandleToIdentifier = driver::zerTranslateDeviceHandleToIdentifier; - runtimeDdiTable.pfnTranslateIdentifierToDeviceHandle = driver::zerTranslateIdentifierToDeviceHandle; - runtimeDdiTable.pfnGetDefaultContext = driver::zerGetDefaultContext; - - pRuntime.Global = &runtimeDdiTable; - pRuntime.isValidFlag = 1; - pRuntime.version = ZE_API_VERSION_CURRENT; } char *context_t::setenv_var_with_driver_id(const std::string &key, uint32_t driverId) diff --git a/source/drivers/null/ze_null.h b/source/drivers/null/ze_null.h index afff2802..f76a7b0b 100644 --- a/source/drivers/null/ze_null.h +++ b/source/drivers/null/ze_null.h @@ -45,7 +45,7 @@ namespace driver zes_dditable_t zesDdiTable = {}; zer_dditable_t zerDdiTable = {}; std::vector globalBaseNullHandle; - bool ddiExtensionSupported = false; + bool ddiExtensionRequested = false; std::vector env_vars{}; context_t(); ~context_t(); @@ -53,7 +53,7 @@ namespace driver void* get( void ) { static uint64_t count = 0x80800000 >> ZEL_NULL_DRIVER_ID; - if (ddiExtensionSupported) { + if (ddiExtensionRequested) { globalBaseNullHandle.push_back(new BaseNullHandle()); return reinterpret_cast(globalBaseNullHandle.back()); } else { @@ -64,11 +64,6 @@ namespace driver char *setenv_var_with_driver_id(const std::string &key, uint32_t driverId); }; - ze_result_t ZE_APICALL zerGetLastErrorDescription(const char **ppString); - uint32_t ZE_APICALL zerTranslateDeviceHandleToIdentifier(ze_device_handle_t hDevice); - ze_device_handle_t ZE_APICALL zerTranslateIdentifierToDeviceHandle(uint32_t identifier); - ze_context_handle_t ZE_APICALL zerGetDefaultContext(void); - extern context_t context; } // namespace driver diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9678f9a4..40651c09 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -596,35 +596,7 @@ set_property(TEST driver_ordering_trim_function PROPERTY ENVIRONMENT "ZE_ENABLE_ add_test(NAME driver_ordering_parse_driver_order COMMAND tests --gtest_filter=DriverOrderingHelperFunctionsTest.ParseDriverOrder_*) set_property(TEST driver_ordering_parse_driver_order PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") -add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_1 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) -set_property(TEST tests_sigle_driver_runtime_api_ddi_ext_v1_1 PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") -add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_1 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) -if (MSVC) - set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_1 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") -else() - set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_1 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") -endif() - -add_test(NAME tests_single_driver_runtime_api_ddi_ext_unsupported COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) -set_property(TEST tests_single_driver_runtime_api_ddi_ext_unsupported PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") - -add_test(NAME tests_multi_driver_runtime_api_ddi_ext_unsupported COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) -if (MSVC) - set_property(TEST tests_multi_driver_runtime_api_ddi_ext_unsupported APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") -else() - set_property(TEST tests_multi_driver_runtime_api_ddi_ext_unsupported APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") -endif() - -add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) -set_property(TEST tests_sigle_driver_runtime_api_ddi_ext_v1_0 PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1") - -add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) -if (MSVC) - set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$/ze_null_test2.dll") - else() - set_property(TEST tests_multi_driver_runtime_api_ddi_ext_v1_0 APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DRIVER_DDI_PATH=1;ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so") -endif() # These tests are currently not supported on Windows. The reason is that the std::cerr is not being redirected to a pipe in Windows to be then checked against the expected output. if(NOT MSVC) diff --git a/test/loader_api.cpp b/test/loader_api.cpp index f4a9d99f..965fb91e 100644 --- a/test/loader_api.cpp +++ b/test/loader_api.cpp @@ -11,7 +11,6 @@ #include "loader/ze_loader.h" #include "ze_api.h" #include "zes_api.h" -#include "zer_api.h" #include @@ -2288,123 +2287,4 @@ TEST_F(DriverOrderingTest, } } - TEST( - RuntimeApiLoaderDriverInteraction, - GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) - { - uint32_t pInitDriversCount = 0; - ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; - desc.flags = UINT32_MAX; - desc.pNext = nullptr; - putenv_safe(const_cast("ZE_ENABLE_LOADER_INTERCEPT=1")); - putenv_safe(const_cast("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=0")); - std::vector drivers; - EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); - drivers.resize(pInitDriversCount); - EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc)); - EXPECT_GT(pInitDriversCount, 0); - - const char *errorString = nullptr; - uint32_t deviceId = 0; - - ze_result_t result = zerGetLastErrorDescription(&errorString); - EXPECT_EQ(ZE_RESULT_SUCCESS, result); - EXPECT_TRUE(compare_env("zerGetLastErrorDescription", "1")); - - deviceId = zerTranslateDeviceHandleToIdentifier(nullptr); - EXPECT_TRUE(compare_env("zerTranslateDeviceHandleToIdentifier", "1")); - - ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId); - EXPECT_TRUE(compare_env("zerTranslateIdentifierToDeviceHandle", "1")); - (void)translatedDevice; - - ze_context_handle_t defaultContext = zerGetDefaultContext(); - EXPECT_TRUE(compare_env("zerGetDefaultContext", "1")); - (void)defaultContext; - } - - TEST( - RuntimeApiLoaderDriverInteraction, - GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully) - { - uint32_t pInitDriversCount = 0; - ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; - desc.flags = UINT32_MAX; - desc.pNext = nullptr; - putenv_safe(const_cast("ZE_ENABLE_LOADER_INTERCEPT=1")); - putenv_safe(const_cast("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=1")); - std::vector drivers; - EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); - drivers.resize(pInitDriversCount); - EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc)); - EXPECT_GT(pInitDriversCount, 0); - - const char *errorString = nullptr; - uint32_t deviceId = 0; - - ze_result_t result = zerGetLastErrorDescription(&errorString); - EXPECT_EQ(ZE_RESULT_SUCCESS, result); - EXPECT_TRUE(compare_env("zerGetLastErrorDescription", "1")); - - deviceId = zerTranslateDeviceHandleToIdentifier(nullptr); - EXPECT_TRUE(compare_env("zerTranslateDeviceHandleToIdentifier", "1")); - - ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId); - EXPECT_TRUE(compare_env("zerTranslateIdentifierToDeviceHandle", "1")); - (void)translatedDevice; - - ze_context_handle_t defaultContext = zerGetDefaultContext(); - EXPECT_TRUE(compare_env("zerGetDefaultContext", "1")); - (void)defaultContext; - } - - - TEST( - RuntimeApiLoaderDriverInteraction, - GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized) - { - uint32_t pInitDriversCount = 0; - ze_init_driver_type_desc_t desc = {ZE_STRUCTURE_TYPE_INIT_DRIVER_TYPE_DESC}; - desc.flags = UINT32_MAX; - desc.pNext = nullptr; - putenv_safe(const_cast("ZE_ENABLE_LOADER_INTERCEPT=1")); - putenv_safe(const_cast("ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT=0")); - putenv_safe(const_cast("ZEL_TEST_DDI_HANDLES_EXT_VERSION=1_0")); - std::vector drivers; - EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, nullptr, &desc)); - drivers.resize(pInitDriversCount); - EXPECT_EQ(ZE_RESULT_SUCCESS, zeInitDrivers(&pInitDriversCount, drivers.data(), &desc)); - EXPECT_GT(pInitDriversCount, 0); - - uint32_t deviceId = 0; - - const char *errorDesc = nullptr; - ze_result_t errorDescResult{}; - - deviceId = zerTranslateDeviceHandleToIdentifier(nullptr); - EXPECT_EQ(UINT32_MAX, deviceId); - - errorDescResult = zerGetLastErrorDescription(&errorDesc); - EXPECT_EQ(ZE_RESULT_SUCCESS, errorDescResult); - EXPECT_NE(errorDesc, nullptr); - EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); - - ze_device_handle_t translatedDevice = zerTranslateIdentifierToDeviceHandle(deviceId); - EXPECT_EQ(nullptr, translatedDevice); - - errorDescResult = zerGetLastErrorDescription(&errorDesc); - EXPECT_EQ(ZE_RESULT_SUCCESS, errorDescResult); - EXPECT_NE(errorDesc, nullptr); - EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); - - ze_context_handle_t defaultContext = zerGetDefaultContext(); - EXPECT_EQ(nullptr, defaultContext); - - errorDescResult = zerGetLastErrorDescription(&errorDesc); - EXPECT_EQ(ZE_RESULT_SUCCESS, errorDescResult); - EXPECT_NE(errorDesc, nullptr); - EXPECT_EQ(0, strcmp(errorDesc, "ERROR UNINITIALIZED")); - } - - } // namespace