Skip to content

Commit 9621d69

Browse files
committed
fix: segfaults in zer DDI intercepts
Signed-off-by: Vishnu Khanth <vishnu.khanth.b@intel.com>
1 parent 95117b0 commit 9621d69

11 files changed

Lines changed: 107 additions & 32 deletions

File tree

scripts/templates/ldrddi.cpp.mako

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ namespace loader
9898
%if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)):
9999
std::call_once(loader::context->coreDriverSortOnce, []() {
100100
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
101-
loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle;
101+
loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle;
102102
loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer;
103103
});
104104
%else:
105105
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
106106
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
107-
loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle;
107+
loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle;
108108
loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer;
109109
});
110110
%endif
@@ -234,6 +234,10 @@ namespace loader
234234
}
235235
${obj['params'][1]['name']}[ driver_index ] = reinterpret_cast<${n}_driver_handle_t>(
236236
context->${n}_driver_factory.getInstance( ${obj['params'][1]['name']}[ driver_index ], &drv.dditable ) );
237+
if (drv.zerDriverHandle != nullptr) {
238+
drv.zerDriverHandle = reinterpret_cast<${n}_driver_handle_t>(
239+
context->${n}_driver_factory.getInstance( drv.zerDriverHandle, &drv.dditable ) );
240+
}
237241
} else if (drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) {
238242
if (loader::context->debugTraceEnabled) {
239243
std::string message = "Driver DDI Handles Supported for " + drv.name;

scripts/templates/ldrddi_driver_ddi.cpp.mako

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ namespace loader_driver_ddi
109109
return ${failure_return};
110110
%endif
111111
}
112-
auto dditable = reinterpret_cast<ze_handle_t*>( *loader::context->defaultZerDriverHandle )->pRuntime;
112+
auto dditable = reinterpret_cast<ze_handle_t*>( loader::context->defaultZerDriverHandle )->pRuntime;
113113
if (dditable->isValidFlag == 0) {
114114
%if ret_type == 'ze_result_t':
115115
return ${X}_RESULT_ERROR_UNINITIALIZED;

scripts/templates/ze_loader_internal.h.mako

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ namespace loader
131131
bool instrumentationEnabled = false;
132132
dditable_t tracing_dditable = {};
133133
std::shared_ptr<Logger> zel_logger;
134-
ze_driver_handle_t* defaultZerDriverHandle = nullptr;
134+
ze_driver_handle_t defaultZerDriverHandle = nullptr;
135135
};
136136

137137
extern ze_handle_t* loaderDispatch;

source/drivers/null/ze_null.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ namespace driver
2222
//////////////////////////////////////////////////////////////////////////
2323
context_t::context_t()
2424
{
25+
auto ddi_test_disable = getenv_string( "ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT" );
26+
#ifndef ZEL_NULL_DRIVER_ID
27+
#define ZEL_NULL_DRIVER_ID 1
28+
#endif
29+
std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID);
30+
ddiExtensionSupported = (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3");
31+
2532
zesDdiTable.Driver.pfnGet = [](
2633
uint32_t* pCount,
2734
ze_driver_handle_t* phDrivers )
@@ -69,15 +76,9 @@ namespace driver
6976
{
7077
auto pNext = reinterpret_cast<ze_base_properties_t *>(pDriverProperties->pNext);
7178
while (pNext) {
72-
auto ddi_test_disable = getenv_string( "ZEL_TEST_NULL_DRIVER_DISABLE_DDI_EXT" );
73-
#ifndef ZEL_NULL_DRIVER_ID
74-
#define ZEL_NULL_DRIVER_ID 1
75-
#endif
76-
std::string null_driver_id_str = std::to_string(ZEL_NULL_DRIVER_ID);
77-
if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES && (ddi_test_disable != null_driver_id_str && ddi_test_disable != "3")) {
79+
if (pNext->stype == ZE_STRUCTURE_TYPE_DRIVER_DDI_HANDLES_EXT_PROPERTIES && context.ddiExtensionSupported) {
7880
ze_driver_ddi_handles_ext_properties_t *pDdiHandlesExtProperties = reinterpret_cast<ze_driver_ddi_handles_ext_properties_t *>(pNext);
7981
pDdiHandlesExtProperties->flags = ze_driver_ddi_handle_ext_flag_t::ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED;
80-
context.ddiExtensionRequested = true;
8182
}
8283
pNext = reinterpret_cast<ze_base_properties_t *>(pNext->pNext);
8384
}

source/drivers/null/ze_null.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ namespace driver
4545
zes_dditable_t zesDdiTable = {};
4646
zer_dditable_t zerDdiTable = {};
4747
std::vector<BaseNullHandle*> globalBaseNullHandle;
48-
bool ddiExtensionRequested = false;
48+
bool ddiExtensionSupported = false;
4949
std::vector<char *> env_vars{};
5050
context_t();
5151
~context_t();
5252

5353
void* get( void )
5454
{
5555
static uint64_t count = 0x80800000 >> ZEL_NULL_DRIVER_ID;
56-
if (ddiExtensionRequested) {
56+
if (ddiExtensionSupported) {
5757
globalBaseNullHandle.push_back(new BaseNullHandle());
5858
return reinterpret_cast<void*>(globalBaseNullHandle.back());
5959
} else {

source/loader/ze_ldrddi.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace loader
6363
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
6464
std::call_once(loader::context->coreDriverSortOnce, []() {
6565
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
66-
loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle;
66+
loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle;
6767
loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer;
6868
});
6969
loader::context->sortingInProgress.store(false);
@@ -156,6 +156,10 @@ namespace loader
156156
}
157157
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
158158
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
159+
if (drv.zerDriverHandle != nullptr) {
160+
drv.zerDriverHandle = reinterpret_cast<ze_driver_handle_t>(
161+
context->ze_driver_factory.getInstance( drv.zerDriverHandle, &drv.dditable ) );
162+
}
159163
} else if (drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) {
160164
if (loader::context->debugTraceEnabled) {
161165
std::string message = "Driver DDI Handles Supported for " + drv.name;
@@ -208,7 +212,7 @@ namespace loader
208212
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
209213
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
210214
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
211-
loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle;
215+
loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle;
212216
loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer;
213217
});
214218
loader::context->sortingInProgress.store(false);
@@ -303,6 +307,10 @@ namespace loader
303307
}
304308
phDrivers[ driver_index ] = reinterpret_cast<ze_driver_handle_t>(
305309
context->ze_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
310+
if (drv.zerDriverHandle != nullptr) {
311+
drv.zerDriverHandle = reinterpret_cast<ze_driver_handle_t>(
312+
context->ze_driver_factory.getInstance( drv.zerDriverHandle, &drv.dditable ) );
313+
}
306314
} else if (drv.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) {
307315
if (loader::context->debugTraceEnabled) {
308316
std::string message = "Driver DDI Handles Supported for " + drv.name;

source/loader/ze_loader.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,23 @@ namespace loader
374374
continue;
375375
}
376376
driver.driverDDIHandleSupportQueried = true;
377+
378+
if (!(driver.properties.flags & ZE_DRIVER_DDI_HANDLE_EXT_FLAG_DDI_HANDLE_EXT_SUPPORTED) || !loader::context->driverDDIPathDefault) {
379+
if (debugTraceEnabled) {
380+
std::string message = "driverSorting: Driver DDI Handles Not Supported for " + driver.name;
381+
debug_trace_message(message, "");
382+
}
383+
if (driver.zerDriverHandle != nullptr) {
384+
driver.zerDriverHandle = reinterpret_cast<ze_driver_handle_t>(
385+
loader::context->ze_driver_factory.getInstance(driver.zerDriverHandle, &driver.dditable));
386+
}
387+
} else {
388+
if (debugTraceEnabled) {
389+
std::string message = "driverSorting: Driver DDI Handles Supported for " + driver.name;
390+
debug_trace_message(message, "");
391+
}
392+
}
393+
377394
uint32_t deviceCount = 0;
378395
res = driver.dditable.ze.Device.pfnGet( handle, &deviceCount, nullptr );
379396
if( ZE_RESULT_SUCCESS != res ) {
@@ -551,7 +568,7 @@ namespace loader
551568
return ZE_RESULT_ERROR_UNINITIALIZED;
552569

553570
// Set default driver handle and DDI table to the first driver in the list before sorting.
554-
loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle;
571+
loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle;
555572
loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer;
556573
return ZE_RESULT_SUCCESS;
557574
}

source/loader/ze_loader_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ namespace loader
167167
bool instrumentationEnabled = false;
168168
dditable_t tracing_dditable = {};
169169
std::shared_ptr<Logger> zel_logger;
170-
ze_driver_handle_t* defaultZerDriverHandle = nullptr;
170+
ze_driver_handle_t defaultZerDriverHandle = nullptr;
171171
};
172172

173173
extern ze_handle_t* loaderDispatch;

source/loader/zer_ldrddi_driver_ddi.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace loader_driver_ddi
3131
if (loader::context->defaultZerDriverHandle == nullptr) {
3232
return ZE_RESULT_ERROR_UNINITIALIZED;
3333
}
34-
auto dditable = reinterpret_cast<ze_handle_t*>( *loader::context->defaultZerDriverHandle )->pRuntime;
34+
auto dditable = reinterpret_cast<ze_handle_t*>( loader::context->defaultZerDriverHandle )->pRuntime;
3535
if (dditable->isValidFlag == 0) {
3636
return ZE_RESULT_ERROR_UNINITIALIZED;
3737
}
@@ -66,7 +66,7 @@ namespace loader_driver_ddi
6666
error_state::setErrorDesc("ERROR UNINITIALIZED");
6767
return UINT32_MAX;
6868
}
69-
auto dditable = reinterpret_cast<ze_handle_t*>( *loader::context->defaultZerDriverHandle )->pRuntime;
69+
auto dditable = reinterpret_cast<ze_handle_t*>( loader::context->defaultZerDriverHandle )->pRuntime;
7070
if (dditable->isValidFlag == 0) {
7171
error_state::setErrorDesc("ERROR UNINITIALIZED");
7272
return UINT32_MAX;
@@ -105,7 +105,7 @@ namespace loader_driver_ddi
105105
error_state::setErrorDesc("ERROR UNINITIALIZED");
106106
return nullptr;
107107
}
108-
auto dditable = reinterpret_cast<ze_handle_t*>( *loader::context->defaultZerDriverHandle )->pRuntime;
108+
auto dditable = reinterpret_cast<ze_handle_t*>( loader::context->defaultZerDriverHandle )->pRuntime;
109109
if (dditable->isValidFlag == 0) {
110110
error_state::setErrorDesc("ERROR UNINITIALIZED");
111111
return nullptr;
@@ -144,7 +144,7 @@ namespace loader_driver_ddi
144144
error_state::setErrorDesc("ERROR UNINITIALIZED");
145145
return nullptr;
146146
}
147-
auto dditable = reinterpret_cast<ze_handle_t*>( *loader::context->defaultZerDriverHandle )->pRuntime;
147+
auto dditable = reinterpret_cast<ze_handle_t*>( loader::context->defaultZerDriverHandle )->pRuntime;
148148
if (dditable->isValidFlag == 0) {
149149
error_state::setErrorDesc("ERROR UNINITIALIZED");
150150
return nullptr;

test/CMakeLists.txt

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -606,15 +606,25 @@ else()
606606
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")
607607
endif()
608608

609-
# add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized)
610-
# 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")
611-
612-
# add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized)
613-
# if (MSVC)
614-
# 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/$<CONFIG>/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test2.dll")
615-
# else()
616-
# 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")
617-
# endif()
609+
add_test(NAME tests_single_driver_runtime_api_ddi_ext_unsupported COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully)
610+
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")
611+
612+
add_test(NAME tests_multi_driver_runtime_api_ddi_ext_unsupported COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtNotSupportedWhenCallingRuntimeApisThenExpectNullDriverIsReachedSuccessfully)
613+
if (MSVC)
614+
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/$<CONFIG>/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test2.dll")
615+
else()
616+
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")
617+
endif()
618+
619+
add_test(NAME tests_sigle_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized)
620+
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")
621+
622+
add_test(NAME tests_multi_driver_runtime_api_ddi_ext_v1_0 COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithLoaderInterceptEnabledAndDdiExtSupportedWithVersion1_0WhenCallingRuntimeApisThenExpectErrorUninitialized)
623+
if (MSVC)
624+
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/$<CONFIG>/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test2.dll")
625+
else()
626+
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")
627+
endif()
618628

619629
# 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.
620630
if(NOT MSVC)

0 commit comments

Comments
 (0)